<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>NotionNext BLOG</title>
        <link>https://tangly1024.com/</link>
        <description>这是一个由NotionNext生成的站点</description>
        <lastBuildDate>Mon, 28 Oct 2024 03:46:05 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <copyright>All rights reserved 2024, NotionNext</copyright>
        <item>
            <title><![CDATA[使用clion开发ros项目cmake配置]]></title>
            <link>https://tangly1024.com/article/12d9b391-226a-80cf-a51c-db55c3f13310</link>
            <guid>https://tangly1024.com/article/12d9b391-226a-80cf-a51c-db55c3f13310</guid>
            <pubDate>Mon, 28 Oct 2024 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-12d9b391226a80cfa51cdb55c3f13310"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-12d9b391226a80abad03d17f1236ef5a" data-id="12d9b391226a80abad03d17f1236ef5a"><span><div id="12d9b391226a80abad03d17f1236ef5a" class="notion-header-anchor"></div><a class="notion-hash-link" href="#12d9b391226a80abad03d17f1236ef5a" title="打开cmake设置"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">打开cmake设置</span></span></h2><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-12d9b391226a806fa9e8cfa811828d9c"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2F4ae76df5-ee6a-4a65-b3ed-9f3b2ed0c361%2Fimage.png?table=block&amp;id=12d9b391-226a-806f-a9e8-cfa811828d9c&amp;t=12d9b391-226a-806f-a9e8-cfa811828d9c&amp;width=722.296875&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-12d9b391226a80ad8f7cdc4a94bae688" data-id="12d9b391226a80ad8f7cdc4a94bae688"><span><div id="12d9b391226a80ad8f7cdc4a94bae688" class="notion-header-anchor"></div><a class="notion-hash-link" href="#12d9b391226a80ad8f7cdc4a94bae688" title="配置build directory到build目录"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">配置build directory到build目录</span></span></h2><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-12d9b391226a807dbdb1c851bd7ce93e"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2F063b4911-a158-4c23-bff4-08333981dc15%2Fimage.png?table=block&amp;id=12d9b391-226a-807d-bdb1-c851bd7ce93e&amp;t=12d9b391-226a-807d-bdb1-c851bd7ce93e&amp;width=722.28125&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-12d9b391226a80e1a377c890e971c6b9" data-id="12d9b391226a80e1a377c890e971c6b9"><span><div id="12d9b391226a80e1a377c890e971c6b9" class="notion-header-anchor"></div><a class="notion-hash-link" href="#12d9b391226a80e1a377c890e971c6b9" title="配置generator和cmake options"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">配置generator和cmake options</span></span></h2><div class="notion-text notion-block-12d9b391226a8066aeb0fd4f6c63895d">generator让cmake选择</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-12d9b391226a80c69a8cedbb3c00d21d"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2Fb07e3f04-9a35-4439-903e-deafc516c15a%2Fimage.png?table=block&amp;id=12d9b391-226a-80c6-9a8c-edbb3c00d21d&amp;t=12d9b391-226a-80c6-9a8c-edbb3c00d21d&amp;width=722.3125&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-12d9b391226a8069bcccf94adf7a1458">cmake options这样填，路径换成自己devel路径</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-12d9b391226a801ca9abf316cb5b873a"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2Fa4d95027-99ba-44ca-b6b9-16fc5d5e8245%2Fimage.png?table=block&amp;id=12d9b391-226a-801c-a9ab-f316cb5b873a&amp;t=12d9b391-226a-801c-a9ab-f316cb5b873a&amp;width=722.3125&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-12d9b391226a804da1f3edc03baabd91" data-id="12d9b391226a804da1f3edc03baabd91"><span><div id="12d9b391226a804da1f3edc03baabd91" class="notion-header-anchor"></div><a class="notion-hash-link" href="#12d9b391226a804da1f3edc03baabd91" title="完成"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">完成</span></span></h2><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-12d9b391226a80babc12fcc228bc6b96"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2Facdcf759-8463-4676-a566-bfd88d174735%2Fimage.png?table=block&amp;id=12d9b391-226a-80ba-bc12-fcc228bc6b96&amp;t=12d9b391-226a-80ba-bc12-fcc228bc6b96&amp;width=722.28125&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-12d9b391226a8006bbb9ef9a23909e9f">之前的build路径就可以删掉了</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-12d9b391226a805b9fd5dc521732f632"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:410px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2Fee983fbf-90b7-4972-a078-e3d04e89b37d%2Fimage.png?table=block&amp;id=12d9b391-226a-805b-9fd5-dc521732f632&amp;t=12d9b391-226a-805b-9fd5-dc521732f632&amp;width=410&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[一次淘宝拒开发票维权经历]]></title>
            <link>https://tangly1024.com/article/tax</link>
            <guid>https://tangly1024.com/article/tax</guid>
            <pubDate>Wed, 29 Nov 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[任何拒开发票，都将绳之以法！]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-7042b45857464197806ef63faef8ce9d"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-text notion-block-56c12f397d71424c9c0ac2ffdc63f353">rm23赛季报销时，有两家购买材料的淘宝店拒开发票，下面讲讲我是怎么维权的。</div><div class="notion-text notion-block-ed3f8b988ba8476fa5118adaa425e3f8">两家店都是要求到一定的消费金额才开票，然而这显然是不符合法律的，即使一分钱的交易也应当交税。</div><div class="notion-text notion-block-bb69db0ff0f84e8692a5baab5086535a">第一家在淘宝官方客服投诉后，马上就把发票开完发过来了，并让我撤销投诉。如果遇上这样的店铺，这是最省事的一种处理方式了。</div><div class="notion-text notion-block-1b81d42b5ef348a59d2c1e96f46659c7">第二家叫<span class="notion-red"><b>小黑工业电脑</b></span><span class="notion-default">，并不怕淘宝投诉，坚持不开票，而且态度很恶劣。</span></div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-27b6d42b362f4e5c93d7984c2a025349"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2Ff52c0e9e-a0fb-481b-889b-0b9b5d57fa89%2FCH2Y(XUSJ(_17SZ8R_8_tmb.png?table=block&amp;id=27b6d42b-362f-4e5c-93d7-984c2a025349&amp;t=27b6d42b-362f-4e5c-93d7-984c2a025349&amp;width=1125&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-a80f139fb38542f9b0c56c526d620e64">在淘宝客服的协商下，店铺仍然坚持不开票，协商结果就是让退货退款。但是东西已经用了没法退货怎么办，这时淘宝客服会指引你申请商家的信息披露，这些信息可以用于税务局举报。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-f4d3705d4c384b63842b58d3b605df1c"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2Ffddaba4c-058d-4b8f-ab09-a960bd6a851e%2FOCZBQ1DO5W6VZO70ZTQ_tmb.png?table=block&amp;id=f4d3705d-4c38-4b63-842b-58d3b605df1c&amp;t=f4d3705d-4c38-4b63-842b-58d3b605df1c&amp;width=1125&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-42b0f27dd42c4809911595250adb6a4a">获得商家信息就可以开始税务举报了。首先根据地址找到对应的税务局，比如这个就是在深圳。</div><div class="notion-text notion-block-5d6514529e8b42708d45ac962ecab835">找到深圳税务举报的官网。</div><figure class="notion-asset-wrapper notion-asset-wrapper-embed notion-block-3bac12c0d89642f7a0d0a9b7fe47b9ee"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:320px"><iframe class="notion-asset-object-fit" src="https://shenzhen.chinatax.gov.cn/bswmh/inspur.hdjl.sswfxwjj.SswfxwjjCmd.cmd" title="iframe embed" frameBorder="0" allowfullscreen="" loading="lazy" scrolling="auto"></iframe></div></figure><div class="notion-text notion-block-458b779f61754f7590fe852fb2e8d162">进入税收违法行为检举。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1ca4afcbae254cbab716c6cfd11c48b6"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2F9f40cb31-251f-44ca-9a85-2d0f8dc78333%2FUntitled.png?table=block&amp;id=1ca4afcb-ae25-4cba-b716-c6cfd11c48b6&amp;t=1ca4afcb-ae25-4cba-b716-c6cfd11c48b6&amp;width=846&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-420ca272ba3245c5b8daabf0ffc029a9">按要求填写就行，附件需要提交举报证据，包括你交易的流水证明。流水证明找到支付宝的账单开就行，会发一个pdf到邮箱。</div><div class="notion-text notion-block-183ae01db3ef4a7fb0efc904f91f020b">注意这里被检举对象是企业还是个人要在淘宝看清楚，检举类型不开发票是逃税。</div><div class="notion-text notion-block-d90c688f038a4ea0b38e09630156ad3f">这里如果要补充证据，一般一两个工作日后会在检举查询页面备注出来，如果证据没问题会备注正在处理，其他都会通过电话联系。</div><div class="notion-text notion-block-920abb0c3f8f47b988dfc80985da0467">比如我一开始以为实在宝安区，后来宝安区税务局打电话来确认地址，说是属于南山区税务局，然后可以帮我转到南山区税务局继续处理，不需要我自己操作什么。</div><div class="notion-text notion-block-4c80af8aa76e4765877a371d370f8e94">处理完成会打电话问我开票单位和纳税人识别号，没几分钟就开完了，然后会打电话问邮箱，发完还会打电话来问是否收到。</div><div class="notion-text notion-block-4ed1425b874c46e0adbdfbbbb3dc336c">整个处理过程十分简单友好，而且并没有提要打好评之类的，贴心且不拖沓，让人感叹深圳作为大城市的办事效率真的很高。</div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[成为尊贵的Arch Linux用户——arch-win11双系统安装]]></title>
            <link>https://tangly1024.com/article/archinstall</link>
            <guid>https://tangly1024.com/article/archinstall</guid>
            <pubDate>Tue, 16 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[arch-win11双系统安装]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-1a01fb60732e44499f570cc43ec9dd6f"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-callout notion-gray_background_co notion-block-ddea1a77bd5c48f7a95d2424f0660640"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="❗">❗</span></div><div class="notion-callout-text">写在前面：
如果你真的想要开始安装Arch Linux，我强烈建议做到以下几点：
1. 给电脑做好备份
2. 先完整地看完教程，再开始动手</div></div><div class="notion-text notion-block-642cd51ab6e84ebab8ce744de9378328">终于上手古法安装了Arch Linux，意外地没有那么难，接下来把我用到的教程贴在下面。</div><div class="notion-blank notion-block-2aeb0ddef44a4762a634382ed7f04a64"> </div><div class="notion-text notion-block-df8228cfc93544ae8bbf12d354d20b12">首先是archwiki，大致看一下心里会有个底。</div><div class="notion-row"><a target="_blank" rel="noopener noreferrer" class="notion-bookmark notion-block-7c8a24ad50c143c1af86b1b3055e8c3d" href="https://wiki.archlinuxcn.org/wiki/Arch_+_Windows_双系统"><div><div class="notion-bookmark-title">Arch + Windows 双系统 -  Arch Linux 中文维基</div><div class="notion-bookmark-link"><div class="notion-bookmark-link-icon"><img src="https://wiki.archlinuxcn.org/wzh/images/logo.svg?t=7c8a24ad-50c1-43c1-af86-b1b3055e8c3d" alt="Arch + Windows 双系统 -  Arch Linux 中文维基" loading="lazy" decoding="async"/></div><div class="notion-bookmark-link-text">https://wiki.archlinuxcn.org/wiki/Arch_+_Windows_双系统</div></div></div></a></div><div class="notion-blank notion-block-934c85a9b3c746feb5929ea655c166f3"> </div><div class="notion-text notion-block-5a6a7aec81e24c859c3cf691548d217c">然后可以按照这篇博客做，解释的非常详细，我觉得完全没接触过linux也能看懂。</div><div class="notion-row"><a target="_blank" rel="noopener noreferrer" class="notion-bookmark notion-block-5a8d279286ae4c33ae836b90e4d116a3" href="https://blog.linioi.com/posts/18/"><div><div class="notion-bookmark-title">Arch Linux + Windows 双系统安装教程</div><div class="notion-bookmark-description">有些话必须放在前面…… 无论从哪个角度看，Arch Linux 都不是一个新手友好型 Linux 发行版。无论你是因为什么原因选择安装 Arch Linux，我都希望你能够满足下条件： 具有基本阅读理解水平，至少要能跟着教程来 掌握电脑基础使用，能够正常开关机 对电脑键盘键位和其按钮有基本了解（打字都不会的就不要打扰了。。。） 能够面对满屏的命令行输出保持基本冷静 具有基础的英语水平，至少命令行报错（比如出现 error）的时候，你能反应过来该命令执行出现错误。 有一定自主操作能力，能根据自己实际情况解决相应问题 出现突发情况，能够自行解决或者上网查阅相关资料 必须说明的是，写一篇面向新手的教程本身就是一件非常令人苦恼的事情。我不能确定我眼中的常识是否是新手闻所未闻的新知识，我不能确定我习惯并自以为清晰明了的描述会不会让新手看的云里雾里。因此在教程中我尽可能侧重于讲解而不是一直单调地告诉你如何去做。同时，因为面向新手，教程也会尽量避免其他知识的扩展以减少新手的阅读压力。此外，因为我很少使用 Windows（或者说 Windows 使用经验几乎为零），所以下文关于 Windows 的描述可能会有一些不准确的地方。如有错误还请指正。 当然，你可以另辟蹊径，通过一些特殊方法（如安装脚本）完成安装过程，但是这样无疑失去了 Arch Linux 安装的意义。这样做最直接的后果是，对于 Arch Linux 这种需要你自己维护的系统，如果你甚至没有自己动手完成你的系统安装过程，那么在系统出现问题的时候你多半无计可施只能重装系统了。 如果你是一个小白也不用太过担心，安装过程虽然是通过命令行一步一步操作，看似非常复杂繁琐。但是实际操作过程中你会发现，大多数情况下你并不需要理解每一个步骤的原因、每一行命令的意思。一般来说，安装过程也不会出现什么技术难点。 如果你有一定的 Linux 使用经验，根据本教程，你可以轻松完成 Arch Linux + Windows 双系统的安装，部分命令可以根据你的习惯或者需求改为其他命令，本教程仅供参照。 如果你并不是想安装双系统，只是单纯安装 Arch Linux 这一个系统，可以根据需求对教程进行改动（教程步骤中也会进行说明）或参阅我单独的 Arch Linux 安装教程（写完了会贴在评论区）。 我更希望的是，新人们能通过我这篇教程更多地了解 Arch Linux 和 Linux 本身，而不是机械式和目的性地完成一个操作系统的安装。 正文 确定电脑的启动类型 电脑启动类型可以粗略地分为「传统 BIOS」（简称 BIOS）和「UEFI」。因为两者在启动盘制作上和安装步骤上存在差异，所以必须在安装前对电脑的启动类型进行确认。如果是最近十年生产的设备，使用的一般是 UEFI 引导。 首先启动进入 Windows 桌面，同时按下 Win+R 打开运行对话框，然后输入 msinfo32 后回车确认打开系统信息，查看「BIOS 模式」是不是 UEFI。如果是，则为 UEFI 引导，反之则为传统 BIOS 引导。</div><div class="notion-bookmark-link"><div class="notion-bookmark-link-icon"><img src="https://blog.linioi.com/favicon.ico?t=5a8d2792-86ae-4c33-ae83-6b90e4d116a3" alt="Arch Linux + Windows 双系统安装教程" loading="lazy" decoding="async"/></div><div class="notion-bookmark-link-text">https://blog.linioi.com/posts/18/</div></div></div><div class="notion-bookmark-image"><img style="object-fit:cover" src="https://blog.linioi.com/src/opengraph.png?t=5a8d2792-86ae-4c33-ae83-6b90e4d116a3" alt="Arch Linux + Windows 双系统安装教程" loading="lazy" decoding="async"/></div></a></div><div class="notion-blank notion-block-3367e8bebdcb47ca944ea3a0748d4e5b"> </div><div class="notion-text notion-block-df5f4fdbaa6e40669d8dfd46ae6f1cb1">硬盘分区和挂载可以同时参考这篇：</div><div class="notion-row"><a target="_blank" rel="noopener noreferrer" class="notion-bookmark notion-block-43d0563ed5f9450eb1b28166b525831e" href="https://zhuanlan.zhihu.com/p/138951848"><div><div class="notion-bookmark-title">2021 Archlinux双系统安装教程（超详细）</div><div class="notion-bookmark-description">如果你不想折腾，直接上Manjaro，如果你喜欢折腾、有时间并且有一定的能力，Arch欢迎你 这篇教程来帮助那些想用Arch但是又害怕命令行的同学（Arch Wiki写得很详细，但其实对小白来说还是有难度） 因为截图很重要这…</div><div class="notion-bookmark-link"><div class="notion-bookmark-link-icon"><img src="https://static.zhihu.com/heifetz/assets/apple-touch-icon-152.81060cab.png?t=43d0563e-d5f9-450e-b1b2-8166b525831e" alt="2021 Archlinux双系统安装教程（超详细）" loading="lazy" decoding="async"/></div><div class="notion-bookmark-link-text">https://zhuanlan.zhihu.com/p/138951848</div></div></div><div class="notion-bookmark-image"><img style="object-fit:cover" src="https://picx.zhimg.com/v2-20e012a0386b0e3c022910a86eee7ac1_r.jpg?source=172ae18b&amp;t=43d0563e-d5f9-450e-b1b2-8166b525831e" alt="2021 Archlinux双系统安装教程（超详细）" loading="lazy" decoding="async"/></div></a></div><div class="notion-text notion-block-eda11a03b19d460f9025767d7b146726">因为arch是高度定制化的，具体的硬盘操作按照自己需求和习惯来，我个人更喜欢知乎这篇的操作。</div><div class="notion-blank notion-block-d05d6b44ef4342479ded75f8f43484f4"> </div><div class="notion-text notion-block-795a4e1038c541ae8404934caac03b8f">如果要使用Windows的efi分区作为引导分区则需要扩容，如果因为有个Windows保留分区没法扩容的话把保留分区删掉就好，一般扩容到512M。</div><div class="notion-blank notion-block-ab3faeb647174366abc0c061cb6704a1"> </div><div class="notion-text notion-block-9d42e96676b14044a9674c5f90cf03a3">换国内源reflector不好使可以手动换：</div><div class="notion-row"><a target="_blank" rel="noopener noreferrer" class="notion-bookmark notion-block-9be943b794fe4946958f69534ec34c3b" href="https://www.zzxworld.com/posts/change-cn-mirror-for-arch-linux"><div><div class="notion-bookmark-title">Arch Linux 更换国内镜像源</div><div class="notion-bookmark-description">自己用的 Arch Linux 在使用 pacman -Syu 更新系统时出现了连接超时的问题，看来又需要换个镜像源了。趁着今天还没想好要分享的内容，那就干脆以此为主题，总结一下如何给 Arch Linux 系统更换国内镜像源。</div><div class="notion-bookmark-link"><div class="notion-bookmark-link-icon"><img src="https://www.zzxworld.com/images/logo.png?t=9be943b7-94fe-4946-958f-69534ec34c3b" alt="Arch Linux 更换国内镜像源" loading="lazy" decoding="async"/></div><div class="notion-bookmark-link-text">https://www.zzxworld.com/posts/change-cn-mirror-for-arch-linux</div></div></div><div class="notion-bookmark-image"><img style="object-fit:cover" src="https://www.zzxworld.com/resource/posts/202210/1666400007.4036.png?t=9be943b7-94fe-4946-958f-69534ec34c3b" alt="Arch Linux 更换国内镜像源" loading="lazy" decoding="async"/></div></a></div><div class="notion-blank notion-block-cccb013e8a314e2997e91fda60af4f88"> </div><div class="notion-text notion-block-5a7f5137ac7c4d47a60465c9fbe53885">装好了进grub如果没有Windows了的话运行这个指令试下</div><div class="notion-text notion-block-2e283480ac1b4ec6b495acacf4e365d5">还不行按这篇博客操作</div><div class="notion-row"><a target="_blank" rel="noopener noreferrer" class="notion-bookmark notion-block-d5183cef93db43d08cf6ea696d3f9897" href="https://blog.csdn.net/Linore_X/article/details/121361740"><div><div class="notion-bookmark-title">Arch Linux grub引导无Windows解决方式_arch linux 的grub上没有windows选项-CSDN博客</div><div class="notion-bookmark-description">文章浏览阅读3.1k次。mkdir /boot/EFI/win把win系统引导区挂载到arch根目录下mount /dev/sda /boot/EFI/win更新grub配置文件grub-mkconfig -o /boot/grub/grub.cfg查看grub.cfg可以看到Windows managerreboot_arch linux 的grub上没有windows选项</div><div class="notion-bookmark-link"><div class="notion-bookmark-link-icon"><img src="https://g.csdnimg.cn/static/logo/favicon32.ico?t=d5183cef-93db-43d0-8cf6-ea696d3f9897" alt="Arch Linux grub引导无Windows解决方式_arch linux 的grub上没有windows选项-CSDN博客" loading="lazy" decoding="async"/></div><div class="notion-bookmark-link-text">https://blog.csdn.net/Linore_X/article/details/121361740</div></div></div></a></div><div class="notion-text notion-block-35c4077e525b4da2a8c4fe86d99e4621">没有的话就是你把Windows的efi整没了，鉴定为寄。</div><div class="notion-blank notion-block-72e7fb07a57a46dbb78db462e41b1dda"> </div><div class="notion-text notion-block-5845406a11de437a8f8646bb89ad3cbe">然后输入法那篇博客有点问题，可以按这个来：</div><div class="notion-row"><a target="_blank" rel="noopener noreferrer" class="notion-bookmark notion-block-641518220c9046ae85454bcbf2b4430b" href="https://zhuanlan.zhihu.com/p/393746270"><div><div class="notion-bookmark-title">Arch Linux - 中文输入法</div><div class="notion-bookmark-description">Arch Linux可以安装安装 fcitx5 实现输入中文，具体步骤如下sudo pacman -S fcitx5-im sudo pacman -S fcitx5-chinese-addons fcitx5-rime其中 fcitx5-chinese-addons 包含了大量中文输入方式：拼音、双拼、五笔拼…</div><div class="notion-bookmark-link"><div class="notion-bookmark-link-icon"><img src="https://static.zhihu.com/heifetz/assets/apple-touch-icon-152.81060cab.png?t=64151822-0c90-46ae-8545-4bcbf2b4430b" alt="Arch Linux - 中文输入法" loading="lazy" decoding="async"/></div><div class="notion-bookmark-link-text">https://zhuanlan.zhihu.com/p/393746270</div></div></div></a></div><div class="notion-blank notion-block-cd983b79e2ca46a7b5905a6ac4e21879"> </div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[将项目中的模块转换成git子模块]]></title>
            <link>https://tangly1024.com/article/12a9b391-226a-803b-9168-c0a510d0b4f1</link>
            <guid>https://tangly1024.com/article/12a9b391-226a-803b-9168-c0a510d0b4f1</guid>
            <pubDate>Fri, 25 Oct 2024 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-12a9b391226a803b9168c0a510d0b4f1"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-text notion-block-12a9b391226a8076b3c8f2e73668ef8d">要把项目中的一部分变为子模块并指向另一个远程仓库，可以按照以下步骤操作：</div><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-12a9b391226a80edac34f9158f818e36" data-id="12a9b391226a80edac34f9158f818e36"><span><div id="12a9b391226a80edac34f9158f818e36" class="notion-header-anchor"></div><a class="notion-hash-link" href="#12a9b391226a80edac34f9158f818e36" title="1. 将项目的部分内容移除："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">1. 将项目的部分内容移除：</span></span></h4><div class="notion-text notion-block-12a9b391226a8030b76ff0d347ffaf57">首先，你需要将项目中的这一部分移除，并将其保存到一个新的仓库中。</div><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-12a9b391226a8015a4fff972b60068be" data-id="12a9b391226a8015a4fff972b60068be"><span><div id="12a9b391226a8015a4fff972b60068be" class="notion-header-anchor"></div><a class="notion-hash-link" href="#12a9b391226a8015a4fff972b60068be" title="2. 在远程仓库中创建新的模块："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">2. 在远程仓库中创建新的模块：</span></span></h4><div class="notion-text notion-block-12a9b391226a80a384f2dc58f9ecfbcb">将被移除的目录内容放到一个新的 Git 仓库中（假设你已经在远程平台如 GitHub 或 GitLab 上创建好了仓库）。</div><div class="notion-text notion-block-12a9b391226a8089add2f1f00321fe0c">如果是已经有一个完整的远程仓库，例如fork的别人的仓库，想要以子模块加入自己的项目，可以跳过这一步，在第三步完成后push一次，再将第一步你保存的自己的代码替换fork的仓库拉下来的，最后一起push。</div><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-12a9b391226a80159251e0329a46b511" data-id="12a9b391226a80159251e0329a46b511"><span><div id="12a9b391226a80159251e0329a46b511" class="notion-header-anchor"></div><a class="notion-hash-link" href="#12a9b391226a80159251e0329a46b511" title="3. 在原项目中添加子模块："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">3. 在原项目中添加子模块：</span></span></h4><div class="notion-text notion-block-12a9b391226a8061b16cda1eeed849c0">返回原项目并将新创建的仓库作为子模块添加进来。</div><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-12a9b391226a8031998afbeb7d011b8f" data-id="12a9b391226a8031998afbeb7d011b8f"><span><div id="12a9b391226a8031998afbeb7d011b8f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#12a9b391226a8031998afbeb7d011b8f" title="4. 初始化并更新子模块："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">4. 初始化并更新子模块：</span></span></h4><div class="notion-text notion-block-12a9b391226a80e481c2db933c792d19">如果是团队合作，其他人克隆项目时需要初始化并更新子模块。</div><div class="notion-text notion-block-12a9b391226a801194cbe36072a9e99e">这样，<code class="notion-inline-code">module-directory</code> 就变成了一个指向远程仓库的子模块，之后你可以独立管理该模块并与原项目同步更新。</div><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-12a9b391226a80d2ac58dc1803645617" data-id="12a9b391226a80d2ac58dc1803645617"><span><div id="12a9b391226a80d2ac58dc1803645617" class="notion-header-anchor"></div><a class="notion-hash-link" href="#12a9b391226a80d2ac58dc1803645617" title="5. 提交修改："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">5. 提交修改：</span></span></h4><div class="notion-text notion-block-12a9b391226a8053b0d9d276c92c7d88">最后将子模块的引用信息提交到原项目的仓库。</div><div class="notion-text notion-block-12a9b391226a809b8f66d7e50cbe053c">通过这种方式，你就成功将项目的一部分转换为子模块，指向了另一个远程仓库。</div><div class="notion-blank notion-block-12a9b391226a802392fedc269e3a24ab"> </div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ipa路径覆盖算法包使用和魔改]]></title>
            <link>https://tangly1024.com/article/1239b391-226a-8020-aeaf-d9d2d58aad00</link>
            <guid>https://tangly1024.com/article/1239b391-226a-8020-aeaf-d9d2d58aad00</guid>
            <pubDate>Tue, 22 Oct 2024 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-1239b391226a8020aeafd9d2d58aad00"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-12a9b391226a80828d92d00641bb9d99" data-id="12a9b391226a80828d92d00641bb9d99"><span><div id="12a9b391226a80828d92d00641bb9d99" class="notion-header-anchor"></div><a class="notion-hash-link" href="#12a9b391226a80828d92d00641bb9d99" title="项目地址"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">项目地址</span></span></h2><a target="_blank" rel="noopener noreferrer" href="https://github.com/AndyKong2020/ipa_coverage_planning" class="notion-external notion-external-block notion-row notion-block-12a9b391226a806d8bf0d2c9371e58a0"><div class="notion-external-image"><svg viewBox="0 0 260 260"><g><path d="M128.00106,0 C57.3172926,0 0,57.3066942 0,128.00106 C0,184.555281 36.6761997,232.535542 87.534937,249.460899 C93.9320223,250.645779 96.280588,246.684165 96.280588,243.303333 C96.280588,240.251045 96.1618878,230.167899 96.106777,219.472176 C60.4967585,227.215235 52.9826207,204.369712 52.9826207,204.369712 C47.1599584,189.574598 38.770408,185.640538 38.770408,185.640538 C27.1568785,177.696113 39.6458206,177.859325 39.6458206,177.859325 C52.4993419,178.762293 59.267365,191.04987 59.267365,191.04987 C70.6837675,210.618423 89.2115753,204.961093 96.5158685,201.690482 C97.6647155,193.417512 100.981959,187.77078 104.642583,184.574357 C76.211799,181.33766 46.324819,170.362144 46.324819,121.315702 C46.324819,107.340889 51.3250588,95.9223682 59.5132437,86.9583937 C58.1842268,83.7344152 53.8029229,70.715562 60.7532354,53.0843636 C60.7532354,53.0843636 71.5019501,49.6441813 95.9626412,66.2049595 C106.172967,63.368876 117.123047,61.9465949 128.00106,61.8978432 C138.879073,61.9465949 149.837632,63.368876 160.067033,66.2049595 C184.49805,49.6441813 195.231926,53.0843636 195.231926,53.0843636 C202.199197,70.715562 197.815773,83.7344152 196.486756,86.9583937 C204.694018,95.9223682 209.660343,107.340889 209.660343,121.315702 C209.660343,170.478725 179.716133,181.303747 151.213281,184.472614 C155.80443,188.444828 159.895342,196.234518 159.895342,208.176593 C159.895342,225.303317 159.746968,239.087361 159.746968,243.303333 C159.746968,246.709601 162.05102,250.70089 168.53925,249.443941 C219.370432,232.499507 256,184.536204 256,128.00106 C256,57.3066942 198.691187,0 128.00106,0 Z M47.9405593,182.340212 C47.6586465,182.976105 46.6581745,183.166873 45.7467277,182.730227 C44.8183235,182.312656 44.2968914,181.445722 44.5978808,180.80771 C44.8734344,180.152739 45.876026,179.97045 46.8023103,180.409216 C47.7328342,180.826786 48.2627451,181.702199 47.9405593,182.340212 Z M54.2367892,187.958254 C53.6263318,188.524199 52.4329723,188.261363 51.6232682,187.366874 C50.7860088,186.474504 50.6291553,185.281144 51.2480912,184.70672 C51.8776254,184.140775 53.0349512,184.405731 53.8743302,185.298101 C54.7115892,186.201069 54.8748019,187.38595 54.2367892,187.958254 Z M58.5562413,195.146347 C57.7719732,195.691096 56.4895886,195.180261 55.6968417,194.042013 C54.9125733,192.903764 54.9125733,191.538713 55.713799,190.991845 C56.5086651,190.444977 57.7719732,190.936735 58.5753181,192.066505 C59.3574669,193.22383 59.3574669,194.58888 58.5562413,195.146347 Z M65.8613592,203.471174 C65.1597571,204.244846 63.6654083,204.03712 62.5716717,202.981538 C61.4524999,201.94927 61.1409122,200.484596 61.8446341,199.710926 C62.5547146,198.935137 64.0575422,199.15346 65.1597571,200.200564 C66.2704506,201.230712 66.6095936,202.705984 65.8613592,203.471174 Z M75.3025151,206.281542 C74.9930474,207.284134 73.553809,207.739857 72.1039724,207.313809 C70.6562556,206.875043 69.7087748,205.700761 70.0012857,204.687571 C70.302275,203.678621 71.7478721,203.20382 73.2083069,203.659543 C74.6539041,204.09619 75.6035048,205.261994 75.3025151,206.281542 Z M86.046947,207.473627 C86.0829806,208.529209 84.8535871,209.404622 83.3316829,209.4237 C81.8013,209.457614 80.563428,208.603398 80.5464708,207.564772 C80.5464708,206.498591 81.7483088,205.631657 83.2786917,205.606221 C84.8005962,205.576546 86.046947,206.424403 86.046947,207.473627 Z M96.6021471,207.069023 C96.7844366,208.099171 95.7267341,209.156872 94.215428,209.438785 C92.7295577,209.710099 91.3539086,209.074206 91.1652603,208.052538 C90.9808515,206.996955 92.0576306,205.939253 93.5413813,205.66582 C95.054807,205.402984 96.4092596,206.021919 96.6021471,207.069023 Z" fill="#161614"></path></g></svg></div><div class="notion-external-description"><div class="notion-external-title">ipa_coverage_planning</div><div class="notion-external-subtitle"><span>AndyKong2020</span><span> • </span><span>Updated <!-- -->Oct 25, 2024</span></div></div></a><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1239b391226a80a68a1ccbac88ca516a" data-id="1239b391226a80a68a1ccbac88ca516a"><span><div id="1239b391226a80a68a1ccbac88ca516a" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1239b391226a80a68a1ccbac88ca516a" title="参考文章"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">参考文章</span></span></h2><div class="notion-row"><a target="_blank" rel="noopener noreferrer" class="notion-bookmark notion-block-1239b391226a80149336c47fbf557487" href="https://blog.csdn.net/jucat/article/details/138757352"><div><div class="notion-bookmark-title">ipa 功能包调试，分区算法，覆盖算法测试_contour line-based coverage path planning-CSDN博客</div><div class="notion-bookmark-description">文章浏览阅读1.5k次，点赞31次，收藏14次。ipa 功能包调试运行。分区算法，覆盖算法测试。_contour line-based coverage path planning</div><div class="notion-bookmark-link"><div class="notion-bookmark-link-icon"><img src="https://g.csdnimg.cn/static/logo/favicon32.ico?t=1239b391-226a-8014-9336-c47fbf557487" alt="ipa 功能包调试，分区算法，覆盖算法测试_contour line-based coverage path planning-CSDN博客" loading="lazy" decoding="async"/></div><div class="notion-bookmark-link-text">https://blog.csdn.net/jucat/article/details/138757352</div></div></div></a></div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1269b391226a80acb97bfcfd30b3edfd" data-id="1269b391226a80acb97bfcfd30b3edfd"><span><div id="1269b391226a80acb97bfcfd30b3edfd" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1269b391226a80acb97bfcfd30b3edfd" title="配置运行环境"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">配置运行环境</span></span></h2><div class="notion-text notion-block-1269b391226a80a68118e5b0522e3dcd">ubuntu20.04， ros noetic</div><div class="notion-text notion-block-1269b391226a8047a7dbdc8931dc697b">直接编译，然后会提示缺少依赖，缺哪个装哪个就行</div><div class="notion-text notion-block-1269b391226a8080a182d656fbee1c82">不需要使用turtlebot也能运行</div><div class="notion-blank notion-block-1269b391226a8026a272fde853a105d8"> </div><div class="notion-text notion-block-1269b391226a8015861adb51ad023737">1.启动server</div><div class="notion-text notion-block-1269b391226a800ab1c8c3f67f608ce9">2.配置client</div><div class="notion-text notion-block-1269b391226a8026a995ffd8fe575e27">在配置环境时，会下载一些示例地图在软件包内，选择ipa-apartment</div><div class="notion-text notion-block-1269b391226a80a5bb73cb6eb249186c">结果：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1269b391226a80978595d879a3280272"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2F5edba0f6-f5e0-473c-ae07-1460bba6bb18%2Fimage.png?table=block&amp;id=1269b391-226a-8097-8595-d879a3280272&amp;t=1269b391-226a-8097-8595-d879a3280272&amp;width=720&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1269b391226a80bd9c59dd22369040ab" data-id="1269b391226a80bd9c59dd22369040ab"><span><div id="1269b391226a80bd9c59dd22369040ab" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1269b391226a80bd9c59dd22369040ab" title="软件包分析"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">软件包分析</span></span></h2><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1269b391226a804e9826ed8a54d37700" data-id="1269b391226a804e9826ed8a54d37700"><span><div id="1269b391226a804e9826ed8a54d37700" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1269b391226a804e9826ed8a54d37700" title="topic&amp;msg流转"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">topic&amp;msg流转</span></span></h3><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1269b391226a8008afa7e00b441ed958"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2F4d2ef25a-b027-4539-b4b8-c4f1f35910b9%2Fimage.png?table=block&amp;id=1269b391-226a-8008-afa7-e00b441ed958&amp;t=1269b391-226a-8008-afa7-e00b441ed958&amp;width=707.96875&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-1269b391226a80e4a639f62b2a4de041">可以看到，server接收action_topics，发布coverage_path</div><div class="notion-text notion-block-1269b391226a80ee8617ece6280b6a27">action_topics包括：</div><div class="notion-text notion-block-1269b391226a80dcb7c2df1dd447a7d4">GoalID似乎在代码里并没有用到</div><div class="notion-text notion-block-1269b391226a80e7a284fa2d2c8b7b7f">其中，action定义：</div><div class="notion-blank notion-block-1269b391226a8078b675d171039f39c9"> </div><div class="notion-text notion-block-1269b391226a8022b856c58ee2e4c2d8">server的发布部分</div><div class="notion-text notion-block-1269b391226a802183bbf8be760c5b62">可以看到，除了回传给client <code class="notion-inline-code">coverage_path</code>和<code class="notion-inline-code">coverage_path_pose_stamped</code>两个消息外，还发布了一个<code class="notion-inline-code">nav_msgs::Path</code>类型的<code class="notion-inline-code">coverage_path</code>，这是我们要用到的</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1269b391226a80dba8eef7dd03b7f2e4" data-id="1269b391226a80dba8eef7dd03b7f2e4"><span><div id="1269b391226a80dba8eef7dd03b7f2e4" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1269b391226a80dba8eef7dd03b7f2e4" title="两种牛耕法算法简述"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">两种牛耕法算法简述</span></span></h2><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1279b391226a8007b579eedaf7f93b59" data-id="1279b391226a8007b579eedaf7f93b59"><span><div id="1279b391226a8007b579eedaf7f93b59" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1279b391226a8007b579eedaf7f93b59" title="概述 "><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">概述 </span></span></h3><div class="notion-text notion-block-1279b391226a8041b4b1c71bcb09c3ab">算法包提供了8种路径覆盖算法，其中牛耕法在扫地机器人中最为常见，在程序中分别是<b>Boustrophedon</b> 和 <b>Boustrophedon Variant</b>。下面是参考chatgpt的解释：</div><blockquote class="notion-quote notion-block-1279b391226a804290e8c3dd7346b3e3"><div><b>Boustrophedon</b> 和 <b>Boustrophedon Variant</b> 是两种在机器人路径规划或覆盖算法中常见的策略，它们都涉及如何高效覆盖一个区域。它们之间的区别主要体现在覆盖路径的生成方式和应对复杂地形的能力上。</div><h4 class="notion-h notion-h3 notion-block-1279b391226a80bdb74df9dd0532b61a" data-id="1279b391226a80bdb74df9dd0532b61a"><span><div id="1279b391226a80bdb74df9dd0532b61a" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1279b391226a80bdb74df9dd0532b61a" title="1. Boustrophedon（牛耕式路径）："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">1. <b>Boustrophedon（牛耕式路径）</b>：</span></span></h4><ul class="notion-list notion-list-disc notion-block-1279b391226a8054965be3148ee7c13e"><li><b>概念</b>: 名称来自希腊语，意为“像牛在田地里来回耕作”，描述的是一种蛇形路径。机器人在区域中按平行直线前进，到边界后掉头再走相反方向的直线。每条路径和之前的一条平行，形成类似于“Z”字形的轨迹。</li></ul><ul class="notion-list notion-list-disc notion-block-1279b391226a80fa9a2ae2a05855564e"><li><b>优点</b>: 这种方法在规则的、没有障碍的矩形或规则形状区域中非常高效，覆盖路径最短。</li></ul><ul class="notion-list notion-list-disc notion-block-1279b391226a80938dd4fba96f95654e"><li><b>缺点</b>: 对复杂区域（如包含障碍物或非规则形状的空间）不太适合，因为需要考虑如何绕过障碍或不规则形状，这可能导致路径的复杂化或覆盖不全。</li></ul><h4 class="notion-h notion-h3 notion-block-1279b391226a80349168c8321d375523" data-id="1279b391226a80349168c8321d375523"><span><div id="1279b391226a80349168c8321d375523" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1279b391226a80349168c8321d375523" title="2. Boustrophedon Variant（变体牛耕式路径）："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">2. <b>Boustrophedon Variant（变体牛耕式路径）</b>：</span></span></h4><ul class="notion-list notion-list-disc notion-block-1279b391226a80449ccef129bb3d8fed"><li><b>概念</b>: 这是对传统<b>Boustrophedon</b>方法的改进，用于应对更复杂的环境。通过分解自由空间（如将区域分成多个子区域），然后在每个子区域内进行类似于牛耕的路径覆盖，能够更好地处理有障碍物或非规则形状的场景。</li></ul><ul class="notion-list notion-list-disc notion-block-1279b391226a80a5abaedede5b2121ce"><li><b>适用场景</b>: 这种变体在包含障碍物、凹凸不平或者不规则形状的区域内非常有用。机器人可以在每个子区域内执行牛耕式覆盖，确保所有自由区域都能被完全覆盖。</li></ul><ul class="notion-list notion-list-disc notion-block-1279b391226a8044bac9ff5386dcdb9c"><li><b>优点</b>: 适用于复杂的自由空间，通过分解问题，使路径规划更加灵活。</li></ul><ul class="notion-list notion-list-disc notion-block-1279b391226a807ca052fd9f906af0d1"><li><b>缺点</b>: 对于简单规则的空间可能没有传统Boustrophedon高效，因为在分解子区域和路径连接时可能会增加额外的路径长度。</li></ul><h4 class="notion-h notion-h3 notion-block-1279b391226a80a3a29feb3d49a19572" data-id="1279b391226a80a3a29feb3d49a19572"><span><div id="1279b391226a80a3a29feb3d49a19572" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1279b391226a80a3a29feb3d49a19572" title="区别总结："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">区别总结：</span></span></h4><ul class="notion-list notion-list-disc notion-block-1279b391226a8005883fce03e0c51f31"><li><b>Boustrophedon</b> 是一种简单的蛇形路径算法，适合规则区域的高效覆盖。</li></ul><ul class="notion-list notion-list-disc notion-block-1279b391226a8044836fd4564f14aae2"><li><b>Boustrophedon Variant</b> 是为了应对包含复杂地形和障碍物的区域，通过子区域分解来实现完整覆盖。</li></ul></blockquote><div class="notion-text notion-block-1279b391226a8031be00c4d6ccbabecc">简单场景下，选择两种算法没有显著差异。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1279b391226a805b8461c41ab16eacbf" data-id="1279b391226a805b8461c41ab16eacbf"><span><div id="1279b391226a805b8461c41ab16eacbf" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1279b391226a805b8461c41ab16eacbf" title="接下来看一下算法传入的参数"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">接下来看一下算法传入的参数</span></span></h3><div class="notion-text notion-block-1279b391226a8022ace1e6161a7e7468">大部分很好理解，这几个参数可以注意：</div><ul class="notion-list notion-list-disc notion-block-1279b391226a80a79ff0f031554d66a2"><li><b>grid_spacing_in_pixel</b>:</li><ul class="notion-list notion-list-disc notion-block-1279b391226a80a79ff0f031554d66a2"><li><b>描述</b>: 栅格的网格间距，以像素为单位。这个值决定了在规划路径时，机器人在地图上生成采样点的间隔。</li><li><b>作用</b>: 控制路径生成时的密度，如果间距太大，路径可能较为粗糙；如果间距太小，计算开销会增大，路径会更密集。</li></ul></ul><ul class="notion-list notion-list-disc notion-block-1279b391226a80488623df20acc2270c"><li><b>grid_obstacle_offset_</b>:</li><ul class="notion-list notion-list-disc notion-block-1279b391226a80488623df20acc2270c"><li><b>描述</b>: 障碍物偏移量，通常以栅格或像素为单位，表示机器人与障碍物之间需要保持的最小安全距离。规划路径时，系统会避开这个偏移量内的区域，确保机器人不会撞到障碍物。</li><li><b>作用</b>: 增加安全性，确保路径不靠近障碍物过近，避免碰撞。</li></ul></ul><ul class="notion-list notion-list-disc notion-block-1279b391226a80bca222d39366986616"><li><b>path_eps_</b>:</li><ul class="notion-list notion-list-disc notion-block-1279b391226a80bca222d39366986616"><li><b>描述</b>: 路径的精度或误差阈值，表示路径生成时的允许误差范围。在路径规划中，误差可以影响机器人对路径的执行精度和路线的光滑程度。</li><li><b>作用</b>: 控制路径生成时的精度要求，如果误差较小，路径更为精确，但可能需要更多的计算。</li></ul></ul><ul class="notion-list notion-list-disc notion-block-1279b391226a8013bb03f25cbcead4d4"><li><b>min_cell_area_</b>:</li><ul class="notion-list notion-list-disc notion-block-1279b391226a8013bb03f25cbcead4d4"><li><b>描述</b>: 最小栅格单元面积，表示路径生成时最小的覆盖区域。小于这个面积的区域可能会被忽略，或者特别处理。</li><li><b>作用</b>: 用于过滤非常小的空间单元，减少不必要的路径计算。</li></ul></ul><div class="notion-blank notion-block-1299b391226a80f0839bf815f5c9b1ce"> </div><div class="notion-text notion-block-1279b391226a804294b7e29ea782964a">其中，<b>path_eps_</b>可以控制路径的平滑程度</div><div class="notion-text notion-block-1279b391226a80b690d2c0eb37e04da6"><b>path_eps_</b> 作为路径规划中的误差阈值，通常表示路径允许的最大偏离或误差范围。</div><ul class="notion-list notion-list-disc notion-block-1279b391226a80e8b2dcd0fbb215d529"><li><b>path_eps_越大</b>:</li><ul class="notion-list notion-list-disc notion-block-1279b391226a80e8b2dcd0fbb215d529"><li>允许更大的误差，路径规划的计算会更宽松。</li><li>生成的路径可能不如更小的误差阈值那样精确，但路径会更加简化和平滑，可能会减少急转弯和路径的细节。</li><li>适合不需要严格精度的场景，优点是规划速度更快，但缺点是路径可能偏离预期位置较多。</li></ul></ul><ul class="notion-list notion-list-disc notion-block-1279b391226a804fae7fe20f4f807fd5"><li><b>path_eps_越小</b>:</li><ul class="notion-list notion-list-disc notion-block-1279b391226a804fae7fe20f4f807fd5"><li>允许的误差更小，路径生成时需要更加精确的计算。</li><li>路径的每一个细节都会更符合预期，因此更符合环境的实际情况。</li><li>但这可能会导致路径更加曲折，不够光滑，特别是在复杂的地形或有障碍物的环境中，路径可能包含更多的细节和急转。</li></ul></ul><ul class="notion-list notion-list-disc notion-block-1279b391226a80bfbafde5a60c3f507c"><li>如果<b>path_eps_</b> <b>值较大</b>，路径会<b>更光滑</b>，因为它忽略了一些小的细节，生成较为简化的路径。</li></ul><ul class="notion-list notion-list-disc notion-block-1279b391226a801283a2d8225a1b0f56"><li>如果<b>path_eps_</b> <b>值较小</b>，路径会<b>更精确</b>，但有时会导致不太光滑的路径，包含更多的弯曲和调整。</li></ul><div class="notion-text notion-block-1279b391226a806e9492d5ce36279f37">参数读取处，我将其从2.0修改为3.0，路径略微变得平滑。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1279b391226a8063ac8dcb912d694dab"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2Fbd2e1fee-48c8-49a1-a31f-d253b49b7748%2Fimage.png?table=block&amp;id=1279b391-226a-8063-ac8d-cb912d694dab&amp;t=1279b391-226a-8063-ac8d-cb912d694dab&amp;width=707.9896240234375&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-1289b391226a802ba122c9f8398f9c36">但在另一个配置文件中，发现这个参数与步长有关</div><div class="notion-text notion-block-1289b391226a8016876afc4ce8444b42">实验后发现，确实代表了生成的最大步长</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1279b391226a80ba9884ed35f55784b4" data-id="1279b391226a80ba9884ed35f55784b4"><span><div id="1279b391226a80ba9884ed35f55784b4" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1279b391226a80ba9884ed35f55784b4" title="存在问题"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">存在问题</span></span></h2><a target="_blank" rel="noopener noreferrer" href="https://github.com/ipa320/ipa_coverage_planning/issues/38" class="notion-external notion-external-block notion-row notion-block-1279b391226a804a8df1f8a6fec5af6e"><div class="notion-external-image"><svg viewBox="0 0 260 260"><g><path d="M128.00106,0 C57.3172926,0 0,57.3066942 0,128.00106 C0,184.555281 36.6761997,232.535542 87.534937,249.460899 C93.9320223,250.645779 96.280588,246.684165 96.280588,243.303333 C96.280588,240.251045 96.1618878,230.167899 96.106777,219.472176 C60.4967585,227.215235 52.9826207,204.369712 52.9826207,204.369712 C47.1599584,189.574598 38.770408,185.640538 38.770408,185.640538 C27.1568785,177.696113 39.6458206,177.859325 39.6458206,177.859325 C52.4993419,178.762293 59.267365,191.04987 59.267365,191.04987 C70.6837675,210.618423 89.2115753,204.961093 96.5158685,201.690482 C97.6647155,193.417512 100.981959,187.77078 104.642583,184.574357 C76.211799,181.33766 46.324819,170.362144 46.324819,121.315702 C46.324819,107.340889 51.3250588,95.9223682 59.5132437,86.9583937 C58.1842268,83.7344152 53.8029229,70.715562 60.7532354,53.0843636 C60.7532354,53.0843636 71.5019501,49.6441813 95.9626412,66.2049595 C106.172967,63.368876 117.123047,61.9465949 128.00106,61.8978432 C138.879073,61.9465949 149.837632,63.368876 160.067033,66.2049595 C184.49805,49.6441813 195.231926,53.0843636 195.231926,53.0843636 C202.199197,70.715562 197.815773,83.7344152 196.486756,86.9583937 C204.694018,95.9223682 209.660343,107.340889 209.660343,121.315702 C209.660343,170.478725 179.716133,181.303747 151.213281,184.472614 C155.80443,188.444828 159.895342,196.234518 159.895342,208.176593 C159.895342,225.303317 159.746968,239.087361 159.746968,243.303333 C159.746968,246.709601 162.05102,250.70089 168.53925,249.443941 C219.370432,232.499507 256,184.536204 256,128.00106 C256,57.3066942 198.691187,0 128.00106,0 Z M47.9405593,182.340212 C47.6586465,182.976105 46.6581745,183.166873 45.7467277,182.730227 C44.8183235,182.312656 44.2968914,181.445722 44.5978808,180.80771 C44.8734344,180.152739 45.876026,179.97045 46.8023103,180.409216 C47.7328342,180.826786 48.2627451,181.702199 47.9405593,182.340212 Z M54.2367892,187.958254 C53.6263318,188.524199 52.4329723,188.261363 51.6232682,187.366874 C50.7860088,186.474504 50.6291553,185.281144 51.2480912,184.70672 C51.8776254,184.140775 53.0349512,184.405731 53.8743302,185.298101 C54.7115892,186.201069 54.8748019,187.38595 54.2367892,187.958254 Z M58.5562413,195.146347 C57.7719732,195.691096 56.4895886,195.180261 55.6968417,194.042013 C54.9125733,192.903764 54.9125733,191.538713 55.713799,190.991845 C56.5086651,190.444977 57.7719732,190.936735 58.5753181,192.066505 C59.3574669,193.22383 59.3574669,194.58888 58.5562413,195.146347 Z M65.8613592,203.471174 C65.1597571,204.244846 63.6654083,204.03712 62.5716717,202.981538 C61.4524999,201.94927 61.1409122,200.484596 61.8446341,199.710926 C62.5547146,198.935137 64.0575422,199.15346 65.1597571,200.200564 C66.2704506,201.230712 66.6095936,202.705984 65.8613592,203.471174 Z M75.3025151,206.281542 C74.9930474,207.284134 73.553809,207.739857 72.1039724,207.313809 C70.6562556,206.875043 69.7087748,205.700761 70.0012857,204.687571 C70.302275,203.678621 71.7478721,203.20382 73.2083069,203.659543 C74.6539041,204.09619 75.6035048,205.261994 75.3025151,206.281542 Z M86.046947,207.473627 C86.0829806,208.529209 84.8535871,209.404622 83.3316829,209.4237 C81.8013,209.457614 80.563428,208.603398 80.5464708,207.564772 C80.5464708,206.498591 81.7483088,205.631657 83.2786917,205.606221 C84.8005962,205.576546 86.046947,206.424403 86.046947,207.473627 Z M96.6021471,207.069023 C96.7844366,208.099171 95.7267341,209.156872 94.215428,209.438785 C92.7295577,209.710099 91.3539086,209.074206 91.1652603,208.052538 C90.9808515,206.996955 92.0576306,205.939253 93.5413813,205.66582 C95.054807,205.402984 96.4092596,206.021919 96.6021471,207.069023 Z" fill="#161614"></path></g></svg></div><div class="notion-external-description"><div class="notion-external-title">I need your help</div><div class="notion-external-subtitle"><span>Updated <!-- -->Jul 25, 2024</span></div></div></a><a target="_blank" rel="noopener noreferrer" href="https://github.com/ipa320/ipa_coverage_planning/issues/25" class="notion-external notion-external-block notion-row notion-block-1279b391226a805187afdc835fe7e1ce"><div class="notion-external-image"><svg viewBox="0 0 260 260"><g><path d="M128.00106,0 C57.3172926,0 0,57.3066942 0,128.00106 C0,184.555281 36.6761997,232.535542 87.534937,249.460899 C93.9320223,250.645779 96.280588,246.684165 96.280588,243.303333 C96.280588,240.251045 96.1618878,230.167899 96.106777,219.472176 C60.4967585,227.215235 52.9826207,204.369712 52.9826207,204.369712 C47.1599584,189.574598 38.770408,185.640538 38.770408,185.640538 C27.1568785,177.696113 39.6458206,177.859325 39.6458206,177.859325 C52.4993419,178.762293 59.267365,191.04987 59.267365,191.04987 C70.6837675,210.618423 89.2115753,204.961093 96.5158685,201.690482 C97.6647155,193.417512 100.981959,187.77078 104.642583,184.574357 C76.211799,181.33766 46.324819,170.362144 46.324819,121.315702 C46.324819,107.340889 51.3250588,95.9223682 59.5132437,86.9583937 C58.1842268,83.7344152 53.8029229,70.715562 60.7532354,53.0843636 C60.7532354,53.0843636 71.5019501,49.6441813 95.9626412,66.2049595 C106.172967,63.368876 117.123047,61.9465949 128.00106,61.8978432 C138.879073,61.9465949 149.837632,63.368876 160.067033,66.2049595 C184.49805,49.6441813 195.231926,53.0843636 195.231926,53.0843636 C202.199197,70.715562 197.815773,83.7344152 196.486756,86.9583937 C204.694018,95.9223682 209.660343,107.340889 209.660343,121.315702 C209.660343,170.478725 179.716133,181.303747 151.213281,184.472614 C155.80443,188.444828 159.895342,196.234518 159.895342,208.176593 C159.895342,225.303317 159.746968,239.087361 159.746968,243.303333 C159.746968,246.709601 162.05102,250.70089 168.53925,249.443941 C219.370432,232.499507 256,184.536204 256,128.00106 C256,57.3066942 198.691187,0 128.00106,0 Z M47.9405593,182.340212 C47.6586465,182.976105 46.6581745,183.166873 45.7467277,182.730227 C44.8183235,182.312656 44.2968914,181.445722 44.5978808,180.80771 C44.8734344,180.152739 45.876026,179.97045 46.8023103,180.409216 C47.7328342,180.826786 48.2627451,181.702199 47.9405593,182.340212 Z M54.2367892,187.958254 C53.6263318,188.524199 52.4329723,188.261363 51.6232682,187.366874 C50.7860088,186.474504 50.6291553,185.281144 51.2480912,184.70672 C51.8776254,184.140775 53.0349512,184.405731 53.8743302,185.298101 C54.7115892,186.201069 54.8748019,187.38595 54.2367892,187.958254 Z M58.5562413,195.146347 C57.7719732,195.691096 56.4895886,195.180261 55.6968417,194.042013 C54.9125733,192.903764 54.9125733,191.538713 55.713799,190.991845 C56.5086651,190.444977 57.7719732,190.936735 58.5753181,192.066505 C59.3574669,193.22383 59.3574669,194.58888 58.5562413,195.146347 Z M65.8613592,203.471174 C65.1597571,204.244846 63.6654083,204.03712 62.5716717,202.981538 C61.4524999,201.94927 61.1409122,200.484596 61.8446341,199.710926 C62.5547146,198.935137 64.0575422,199.15346 65.1597571,200.200564 C66.2704506,201.230712 66.6095936,202.705984 65.8613592,203.471174 Z M75.3025151,206.281542 C74.9930474,207.284134 73.553809,207.739857 72.1039724,207.313809 C70.6562556,206.875043 69.7087748,205.700761 70.0012857,204.687571 C70.302275,203.678621 71.7478721,203.20382 73.2083069,203.659543 C74.6539041,204.09619 75.6035048,205.261994 75.3025151,206.281542 Z M86.046947,207.473627 C86.0829806,208.529209 84.8535871,209.404622 83.3316829,209.4237 C81.8013,209.457614 80.563428,208.603398 80.5464708,207.564772 C80.5464708,206.498591 81.7483088,205.631657 83.2786917,205.606221 C84.8005962,205.576546 86.046947,206.424403 86.046947,207.473627 Z M96.6021471,207.069023 C96.7844366,208.099171 95.7267341,209.156872 94.215428,209.438785 C92.7295577,209.710099 91.3539086,209.074206 91.1652603,208.052538 C90.9808515,206.996955 92.0576306,205.939253 93.5413813,205.66582 C95.054807,205.402984 96.4092596,206.021919 96.6021471,207.069023 Z" fill="#161614"></path></g></svg></div><div class="notion-external-description"><div class="notion-external-title">Some problems of covering paths on obstacle maps</div><div class="notion-external-subtitle"><span>Updated <!-- -->Aug 31, 2023</span></div></div></a><div class="notion-text notion-block-1279b391226a80a0b956c776335010ee">以上issue描述了相同的问题，即规划的路径会穿过不可达的位置，维护者在issue中解释了原因。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1289b391226a80b98497c54d2913a93a"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2F0ea8b89d-f5d2-4bd9-8fbb-6ab7b5088770%2Fimage.png?table=block&amp;id=1289b391-226a-80b9-8497-c54d2913a93a&amp;t=1289b391-226a-80b9-8497-c54d2913a93a&amp;width=708&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-1289b391226a80a88314dd478d87b467">后面代码分析会提到如何解决</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1289b391226a80e09039c66f2ef50ad4" data-id="1289b391226a80e09039c66f2ef50ad4"><span><div id="1289b391226a80e09039c66f2ef50ad4" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1289b391226a80e09039c66f2ef50ad4" title="代码分析"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">代码分析</span></span></h2><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1289b391226a80e4adc7fb5ad9b11e85" data-id="1289b391226a80e4adc7fb5ad9b11e85"><span><div id="1289b391226a80e4adc7fb5ad9b11e85" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1289b391226a80e4adc7fb5ad9b11e85" title="参考文章"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">参考文章</span></span></h3><div class="notion-row"><a target="_blank" rel="noopener noreferrer" class="notion-bookmark notion-block-1289b391226a80bca1fef1a4c6ccfeda" href="https://blog.csdn.net/jucat/article/details/139012652"><div><div class="notion-bookmark-title">ipa 覆盖算法分析（一）_coverage path planning: the boustrophedon cellular-CSDN博客</div><div class="notion-bookmark-description">文章浏览阅读1.5k次，点赞16次，收藏34次。ipa 功能包，牛耕法覆盖算法，细胞分解，单元分解。基于栅格的旅行商覆盖算法，基于神经网络的覆盖算法，局部能量最小覆盖算法，基于轮廓线的覆盖算法，凸感知放置覆盖算法_coverage path planning: the boustrophedon cellular decomposition</div><div class="notion-bookmark-link"><div class="notion-bookmark-link-icon"><img src="https://g.csdnimg.cn/static/logo/favicon32.ico?t=1289b391-226a-80bc-a1fe-f1a4c6ccfeda" alt="ipa 覆盖算法分析（一）_coverage path planning: the boustrophedon cellular-CSDN博客" loading="lazy" decoding="async"/></div><div class="notion-bookmark-link-text">https://blog.csdn.net/jucat/article/details/139012652</div></div></div></a></div><div class="notion-text notion-block-1289b391226a8027b052e842866abfdf">这篇文章详解了算法的原理和流程。</div><div class="notion-blank notion-block-1299b391226a80c78805e65b933cbd79"> </div><div class="notion-text notion-block-1299b391226a8087aacfe156a75b3830">论文pdf：</div><div class="notion-row"><a target="_blank" rel="noopener noreferrer" class="notion-bookmark notion-block-1299b391226a8042b571f52dd6d36ec3" href="https://www.ri.cmu.edu/pub_files/pub4/choset_howie_1997_3/choset_howie_1997_3.pdf"><div><div class="notion-bookmark-title">www.ri.cmu.edu</div><div class="notion-bookmark-link"><div class="notion-bookmark-link-text">https://www.ri.cmu.edu/pub_files/pub4/choset_howie_1997_3/choset_howie_1997_3.pdf</div></div></div></a></div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1289b391226a80f1936ffbdfb0345bb1" data-id="1289b391226a80f1936ffbdfb0345bb1"><span><div id="1289b391226a80f1936ffbdfb0345bb1" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1289b391226a80f1936ffbdfb0345bb1" title="两步走"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">两步走</span></span></h3><div class="notion-text notion-block-1289b391226a80cf8e22c825695728b5">可以从源码中发现，可以分为两大步骤，第一布是将图片分区，称为cell，第二部是画线。</div><div class="notion-text notion-block-1289b391226a80e0bf07cd57e5f42cc5">实验多种参数发现，边缘粗糙复杂的地图cell会非常多，这时会运行一个cell合并函数，将cell的数量减小。相关参数是 <code class="notion-inline-code">min_cell_area</code> 。</div><div class="notion-text notion-block-1289b391226a80a9aa89fccff2e6c882">接下来会对每个cell内部生成覆盖路径，前一个的尾和后一个的首相连得到最终路径。单个cell内首尾位置是没有约束的。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1289b391226a806d862eccb0bd37adb6" data-id="1289b391226a806d862eccb0bd37adb6"><span><div id="1289b391226a806d862eccb0bd37adb6" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1289b391226a806d862eccb0bd37adb6" title="路径穿过障碍或墙体的两种情况"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">路径穿过障碍或墙体的两种情况</span></span></h3><ol start="1" class="notion-list notion-list-numbered notion-block-1289b391226a8076bcbbda2e4080d814"><li>第一种是上面说到的两个cell之间尾首相连，只有两点一线，中间有可能穿过障碍或墙体</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-1289b391226a803e9acad45540afc745"><li>第二种即当步长设置过大，两点之间的路径可能会距离墙体太近或直接穿过。这是因为机器人投影面积的约束只对点有效，线经过哪里无法控制。</li></ol><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1289b391226a804ea754e581a1228b09" data-id="1289b391226a804ea754e581a1228b09"><span><div id="1289b391226a804ea754e581a1228b09" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1289b391226a804ea754e581a1228b09" title="解决办法"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">解决办法</span></span></h3><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1299b391226a80d09959f0fe5b4e1bf0" data-id="1299b391226a80d09959f0fe5b4e1bf0"><span><div id="1299b391226a80d09959f0fe5b4e1bf0" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a80d09959f0fe5b4e1bf0" title="第一种问题的解决方法"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">第一种问题的解决方法</span></span></h3><div class="notion-text notion-block-1289b391226a80b39222c42396ba9cb1">对于cell之间尾首相连的路径问题，可以在这两点之间使用A*算法规划一条路线。</div><div class="notion-text notion-block-1289b391226a80e8b710fd00396b1271">实现的代码需要添加到里：<code class="notion-inline-code">src/ipa_coverage_planning/ipa_room_exploration/common/src/boustrophedon_explorator.cpp</code></div><div class="notion-text notion-block-1289b391226a80e28d3cf3add3d052f3">这段代码在一个对cell的迭代器中，对每个cell，把cell内生成的路径推入总路径。</div><div class="notion-text notion-block-1299b391226a8089a1a8e4336c328a5c">我们可以在<code class="notion-inline-code">fov_middlepoint_path.insert(fov_middlepoint_path.end(), fov_middlepoint_path_part.begin(), fov_middlepoint_path_part.end());</code>前规划一段连接上一个cell内路径末尾的路径，在这行之前推入总路径。</div><div class="notion-text notion-block-1299b391226a80ca8df4c7b7014f9014">这里使用A*算法来规划路径，在这个软件包中，作者在<code class="notion-inline-code">src/ipa_coverage_planning/ipa_building_navigation/common</code>中已经完成了一个A*算法的实现，我们直接调用。</div><div class="notion-text notion-block-1299b391226a80ccafadf2c19e0e90bf">需要注意传入的地图，地图在程序中有多个旋转过的版本，需要转入原始地图。别忘了先判断存不存在上一段路径。</div><div class="notion-text notion-block-1299b391226a80c79f60de41bb4f37e8">结果如下，粗线即使用A*规划的路径，成功绕开了墙体。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1289b391226a80d89137dd9c54c4cc96"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2F8508219f-3ac6-4105-bdc5-281635974573%2Fimage.png?table=block&amp;id=1289b391-226a-80d8-9137-dd9c54c4cc96&amp;t=1289b391-226a-80d8-9137-dd9c54c4cc96&amp;width=707.9896240234375&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1299b391226a808c9d43e9af85f154fe" data-id="1299b391226a808c9d43e9af85f154fe"><span><div id="1299b391226a808c9d43e9af85f154fe" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a808c9d43e9af85f154fe" title="第二种情况"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">第二种情况</span></span></h3><div class="notion-text notion-block-1299b391226a80b98f8ffdc6c1357751">对于第二种情况，同样可以使用A*规划每两个点之间的路径，也可以减小<code class="notion-inline-code">path_eps</code>参数。</div><div class="notion-blank notion-block-1299b391226a809c859fc5d6cba090b4"> </div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[VDA5050协议]]></title>
            <link>https://tangly1024.com/article/1299b391-226a-8079-97f3-f737a263c71e</link>
            <guid>https://tangly1024.com/article/1299b391-226a-8079-97f3-f737a263c71e</guid>
            <pubDate>Thu, 24 Oct 2024 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-1299b391226a807997f3f737a263c71e"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1299b391226a80db8276fe974b3cb5ee" data-id="1299b391226a80db8276fe974b3cb5ee"><span><div id="1299b391226a80db8276fe974b3cb5ee" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a80db8276fe974b3cb5ee" title="VDA5050是什么"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">VDA5050是什么</span></span></h2><div class="notion-text notion-block-1299b391226a8084865bce94dcf956ba"><b>VDA5050 是 自动导引车 (AGV) 和主控制器之间通信接口的定义。</b></div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1299b391226a804a9414d3ade0ebc845"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2F2b569e03-3b38-4ce8-9f33-4cd7c7fc44fe%2Fimage.png?table=block&amp;id=1299b391-226a-804a-9414-d3ade0ebc845&amp;t=1299b391-226a-804a-9414-d3ade0ebc845&amp;width=707.9896240234375&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-1299b391226a80e5bae3c46a4f40f9d8">主控制器可以在本地，也可以在云计算中心。</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1299b391226a80329e8ee6e0a9f0093f" data-id="1299b391226a80329e8ee6e0a9f0093f"><span><div id="1299b391226a80329e8ee6e0a9f0093f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a80329e8ee6e0a9f0093f" title="沟通流程及内容"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>沟通流程及内容</b></span></span></h2><div class="notion-text notion-block-1299b391226a808c91c0de062ccfc3bd">AGV运行流程至少有以下部分：</div><ul class="notion-list notion-list-disc notion-block-1299b391226a80b28ed8fbe517a813bb"><li>AGV的系统提供基本信息</li></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a8012b93fc3dd625aefa4"><li>主控组织管理运行</li></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a80669a3fc812e97db898"><li>AGV执行指令</li></ul><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1299b391226a8097b6ede25b7e6884cf"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:636px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2Fbbdfd010-b6ac-4162-9da2-edd3d6322258%2Fimage.png?table=block&amp;id=1299b391-226a-8097-b6ed-e25b7e6884cf&amp;t=1299b391-226a-8097-b6ed-e25b7e6884cf&amp;width=636&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-1299b391226a80cfa8a2cb06e7ac04ac">在实施阶段，建立了由主控和AGV组成的无人驾驶运输系统（DTS）。必要的框架条件由操作员定义，所需的信息要么由操作员手动输入，要么通过从其他系统导入来存储在主控制器中。本质上，这涉及以下内容：</div><ul class="notion-list notion-list-disc notion-block-1299b391226a80a882ccee45b9ebe1c6"><li>线路定义：使用CAD导入，可以将线路导入到主控中。或者，也可以由操作员在主控制器中手动实施路线。路线可以是单向街道，限制某些车辆组（基于尺寸比例）等。</li></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a80d689a6c4ee9adb29a0"><li>路线网络配置：路线内定义装卸站、充电站、周边环境（闸机、电梯、道闸）、候车位、缓冲站等。</li></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a80889bc2e362ceb0aa92"><li>车辆配置：AGV 的物理属性（尺寸、可用的负载载体安装座等）由操作员存储。 AGV 应以文档<a target="_blank" rel="noopener noreferrer" class="notion-link" href="https://github.com/VDA5050/VDA5050/blob/main/VDA5050_EN.md#615-topic-factsheet">主题“情况说明书”</a>中定义的特定方式通过主题情况<code class="notion-inline-code">factsheet</code>传达此信息。</li></ul><div class="notion-text notion-block-1299b391226a803ebbc8e166d8d6a956">上述路由配置和路由网络不属于本文档的内容。它们构成了主控制器基于此信息和要完成的运输要求实现订单控制和驾驶路线分配的基础。然后，AGV 的最终订单通过 MQTT 消息代理传输到车辆。然后，在执行作业的同时，不断向主控制器报告其状态。这也是使用 MQTT 消息代理完成的。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1299b391226a809eb5a3cb7365e04d62" data-id="1299b391226a809eb5a3cb7365e04d62"><span><div id="1299b391226a809eb5a3cb7365e04d62" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a809eb5a3cb7365e04d62" title="主控的功能"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">主控的功能</span></span></h3><ul class="notion-list notion-list-disc notion-block-1299b391226a80c1a1f9cfcfc4ee2542"><li>Assignment of orders to the AGVs</li><ul class="notion-list notion-list-disc notion-block-1299b391226a80c1a1f9cfcfc4ee2542"><div class="notion-text notion-block-1299b391226a80a0be6ece6a27402eed">将订单分配给 AGV</div></ul></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a80a7b65ad66309344fab"><li>Route calculation and guidance of the AGVs (taking into account the limitations of the individual physical properties of each AGV, e.g., size, maneuverability, etc.)</li><ul class="notion-list notion-list-disc notion-block-1299b391226a80a7b65ad66309344fab"><div class="notion-text notion-block-1299b391226a80769021cdbabc8cb970">AGV 的路线计算和引导（考虑到每个 AGV 个体物理特性的限制，例如尺寸、机动性等）</div></ul></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a80abb46bf7be18785242"><li>Detection and resolution of blockages (&quot;deadlocks&quot;)</li><ul class="notion-list notion-list-disc notion-block-1299b391226a80abb46bf7be18785242"><div class="notion-text notion-block-1299b391226a80ab89b9f66410561479">阻塞（“死锁”）的检测和解决</div></ul></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a8048a61fd555528db1be"><li>Energy management: Charging orders can interrupt transfer orders</li><ul class="notion-list notion-list-disc notion-block-1299b391226a8048a61fd555528db1be"><div class="notion-text notion-block-1299b391226a805599edf62e04d0227d">能源管理：充电指令可以中断转移指令</div></ul></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a80abaaa8fb9742fb7e0c"><li>Traffic control: Buffer routes and waiting positions</li><ul class="notion-list notion-list-disc notion-block-1299b391226a80abaaa8fb9742fb7e0c"><div class="notion-text notion-block-1299b391226a801ebc60da4053635441">交通管制：缓冲路线和等候位置</div></ul></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a8005af75e38014622507"><li>(Temporary) changes in the environment, such as freeing certain areas or changing the maximum speed</li><ul class="notion-list notion-list-disc notion-block-1299b391226a8005af75e38014622507"><div class="notion-text notion-block-1299b391226a800ba580e67ac9a84d48">（临时）环境变化，例如释放某些区域或更改最大速度</div></ul></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a805a8998d8293d8d6e82"><li>Communication with peripheral systems such as doors, gates, elevators, etc.</li><ul class="notion-list notion-list-disc notion-block-1299b391226a805a8998d8293d8d6e82"><div class="notion-text notion-block-1299b391226a805dbc08edeec2d4cd2e">与门、大门、电梯等外围系统通信</div></ul></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a8066899bdcf0416284a0"><li>Detection and resolution of communication errors</li><ul class="notion-list notion-list-disc notion-block-1299b391226a8066899bdcf0416284a0"><div class="notion-text notion-block-1299b391226a803da0eed111a9671ac9">通信错误的检测和解决</div></ul></ul><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1299b391226a8074a7fed9c5f473293c" data-id="1299b391226a8074a7fed9c5f473293c"><span><div id="1299b391226a8074a7fed9c5f473293c" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a8074a7fed9c5f473293c" title="AGV的功能"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">AGV的功能</span></span></h3><ul class="notion-list notion-list-disc notion-block-1299b391226a80a69243c14054f3ca2b"><li>Localization</li><ul class="notion-list notion-list-disc notion-block-1299b391226a80a69243c14054f3ca2b"><div class="notion-text notion-block-1299b391226a801293eff93cc5e199cb">定位</div></ul></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a8069aa1bfec417ad1d3b"><li>Navigation along associated routes (guided or autonomous)</li><ul class="notion-list notion-list-disc notion-block-1299b391226a8069aa1bfec417ad1d3b"><div class="notion-text notion-block-1299b391226a805bb63fe10240c92e02">沿着相关路线导航（引导或自主）</div></ul></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a804996dff9754a8744ff"><li>Execution of actions</li><ul class="notion-list notion-list-disc notion-block-1299b391226a804996dff9754a8744ff"><div class="notion-text notion-block-1299b391226a8033bb49ec4ec50f773f">行动的执行</div></ul></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a809c8d5ae75831730895"><li>Continuous transmission of vehicle status</li><ul class="notion-list notion-list-disc notion-block-1299b391226a809c8d5ae75831730895"><div class="notion-text notion-block-1299b391226a8027b768e6bb835f2a0b">车辆状态持续传输</div></ul></ul><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1299b391226a807a83ffd1443fcd89d4" data-id="1299b391226a807a83ffd1443fcd89d4"><span><div id="1299b391226a807a83ffd1443fcd89d4" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a807a83ffd1443fcd89d4" title="协议规范"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>协议规范</b></span></span></h2><div class="notion-text notion-block-1299b391226a806a9ec3f466820efe83">协议规定了主控与AGV之间的通信。不同的消息显示在描述作为指令、状态等发送的 JSON 字段内容的表格中。</div><div class="notion-text notion-block-1299b391226a8095850cfd2c1119900a">此外，JSON 架构可在公共 git 存储库 ( <a target="_blank" rel="noopener noreferrer" class="notion-link" href="https://github.com/VDA5050/VDA5050">https://github.com/VDA5050/VDA5050</a> ) 中进行验证。 </div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1299b391226a805c9ec6c81864b70dcd" data-id="1299b391226a805c9ec6c81864b70dcd"><span><div id="1299b391226a805c9ec6c81864b70dcd" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a805c9ec6c81864b70dcd" title="表格符号及格式含义"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>表格符号及格式含义</b></span></span></h3><table class="notion-simple-table notion-block-1299b391226a8062a205c883906c6a5f"><tbody><tr class="notion-simple-table-row notion-block-1299b391226a80c2a02ce39f39693254"><td class="" style="width:345px"><div class="notion-simple-table-cell">Identification</div></td><td class="" style="width:345px"><div class="notion-simple-table-cell">Description</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80ea9e28e0d7f10a5962"><td class="" style="width:345px"><div class="notion-simple-table-cell">standard</div></td><td class="" style="width:345px"><div class="notion-simple-table-cell">Variable is an elementary data type</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a8072951ff273d46de960"><td class="" style="width:345px"><div class="notion-simple-table-cell"><b>bold</b></div></td><td class="" style="width:345px"><div class="notion-simple-table-cell">Variable is a non-elementary data type (e.g., JSON object or array) and defined separately</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80bdae2df53e7cbcc18f"><td class="" style="width:345px"><div class="notion-simple-table-cell"><em>italic</em></div></td><td class="" style="width:345px"><div class="notion-simple-table-cell">Variable is optional</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a8069bf30fe8de6913573"><td class="" style="width:345px"><div class="notion-simple-table-cell"><em><b>italic and bold</b></em></div></td><td class="" style="width:345px"><div class="notion-simple-table-cell">Variable is optional and a non-elementary data type</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80eb9c72d7ee816486ff"><td class="" style="width:345px"><div class="notion-simple-table-cell">arrayName[arrayDataType]</div></td><td class="" style="width:345px"><div class="notion-simple-table-cell">Variable (here arrayName) is an array of the data type included in the square brackets (here the data type is arrayDataType)</div></td></tr></tbody></table><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-1299b391226a8020b8a1ef67726acb05" data-id="1299b391226a8020b8a1ef67726acb05"><span><div id="1299b391226a8020b8a1ef67726acb05" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a8020b8a1ef67726acb05" title="Optional"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>Optional</b></span></span></h4><div class="notion-text notion-block-1299b391226a80f88fa2e4954bdbf4f6">如果一个变量被标记为可选，则意味着它对于发送者来说是可选的，因为该变量在某些情况下可能不适用（例如，当主控向 AGV 发送命令时，一些 AGV 会自行规划其轨迹和场地） <code class="notion-inline-code">edge</code>对象内的<code class="notion-inline-code">trajectory</code>顺序可以省略）。</div><div class="notion-text notion-block-1299b391226a805c8d39d961988f24ea">主控只发送AGV支持的可选信息。</div><div class="notion-text notion-block-1299b391226a802db157dc2bbe862aef">示例：轨迹是可选的。如果AGV无法处理轨迹，主控不得向车辆发送轨迹。</div><div class="notion-text notion-block-1299b391226a809bb83ce4878e672f69">AGV 应通过 AGV <code class="notion-inline-code">factsheet</code>消息传达其需要的可选参数。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-1299b391226a80a084a1d933f0e751f9" data-id="1299b391226a80a084a1d933f0e751f9"><span><div id="1299b391226a80a084a1d933f0e751f9" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a80a084a1d933f0e751f9" title="允许的字符和字段长度"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>允许的字符和字段长度</b></span></span></h4><div class="notion-text notion-block-1299b391226a8075b00df8addb3ab6f8">所有通信均以 UTF-8 编码，以实现描述的国际适应。建议 ID 应仅使用以下字符：</div><div class="notion-text notion-block-1299b391226a804e8ff8f2c6c1e78547"><code class="notion-inline-code">A-Z a-z 0-9 _ - . :</code></div><div class="notion-text notion-block-1299b391226a80c7a5bbded3be2fbd1e">最大消息长度没有定义，但受到 MQTT 协议规范的限制，并且可能受到情况说明书中定义的技术约束的限制。如果 AGV 内存不足以处理传入订单，则会拒绝该订单。最大字段长度、字符串长度或值范围的匹配由积分器决定。为了便于集成，AGV 供应商应提供 AGV 资料表，详细信息请参阅<a target="_blank" rel="noopener noreferrer" class="notion-link" href="https://github.com/VDA5050/VDA5050/blob/main/VDA5050_EN.md#616-topic-factsheet">资料表部分</a>。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-1299b391226a80a1bb30d5b4a1859a6f" data-id="1299b391226a80a1bb30d5b4a1859a6f"><span><div id="1299b391226a80a1bb30d5b4a1859a6f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a80a1bb30d5b4a1859a6f" title="字段、主题和枚举的表示法"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>字段、主题和枚举的表示法</b></span></span></h4><div class="notion-text notion-block-1299b391226a807ea210d70739584f36">本文档中的主题和字段以以下样式突出显示： <code class="notion-inline-code">exampleField</code>和<code class="notion-inline-code">exampleTopic</code> 。枚举应以大写字母书写。这些值在文档中用单引号引起来。这包括诸如<code class="notion-inline-code">actionStatus</code>字段中的关键字（“WAITING”、“FINISHED”等）。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-1299b391226a800f9c43eecba0893bd5" data-id="1299b391226a800f9c43eecba0893bd5"><span><div id="1299b391226a800f9c43eecba0893bd5" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a800f9c43eecba0893bd5" title="JSON 数据类型"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>JSON 数据类型</b></span></span></h4><div class="notion-text notion-block-1299b391226a800e9e82fadce4e84cbd">如果可能，应使用 JSON 数据类型。因此，布尔值由“true”或“false”编码，而不是用枚举（“TRUE”、“FALSE”）或幻数编码。</div><div class="notion-text notion-block-1299b391226a8096a607d3fa25969bb3">数值数据类型用类型和精度指定，例如float64 或uint32。不支持 IEEE 754 中的特殊数值，例如 NaN 和无穷大。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1299b391226a809e98a4c7863820a239" data-id="1299b391226a809e98a4c7863820a239"><span><div id="1299b391226a809e98a4c7863820a239" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a809e98a4c7863820a239" title="MQTT 连接处理、安全性和 QoS"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>MQTT 连接处理、安全性和 QoS</b></span></span></h3><div class="notion-text notion-block-1299b391226a80069f28c5d43e6b8b28">MQTT 协议提供为客户端设置最后遗嘱消息的选项。如果客户端因任何原因意外断开连接，最后的遗嘱将由代理分发给其他订阅的客户端。该功能的使用在第<a target="_blank" rel="noopener noreferrer" class="notion-link" href="https://github.com/VDA5050/VDA5050/blob/main/VDA5050_EN.md#614-topic-connection">6.14 节主题“连接”</a>中描述。</div><div class="notion-text notion-block-1299b391226a807788a0f4a3522d5106">如果 AGV 与代理断开连接，它会保留所有指令信息并履行直到最后发布的节点为止的指令。</div><div class="notion-text notion-block-1299b391226a80aa9bc5e75de5227dff">代理配置需要考虑协议安全性。</div><div class="notion-text notion-block-1299b391226a80aa9830df9149835954">为了减少通信开销，MQTT QoS 级别 0（尽力而为）将用于主题<code class="notion-inline-code">order</code> 、 <code class="notion-inline-code">instantActions</code> 、 <code class="notion-inline-code">state</code> 、 <code class="notion-inline-code">factsheet</code>和<code class="notion-inline-code">visualization</code> 。主题<code class="notion-inline-code">connection</code>应使用 QoS 级别 1（至少一次）。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1299b391226a80dfaff3c61d212f19bf" data-id="1299b391226a80dfaff3c61d212f19bf"><span><div id="1299b391226a80dfaff3c61d212f19bf" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a80dfaff3c61d212f19bf" title="MQTT 主题级别"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>MQTT 主题级别</b></span></span></h3><div class="notion-text notion-block-1299b391226a8077a9dbece4fd3af95e">以下部分中定义的主题名称是强制性的。</div><div class="notion-text notion-block-1299b391226a80ed80bcff641008e3e9">对于本地broker，建议的 MQTT 主题级别如下：</div><div class="notion-text notion-block-1299b391226a8049b059fe3c0cbd6104"><b>interfaceName/majorVersion/manufacturer/serialNumber/topic</b></div><div class="notion-text notion-block-1299b391226a8023b84aec3928750a8d">Example: </div><table class="notion-simple-table notion-block-1299b391226a8027a63ccf674340d9f1"><tbody><tr class="notion-simple-table-row notion-block-1299b391226a8083ad7ffe72bd9d1fec"><td class="" style="width:230px"><div class="notion-simple-table-cell">MQTT Topic Level</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">Data type</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">Description</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a802e92d8f15983853ea0"><td class="" style="width:230px"><div class="notion-simple-table-cell">interfaceName</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">Name of the used interface</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a801fae5dc2b9458ff7fe"><td class="" style="width:230px"><div class="notion-simple-table-cell">majorVersion</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">Major version number of the VDA 5050 recommendation, preceded by &quot;v&quot;</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a8054a944f96222b2a252"><td class="" style="width:230px"><div class="notion-simple-table-cell">manufacturer</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">Manufacturer of the AGV.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80289184d9814baa1474"><td class="" style="width:230px"><div class="notion-simple-table-cell">serialNumber</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">Unique AGV serial number consisting of the following characters:A-Za-z0-9_.:-</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80debd9ef5d019a91302"><td class="" style="width:230px"><div class="notion-simple-table-cell">topic</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">Topic (e.g., order or state) see Section <a target="_blank" rel="noopener noreferrer" class="notion-link" href="https://github.com/VDA5050/VDA5050/blob/main/VDA5050_EN.md#65-topics-for-communication">6.5 Topics for Communication</a></div></td></tr></tbody></table><div class="notion-callout notion-gray_background_co notion-block-1299b391226a80d8bf25f4de970157af"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="💡">💡</span></div><div class="notion-callout-text"><div class="notion-text notion-block-1299b391226a80a49c1ffe39dc466578">注意：由于<code class="notion-inline-code">/</code>字符用于定义主题层次结构，因此不得在上述任何字段中使用它。 <code class="notion-inline-code">$</code>字符也在一些 MQTT 代理中用于特殊的内部主题，因此也不应该使用它。</div></div></div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1299b391226a804ca1ecf882ac8f23b2" data-id="1299b391226a804ca1ecf882ac8f23b2"><span><div id="1299b391226a804ca1ecf882ac8f23b2" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a804ca1ecf882ac8f23b2" title="Protocol header"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>Protocol header</b></span></span></h3><div class="notion-text notion-block-1299b391226a80f7af4cf16faee1fd17">每个 JSON 消息都以header开头。在以下部分中，为了便于阅读，以下字段将被引用为header。header由以下各个元素组成。<span class="notion-red_background">header不是 JSON 对象。</span></div><table class="notion-simple-table notion-block-1299b391226a804a9fd1e773cfb0ba59"><tbody><tr class="notion-simple-table-row notion-block-1299b391226a80f2b1a4c23932632008"><td class="" style="width:230px"><div class="notion-simple-table-cell">Object structure/Identifier</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">Data type</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">Description</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80298572d479596d2319"><td class="" style="width:230px"><div class="notion-simple-table-cell">headerId</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">uint32</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">Header ID of the message.The headerId is defined per topic and incremented by 1 with each sent (but not necessarily received) message.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80038f46ecfd6c0b97d4"><td class="" style="width:230px"><div class="notion-simple-table-cell">timestamp</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">Timestamp (ISO 8601, UTC); YYYY-MM-DDTHH:mm:ss.ffZ (e.g., &quot;2017-04-15T11:40:03.12Z&quot;).</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80069992eca4da20dc35"><td class="" style="width:230px"><div class="notion-simple-table-cell">version</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">Version of the protocol [Major].[Minor].[Patch] (e.g., 1.3.2).</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80638615d2da9ac9695c"><td class="" style="width:230px"><div class="notion-simple-table-cell">manufacturer</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">Manufacturer of the AGV.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a804eb351eb13ab631a18"><td class="" style="width:230px"><div class="notion-simple-table-cell">serialNumber</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:230px"><div class="notion-simple-table-cell">Serial number of the AGV.</div></td></tr></tbody></table><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1299b391226a80dca8ebcc1b8fce1fa2" data-id="1299b391226a80dca8ebcc1b8fce1fa2"><span><div id="1299b391226a80dca8ebcc1b8fce1fa2" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a80dca8ebcc1b8fce1fa2" title="Topics for communication"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>Topics for communication</b></span></span></h3><div class="notion-text notion-block-1299b391226a808ca7e0eb3ba1f92c5d">AGV协议使用以下主题进行主控与AGV之间的信息交换。</div><table class="notion-simple-table notion-block-1299b391226a808ebb89c958ab8cc7e9"><tbody><tr class="notion-simple-table-row notion-block-1299b391226a8047a1ffd91c1558a7a2"><td class="" style="width:115px"><div class="notion-simple-table-cell">Topic name</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">Published by</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">Subscribed by</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">Used for</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">Implementation</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">Schema</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a8038b0cbe12cd5a5fd2d"><td class="" style="width:115px"><div class="notion-simple-table-cell">order</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">master control</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">AGV</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">Communication of driving orders from master control to the AGV</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">mandatory</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">order.schema</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a8031a3b6fafc3a3ccec6"><td class="" style="width:115px"><div class="notion-simple-table-cell">instantActions</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">master control</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">AGV</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">Communication of the actions that are to be executed immediately</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">mandatory</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">instantActions.schema</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a8058a111eddaee641db5"><td class="" style="width:115px"><div class="notion-simple-table-cell">state</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">AGV</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">master control</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">Communication of the AGV state</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">mandatory</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">state.schema</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80649647df3071f3b44b"><td class="" style="width:115px"><div class="notion-simple-table-cell">visualization</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">AGV</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">Visualization systems</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">Higher frequency of position topic for visualization purposes only</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">optional</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">visualization.schema</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80b9ade0ccefbe870903"><td class="" style="width:115px"><div class="notion-simple-table-cell">connection</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">Broker/AGV</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">master control</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">Indicates when AGV connection is lost, not to be used by master control for checking the vehicle health, added for an MQTT protocol level check of connection</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">mandatory</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">connection.schema</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80c3ac94e9063fc81cd0"><td class="" style="width:115px"><div class="notion-simple-table-cell">factsheet</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">AGV</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">master control</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">Parameters or vendor-specific information to assist set-up of the AGV in master control</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">mandatory</div></td><td class="" style="width:115px"><div class="notion-simple-table-cell">factsheet.schema</div></td></tr></tbody></table><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1299b391226a80a6ae16f9f56bd9902d" data-id="1299b391226a80a6ae16f9f56bd9902d"><span><div id="1299b391226a80a6ae16f9f56bd9902d" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a80a6ae16f9f56bd9902d" title="Topic内容"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">Topic内容</span></span></h2><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1299b391226a80148b30f987980effe6" data-id="1299b391226a80148b30f987980effe6"><span><div id="1299b391226a80148b30f987980effe6" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a80148b30f987980effe6" title="Topic: &quot;order&quot; (from master control to AGV)"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>Topic: &quot;order&quot; (from master control to AGV)</b></span></span></h3><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-1299b391226a806e9d4eeb3be4a15477" data-id="1299b391226a806e9d4eeb3be4a15477"><span><div id="1299b391226a806e9d4eeb3be4a15477" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a806e9d4eeb3be4a15477" title="概念与逻辑"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>概念与逻辑</b></span></span></h4><div class="notion-text notion-block-1299b391226a80f1809fe87b3f48c4d5">主题“order”是 MQTT 主题，AGV 通过该主题接收 JSON 封装的order。</div><div class="notion-text notion-block-1299b391226a8012ba02d9300e964fa5">order的基本结构是节点和边的图。 AGV 预计会遍历节点和边来完成order。所有连接的节点和边的完整图由主控制保存。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1299b391226a808fb012dc22d7df4078"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2F50411b9f-b2b4-4cf3-b849-d03a9d46779a%2Fimage.png?table=block&amp;id=1299b391-226a-808f-b012-dc22d7df4078&amp;t=1299b391-226a-808f-b012-dc22d7df4078&amp;width=707.9791870117188&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><blockquote class="notion-quote notion-block-1299b391226a8072bd67dafac17f6941"><div>Graph representation in master control and graph transmitted in orders</div></blockquote><ul class="notion-list notion-list-disc notion-block-1299b391226a806db329d71ddc6b4cf5"><li>节点和边作为order消息中的两个列表进行传递。这些列表中的节点和边的顺序也决定了节点和边的遍历顺序。</li></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a80c6a193d4babf6d4cc5"><li>对于有效的order，至少应有一个节点，并且边的数量应等于节点数减一。</li></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a808188a6cd06a10b3129"><li>AGV 应该能够轻松到达订单的第一个节点。这意味着要么AGV已经站在节点上，要么AGV处于节点的偏差范围内。</li></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a8017badcd78b4258f5c4"><li>节点和边都有一个布尔属性<code class="notion-inline-code">released</code> 。如果某个节点或边被释放，AGV 就会穿过它。如果节点或边未被释放，AGV 不得遍历它。</li></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a809f8ebffccacec1e704"><li>只有当一条边的起始节点和结束节点都被释放时，该边才能被释放。</li></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a80ecb5f9d74cda7f5b45"><li>在未释放的边之后，序列中不能跟随任何已释放的节点或边。</li></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a8057bb9bff04e51fb5a8"><li>释放的节点和边的集合称为“base”。未释放的节点和边的集合称为“horizon”。</li></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a8014952cf0d9c517c721"><li>发送没有horison的order是合法的。</li></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a80cc844af20ae9b6deeb"><li>order消息不一定描述完整的运输订单。为了进行交通控制并容纳资源受限的车辆，完整的运输order（可能由许多节点和边组成）可以分为许多子order，这些子order通过其<code class="notion-inline-code">orderId</code>和<code class="notion-inline-code">orderUpdateId</code>连接。更新order的过程将在下一节中描述。</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-1299b391226a803f90d5cdfb0749e317" data-id="1299b391226a803f90d5cdfb0749e317"><span><div id="1299b391226a803f90d5cdfb0749e317" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a803f90d5cdfb0749e317" title="Orders and order update"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>Orders and order update</b></span></span></h4><div class="notion-text notion-block-1299b391226a804b8fa9cc9bbd5ad188">为了支持流量管理，主控可以将通过命令通信的路径分为两部分：</div><ul class="notion-list notion-list-disc notion-block-1299b391226a80e6b21fea64dc714d61"><li><em>“Base”</em> ：这是允许 AGV 行驶的定义路线。基本路线的所有节点和边缘均已被车辆主控释放。基的最后一个节点称为decision point。</li></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a80959705cf3327f6a699"><li><em>“horizon”</em> ：这是主控当前规划的AGV在决策点之后行驶的路线。horizon路径尚未被主控释放。</li></ul><div class="notion-text notion-block-1299b391226a8023a54feeb04762bfe6">如果没有进一步的节点和边添加到基础上，AGV 将停止在决策点。为了保证运动流畅，在交通情况允许的情况下，主控应在AGV到达决策点之前扩展base。</div><div class="notion-text notion-block-1299b391226a80cbb2fdc5396dfab1a0">由于 MQTT 是异步协议，通过无线网络传输不可靠，因此base无法更改。因此，主控应假定base已被 AGV 执行。后面的部分描述了取消order的过程，但由于上述通信限制，这也被认为是不可靠的。</div><div class="notion-text notion-block-1299b391226a8004bfb2c91774356621">主控制器可以通过向 AGV 发送更新的路线来改变horizon，其中包括更改的节点和边列表。改变horizon路径的流程如图4所示。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1299b391226a80c39e0be6b2a51afd44"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2F6d4d89d7-4b06-4dc0-a5be-52fb4f2e4c46%2Fimage.png?table=block&amp;id=1299b391-226a-80c3-9e0b-e6b2a51afd44&amp;t=1299b391-226a-80c3-9e0b-e6b2a51afd44&amp;width=707.9896240234375&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><blockquote class="notion-quote notion-block-1299b391226a801baab5ea9eb9280201"><div>图4 更改行驶路线“Horizon”的流程</div></blockquote><div class="notion-text notion-block-1299b391226a8035b9bbf0c1daba8cb8">在图 4 中，控制面板首先在时间 t = 1 时发送初始作业。图 5 显示了可能作业的伪代码。为了便于阅读，这里省略了完整的 JSON 示例。</div><blockquote class="notion-quote notion-block-1299b391226a80238e53db7470ad60ed"><div>图 5 order的伪代码。</div></blockquote><div class="notion-callout notion-gray_background_co notion-block-1299b391226a80f5a45ae36b880f3215"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="💡">💡</span></div><div class="notion-callout-text"><div class="notion-text notion-block-1299b391226a8060b7bae2e1bdbc8f14">在时间 t = 3 时，通过发送order扩展来更新order（参见图 6 中的示例）。请注意， <code class="notion-inline-code">orderUpdateId</code>会递增，并且order更新的第一个节点对应于前一个order消息的最后一个共享base节点。</div></div></div><div class="notion-text notion-block-1299b391226a80eb8f93c41f9b76d0b7">这确保了AGV也可以执行order更新，即通过执行AGV已知的边可以到达作业更新的第一个节点。</div><blockquote class="notion-quote notion-block-1299b391226a80068c66d115b6acea57"><div>图 6 order更新的伪代码。请注意<code class="notion-inline-code">orderUpdateId</code>的更改。</div></blockquote><div class="notion-text notion-block-1299b391226a80aca98decad0baf60b4">这在order update丢失的情况下也有帮助（例如，由于无线网络不可靠）。 AGV 始终可以检查最后一个已知的基本节点是否与第一个新的基本节点具有相同的<code class="notion-inline-code">nodeId</code> （以及<code class="notion-inline-code">nodeSequenceId</code> ，稍后会详细介绍）。</div><div class="notion-text notion-block-1299b391226a80e68679de6bdc60deee">另请注意，节点 g 是唯一再次发送的基节点。由于基数无法更改，因此节点 f 和 d 的重传无效。</div><div class="notion-text notion-block-1299b391226a80f6b7cecf3184d2d42f">重要的是，拼接节点（示例中的节点 g）的内容不会改变。对于动作、偏差范围等，AGV应使用<b>第一条</b>order中提供的指令（图5，orderUpdateId 0）。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1299b391226a807299a9eb7cfd712b4d"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2F05016292-573c-49ba-8c94-0cfb5516b17e%2Fimage.png?table=block&amp;id=1299b391-226a-8072-99a9-eb7cfd712b4d&amp;t=1299b391-226a-8072-99a9-eb7cfd712b4d&amp;width=707.9896240234375&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><blockquote class="notion-quote notion-block-1299b391226a808e9836da178c609dd0"><div>图7 定期更新流程-order extension。</div></blockquote><div class="notion-text notion-block-1299b391226a804d9348cff2bcba3615">图 7 描述了如何延长order。它显示 AGV 当前可用的信息。 <code class="notion-inline-code">orderId</code>保持不变， <code class="notion-inline-code">orderUpdateId</code>递增。</div><div class="notion-text notion-block-1299b391226a8021a40beab54ab58818">前一个基节点的最后一个节点是更新顺序中的第一个基节点。通过该节点，AGV 可以将更新的order添加到当前order上（缝合）。来自前一个基的其他节点和边不会重新发送。</div><div class="notion-text notion-block-1299b391226a802cb1a1f02072599f65">主控制可以选择通过发送完全不同的节点作为新base来更改horizon。horizon也可以删除。</div><div class="notion-text notion-block-1299b391226a8053ae63f06f4ed39167">为了允许按顺序循环（例如从节点 a 到 b，然后再返回到 a），将<code class="notion-inline-code">sequenceId</code>分配给节点和边对象。该<code class="notion-inline-code">sequenceId</code>在节点和边上运行（订单的第一个节点接收0，第一个边然后获取1，第二个节点然后获取2，依此类推）。这样可以更轻松地跟踪order进度。</div><div class="notion-text notion-block-1299b391226a80369786efd4fe5d8d32">一旦分配了<code class="notion-inline-code">sequenceId</code> ，它就不会随着order更新而改变（参见图7）。这对于AGV侧确定主控指的是哪个节点是必要的。</div><div class="notion-text notion-block-1299b391226a8054831bc5621528c78c">图8描述了接受order或order更新的过程。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1299b391226a80b19c92d4575148a5e8"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2F48a756d6-a722-4573-b7d8-14c014786fa9%2Fimage.png?table=block&amp;id=1299b391-226a-80b1-9c92-d4575148a5e8&amp;t=1299b391-226a-80b1-9c92-d4575148a5e8&amp;width=707.9896240234375&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><blockquote class="notion-quote notion-block-1299b391226a80ce9f07e4a9bcf93cb6"><div>图8 接受order或order update的流程。</div></blockquote><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-1299b391226a80fab59fd309bb03dd74" data-id="1299b391226a80fab59fd309bb03dd74"><span><div id="1299b391226a80fab59fd309bb03dd74" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a80fab59fd309bb03dd74" title="Order cancellation"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>Order cancellation</b></span></span></h4><div class="notion-text notion-block-1299b391226a80118271f42a4823cb37">如果基本节点发生意外更改，则应使用 instantAction <code class="notion-inline-code">cancelOrder</code>取消order。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1299b391226a809cb9d0cdbe80cedb05"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2F1ab4f2ec-142c-4fb4-93c2-2a71fa226af7%2Fimage.png?table=block&amp;id=1299b391-226a-809c-b9d0-cdbe80cedb05&amp;t=1299b391-226a-809c-b9d0-cdbe80cedb05&amp;width=707.9896240234375&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><blockquote class="notion-quote notion-block-1299b391226a80bc8f82eddb7f3add18"><div>图 9 <code class="notion-inline-code">cancelOrder</code>后的预期行为。</div></blockquote><div class="notion-text notion-block-1299b391226a80deb294e7a274321970">取消order后，车辆应处于接受新order的状态。</div><div class="notion-text notion-block-1299b391226a80b08b77f1d3e2d236f3">如果 AGV 通过标签将自身定位在节点上，则新order必须从 AGV 现在所在的节点开始（另请参见图 5）。</div><div class="notion-text notion-block-1299b391226a80b3adadc05d7b4a2311">如果 AGV 可以在节点之间停止，则选择由主控制如何启动下一个order。 AGV 应接受这两种方法。</div><div class="notion-text notion-block-1299b391226a801d8fd9c3d274bc2223">两种选择：</div><ul class="notion-list notion-list-disc notion-block-1299b391226a80c6b069c2cbe9ca6d0d"><li>发送一个order，其中第一个节点是临时节点，位于AGV当前所在的位置。然后，AGV 应意识到该节点是可轻松到达的并接受order。</li></ul><ul class="notion-list notion-list-disc notion-block-1299b391226a80868c8bec299f7c58ac"><li>发送一个order，其中第一个节点是上一个订单的最后一个遍历的节点，但将偏差范围设置得足够大，使 AGV 在此范围内。因此，AGV 应意识到该节点应被计为已遍历并接受order。</li></ul><div class="notion-text notion-block-1299b391226a804c9e5cc4cd2f52a87f">如果 AGV 收到<code class="notion-inline-code">cancelOrder</code>操作，但 AGV 当前没有order，或者先前的order已取消，则<code class="notion-inline-code">cancelOrder</code>操作应报告为“FAILED”。</div><div class="notion-text notion-block-1299b391226a80f98ba2f58ec2253381">AGV 应报告“noOrderToCancel”错误，并将<code class="notion-inline-code">errorLevel</code>设置为“警告”。 <code class="notion-inline-code">instantAction</code>的<code class="notion-inline-code">actionId</code>应作为<code class="notion-inline-code">errorReference</code>传递。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1299b391226a80d4a47cca0f4cd82751" data-id="1299b391226a80d4a47cca0f4cd82751"><span><div id="1299b391226a80d4a47cca0f4cd82751" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a80d4a47cca0f4cd82751" title="Order rejection"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>Order rejection</b></span></span></h3><div class="notion-text notion-block-1299b391226a806bb2bbf8ce95021a4a">‣</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1299b391226a80888b38d7e2d5eb3cac" data-id="1299b391226a80888b38d7e2d5eb3cac"><span><div id="1299b391226a80888b38d7e2d5eb3cac" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a80888b38d7e2d5eb3cac" title="Corridors"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>Corridors</b></span></span></h3><div class="notion-text notion-block-1299b391226a80c49e62ebe75f5ee3bd">可选的<code class="notion-inline-code">corridor</code>边缘属性允许车辆偏离边缘轨迹以避障，并定义允许车辆运行的边界。要使用<code class="notion-inline-code">corridor</code>属性，需要一个预定义的轨迹，如果未定义<code class="notion-inline-code">corridor</code>属性，车辆将遵循该轨迹。这可以是主控制器已知的在车辆上定义的轨迹，也可以是按order发送的轨迹。使用<code class="notion-inline-code">corridor</code>属性的车辆的行为仍然是线路引导车辆的行为，只不过它允许暂时偏离轨迹以避开障碍物。</div><div class="notion-text notion-block-1299b391226a802382f5c8abedc356f0"><em>备注：order内的边定义两个节点之间的逻辑连接，而不一定是车辆从起始节点行驶到结束节点时遵循的（真实）轨迹。根据车辆类型，车辆在起始节点和结束节点之间采取的轨迹要么由主控制通过轨迹边缘属性定义，要么作为预定义轨迹分配给车辆。根据车辆的内部状态，选择的轨迹可能会有所不同。</em></div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1299b391226a801aba0fcec6ebb7a9d0"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa1338f7c-8510-46e4-8a52-b87c3838cf79%2F44c3f9f8-6ead-4bee-82af-6181f3ae4591%2Fimage.png?table=block&amp;id=1299b391-226a-801a-ba0f-cec6ebb7a9d0&amp;t=1299b391-226a-801a-ba0f-cec6ebb7a9d0&amp;width=707.9791870117188&amp;cache=v2" alt="notion image" loading="lazy" decoding="async"/></div></figure><blockquote class="notion-quote notion-block-1299b391226a8037a112eb101523399b"><div>图 10 具有<code class="notion-inline-code">corridor</code>属性的边缘，定义了允许车辆偏离其预定义轨迹以避开障碍物的左右边界。左侧，运动中心定义了允许的偏差，而右侧，车辆的轮廓（可能因负载而延伸）定义了允许的偏差。这是由<code class="notion-inline-code">corridorRefPoint</code>参数定义的。</div></blockquote><div class="notion-text notion-block-1299b391226a80068e13de6645b31c64">允许车辆独立导航（并偏离原始边缘轨迹）的区域由左边界和右边界定义。可选的<code class="notion-inline-code">corridorRefPoint</code>字段指定车辆控制点或车辆轮廓是否应位于定义的边界内。边缘的边界应以这样的方式定义：车辆一经过节点就位于新的当前边缘的边界内。如果车辆不偏离轨迹，主控不应使用<code class="notion-inline-code">corridor</code>属性，而不是将走廊边界设置为零。</div><div class="notion-text notion-block-1299b391226a8008b4b2fc6787003137">车辆的运动控制软件应不断检查车辆是否在定义的边界内。否则，车辆应因超出允许的导航空间而停车并报告错误。主控制器可以通过取消当前命令并向车辆发送带有允许车辆再次移动的走廊信息的新命令来决定是否需要用户交互或者车辆是否可以继续。</div><div class="notion-text notion-block-1299b391226a80fd8fe4d277164b691d"><em>备注：允许车辆偏离轨迹会增加车辆在行驶过程中可能的足迹。在初始运行时，如果主控根据车辆的足迹做出交通控制决策，则应考虑这种情况。</em></div><div class="notion-text notion-block-1299b391226a80488c91e6c787669abf">另请参阅<a target="_blank" rel="noopener noreferrer" class="notion-link" href="https://github.com/VDA5050/VDA5050/blob/main/VDA5050_EN.md#6102-traversal-of-nodes-and-enteringleaving-edges-triggering-of-actions">遍历节点和进入/离开边缘</a>以获取更多信息。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1299b391226a80b3aaf8c2e2f6d27f7f" data-id="1299b391226a80b3aaf8c2e2f6d27f7f"><span><div id="1299b391226a80b3aaf8c2e2f6d27f7f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1299b391226a80b3aaf8c2e2f6d27f7f" title="Implementation of the order message"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>Implementation of the order message</b></span></span></h3><table class="notion-simple-table notion-block-1299b391226a800183b2c2c73a083280"><tbody><tr class="notion-simple-table-row notion-block-1299b391226a80be9a16c65285057baf"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Object structure</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Unit</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Data type</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Description</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a806482fee2e3578be465"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">headerId</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">uint32</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Header ID of the message.The header ID is defined per topic and incremented by 1 with each sent (but not necessarily received) message.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a806f9c6ec90987a2c7b8"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">timestamp</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Timestamp (ISO 8601, UTC); YYYY-MM-DDTHH:mm:ss.ffZ (e.g., &quot;2017-04-15T11:40:03.12Z&quot;)</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a8019b500cbc69d041316"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">version</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Version of the protocol [Major].[Minor].[Patch] (e.g., 1.3.2)</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80458835d07855de6120"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">manufacturer</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Manufacturer of the AGV</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80f892d9f14667a28ab3"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">serialNumber</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Serial number of the AGV</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a8067ac4cd428b619fc79"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">orderId</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Order identification.This is to be used to identify multiple order messages that belong to the same order.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a805eb61ac3dee78814b2"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">orderUpdateId</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">uint32</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Order update identification.Is unique per orderId.If an order update is rejected, this field is to be passed in the rejection message.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a805f9d37c3dafc63309e"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em>zoneSetId</em></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Unique identifier of the zone set, that the AGV has to use for navigation or that was used by master control for planning.Optional: Some master control systems do not use zones.Some AGVs do not understand zones.Do not add to message, if no zones are used.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a8054ac6dd67fc4387097"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><b>nodes [node]</b></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">array</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Array of node objects to be traversed for fulfilling the order.One node is enough for a valid order.Leave edge array empty in that case.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80808adfd2e5ce9b528b"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><b>edges [edge]</b></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">array</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Array of edge objects to be traversed for fulfilling the order.One node is enough for a valid order.Leave edge array empty in that case.</div></td></tr></tbody></table><table class="notion-simple-table notion-block-1299b391226a8039875cead9354836c9"><tbody><tr class="notion-simple-table-row notion-block-1299b391226a803992cdef7c7123f717"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Object structure</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Unit</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Data type</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Description</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a807b9239ed1dbd8a6dae"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><b>node</b> {</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">JSON object</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a804591f7d6248e7450f3"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">nodeId</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Unique node identification</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80a19ccdcc537e0da60a"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">sequenceId</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">uint32</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Number to track the sequence of nodes and edges in an order and to simplify order updates.The main purpose is to distinguish between a node, which is passed more than once within one orderId.The variable sequenceId runs across all nodes and edges of the same order and is reset when a new orderId is issued.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80289e7ed1c4fd81ef61"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em>nodeDescription</em></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Additional information on the node</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a8086b533d9704b364129"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">released</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">boolean</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">&quot;true&quot; indicates that the node is part of the base.&quot;false&quot; indicates that the node is part of the horizon.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80a188fce42368c956ac"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em><b>nodePosition</b></em></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">JSON object</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Node position.Optional for vehicle types that do not require the node position (e.g., line-guided vehicles).</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a808398d9c1c3bc256773"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><b>actions [action]</b>}</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">array</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Array of actions to be executed on a node.Empty array, if no actions required.</div></td></tr></tbody></table><table class="notion-simple-table notion-block-1299b391226a80fbac45fc36865fe11a"><tbody><tr class="notion-simple-table-row notion-block-1299b391226a80b185fdf7d8ef1e6b56"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Object structure</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Unit</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Data type</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Description</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a806082acec5cf40c5eb7"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><b>nodePosition</b> {</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">JSON object</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Defines the position on a map in a global project-specific world coordinate system.Each floor has its own map.All maps shall use the same project-specific global origin.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a802ab550d803aa797f3c"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">x</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">m</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">float64</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">X-position on the map in reference to the map coordinate system.Precision is up to the specific implementation.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80d88414c164f2206f1e"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">y</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">m</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">float64</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Y-position on the map in reference to the map coordinate system.Precision is up to the specific implementation.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80b1acb5e1bb9419f22d"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em>theta</em></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">rad</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">float64</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Range: [-Pi ... Pi]Absolute orientation of the AGV on the node.Optional: vehicle can plan the path by itself.If defined, the AGV has to assume the theta angle on this node.If previous edge disallows rotation, the AGV shall rotate on the node.If following edge has a differing orientation defined but disallows rotation, the AGV is to rotate on the node to the edges desired rotation before entering the edge.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80cab156cd2b668ee40f"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em>allowedDeviationXY</em></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">m</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">float64</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Indicates how precisely an AGV shall match the position of a node for it to be considered traversed.If = 0.0: no deviation is allowed (no deviation means within the normal tolerance of the AGV manufacturer).If &gt; 0.0: allowed deviation radius in meters.If the AGV passes a node within the deviation radius, the node can be considered traversed.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80628c6bd5135b2ee8a4"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em>allowedDeviationTheta</em></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">rad</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">float64</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Range: [0.0 ... Pi]Indicates how precise the orientation defined in theta has to be met on the node by the AGV.The lowest acceptable angle is theta - allowedDeviationTheta and the highest acceptable angle is theta + allowedDeviationTheta.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a805b8e8fc777077906cc"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">mapId</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Unique identification of the map on which the position is referenced.Each map has the same project-specific global origin of coordinates.When an AGV uses an elevator, e.g., leading from a departure floor to a target floor, it will disappear off the map of the departure floor and spawn in the related lift node on the map of the target floor.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a8095b3a9f828ae88e529"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em>mapDescription</em>}</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Additional information on the map.</div></td></tr></tbody></table><table class="notion-simple-table notion-block-1299b391226a80c6b006e81e94792e0d"><tbody><tr class="notion-simple-table-row notion-block-1299b391226a80d6a261cbf1bc8d1646"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Object structure</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Unit</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Data type</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Description</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a8041b53df18cc06ee33b"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><b>action</b> {</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">JSON object</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Describes an action that the AGV can perform.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80aea5b8c6de8f757060"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">actionType</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Name of action as described in the first column of &quot;Actions and Parameters&quot;.Identifies the function of the action.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a803ca2dbdfe67f596250"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">actionId</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Unique ID to identify the action and map them to the actionState in the state.Suggestion: Use UUIDs.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a809ebeb1c700ddd328d0"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em>actionDescription</em></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Additional information on the action</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a809a98a6db4b687f9d8e"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">blockingType</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Enum {&#x27;NONE&#x27;, &#x27;SOFT&#x27;, &#x27;HARD&#x27;}:&#x27;NONE&#x27;: allows driving and other actions;&#x27;SOFT&#x27;: allows other actions but not driving;&#x27;HARD&#x27;: is the only allowed action at that time.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80388d1feae80152854b"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em><b>actionParameters [actionParameter]</b></em>}</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">array</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Array of actionParameter objects for the indicated action, e.g., &quot;deviceId&quot;, &quot;loadId&quot;, &quot;external triggers&quot;.An example implementation can be found in <a target="_blank" rel="noopener noreferrer" class="notion-link" href="https://github.com/VDA5050/VDA5050/blob/main/VDA5050_EN.md#72-format-of-parameters">7.2 Format of parameters</a>.</div></td></tr></tbody></table><table class="notion-simple-table notion-block-1299b391226a80afbc70c1480ab4a408"><tbody><tr class="notion-simple-table-row notion-block-1299b391226a807e8831e7a0bfb5757a"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Object structure</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Unit</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Data type</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Description</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a806f8b6ef9d7f97c77fc"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><b>edge</b> {</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">JSON object</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Directional connection between two nodes.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a802abdf9ece41d821a64"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">edgeId</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Unique edge identification.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80b8ade8d69d548f1745"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">sequenceId</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">uint32</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Number to track the sequence of nodes and edges in an order and to simplify order updates.The variable sequenceId runs across all nodes and edges of the same order and is reset when a new orderId is issued.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80c0bf88ca59f05f1f16"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em>edgeDescription</em></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Additional information on the edge.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a806d9272e7edabb498f8"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">released</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">boolean</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">&quot;true&quot; indicates that the edge is part of the base.&quot;false&quot; indicates that the edge is part of the horizon.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80d8b93de45e9d34374a"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">startNodeId</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">nodeId of first node within the order.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80fb9e59ed1922f2e429"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">endNodeId</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">nodeId of the last node within the order.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a8062a24ce16216b9e3af"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em>maxSpeed</em></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">m/s</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">float64</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Permitted maximum speed on the edge.Speed is defined by the fastest measurement of the vehicle.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a805c82e1d2839fe39a7e"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em>maxHeight</em></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">m</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">float64</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Permitted maximum height of the vehicle, including the load, on the edge.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80728012f9f15bf941be"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em>minHeight</em></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">m</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">float64</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Permitted minimal height of the load handling device on the edge.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80919558c76a881f07cd"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em>orientation</em></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">rad</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">float64</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Orientation of the AGV on the edge. The value <code class="notion-inline-code">orientationType</code> defines if it has to be interpreted relative to the global project-specific map coordinate system or tangential to the edge. In case of interpreted tangential to the edge, 0.0 denotes driving forwards and PI denotes driving backwards.Example: orientation Pi/2 rad will lead to a rotation of 90 degrees.If the AGV starts in a different orientation, rotate the vehicle on the edge to the desired orientation, if <code class="notion-inline-code">rotationAllowed</code> is set to &quot;true&quot;.If <code class="notion-inline-code">rotationAllowed</code> is &quot;false&quot;, rotate before entering the edge.If that is not possible, reject the order.If no trajectory is defined, apply the rotation to the direct path between the two connecting nodes of the edge.If a trajectory is defined for the edge, apply the orientation to the trajectory.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80e9b3fbfc181fd17f89"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em>orientationType</em></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Enum {&#x27;GLOBAL&#x27;, &#x27;TANGENTIAL&#x27;}:&#x27;GLOBAL&#x27;: relative to the global project-specific map coordinate system;&#x27;TANGENTIAL&#x27;: tangential to the edge.If not defined, the default value is &#x27;TANGENTIAL&#x27;.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80b4a183f1eeba04d0aa"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em>direction</em></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Sets direction at junctions for line-guided or wire-guided vehicles, to be defined initially (vehicle-individual).Examples: &quot;left&quot;, &quot;right&quot;, &quot;straight&quot;.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a8037b7b8c97930051c80"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em>rotationAllowed</em></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">boolean</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">&quot;true&quot;: rotation is allowed on the edge.&quot;false&quot;: rotation is not allowed on the edge.Optional:No limit, if not set.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a808ab406c62797f39c56"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em>maxRotationSpeed</em></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">rad/s</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">float64</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Maximum rotation speedOptional:No limit, if not set.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a809e828cf3c6d4fab705"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em><b>trajectory</b></em></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">JSON object</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Trajectory JSON object for this edge as NURBS.Defines the path, on which the AGV should move between the start node and the end node of the edge.Optional:Can be omitted, if the AGV cannot process trajectories or if the AGV plans its own trajectory.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a809981a1e74764614f3c"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em>length</em></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">m</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">float64</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Length of the path from the start node to the end nodeOptional:This value is used by line-guided AGVs to decrease their speed before reaching a stop position.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80eeb648dea6cac73eee"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em><b>corridor</b></em></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">JSON object</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Definition of boundaries in which a vehicle can deviate from its trajectory, e.g., to avoid obstacles.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80dd88a9cf7ba2c4fd66"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><b>action [action]</b>}</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">array</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Array of actions to be executed on the edge.Empty array, if no actions required.An action triggered by an edge will only be active for the time that the AGV is traversing the edge which triggered the action.When the AGV leaves the edge, the action will stop and the state before entering the edge will be restored.</div></td></tr></tbody></table><table class="notion-simple-table notion-block-1299b391226a80d498dacb806ba5d06e"><tbody><tr class="notion-simple-table-row notion-block-1299b391226a80d49e7ac05035f7cee1"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Object structure</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Unit</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Data type</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Description</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80c4bb02c15074b6c8e6"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><b>trajectory</b> {</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">JSON object</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80e58ffbcb1749e7b965"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">degree</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">float64</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Range: [1.0 ... float64.max]Degree of the NURBS curve defining the trajectory.If not defined, the default value is 1.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a806485baf11b9bbf17b4"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><b>knotVector [float64]</b></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">array</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Range: [0.0 ... 1.0]Array of knot values of the NURBS.knotVector has size of number of control points + degree + 1.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80ca9355fa1661f6df39"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><b>controlPoints [controlPoint]</b>}</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">array</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Array of controlPoint objects defining the control points of the NURBS, explicitly including the start and end point.</div></td></tr></tbody></table><table class="notion-simple-table notion-block-1299b391226a80e799baebd8c569b250"><tbody><tr class="notion-simple-table-row notion-block-1299b391226a802996ebdd20238e3976"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Object structure</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Unit</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Data type</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Description</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a802fb1dbf4ed395cd482"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><b>controlPoint</b> {</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">JSON object</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80c2acc2ed3ecd6bbc7e"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">x</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">float64</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">X-coordinate described in the world coordinate system.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80d490e2f7d0e9ff88be"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">y</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">float64</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Y-coordinate described in the world coordinate system.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a8009a0cdf753d4f00113"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em>weight</em></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">float64</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Range: [0.0 ... float64.max]The weight of the control point on the curve.When not defined, the default will be 1.0.</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80c69093cc7e2e6cc7d4"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">}</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td></tr></tbody></table><table class="notion-simple-table notion-block-1299b391226a80199891d43569f75b67"><tbody><tr class="notion-simple-table-row notion-block-1299b391226a80b69294e7af98a9d04f"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Object structure</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Unit</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Data type</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Description</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80c5a3e2e1f4dbd3ea04"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em><b>corridor</b></em> {</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">JSON object</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80febca6db8211d00997"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">leftWidth</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">m</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">float64</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Range: [0.0 ... float64.max]Defines the width of the corridor in meters to the left related to the trajectory of the vehicle (see Figure 13).</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80769432f9222a05023b"><td class="" style="width:172.5px"><div class="notion-simple-table-cell">rightWidth</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">m</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">float64</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Range: [0.0 ... float64.max]Defines the width of the corridor in meters to the right related to the trajectory of the vehicle (see Figure 13).</div></td></tr><tr class="notion-simple-table-row notion-block-1299b391226a80c3b113e92f7c9750d1"><td class="" style="width:172.5px"><div class="notion-simple-table-cell"><em>corridorRefPoint</em><b>}</b></div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">string</div></td><td class="" style="width:172.5px"><div class="notion-simple-table-cell">Defines whether the boundaries are valid for the kinematic center or the contour of the vehicle. If not specified the boundaries are valid to the vehicles kinematic center.Enum { &#x27;KINEMATICCENTER&#x27; , &#x27;CONTOUR&#x27; }</div></td></tr></tbody></table><div class="notion-blank notion-block-1299b391226a80618751da6c26dc6e44"> </div></main></div>]]></content:encoded>
        </item>
    </channel>
</rss>