<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.lessokaji.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Artheru</id>
	<title>MDCS wiki - 用户贡献 [zh-cn]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.lessokaji.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Artheru"/>
	<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E7%89%B9%E6%AE%8A:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/Artheru"/>
	<updated>2026-04-15T16:01:16Z</updated>
	<subtitle>用户贡献</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%9B%B4%E5%A4%9A%E4%BA%A4%E7%AE%A1%E7%BB%86%E8%8A%82%E7%94%A8%E6%B3%95&amp;diff=988</id>
		<title>使用手册 - 更多交管细节用法</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%9B%B4%E5%A4%9A%E4%BA%A4%E7%AE%A1%E7%BB%86%E8%8A%82%E7%94%A8%E6%B3%95&amp;diff=988"/>
		<updated>2026-02-15T10:01:08Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1.必空点 ==&lt;br /&gt;
&lt;br /&gt;
=== 1.1 必空点概念 ===&lt;br /&gt;
在Simple中，可以通过站点上mustFree的字段添加必空点，在id为1的必空点上添加mustFree:[2,3]代表当1号点被锁时，2、3号点不能被锁。&lt;br /&gt;
&lt;br /&gt;
注意必空点为单向的概念，即1号点被锁，2、3不能被锁，但2、3被锁不影响1号点的上锁情况。&lt;br /&gt;
&lt;br /&gt;
=== 1.2 如何配置必空点 ===&lt;br /&gt;
&lt;br /&gt;
# 可以通过在站点上添加mustFree字段来添加必空点。&lt;br /&gt;
# 可以通过点击”设置必空点“来添加。&lt;br /&gt;
&lt;br /&gt;
[[文件:2c247231da7eee82f61394abfcdabd9.png|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
[[文件:982cbb082b59f743ed46acfef0eb665.png|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bonus：&lt;br /&gt;
&lt;br /&gt;
此外，路线可以设置sconflicts或conflicts，前者是行走某个路径和某个站点冲突，后者是两个路径不能同时行走。可以用于一些交管复杂的情况。&lt;br /&gt;
[[文件:ImageTrackConflicts.png|无|缩略图|如此例中，左路线和右点可能存在干涉：车辆在冲突点黄色点旋转时可能会影响左路线行驶，因此可以在路线上标记sconflicts处理该问题。]]&lt;br /&gt;
&lt;br /&gt;
== 2.修改Simple项目属性 ==&lt;br /&gt;
Simple中项目属性如下图，其中含义在”MDCS参数表：Simple“中有叙述。&lt;br /&gt;
&lt;br /&gt;
[[文件:755a68e08f05a3e843db325873a5d2c.png]]&lt;br /&gt;
&lt;br /&gt;
=== 1. 搜索路线时允许终点和别的车的终点重合 ===&lt;br /&gt;
plan里加“forbid_cross”字段，设置为“true”。&lt;br /&gt;
&lt;br /&gt;
（Search_AllowDestOnRoute为True：表示允许本次搜索路线的终点在别的车的路径上）&lt;br /&gt;
&lt;br /&gt;
=== 2. 寻路时某个点需要经过多次 ===&lt;br /&gt;
将Search_MaxVisitPerSite（每个站点最多的经过次数）和Search_MaxDupVisit（整条路径上最多重复经过多少个站点）改大一些。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''3. 寻路时和交管相关的抛出异常：'''&lt;br /&gt;
&lt;br /&gt;
* DestinationSameException：搜索路径的终点和其他车相同。conflictedCars包含了冲突车的列表。&lt;br /&gt;
** 可以使用“forbid_cross”来暂时允许，多用于要连续拼接多条路线的情况。但如果整条路线终点确实和其他车的终点重合，那么无法进行交管规划。&lt;br /&gt;
** 可编辑终点为terminal点或sink点。&lt;br /&gt;
** 若其他车具有escape，则不会冲突。&lt;br /&gt;
* DestinationOnRouteException：搜索路径的终点停在其他车的路径上。这个异常可能会在未来被移除。可设置参数Search_AllowDestOnRoute为true来屏蔽该异常。&lt;br /&gt;
** 之所以抛该异常是因为这会导致：当前车在到达终点前，必须先等其他车经过终点后才能前往终点。&lt;br /&gt;
* DestinationBlockedException： 有车堵塞了该车前往终点的路径：这些车停在当前车去目标点的必经路径上或即将到达堵塞位置。conflictedCars包含了堵塞车的列表。&lt;br /&gt;
** 若堵塞车的终点为terminal点或sink点，或设置有escape路径，那么可以防止该异常发生。&lt;br /&gt;
&lt;br /&gt;
== 交管事件 ==&lt;br /&gt;
用户程序可以监听交管事件。目前提供以下事件：&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public delegate void TrafficControlEvent(AbstractCar car, int siteId);&lt;br /&gt;
public delegate void TrafficDeadLockEvent(AbstractCar[] loopingCar);&lt;br /&gt;
public delegate bool TrafficControlBeforeLockCallback(AbstractCar car, int siteId);&lt;br /&gt;
        &lt;br /&gt;
public static TrafficControlBeforeLockCallback BeforeLock; //在小车试图获取锁时调用：参数为哪个车试图获取哪个锁，返回true表示允许获取，返回false表示拒绝。&lt;br /&gt;
public static TrafficControlEvent OnLockAcquired; //在小车已拿到锁时调用：参数为哪个车获取了哪个锁&lt;br /&gt;
public static TrafficControlEvent AfterLeave; //在小车释放锁时调用：参数为哪个车释放了哪个锁&lt;br /&gt;
public static TrafficDeadLockEvent OnDeadLock; //在系统检测到死锁情况时调用。参数为发生了死锁的车辆。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;其中业务程序中常用的事件主要是BeforeLock/AfterLeave事件，这个事件可以用于控制车辆的诸如排队充电、排队取货等行为。&lt;br /&gt;
&lt;br /&gt;
=== 不可停站点 ===&lt;br /&gt;
[[文件:Image-nonstop.png|无|缩略图]]&lt;br /&gt;
通过模拟，人工经常能够分辨出一个地图上容易发生堵塞的位置。SimpleCore支持对站点加nonstop:true属性：此时计算交管时会保证加了该标记的站点一定不会停靠。&lt;br /&gt;
&lt;br /&gt;
工作原理是：小车对于连续的nonstop站点会连续拿锁到非nonstop站点，从而保证可以连续行走，不在nonstop站点停车堵塞。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-nonstop.png&amp;diff=987</id>
		<title>文件:Image-nonstop.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-nonstop.png&amp;diff=987"/>
		<updated>2026-02-15T09:59:14Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;一个nonstop站点的例子&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%9B%B4%E5%A4%9A%E4%BA%A4%E7%AE%A1%E7%BB%86%E8%8A%82%E7%94%A8%E6%B3%95&amp;diff=986</id>
		<title>使用手册 - 更多交管细节用法</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%9B%B4%E5%A4%9A%E4%BA%A4%E7%AE%A1%E7%BB%86%E8%8A%82%E7%94%A8%E6%B3%95&amp;diff=986"/>
		<updated>2026-02-06T09:20:18Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​/* 1.必空点 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1.必空点 ==&lt;br /&gt;
&lt;br /&gt;
=== 1.1 必空点概念 ===&lt;br /&gt;
在Simple中，可以通过站点上mustFree的字段添加必空点，在id为1的必空点上添加mustFree:[2,3]代表当1号点被锁时，2、3号点不能被锁。&lt;br /&gt;
&lt;br /&gt;
注意必空点为单向的概念，即1号点被锁，2、3不能被锁，但2、3被锁不影响1号点的上锁情况。&lt;br /&gt;
&lt;br /&gt;
=== 1.2 如何配置必空点 ===&lt;br /&gt;
&lt;br /&gt;
# 可以通过在站点上添加mustFree字段来添加必空点。&lt;br /&gt;
# 可以通过点击”设置必空点“来添加。&lt;br /&gt;
&lt;br /&gt;
[[文件:2c247231da7eee82f61394abfcdabd9.png|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
[[文件:982cbb082b59f743ed46acfef0eb665.png|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bonus：&lt;br /&gt;
&lt;br /&gt;
此外，路线可以设置sconflicts或conflicts，前者是行走某个路径和某个站点冲突，后者是两个路径不能同时行走。可以用于一些交管复杂的情况。&lt;br /&gt;
[[文件:ImageTrackConflicts.png|无|缩略图|如此例中，左路线和右点可能存在干涉：车辆在冲突点黄色点旋转时可能会影响左路线行驶，因此可以在路线上标记sconflicts处理该问题。]]&lt;br /&gt;
&lt;br /&gt;
== 2.修改Simple项目属性 ==&lt;br /&gt;
Simple中项目属性如下图，其中含义在”MDCS参数表：Simple“中有叙述。&lt;br /&gt;
&lt;br /&gt;
[[文件:755a68e08f05a3e843db325873a5d2c.png]]&lt;br /&gt;
&lt;br /&gt;
=== 1. 搜索路线时允许终点和别的车的终点重合 ===&lt;br /&gt;
plan里加“forbid_cross”字段，设置为“true”。&lt;br /&gt;
&lt;br /&gt;
（Search_AllowDestOnRoute为True：表示允许本次搜索路线的终点在别的车的路径上）&lt;br /&gt;
&lt;br /&gt;
=== 2. 寻路时某个点需要经过多次 ===&lt;br /&gt;
将Search_MaxVisitPerSite（每个站点最多的经过次数）和Search_MaxDupVisit（整条路径上最多重复经过多少个站点）改大一些。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''3. 寻路时和交管相关的抛出异常：'''&lt;br /&gt;
&lt;br /&gt;
* DestinationSameException：搜索路径的终点和其他车相同。conflictedCars包含了冲突车的列表。&lt;br /&gt;
** 可以使用“forbid_cross”来暂时允许，多用于要连续拼接多条路线的情况。但如果整条路线终点确实和其他车的终点重合，那么无法进行交管规划。&lt;br /&gt;
** 可编辑终点为terminal点或sink点。&lt;br /&gt;
** 若其他车具有escape，则不会冲突。&lt;br /&gt;
* DestinationOnRouteException：搜索路径的终点停在其他车的路径上。这个异常可能会在未来被移除。可设置参数Search_AllowDestOnRoute为true来屏蔽该异常。&lt;br /&gt;
** 之所以抛该异常是因为这会导致：当前车在到达终点前，必须先等其他车经过终点后才能前往终点。&lt;br /&gt;
* DestinationBlockedException： 有车堵塞了该车前往终点的路径：这些车停在当前车去目标点的必经路径上或即将到达堵塞位置。conflictedCars包含了堵塞车的列表。&lt;br /&gt;
** 若堵塞车的终点为terminal点或sink点，或设置有escape路径，那么可以防止该异常发生。&lt;br /&gt;
&lt;br /&gt;
== 交管事件 ==&lt;br /&gt;
用户程序可以监听交管事件。目前提供以下事件：&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public delegate void TrafficControlEvent(AbstractCar car, int siteId);&lt;br /&gt;
public delegate void TrafficDeadLockEvent(AbstractCar[] loopingCar);&lt;br /&gt;
public delegate bool TrafficControlBeforeLockCallback(AbstractCar car, int siteId);&lt;br /&gt;
        &lt;br /&gt;
public static TrafficControlBeforeLockCallback BeforeLock; //在小车试图获取锁时调用：参数为哪个车试图获取哪个锁，返回true表示允许获取，返回false表示拒绝。&lt;br /&gt;
public static TrafficControlEvent OnLockAcquired; //在小车已拿到锁时调用：参数为哪个车获取了哪个锁&lt;br /&gt;
public static TrafficControlEvent AfterLeave; //在小车释放锁时调用：参数为哪个车释放了哪个锁&lt;br /&gt;
public static TrafficDeadLockEvent OnDeadLock; //在系统检测到死锁情况时调用。参数为发生了死锁的车辆。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;其中业务程序中常用的事件主要是BeforeLock/AfterLeave事件，这个事件可以用于控制车辆的诸如排队充电、排队取货等行为。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:ImageTrackConflicts.png&amp;diff=985</id>
		<title>文件:ImageTrackConflicts.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:ImageTrackConflicts.png&amp;diff=985"/>
		<updated>2026-02-06T09:18:35Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ImageTrackConflicts&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%9B%B4%E5%A4%9A%E4%BA%A4%E7%AE%A1%E7%BB%86%E8%8A%82%E7%94%A8%E6%B3%95&amp;diff=984</id>
		<title>使用手册 - 更多交管细节用法</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%9B%B4%E5%A4%9A%E4%BA%A4%E7%AE%A1%E7%BB%86%E8%8A%82%E7%94%A8%E6%B3%95&amp;diff=984"/>
		<updated>2026-02-06T09:13:58Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​/* 1.必空点 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1.必空点 ==&lt;br /&gt;
&lt;br /&gt;
=== 1.1 必空点概念 ===&lt;br /&gt;
在Simple中，可以通过站点上mustFree的字段添加必空点，在id为1的必空点上添加mustFree:[2,3]代表当1号点被锁时，2、3号点不能被锁。&lt;br /&gt;
&lt;br /&gt;
注意必空点为单向的概念，即1号点被锁，2、3不能被锁，但2、3被锁不影响1号点的上锁情况。&lt;br /&gt;
&lt;br /&gt;
=== 1.2 如何配置必空点 ===&lt;br /&gt;
&lt;br /&gt;
# 可以通过在站点上添加mustFree字段来添加必空点。&lt;br /&gt;
# 可以通过点击”设置必空点“来添加。&lt;br /&gt;
&lt;br /&gt;
[[文件:2c247231da7eee82f61394abfcdabd9.png|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
[[文件:982cbb082b59f743ed46acfef0eb665.png|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
此外，路线可以设置sconflicts或conflicts，前者是行走某个路径和某个站点冲突，后者是两个路径不能同时行走。可以用于一些交管复杂的情况。&lt;br /&gt;
&lt;br /&gt;
== 2.修改Simple项目属性 ==&lt;br /&gt;
Simple中项目属性如下图，其中含义在”MDCS参数表：Simple“中有叙述。&lt;br /&gt;
&lt;br /&gt;
[[文件:755a68e08f05a3e843db325873a5d2c.png]]&lt;br /&gt;
&lt;br /&gt;
=== 1. 搜索路线时允许终点和别的车的终点重合 ===&lt;br /&gt;
plan里加“forbid_cross”字段，设置为“true”。&lt;br /&gt;
&lt;br /&gt;
（Search_AllowDestOnRoute为True：表示允许本次搜索路线的终点在别的车的路径上）&lt;br /&gt;
&lt;br /&gt;
=== 2. 寻路时某个点需要经过多次 ===&lt;br /&gt;
将Search_MaxVisitPerSite（每个站点最多的经过次数）和Search_MaxDupVisit（整条路径上最多重复经过多少个站点）改大一些。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''3. 寻路时和交管相关的抛出异常：'''&lt;br /&gt;
&lt;br /&gt;
* DestinationSameException：搜索路径的终点和其他车相同。conflictedCars包含了冲突车的列表。&lt;br /&gt;
** 可以使用“forbid_cross”来暂时允许，多用于要连续拼接多条路线的情况。但如果整条路线终点确实和其他车的终点重合，那么无法进行交管规划。&lt;br /&gt;
** 可编辑终点为terminal点或sink点。&lt;br /&gt;
** 若其他车具有escape，则不会冲突。&lt;br /&gt;
* DestinationOnRouteException：搜索路径的终点停在其他车的路径上。这个异常可能会在未来被移除。可设置参数Search_AllowDestOnRoute为true来屏蔽该异常。&lt;br /&gt;
** 之所以抛该异常是因为这会导致：当前车在到达终点前，必须先等其他车经过终点后才能前往终点。&lt;br /&gt;
* DestinationBlockedException： 有车堵塞了该车前往终点的路径：这些车停在当前车去目标点的必经路径上或即将到达堵塞位置。conflictedCars包含了堵塞车的列表。&lt;br /&gt;
** 若堵塞车的终点为terminal点或sink点，或设置有escape路径，那么可以防止该异常发生。&lt;br /&gt;
&lt;br /&gt;
== 交管事件 ==&lt;br /&gt;
用户程序可以监听交管事件。目前提供以下事件：&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public delegate void TrafficControlEvent(AbstractCar car, int siteId);&lt;br /&gt;
public delegate void TrafficDeadLockEvent(AbstractCar[] loopingCar);&lt;br /&gt;
public delegate bool TrafficControlBeforeLockCallback(AbstractCar car, int siteId);&lt;br /&gt;
        &lt;br /&gt;
public static TrafficControlBeforeLockCallback BeforeLock; //在小车试图获取锁时调用：参数为哪个车试图获取哪个锁，返回true表示允许获取，返回false表示拒绝。&lt;br /&gt;
public static TrafficControlEvent OnLockAcquired; //在小车已拿到锁时调用：参数为哪个车获取了哪个锁&lt;br /&gt;
public static TrafficControlEvent AfterLeave; //在小车释放锁时调用：参数为哪个车释放了哪个锁&lt;br /&gt;
public static TrafficDeadLockEvent OnDeadLock; //在系统检测到死锁情况时调用。参数为发生了死锁的车辆。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;其中业务程序中常用的事件主要是BeforeLock/AfterLeave事件，这个事件可以用于控制车辆的诸如排队充电、排队取货等行为。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=FAQ&amp;diff=983</id>
		<title>FAQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=FAQ&amp;diff=983"/>
		<updated>2026-02-05T11:06:48Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== 基础问题 ===&lt;br /&gt;
* Q: 机器人在转圈的时候，Detour为什么反馈的方向角从2.2度突然跳到了-357.8度，差了4.4度？&lt;br /&gt;
** A: 2.2度和-357.8度是同一个角度，并没有差了4.4度。另外能问出这个问题的同学，也经常卡在计算两个角度的角度差上，那么可以使用这个公式：&lt;br /&gt;
&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;thdiff = (th1-th2)-round((th1-th2)/360)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 调试原理性问题 ===&lt;br /&gt;
* Q: Simple下任务后，Clumsy的表现和预期不一致，或者做完任务后Simple还报错了，如何调试？&lt;br /&gt;
** A: Simple首先通过对车进行路径搜索（SegmentPlan.FindRoute）搜索到路径，然后通过Compile调用车体类挂载的Coder生成代码，最后通过车体类继承的actualSendScript进行脚本下发。对于Clumsy而言，下发的脚本会保存于debug目录下。首先检查脚本是否正确，然后调试Clumsy插件中继承SimpleAGVInterface的类（一般为AGV类），是否其函数按照正常的方法实现了（见[[通用约定]]）。&lt;br /&gt;
*Q: Simple不给锁，怎么看原因？&lt;br /&gt;
**A: 点开小车的状态面板，看TcStat交管信息。这个字段里显示了为什么不下发锁的原因。&lt;br /&gt;
*Q: Simple似乎死锁了？&lt;br /&gt;
**A: Simple非常非常难遇到真的死锁。可以看BlockedBy字段来判断到底是真的死锁了，还是因为路线图设计问题导致的关键等待。可能所有的车都在等一个关键车下发路线。&lt;br /&gt;
*Q: Simple包络似乎错了，两个车包络明明冲突但相撞了。&lt;br /&gt;
**A: 检查经过的路径的layerName，在不同layerName上的包络互相不冲突。比如layerName&lt;br /&gt;
*Q:使用激光+地纹导航时，出现车辆位置来回拉扯的情况，是怎么回事？&lt;br /&gt;
**A：首先检查detour.json中uscTC是否设置为true。然后还需要判断两个里程计的时序问题，在有独立显卡的工控机上，地纹延迟低，雷达延迟高，需要将单线雷达的time_bias_ms设置为-30至-50（具体根据雷达延迟），若使用核显跑地纹，地纹延迟会上升，此时将雷达和相机的tims_bias_ms都设置为0&lt;br /&gt;
&lt;br /&gt;
=== Detour使用常见问题 ===&lt;br /&gt;
&lt;br /&gt;
* Q:Detour软件没有在匹配地图，定位不理想，虽然建了地图，但地图就像没有用一样。手动拖拽位置也无法恢复位置。&lt;br /&gt;
** A: 这很可能是因为地图回环匹配线程没有开启，比如删了原图层并增加了个新图层。可以到对应面板里点“启动”来启动回环线程。&lt;br /&gt;
* Q: 为什么定不了位？界面不动？为什么电脑重启后无法定位？&lt;br /&gt;
** A: 很可能是因为没有启动。可以点“全部启动”按钮启动定位。如果需要自动后自动全部启动，勾选“自动开启”选项并保存配置。&lt;br /&gt;
* Q: 场景太宽阔而车有颠簸时，可能会出现短暂的定位异常情况，然后很快恢复，如何解决？&lt;br /&gt;
** A: 可以尝试缩小场景比例。具体做法见《[[Detour使用Trick：大场景处理]]》\&lt;br /&gt;
&lt;br /&gt;
=== Simple使用常见问题 ===&lt;br /&gt;
&lt;br /&gt;
* terminal关键字要慎用，它的语义是，保证想离开这个站点时随时能离开，不会和其它车发生冲突。一般也就是单向路线中间的点可以设置为terminal。如果违背这个原则，那么造成的结果可能是一个A车停在terminal站点上阻碍了另一台车B，但车A无法出站，导致思索。&lt;br /&gt;
&lt;br /&gt;
=== CycleGUI使用问题 ===&lt;br /&gt;
&lt;br /&gt;
* 本地界面的启动参数放置于cyclegui_conf.txt文件中，格式为若干行&amp;quot;参数=xxx&amp;quot;，xxx为数字。可配置的参数包括swapinterval（0/1，表示持续刷新界面还是等垂直同步，或者-1表示GSync）, drawmouse, limitfps, forgetsize（是否不保存上次主界面关闭时的窗口位置）。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=Detour%E4%BD%BF%E7%94%A8Trick%EF%BC%9A%E5%A4%A7%E5%9C%BA%E6%99%AF%E5%A4%84%E7%90%86&amp;diff=979</id>
		<title>Detour使用Trick：大场景处理</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=Detour%E4%BD%BF%E7%94%A8Trick%EF%BC%9A%E5%A4%A7%E5%9C%BA%E6%99%AF%E5%A4%84%E7%90%86&amp;diff=979"/>
		<updated>2025-10-30T06:04:29Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[文件:Image wfesa4refs.png|缩略图|Detour工作台中缩放地图尺寸。]]&lt;br /&gt;
可将大场景缩小为原先的0.5倍：&lt;br /&gt;
&lt;br /&gt;
# 一般是3D雷达，找到对应的3D雷达。找scale参数，改为0.5。&amp;lt;s&amp;gt;*或者也可以找二向化雷达，一般名字为plannar或frontlidar。但这样会造成垂直特征和3d雷达的特征在显示时对不上。如果不需要对特征可以缩小二向化雷达。&amp;lt;/s&amp;gt;&lt;br /&gt;
# 找配置文件中的guru节的inputScale，改为0.5&lt;br /&gt;
# 将地图缩放为原先的0.5倍（如右图所示）。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=978</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=978"/>
		<updated>2025-10-11T11:35:39Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​/* 链接 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:1--&amp;gt;&lt;br /&gt;
MDCS是上海懒书智能科技开发的机器人软件构建框架，包括以下组件。&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
* Medulla：高效的硬件通信、控制和抽象平台。&lt;br /&gt;
* Detour：定位系统，内置激光雷达和视觉SLAM等。&lt;br /&gt;
* Clumsy：机器人运动指令平台，内置AGV/AMR的典型运动能力。&lt;br /&gt;
* Simple：机器人集群管理系统，核心为交通控制和寻路。&lt;br /&gt;
* CycleGUI：针对算法内核交互的回合式GUI框架，可在任何算法中随时提交协程由CycleGUI托管界面，协程仅在需要刷新界面时调用，效率很高。此外还支持''裸眼3D显示''&lt;br /&gt;
* DIVER(Dotnet Integrated Vehicle Runtime): 是一个专门用于载具控制系统的.NET运行环境，可将C#程序开发的Medulla下位硬件控制程序无痛地运行在MCU中。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
更详细地综述见：[[特殊:我的语言/MDCS-Walkthrough|MDCS-Walkthrough]]  [[特殊:我的语言/MDCS概述|&amp;lt;s&amp;gt;MDCS概述&amp;lt;/s&amp;gt;]]&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
== 基本介绍 ==&lt;br /&gt;
&lt;br /&gt;
'''定位系统'''：AGV的定位是由独立模块《Detour》完成。Detour支持激光雷达和视觉的各类SLAM算法，包括[[特殊:我的语言/具有高鲁棒性的激光SLAM算法|具有高鲁棒性的2D激光SLAM算法]]、[[特殊:我的语言/地纹SLAM|地纹SLAM]]、[[特殊:我的语言/天花板SLAM|天花板SLAM]]、[[特殊:我的语言/二维码识别导航|二维码导航]]等，支持[[特殊:我的语言/多定位源的自动综合|多定位源的自动综合]]。Detour可以使用Medulla提供的数据来源、也可以自行获取。整套MDCS实施时一般使用Medulla提供的数据来源。&lt;br /&gt;
&lt;br /&gt;
'''AGV车载系统'''：由Medulla（硬件抽象逻辑）、Clumsy（车体运动抽象）组成并对功能定义；二者原理见[[特殊:我的语言/车体抽象原理|车体抽象原理]]。Medulla+Clumsy可实现各类车体动作，最简单诸如[[特殊:我的语言/巡线行走|巡线行走]]、[[特殊:我的语言/绕障行走|绕障行走]]等，复杂一些的例子如[[特殊:我的语言/自动识别工位并取放货|自动识别工位并取放货]]、[[特殊:我的语言/自动识别托盘取放货|自动识别托盘取放货]]、[[特殊:我的语言/识别料框并堆垛拆垛|识别料框并堆垛拆垛]]、[[特殊:我的语言/联动天眼系统进行装卸车|联动天眼系统进行装卸车]]等。车载软件定义了AGV的能力集以及测试方法，并可由调度软件做动作组合从而完成整套任务。&lt;br /&gt;
&lt;br /&gt;
'''车队调度'''：交管、寻路、包络、可达性分析等内核算法由SimpleCore提供，其原理参见[[特殊:我的语言/调度内核运行原理|内核运行原理]]，SimpleCore提供编程接口使得用户可对具体车型或业务场景编程声明寻路规则、运行脚本、包络、可达性需求等。对调度的运行原理参见：[[特殊:我的语言/AGV任务运行逻辑|AGV任务运行逻辑]] 。MDCS提供一个简单的壳层称为SimpleComposer，其提供UI和基础的车辆通信定义，在此之上还支持插件进一步定义车辆具体细节和业务逻辑。&lt;br /&gt;
&lt;br /&gt;
'''周围系统'''：CycleGUI可用于3D显示和远程界面显示，可快速开发诸如3D标注程序、[[全息座舱]]等应用；DIVER可用于基于MCU低成本快速地开发四向穿梭车、磁导航车、编舞机器人等。V-helper是一套ＭＤＣ（车载程序）的远程监控和运维程序，可监控ＭＤＣ程序的堆栈、检查DObject/Hedingben变量内容等。&lt;br /&gt;
&lt;br /&gt;
== 快速开始 ==&lt;br /&gt;
&lt;br /&gt;
'''定位'''&lt;br /&gt;
&lt;br /&gt;
如果您有Detour使用经验，请阅读 [[特殊:我的语言/下载并部署Detour|下载并部署Detour]] 快速开始。如果您首次使用Detour，请阅读详细教程：首先是 [[特殊:我的语言/安装Detour|安装Detour]] ，然后 [[标定激光雷达外参]] ，然后 [[激光SLAM建图]] ，用于优化地图的 [[激光地图编辑指南]] ，最后 使用激光SLAM功能 。&lt;br /&gt;
&lt;br /&gt;
在激光不友好的场景，我们可以使用地纹SLAM。请阅读[[地纹SLAM技术概述]]来了解这个特性。&lt;br /&gt;
&lt;br /&gt;
'''整车适配'''&lt;br /&gt;
&lt;br /&gt;
对于需要做整车适配的读者，请阅读以下文章。&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/MDCS引擎适配机器人入门教学|MDCS引擎适配机器人入门教学]]、[[特殊:我的语言/叉车适配案例|叉车(牵引车)适配案例]]、[[特殊:我的语言/潜伏顶升车(KIVA类小车)适配案例|潜伏顶升车(KIVA类小车)适配案例]]、[[特殊:我的语言/全向车适配案例|全向车适配案例]]、[[特殊:我的语言/牵引车适配案例|双阿克曼车型适配案例]]&lt;br /&gt;
&lt;br /&gt;
传感器适配&lt;br /&gt;
&lt;br /&gt;
[[2D激光雷达适配]]、[[3D相机适配]]（全局曝光、alt/azi固定的、像素化的3D雷达也算此类）、[[3D激光雷达适配]]、&lt;br /&gt;
&lt;br /&gt;
== 使用手册 ==&lt;br /&gt;
&lt;br /&gt;
=== 通识和入门教学 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/MDCS-Walkthrough|MDCS-Walkthrough]] &lt;br /&gt;
&lt;br /&gt;
[[Detour简介]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS简介|使用手册 - MDCS简介]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/激光SLAM的能力边界|激光SLAM的能力边界]]&lt;br /&gt;
&lt;br /&gt;
[[非标车型使用手册]]&lt;br /&gt;
&lt;br /&gt;
=== 定位导航相关手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 定位导航|使用手册 - 定位导航]]&lt;br /&gt;
&lt;br /&gt;
[[激光SLAM建图|使用手册 - 激光SLAM建图]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 激光SLAM＋反光板建图手册|使用手册 - 激光SLAM+反光板建图手册]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 分析定位问题|使用手册 - 分析定位问题]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 激光＋纹理导航|使用手册 - 激光+纹理导航]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Detour车体编辑器使用教学|使用手册 - Detour车体编辑器使用教学]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 双雷达标定手册|使用手册 - 双雷达标定手册]] / [[特殊:我的语言/标定双激光雷达外参|标定双激光雷达外参]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 在地纹导航中使用二维码快速找回定位|使用手册 - 在地纹导航中使用二维码快速找回定位]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 同时使用激光、地纹、二维码、轮编里程计和IMU进行鲁棒定位|使用手册 - 同时使用激光、地纹、二维码、轮编里程计和IMU进行鲁棒定位]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/标定激光雷达外参|标定激光雷达外参]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - 如何在核显工控机上运行地纹导航]]&lt;br /&gt;
&lt;br /&gt;
[[激光雷达选型测试报告]]&lt;br /&gt;
&lt;br /&gt;
[[输入GPS外部定位]]&lt;br /&gt;
&lt;br /&gt;
[[DetourLite检查表]]&lt;br /&gt;
&lt;br /&gt;
=== 运动控制使用手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用叉车自动取托盘功能|使用叉车自动取托盘功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用自动对准料架功能|使用自动对准料架功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用叉车料架堆叠功能|使用叉车料架堆叠功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/色带和磁条导航|色带和磁条导航]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/纯二维码导航|纯二维码导航]]&lt;br /&gt;
&lt;br /&gt;
=== 调度相关手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 车队管控|使用手册 - 车队管控]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册-routing字段：设置车辆必经点（必不经点）逻辑|使用手册 - routing字段：设置车辆必经点（必不经点）逻辑]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:从使用到开发]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:coder（路径编译器）机制详解]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:包络如何定义]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS软件部署方法介绍|使用手册 - MDCS软件部署方法介绍]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Simple软件文件管理标准化作业|使用手册 - Simple软件文件管理标准化作业]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS适配流程说明|使用手册 - MDCS适配流程说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS适配详细说明|使用手册 - MDCS适配详细说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Simple图层合并手册|使用手册 - Simple图层合并手册]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 寻路启发器功能|使用手册 - 寻路启发器功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 更多交管细节用法|使用手册 - 更多交管细节用法]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 劫持用法|使用手册 - 劫持用法]](用于中途更改路线)&lt;br /&gt;
&lt;br /&gt;
[[可达性状态编程|使用手册 - 可达性状态编程（用于如驶入式巷道叉车避免前车放货后影响后车运行等场景）]]&lt;br /&gt;
&lt;br /&gt;
=== 二次开发相关说明 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何适配新的雷达|如何适配新的雷达]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何使用CycleGUI快速开发UI界面|如何使用CycleGUI快速开发UI界面]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何使用LessokajiWeaver的多语言功能|如何使用LessokajiWeaver的多语言功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - 轨迹跟踪|开发手册 - 轨迹跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - 目标跟踪|开发手册 - 目标跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - SimpleComposer界面开发 - CAD工具|开发手册 - SimpleComposer界面开发 - CAD工具]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Medulla:相机使用方法 Camera Data Access Guide]]&lt;br /&gt;
&lt;br /&gt;
[[如何基于SimpleCore核心库进行调度系统开发]]&lt;br /&gt;
&lt;br /&gt;
=== 杂项 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何查看工控机性能以及功耗墙|如何查看工控机性能以及功耗墙]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 数据录制与回放手册|使用手册 - 数据录制与回放手册]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Linux MDCS部署配置和操作说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/FAQ|FAQ]]&lt;br /&gt;
&lt;br /&gt;
Cheat sheet&lt;br /&gt;
&lt;br /&gt;
[[Detour版本发布记录]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/待整理的杂项内容|待整理的杂项内容]]&lt;br /&gt;
&lt;br /&gt;
[[FundamentalLib使用说明]]&lt;br /&gt;
&lt;br /&gt;
== 技术报告 ==&lt;br /&gt;
&lt;br /&gt;
* MDCS架构&lt;br /&gt;
** Medulla软件架构&lt;br /&gt;
** Detour软件架构&lt;br /&gt;
*** Detour激光SLAM算法详解&lt;br /&gt;
*** Detour地面纹理SLAM算法详解&lt;br /&gt;
** Simple软件架构&lt;br /&gt;
*** [[特殊:我的语言/调度内核运行原理|调度内核运行原理]]&lt;br /&gt;
**** 基于预先规划交管算法：[[特殊:我的语言/DPS调度算法详解|DPS调度算法详解]]&lt;br /&gt;
**** 流场规划&lt;br /&gt;
*** 基于网络流的业务规划器&lt;br /&gt;
* LessokajiWeaver编译后处理工具&lt;br /&gt;
* CycleGUI&lt;br /&gt;
&lt;br /&gt;
== 接口 ==&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Medulla-API|Medulla]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Detour-API|Detour]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Clumsy-API|Clumsy]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Simple-API|Simple]]&lt;br /&gt;
&lt;br /&gt;
== 术语和约定 ==&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/通用约定|MDCS开发通用约定]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/定位导航|定位导航]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Medulla]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Detour]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Clumsy]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Simple]]&lt;br /&gt;
&lt;br /&gt;
== 特殊技术方案 ==&lt;br /&gt;
&lt;br /&gt;
当前MDCS的特殊技术方案包括：[[特殊:我的语言/托盘识别|托盘识别]]、[[特殊:我的语言/双车/多车联动|双车/多车联动]]、[[特殊:我的语言/汽车面差检测|汽车面差检测]]、[[特殊:我的语言/天眼系统|天眼系统]]、[[特殊:我的语言/自动装卸车应用|自动装卸车应用]]、[[特殊:我的语言/复合卷料机械手叉车|复合卷料机械手叉车]]、[[特殊:我的语言/清洁机器人|清洁机器人]]、[[特殊:我的语言/设备跟随联动|设备跟随联动]]。其它技术方案还在进一步补充中。&lt;br /&gt;
[[文件:Drliuwechat.png|缩略图|100x100像素|微信联系方式]]&lt;br /&gt;
&lt;br /&gt;
== 链接 ==&lt;br /&gt;
&lt;br /&gt;
*[https://dl.lessokaji.com MDCS下载站]：MDCS的各类程序可在该站上下载&lt;br /&gt;
* [https://dev.lessokaji.com 技术讨论站]：包含FAQ、需求讨论、AGV项目实施经验等技术讨论&lt;br /&gt;
* [https://git.lessokaji.com MDCS代码库]：git源&lt;br /&gt;
* [https://auth.lessokaji.com MDCS授权站]：License授权、代码阅读和编译权限授权站&lt;br /&gt;
* 视频案例链接: &amp;lt;nowiki&amp;gt;https://pan.baidu.com/s/19c0XIZGZGJJGGyVdS-5mQA?pwd=1234&amp;lt;/nowiki&amp;gt; 提取码: 1234 &lt;br /&gt;
&lt;br /&gt;
__无目录__&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=977</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=977"/>
		<updated>2025-10-11T10:05:35Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​/* 链接 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:1--&amp;gt;&lt;br /&gt;
MDCS是上海懒书智能科技开发的机器人软件构建框架，包括以下组件。&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
* Medulla：高效的硬件通信、控制和抽象平台。&lt;br /&gt;
* Detour：定位系统，内置激光雷达和视觉SLAM等。&lt;br /&gt;
* Clumsy：机器人运动指令平台，内置AGV/AMR的典型运动能力。&lt;br /&gt;
* Simple：机器人集群管理系统，核心为交通控制和寻路。&lt;br /&gt;
* CycleGUI：针对算法内核交互的回合式GUI框架，可在任何算法中随时提交协程由CycleGUI托管界面，协程仅在需要刷新界面时调用，效率很高。此外还支持''裸眼3D显示''&lt;br /&gt;
* DIVER(Dotnet Integrated Vehicle Runtime): 是一个专门用于载具控制系统的.NET运行环境，可将C#程序开发的Medulla下位硬件控制程序无痛地运行在MCU中。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
更详细地综述见：[[特殊:我的语言/MDCS-Walkthrough|MDCS-Walkthrough]]  [[特殊:我的语言/MDCS概述|&amp;lt;s&amp;gt;MDCS概述&amp;lt;/s&amp;gt;]]&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
== 基本介绍 ==&lt;br /&gt;
&lt;br /&gt;
'''定位系统'''：AGV的定位是由独立模块《Detour》完成。Detour支持激光雷达和视觉的各类SLAM算法，包括[[特殊:我的语言/具有高鲁棒性的激光SLAM算法|具有高鲁棒性的2D激光SLAM算法]]、[[特殊:我的语言/地纹SLAM|地纹SLAM]]、[[特殊:我的语言/天花板SLAM|天花板SLAM]]、[[特殊:我的语言/二维码识别导航|二维码导航]]等，支持[[特殊:我的语言/多定位源的自动综合|多定位源的自动综合]]。Detour可以使用Medulla提供的数据来源、也可以自行获取。整套MDCS实施时一般使用Medulla提供的数据来源。&lt;br /&gt;
&lt;br /&gt;
'''AGV车载系统'''：由Medulla（硬件抽象逻辑）、Clumsy（车体运动抽象）组成并对功能定义；二者原理见[[特殊:我的语言/车体抽象原理|车体抽象原理]]。Medulla+Clumsy可实现各类车体动作，最简单诸如[[特殊:我的语言/巡线行走|巡线行走]]、[[特殊:我的语言/绕障行走|绕障行走]]等，复杂一些的例子如[[特殊:我的语言/自动识别工位并取放货|自动识别工位并取放货]]、[[特殊:我的语言/自动识别托盘取放货|自动识别托盘取放货]]、[[特殊:我的语言/识别料框并堆垛拆垛|识别料框并堆垛拆垛]]、[[特殊:我的语言/联动天眼系统进行装卸车|联动天眼系统进行装卸车]]等。车载软件定义了AGV的能力集以及测试方法，并可由调度软件做动作组合从而完成整套任务。&lt;br /&gt;
&lt;br /&gt;
'''车队调度'''：交管、寻路、包络、可达性分析等内核算法由SimpleCore提供，其原理参见[[特殊:我的语言/调度内核运行原理|内核运行原理]]，SimpleCore提供编程接口使得用户可对具体车型或业务场景编程声明寻路规则、运行脚本、包络、可达性需求等。对调度的运行原理参见：[[特殊:我的语言/AGV任务运行逻辑|AGV任务运行逻辑]] 。MDCS提供一个简单的壳层称为SimpleComposer，其提供UI和基础的车辆通信定义，在此之上还支持插件进一步定义车辆具体细节和业务逻辑。&lt;br /&gt;
&lt;br /&gt;
'''周围系统'''：CycleGUI可用于3D显示和远程界面显示，可快速开发诸如3D标注程序、[[全息座舱]]等应用；DIVER可用于基于MCU低成本快速地开发四向穿梭车、磁导航车、编舞机器人等。V-helper是一套ＭＤＣ（车载程序）的远程监控和运维程序，可监控ＭＤＣ程序的堆栈、检查DObject/Hedingben变量内容等。&lt;br /&gt;
&lt;br /&gt;
== 快速开始 ==&lt;br /&gt;
&lt;br /&gt;
'''定位'''&lt;br /&gt;
&lt;br /&gt;
如果您有Detour使用经验，请阅读 [[特殊:我的语言/下载并部署Detour|下载并部署Detour]] 快速开始。如果您首次使用Detour，请阅读详细教程：首先是 [[特殊:我的语言/安装Detour|安装Detour]] ，然后 [[标定激光雷达外参]] ，然后 [[激光SLAM建图]] ，用于优化地图的 [[激光地图编辑指南]] ，最后 使用激光SLAM功能 。&lt;br /&gt;
&lt;br /&gt;
在激光不友好的场景，我们可以使用地纹SLAM。请阅读[[地纹SLAM技术概述]]来了解这个特性。&lt;br /&gt;
&lt;br /&gt;
'''整车适配'''&lt;br /&gt;
&lt;br /&gt;
对于需要做整车适配的读者，请阅读以下文章。&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/MDCS引擎适配机器人入门教学|MDCS引擎适配机器人入门教学]]、[[特殊:我的语言/叉车适配案例|叉车(牵引车)适配案例]]、[[特殊:我的语言/潜伏顶升车(KIVA类小车)适配案例|潜伏顶升车(KIVA类小车)适配案例]]、[[特殊:我的语言/全向车适配案例|全向车适配案例]]、[[特殊:我的语言/牵引车适配案例|双阿克曼车型适配案例]]&lt;br /&gt;
&lt;br /&gt;
传感器适配&lt;br /&gt;
&lt;br /&gt;
[[2D激光雷达适配]]、[[3D相机适配]]（全局曝光、alt/azi固定的、像素化的3D雷达也算此类）、[[3D激光雷达适配]]、&lt;br /&gt;
&lt;br /&gt;
== 使用手册 ==&lt;br /&gt;
&lt;br /&gt;
=== 通识和入门教学 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/MDCS-Walkthrough|MDCS-Walkthrough]] &lt;br /&gt;
&lt;br /&gt;
[[Detour简介]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS简介|使用手册 - MDCS简介]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/激光SLAM的能力边界|激光SLAM的能力边界]]&lt;br /&gt;
&lt;br /&gt;
[[非标车型使用手册]]&lt;br /&gt;
&lt;br /&gt;
=== 定位导航相关手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 定位导航|使用手册 - 定位导航]]&lt;br /&gt;
&lt;br /&gt;
[[激光SLAM建图|使用手册 - 激光SLAM建图]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 激光SLAM＋反光板建图手册|使用手册 - 激光SLAM+反光板建图手册]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 分析定位问题|使用手册 - 分析定位问题]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 激光＋纹理导航|使用手册 - 激光+纹理导航]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Detour车体编辑器使用教学|使用手册 - Detour车体编辑器使用教学]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 双雷达标定手册|使用手册 - 双雷达标定手册]] / [[特殊:我的语言/标定双激光雷达外参|标定双激光雷达外参]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 在地纹导航中使用二维码快速找回定位|使用手册 - 在地纹导航中使用二维码快速找回定位]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 同时使用激光、地纹、二维码、轮编里程计和IMU进行鲁棒定位|使用手册 - 同时使用激光、地纹、二维码、轮编里程计和IMU进行鲁棒定位]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/标定激光雷达外参|标定激光雷达外参]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - 如何在核显工控机上运行地纹导航]]&lt;br /&gt;
&lt;br /&gt;
[[激光雷达选型测试报告]]&lt;br /&gt;
&lt;br /&gt;
[[输入GPS外部定位]]&lt;br /&gt;
&lt;br /&gt;
[[DetourLite检查表]]&lt;br /&gt;
&lt;br /&gt;
=== 运动控制使用手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用叉车自动取托盘功能|使用叉车自动取托盘功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用自动对准料架功能|使用自动对准料架功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用叉车料架堆叠功能|使用叉车料架堆叠功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/色带和磁条导航|色带和磁条导航]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/纯二维码导航|纯二维码导航]]&lt;br /&gt;
&lt;br /&gt;
=== 调度相关手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 车队管控|使用手册 - 车队管控]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册-routing字段：设置车辆必经点（必不经点）逻辑|使用手册 - routing字段：设置车辆必经点（必不经点）逻辑]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:从使用到开发]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:coder（路径编译器）机制详解]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:包络如何定义]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS软件部署方法介绍|使用手册 - MDCS软件部署方法介绍]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Simple软件文件管理标准化作业|使用手册 - Simple软件文件管理标准化作业]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS适配流程说明|使用手册 - MDCS适配流程说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS适配详细说明|使用手册 - MDCS适配详细说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Simple图层合并手册|使用手册 - Simple图层合并手册]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 寻路启发器功能|使用手册 - 寻路启发器功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 更多交管细节用法|使用手册 - 更多交管细节用法]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 劫持用法|使用手册 - 劫持用法]](用于中途更改路线)&lt;br /&gt;
&lt;br /&gt;
[[可达性状态编程|使用手册 - 可达性状态编程（用于如驶入式巷道叉车避免前车放货后影响后车运行等场景）]]&lt;br /&gt;
&lt;br /&gt;
=== 二次开发相关说明 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何适配新的雷达|如何适配新的雷达]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何使用CycleGUI快速开发UI界面|如何使用CycleGUI快速开发UI界面]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何使用LessokajiWeaver的多语言功能|如何使用LessokajiWeaver的多语言功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - 轨迹跟踪|开发手册 - 轨迹跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - 目标跟踪|开发手册 - 目标跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - SimpleComposer界面开发 - CAD工具|开发手册 - SimpleComposer界面开发 - CAD工具]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Medulla:相机使用方法 Camera Data Access Guide]]&lt;br /&gt;
&lt;br /&gt;
[[如何基于SimpleCore核心库进行调度系统开发]]&lt;br /&gt;
&lt;br /&gt;
=== 杂项 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何查看工控机性能以及功耗墙|如何查看工控机性能以及功耗墙]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 数据录制与回放手册|使用手册 - 数据录制与回放手册]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Linux MDCS部署配置和操作说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/FAQ|FAQ]]&lt;br /&gt;
&lt;br /&gt;
Cheat sheet&lt;br /&gt;
&lt;br /&gt;
[[Detour版本发布记录]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/待整理的杂项内容|待整理的杂项内容]]&lt;br /&gt;
&lt;br /&gt;
[[FundamentalLib使用说明]]&lt;br /&gt;
&lt;br /&gt;
== 技术报告 ==&lt;br /&gt;
&lt;br /&gt;
* MDCS架构&lt;br /&gt;
** Medulla软件架构&lt;br /&gt;
** Detour软件架构&lt;br /&gt;
*** Detour激光SLAM算法详解&lt;br /&gt;
*** Detour地面纹理SLAM算法详解&lt;br /&gt;
** Simple软件架构&lt;br /&gt;
*** [[特殊:我的语言/调度内核运行原理|调度内核运行原理]]&lt;br /&gt;
**** 基于预先规划交管算法：[[特殊:我的语言/DPS调度算法详解|DPS调度算法详解]]&lt;br /&gt;
**** 流场规划&lt;br /&gt;
*** 基于网络流的业务规划器&lt;br /&gt;
* LessokajiWeaver编译后处理工具&lt;br /&gt;
* CycleGUI&lt;br /&gt;
&lt;br /&gt;
== 接口 ==&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Medulla-API|Medulla]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Detour-API|Detour]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Clumsy-API|Clumsy]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Simple-API|Simple]]&lt;br /&gt;
&lt;br /&gt;
== 术语和约定 ==&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/通用约定|MDCS开发通用约定]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/定位导航|定位导航]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Medulla]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Detour]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Clumsy]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Simple]]&lt;br /&gt;
&lt;br /&gt;
== 特殊技术方案 ==&lt;br /&gt;
&lt;br /&gt;
当前MDCS的特殊技术方案包括：[[特殊:我的语言/托盘识别|托盘识别]]、[[特殊:我的语言/双车/多车联动|双车/多车联动]]、[[特殊:我的语言/汽车面差检测|汽车面差检测]]、[[特殊:我的语言/天眼系统|天眼系统]]、[[特殊:我的语言/自动装卸车应用|自动装卸车应用]]、[[特殊:我的语言/复合卷料机械手叉车|复合卷料机械手叉车]]、[[特殊:我的语言/清洁机器人|清洁机器人]]、[[特殊:我的语言/设备跟随联动|设备跟随联动]]。其它技术方案还在进一步补充中。&lt;br /&gt;
[[文件:Drliuwechat.png|缩略图|100x100像素|微信联系方式]]&lt;br /&gt;
&lt;br /&gt;
== 链接 ==&lt;br /&gt;
&lt;br /&gt;
*[https://dl.lessokaji.com MDCS下载站]：MDCS的各类程序可在该站上下载&lt;br /&gt;
* [https://dev.lessokaji.com 技术讨论站]：包含FAQ、需求讨论、AGV项目实施经验等技术讨论&lt;br /&gt;
* [https://git.lessokaji.com MDCS代码库]：git源&lt;br /&gt;
* [https://auth.lessokaji.com MDCS授权站]：License授权、代码阅读和编译权限授权站&lt;br /&gt;
* 一些视频案例：链接：https://pan.baidu.com/s/1foIUJzCnpbEaNoy6ooVbJg 提取码：2of9&lt;br /&gt;
&lt;br /&gt;
__无目录__&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=Detour%E4%BD%BF%E7%94%A8Trick%EF%BC%9A%E5%A4%A7%E5%9C%BA%E6%99%AF%E5%A4%84%E7%90%86&amp;diff=976</id>
		<title>Detour使用Trick：大场景处理</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=Detour%E4%BD%BF%E7%94%A8Trick%EF%BC%9A%E5%A4%A7%E5%9C%BA%E6%99%AF%E5%A4%84%E7%90%86&amp;diff=976"/>
		<updated>2025-09-23T08:40:37Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​创建页面，内容为“Detour工作台中缩放地图尺寸。 可将大场景缩小为原先的0.5倍：  # 找到二向化雷达，一般名字为plannar或frontlidar。找scale参数，改为0.5 # 找配置文件中的guru节的inputScale，改为0.5 # 将地图缩放为原先的0.5倍（如右图所示）。”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[文件:Image wfesa4refs.png|缩略图|Detour工作台中缩放地图尺寸。]]&lt;br /&gt;
可将大场景缩小为原先的0.5倍：&lt;br /&gt;
&lt;br /&gt;
# 找到二向化雷达，一般名字为plannar或frontlidar。找scale参数，改为0.5&lt;br /&gt;
# 找配置文件中的guru节的inputScale，改为0.5&lt;br /&gt;
# 将地图缩放为原先的0.5倍（如右图所示）。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image_wfesa4refs.png&amp;diff=975</id>
		<title>文件:Image wfesa4refs.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image_wfesa4refs.png&amp;diff=975"/>
		<updated>2025-09-23T08:37:14Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;图示&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=FAQ&amp;diff=974</id>
		<title>FAQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=FAQ&amp;diff=974"/>
		<updated>2025-09-23T08:36:50Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​/* Detour使用常见问题 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== 基础问题 ===&lt;br /&gt;
* Q: 机器人在转圈的时候，Detour为什么反馈的方向角从2.2度突然跳到了-357.8度，差了4.4度？&lt;br /&gt;
** A: 2.2度和-357.8度是同一个角度，并没有差了4.4度。另外能问出这个问题的同学，也经常卡在计算两个角度的角度差上，那么可以使用这个公式：&lt;br /&gt;
&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;thdiff = (th1-th2)-round((th1-th2)/360)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 调试原理性问题 ===&lt;br /&gt;
* Q: Simple下任务后，Clumsy的表现和预期不一致，或者做完任务后Simple还报错了，如何调试？&lt;br /&gt;
** A: Simple首先通过对车进行路径搜索（SegmentPlan.FindRoute）搜索到路径，然后通过Compile调用车体类挂载的Coder生成代码，最后通过车体类继承的actualSendScript进行脚本下发。对于Clumsy而言，下发的脚本会保存于debug目录下。首先检查脚本是否正确，然后调试Clumsy插件中继承SimpleAGVInterface的类（一般为AGV类），是否其函数按照正常的方法实现了（见[[通用约定]]）。&lt;br /&gt;
*Q: Simple不给锁，怎么看原因？&lt;br /&gt;
**A: 点开小车的状态面板，看TcStat交管信息。这个字段里显示了为什么不下发锁的原因。&lt;br /&gt;
*Q: Simple似乎死锁了？&lt;br /&gt;
**A: Simple非常非常难遇到真的死锁。可以看BlockedBy字段来判断到底是真的死锁了，还是因为路线图设计问题导致的关键等待。可能所有的车都在等一个关键车下发路线。&lt;br /&gt;
*Q: Simple包络似乎错了，两个车包络明明冲突但相撞了。&lt;br /&gt;
**A: 检查经过的路径的layerName，在不同layerName上的包络互相不冲突。比如layerName&lt;br /&gt;
*Q:使用激光+地纹导航时，出现车辆位置来回拉扯的情况，是怎么回事？&lt;br /&gt;
**A：首先检查detour.json中uscTC是否设置为true。然后还需要判断两个里程计的时序问题，在有独立显卡的工控机上，地纹延迟低，雷达延迟高，需要将单线雷达的time_bias_ms设置为-30至-50（具体根据雷达延迟），若使用核显跑地纹，地纹延迟会上升，此时将雷达和相机的tims_bias_ms都设置为0&lt;br /&gt;
&lt;br /&gt;
=== Detour使用常见问题 ===&lt;br /&gt;
&lt;br /&gt;
* Q:Detour软件没有在匹配地图，定位不理想，虽然建了地图，但地图就像没有用一样。手动拖拽位置也无法恢复位置。&lt;br /&gt;
** A: 这很可能是因为地图回环匹配线程没有开启，比如删了原图层并增加了个新图层。可以到对应面板里点“启动”来启动回环线程。&lt;br /&gt;
* Q: 为什么定不了位？界面不动？为什么电脑重启后无法定位？&lt;br /&gt;
** A: 很可能是因为没有启动。可以点“全部启动”按钮启动定位。如果需要自动后自动全部启动，勾选“自动开启”选项并保存配置。&lt;br /&gt;
* Q: 场景太宽阔而车有颠簸时，可能会出现短暂的定位异常情况，然后很快恢复，如何解决？&lt;br /&gt;
** A: 可以尝试缩小场景比例。具体做法见《[[Detour使用Trick：大场景处理]]》&lt;br /&gt;
&lt;br /&gt;
=== CycleGUI使用问题 ===&lt;br /&gt;
&lt;br /&gt;
* 本地界面的启动参数放置于cyclegui_conf.txt文件中，格式为若干行&amp;quot;参数=xxx&amp;quot;，xxx为数字。可配置的参数包括swapinterval（0/1，表示持续刷新界面还是等垂直同步，或者-1表示GSync）, drawmouse, limitfps, forgetsize（是否不保存上次主界面关闭时的窗口位置）。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E8%87%AA%E5%8A%A8I18N%EF%BC%88%E5%A4%9A%E8%AF%AD%E8%A8%80%E5%8A%9F%E8%83%BD%EF%BC%89&amp;diff=973</id>
		<title>自动I18N（多语言功能）</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E8%87%AA%E5%8A%A8I18N%EF%BC%88%E5%A4%9A%E8%AF%AD%E8%A8%80%E5%8A%9F%E8%83%BD%EF%BC%89&amp;diff=973"/>
		<updated>2025-09-09T10:13:00Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​创建页面，内容为“原理：编译时自动遍历字符串和Attribute并将引用部分作IL变更以获得正确字符串。  使用方法：使用LessokajiWeaver时会自动处理，无需声明。  编译后会生成一个$工程名$_i18n.json的文件，它列举了全部的字符串和可多语言的Attribute。增加更多语言就改这个json即可。&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt; [ {&amp;quot;DocumentAttribute.Name@TestApp.Program&amp;quot;:{&amp;quot;default&amp;quot;:&amp;quot;capture1&amp;quot;,&amp;quot;zh&amp;quot;:&amp;quot;捕捉！&amp;quot;}}, {&amp;quot;Docu…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;原理：编译时自动遍历字符串和Attribute并将引用部分作IL变更以获得正确字符串。&lt;br /&gt;
&lt;br /&gt;
使用方法：使用LessokajiWeaver时会自动处理，无需声明。&lt;br /&gt;
&lt;br /&gt;
编译后会生成一个$工程名$_i18n.json的文件，它列举了全部的字符串和可多语言的Attribute。增加更多语言就改这个json即可。&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
{&amp;quot;DocumentAttribute.Name@TestApp.Program&amp;quot;:{&amp;quot;default&amp;quot;:&amp;quot;capture1&amp;quot;,&amp;quot;zh&amp;quot;:&amp;quot;捕捉！&amp;quot;}},&lt;br /&gt;
{&amp;quot;DocumentAttribute.Description@TestApp.Program&amp;quot;:{&amp;quot;default&amp;quot;:&amp;quot;start capture lidar data1&amp;quot;}},&lt;br /&gt;
{&amp;quot;TestApp.Program.Main(args)[0]&amp;quot;:{&amp;quot;default&amp;quot;:&amp;quot;zh&amp;quot;}},&lt;br /&gt;
{&amp;quot;TestApp.Program.Main(args)[1]&amp;quot;:{&amp;quot;default&amp;quot;:&amp;quot;Cool!&amp;quot;,&amp;quot;zh&amp;quot;:&amp;quot;牛啊！&amp;quot;}},&lt;br /&gt;
{&amp;quot;TestApp.Program.Main(args)[2]&amp;quot;:{&amp;quot;default&amp;quot;:&amp;quot;x&amp;quot;}},&lt;br /&gt;
{&amp;quot;TestApp.Program.Main(args)[3]&amp;quot;:{&amp;quot;default&amp;quot;:&amp;quot;,&amp;quot;}},&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;再次编译就会将该json的多语言翻译写入到生成的二进制程序中。&lt;br /&gt;
----另外：程序中的字符串可直接正常使用，会被自动替换。但对于Attribute的翻译，获取CustomAttribute后并不能直接翻译（它是c#的metadata的一部分，无法运行时更改），因此需要人工获取Attribute的翻译。LessokajiWeaver中提供了专门的DocumentAttribute用于获取翻译文档。以下为例子：&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
[Document(Description = &amp;quot;时间偏移毫秒&amp;quot;)] public int time_bias_ms = 0;&lt;br /&gt;
//使用GetDocument()方法来获取Attribute的翻译内容。&lt;br /&gt;
var translated = typeof(X).GetField().GetDocument().Description;&lt;br /&gt;
&lt;br /&gt;
//程序启动时，使用以下代码切换语言：&lt;br /&gt;
I18N.LoadI18N(&amp;quot;en&amp;quot;); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=FundamentalLib%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E&amp;diff=972</id>
		<title>FundamentalLib使用说明</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=FundamentalLib%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E&amp;diff=972"/>
		<updated>2025-09-09T09:58:00Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;FundamentalLib是懒书的工具箱库。&lt;br /&gt;
&lt;br /&gt;
* [[LessPythonInvoke]]：用于和Python进行交互的库，轻松调用。&lt;br /&gt;
* [[自动I18N（多语言功能）]]：可对c#中出现的字符串作全自动的多语言更换。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=LessPythonInvoke&amp;diff=971</id>
		<title>LessPythonInvoke</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=LessPythonInvoke&amp;diff=971"/>
		<updated>2025-09-04T08:51:23Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​创建页面，内容为“ = LessPython C# &amp;amp;#x3C;-&amp;amp;#x3E; Python Interop = A high-performance, cross-platform interop layer between C# and Python using shared memory (MMF) for data transfer and a lightweight TCP notify channel. Optimized for large &amp;lt;code&amp;gt;NumPy&amp;lt;/code&amp;gt; arrays via a compact binary protocol and zero-copy views.  == Quick start ==  # Ensure Python is available (optionally in a venv) and &amp;lt;code&amp;gt;numpy&amp;lt;/code&amp;gt; installed if you use array features. # Add this project to your solution…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= LessPython C# &amp;amp;#x3C;-&amp;amp;#x3E; Python Interop =&lt;br /&gt;
A high-performance, cross-platform interop layer between C# and Python using shared memory (MMF) for data transfer and a lightweight TCP notify channel. Optimized for large &amp;lt;code&amp;gt;NumPy&amp;lt;/code&amp;gt; arrays via a compact binary protocol and zero-copy views.&lt;br /&gt;
&lt;br /&gt;
== Quick start ==&lt;br /&gt;
&lt;br /&gt;
# Ensure Python is available (optionally in a venv) and &amp;lt;code&amp;gt;numpy&amp;lt;/code&amp;gt; installed if you use array features.&lt;br /&gt;
# Add this project to your solution or reference the produced DLL.&lt;br /&gt;
# Write a Python module with functions to call from C#.&lt;br /&gt;
# Initialize and call via a typed interface:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;# exporting_module.py:&lt;br /&gt;
def add_ints(a, b):&lt;br /&gt;
    return int(a) + int(b)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;public interface IMyPyApi&lt;br /&gt;
{&lt;br /&gt;
    [PythonImport] int add_ints(int a, int b);&lt;br /&gt;
    [PythonImport] NdArray inc_ndarray(NdArray nd);&lt;br /&gt;
    [PythonImport(&amp;quot;inc_ndarray_timed&amp;quot;)] (NdArray, double) inc_ndarray_timed(NdArray nd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var api = LessPythonInvoke.Initialize&amp;lt;IMyPyApi&amp;gt;(&lt;br /&gt;
    pythonVenvPath: &amp;quot;&amp;quot;,                 // optional venv root (&amp;quot;&amp;quot; =&amp;gt; system python)&lt;br /&gt;
    exportingPyPath: &amp;quot;lesspy_work/exporting_module.py&amp;quot;, // your module path&lt;br /&gt;
    debug: false,&lt;br /&gt;
    keepAlive: true,&lt;br /&gt;
    capacity: 256 * 1024 * 1024          // per-file MMF capacity&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
int x = api.add_ints(2, 40);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialization ==&lt;br /&gt;
&amp;lt;code&amp;gt;LessPythonInvoke.Initialize&amp;amp;#x3C;T&amp;amp;#x3E;(string pythonVenvPath, string exportingPyPath, bool debug=false, bool keepAlive=false, int capacity=16*1024*1024)&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;pythonVenvPath&amp;lt;/code&amp;gt;: optional; empty string uses system &amp;lt;code&amp;gt;python&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;python3&amp;lt;/code&amp;gt;. - &amp;lt;code&amp;gt;exportingPyPath&amp;lt;/code&amp;gt;: path to your Python module file. - &amp;lt;code&amp;gt;debug&amp;lt;/code&amp;gt;: enables extra logging from the shim. - &amp;lt;code&amp;gt;keepAlive&amp;lt;/code&amp;gt;: keep Python server and MMFs running across C# process runs. - &amp;lt;code&amp;gt;capacity&amp;lt;/code&amp;gt;: size of each MMF file (request/response). Must be large enough for your largest payload.&lt;br /&gt;
&lt;br /&gt;
MMF/aux files are placed under &amp;lt;code&amp;gt;bin/&amp;amp;#x3C;config&amp;amp;#x3E;/&amp;amp;#x3C;tfm&amp;amp;#x3E;/lesspy_work/&amp;lt;/code&amp;gt;: - &amp;lt;code&amp;gt;req.mmf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;resp.mmf&amp;lt;/code&amp;gt;: shared memory files - &amp;lt;code&amp;gt;lesspy_shim.py&amp;lt;/code&amp;gt;: shim injected and launched - &amp;lt;code&amp;gt;python.pid&amp;lt;/code&amp;gt;: Python PID (keepalive) - &amp;lt;code&amp;gt;notify.port&amp;lt;/code&amp;gt;: TCP port (keepalive reconnect)&lt;br /&gt;
&lt;br /&gt;
== Attributes and binding ==&lt;br /&gt;
&lt;br /&gt;
* Mark interface methods with &amp;lt;code&amp;gt;[PythonImport]&amp;lt;/code&amp;gt;. The method name maps to the Python function name by default; override via &amp;lt;code&amp;gt;[PythonImport(&amp;amp;#x22;py_name&amp;amp;#x22;)]&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Supported argument/return types:&lt;br /&gt;
** &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;byte[]&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;int[]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;int[][]&amp;lt;/code&amp;gt; (nested)&lt;br /&gt;
** &amp;lt;code&amp;gt;ValueTuple&amp;lt;/code&amp;gt; with supported element types&lt;br /&gt;
** &amp;lt;code&amp;gt;NdArray&amp;lt;/code&amp;gt; (NumPy) with shape/dtype/data&lt;br /&gt;
&lt;br /&gt;
== NdArray ==&lt;br /&gt;
&amp;lt;code&amp;gt;NdArray&amp;lt;/code&amp;gt; represents a NumPy array: &amp;lt;code&amp;gt;Shape&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Dtype&amp;lt;/code&amp;gt;, and data. On responses, if Python returns a NumPy array, the C# side returns an &amp;lt;code&amp;gt;NdArray&amp;lt;/code&amp;gt; backed by a zero-copy view over &amp;lt;code&amp;gt;resp.mmf&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;DataMemory&amp;lt;/code&amp;gt;). Accessing &amp;lt;code&amp;gt;NdArray.Data&amp;lt;/code&amp;gt; materializes a copy only on demand.&lt;br /&gt;
&lt;br /&gt;
== KeepAlive ==&lt;br /&gt;
&lt;br /&gt;
* When &amp;lt;code&amp;gt;keepAlive: true&amp;lt;/code&amp;gt;, the Python process keeps running after C# exits.&lt;br /&gt;
* On next run, C# will reuse the existing Python server by reading &amp;lt;code&amp;gt;python.pid&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;notify.port&amp;lt;/code&amp;gt;, then connect over TCP.&lt;br /&gt;
* If the notify connection drops, Python keeps listening; subsequent runs will reconnect.&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
&lt;br /&gt;
* Binary protocol (no JSON) over SHM, single-byte notify via localhost TCP.&lt;br /&gt;
* Direct pointer copies for MMF read/write; no intermediate payload buffers on C# side.&lt;br /&gt;
* Zero-copy ndarray responses (views over &amp;lt;code&amp;gt;resp.mmf&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Example (4096x4096 float32 inc): ~24.9 ms end-to-end for one un-timed call (~5.1 GB/s raw read+write).&lt;br /&gt;
&lt;br /&gt;
Tips: - Use larger &amp;lt;code&amp;gt;capacity&amp;lt;/code&amp;gt; for big transfers. - Prefer returning arrays directly from Python for zero-copy on C#. - For transforms, compute into the response buffer on Python side to avoid extra copies.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
* MMF locked on rapid restarts: you may see &amp;lt;code&amp;gt;user-mapped section open&amp;lt;/code&amp;gt;. Retry after a moment; add exponential backoff if needed.&lt;br /&gt;
* Type mismatch in tuples: ensure element types align (e.g., &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt; vs &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt;). The invoker coerces primitives where needed.&lt;br /&gt;
* KeepAlive not reusing: ensure &amp;lt;code&amp;gt;python.pid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;notify.port&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;req.mmf&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;resp.mmf&amp;lt;/code&amp;gt; remain present and Python is still running.&lt;br /&gt;
* Capacity exceeded: increase &amp;lt;code&amp;gt;capacity&amp;lt;/code&amp;gt; to fit your largest request/response.&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=FundamentalLib%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E&amp;diff=970</id>
		<title>FundamentalLib使用说明</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=FundamentalLib%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E&amp;diff=970"/>
		<updated>2025-09-04T08:49:47Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;FundamentalLib是懒书的工具箱库。&lt;br /&gt;
&lt;br /&gt;
* [[LessPythonInvoke]]：用于和Python进行交互的库，轻松调用。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=FundamentalLib%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E&amp;diff=969</id>
		<title>FundamentalLib使用说明</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=FundamentalLib%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E&amp;diff=969"/>
		<updated>2025-09-04T08:49:30Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​创建页面，内容为“FundamentalLib是懒书的工具箱库。  * LessPythonInvoke：用于和Python进行交互的库，轻松调用。”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;FundamentalLib是懒书的工具箱库。&lt;br /&gt;
&lt;br /&gt;
* LessPythonInvoke：用于和Python进行交互的库，轻松调用。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=968</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=968"/>
		<updated>2025-09-04T08:29:47Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​/* 使用手册 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:1--&amp;gt;&lt;br /&gt;
MDCS是上海懒书智能科技开发的机器人软件构建框架，包括以下组件。&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
* Medulla：高效的硬件通信、控制和抽象平台。&lt;br /&gt;
* Detour：定位系统，内置激光雷达和视觉SLAM等。&lt;br /&gt;
* Clumsy：机器人运动指令平台，内置AGV/AMR的典型运动能力。&lt;br /&gt;
* Simple：机器人集群管理系统，核心为交通控制和寻路。&lt;br /&gt;
* CycleGUI：针对算法内核交互的回合式GUI框架，可在任何算法中随时提交协程由CycleGUI托管界面，协程仅在需要刷新界面时调用，效率很高。此外还支持''裸眼3D显示''&lt;br /&gt;
* DIVER(Dotnet Integrated Vehicle Runtime): 是一个专门用于载具控制系统的.NET运行环境，可将C#程序开发的Medulla下位硬件控制程序无痛地运行在MCU中。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
更详细地综述见：[[特殊:我的语言/MDCS-Walkthrough|MDCS-Walkthrough]]  [[特殊:我的语言/MDCS概述|&amp;lt;s&amp;gt;MDCS概述&amp;lt;/s&amp;gt;]]&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
== 基本介绍 ==&lt;br /&gt;
&lt;br /&gt;
'''定位系统'''：AGV的定位是由独立模块《Detour》完成。Detour支持激光雷达和视觉的各类SLAM算法，包括[[特殊:我的语言/具有高鲁棒性的激光SLAM算法|具有高鲁棒性的2D激光SLAM算法]]、[[特殊:我的语言/地纹SLAM|地纹SLAM]]、[[特殊:我的语言/天花板SLAM|天花板SLAM]]、[[特殊:我的语言/二维码识别导航|二维码导航]]等，支持[[特殊:我的语言/多定位源的自动综合|多定位源的自动综合]]。Detour可以使用Medulla提供的数据来源、也可以自行获取。整套MDCS实施时一般使用Medulla提供的数据来源。&lt;br /&gt;
&lt;br /&gt;
'''AGV车载系统'''：由Medulla（硬件抽象逻辑）、Clumsy（车体运动抽象）组成并对功能定义；二者原理见[[特殊:我的语言/车体抽象原理|车体抽象原理]]。Medulla+Clumsy可实现各类车体动作，最简单诸如[[特殊:我的语言/巡线行走|巡线行走]]、[[特殊:我的语言/绕障行走|绕障行走]]等，复杂一些的例子如[[特殊:我的语言/自动识别工位并取放货|自动识别工位并取放货]]、[[特殊:我的语言/自动识别托盘取放货|自动识别托盘取放货]]、[[特殊:我的语言/识别料框并堆垛拆垛|识别料框并堆垛拆垛]]、[[特殊:我的语言/联动天眼系统进行装卸车|联动天眼系统进行装卸车]]等。车载软件定义了AGV的能力集以及测试方法，并可由调度软件做动作组合从而完成整套任务。&lt;br /&gt;
&lt;br /&gt;
'''车队调度'''：交管、寻路、包络、可达性分析等内核算法由SimpleCore提供，其原理参见[[特殊:我的语言/调度内核运行原理|内核运行原理]]，SimpleCore提供编程接口使得用户可对具体车型或业务场景编程声明寻路规则、运行脚本、包络、可达性需求等。对调度的运行原理参见：[[特殊:我的语言/AGV任务运行逻辑|AGV任务运行逻辑]] 。MDCS提供一个简单的壳层称为SimpleComposer，其提供UI和基础的车辆通信定义，在此之上还支持插件进一步定义车辆具体细节和业务逻辑。&lt;br /&gt;
&lt;br /&gt;
'''周围系统'''：CycleGUI可用于3D显示和远程界面显示，可快速开发诸如3D标注程序、[[全息座舱]]等应用；DIVER可用于基于MCU低成本快速地开发四向穿梭车、磁导航车、编舞机器人等。V-helper是一套ＭＤＣ（车载程序）的远程监控和运维程序，可监控ＭＤＣ程序的堆栈、检查DObject/Hedingben变量内容等。&lt;br /&gt;
&lt;br /&gt;
== 快速开始 ==&lt;br /&gt;
&lt;br /&gt;
'''定位'''&lt;br /&gt;
&lt;br /&gt;
如果您有Detour使用经验，请阅读 [[特殊:我的语言/下载并部署Detour|下载并部署Detour]] 快速开始。如果您首次使用Detour，请阅读详细教程：首先是 [[特殊:我的语言/安装Detour|安装Detour]] ，然后 [[标定激光雷达外参]] ，然后 [[激光SLAM建图]] ，用于优化地图的 [[激光地图编辑指南]] ，最后 使用激光SLAM功能 。&lt;br /&gt;
&lt;br /&gt;
在激光不友好的场景，我们可以使用地纹SLAM。请阅读[[地纹SLAM技术概述]]来了解这个特性。&lt;br /&gt;
&lt;br /&gt;
'''整车适配'''&lt;br /&gt;
&lt;br /&gt;
对于需要做整车适配的读者，请阅读以下文章。&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/MDCS引擎适配机器人入门教学|MDCS引擎适配机器人入门教学]]、[[特殊:我的语言/叉车适配案例|叉车(牵引车)适配案例]]、[[特殊:我的语言/潜伏顶升车(KIVA类小车)适配案例|潜伏顶升车(KIVA类小车)适配案例]]、[[特殊:我的语言/全向车适配案例|全向车适配案例]]、[[特殊:我的语言/牵引车适配案例|双阿克曼车型适配案例]]&lt;br /&gt;
&lt;br /&gt;
传感器适配&lt;br /&gt;
&lt;br /&gt;
[[2D激光雷达适配]]、[[3D相机适配]]（全局曝光、alt/azi固定的、像素化的3D雷达也算此类）、[[3D激光雷达适配]]、&lt;br /&gt;
&lt;br /&gt;
== 使用手册 ==&lt;br /&gt;
&lt;br /&gt;
=== 通识和入门教学 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/MDCS-Walkthrough|MDCS-Walkthrough]] &lt;br /&gt;
&lt;br /&gt;
[[Detour简介]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS简介|使用手册 - MDCS简介]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/激光SLAM的能力边界|激光SLAM的能力边界]]&lt;br /&gt;
&lt;br /&gt;
[[非标车型使用手册]]&lt;br /&gt;
&lt;br /&gt;
=== 定位导航相关手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 定位导航|使用手册 - 定位导航]]&lt;br /&gt;
&lt;br /&gt;
[[激光SLAM建图|使用手册 - 激光SLAM建图]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 激光SLAM＋反光板建图手册|使用手册 - 激光SLAM+反光板建图手册]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 分析定位问题|使用手册 - 分析定位问题]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 激光＋纹理导航|使用手册 - 激光+纹理导航]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Detour车体编辑器使用教学|使用手册 - Detour车体编辑器使用教学]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 双雷达标定手册|使用手册 - 双雷达标定手册]] / [[特殊:我的语言/标定双激光雷达外参|标定双激光雷达外参]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 在地纹导航中使用二维码快速找回定位|使用手册 - 在地纹导航中使用二维码快速找回定位]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 同时使用激光、地纹、二维码、轮编里程计和IMU进行鲁棒定位|使用手册 - 同时使用激光、地纹、二维码、轮编里程计和IMU进行鲁棒定位]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/标定激光雷达外参|标定激光雷达外参]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - 如何在核显工控机上运行地纹导航]]&lt;br /&gt;
&lt;br /&gt;
[[激光雷达选型测试报告]]&lt;br /&gt;
&lt;br /&gt;
[[输入GPS外部定位]]&lt;br /&gt;
&lt;br /&gt;
[[DetourLite检查表]]&lt;br /&gt;
&lt;br /&gt;
=== 运动控制使用手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用叉车自动取托盘功能|使用叉车自动取托盘功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用自动对准料架功能|使用自动对准料架功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用叉车料架堆叠功能|使用叉车料架堆叠功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/色带和磁条导航|色带和磁条导航]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/纯二维码导航|纯二维码导航]]&lt;br /&gt;
&lt;br /&gt;
=== 调度相关手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 车队管控|使用手册 - 车队管控]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册-routing字段：设置车辆必经点（必不经点）逻辑|使用手册 - routing字段：设置车辆必经点（必不经点）逻辑]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:从使用到开发]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:coder（路径编译器）机制详解]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:包络如何定义]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS软件部署方法介绍|使用手册 - MDCS软件部署方法介绍]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Simple软件文件管理标准化作业|使用手册 - Simple软件文件管理标准化作业]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS适配流程说明|使用手册 - MDCS适配流程说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS适配详细说明|使用手册 - MDCS适配详细说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Simple图层合并手册|使用手册 - Simple图层合并手册]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 寻路启发器功能|使用手册 - 寻路启发器功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 更多交管细节用法|使用手册 - 更多交管细节用法]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 劫持用法|使用手册 - 劫持用法]](用于中途更改路线)&lt;br /&gt;
&lt;br /&gt;
[[可达性状态编程|使用手册 - 可达性状态编程（用于如驶入式巷道叉车避免前车放货后影响后车运行等场景）]]&lt;br /&gt;
&lt;br /&gt;
=== 二次开发相关说明 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何适配新的雷达|如何适配新的雷达]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何使用CycleGUI快速开发UI界面|如何使用CycleGUI快速开发UI界面]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何使用LessokajiWeaver的多语言功能|如何使用LessokajiWeaver的多语言功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - 轨迹跟踪|开发手册 - 轨迹跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - 目标跟踪|开发手册 - 目标跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - SimpleComposer界面开发 - CAD工具|开发手册 - SimpleComposer界面开发 - CAD工具]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Medulla:相机使用方法 Camera Data Access Guide]]&lt;br /&gt;
&lt;br /&gt;
[[如何基于SimpleCore核心库进行调度系统开发]]&lt;br /&gt;
&lt;br /&gt;
=== 杂项 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何查看工控机性能以及功耗墙|如何查看工控机性能以及功耗墙]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 数据录制与回放手册|使用手册 - 数据录制与回放手册]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Linux MDCS部署配置和操作说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/FAQ|FAQ]]&lt;br /&gt;
&lt;br /&gt;
Cheat sheet&lt;br /&gt;
&lt;br /&gt;
[[Detour版本发布记录]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/待整理的杂项内容|待整理的杂项内容]]&lt;br /&gt;
&lt;br /&gt;
[[FundamentalLib使用说明]]&lt;br /&gt;
&lt;br /&gt;
== 技术报告 ==&lt;br /&gt;
&lt;br /&gt;
* MDCS架构&lt;br /&gt;
** Medulla软件架构&lt;br /&gt;
** Detour软件架构&lt;br /&gt;
*** Detour激光SLAM算法详解&lt;br /&gt;
*** Detour地面纹理SLAM算法详解&lt;br /&gt;
** Simple软件架构&lt;br /&gt;
*** [[特殊:我的语言/调度内核运行原理|调度内核运行原理]]&lt;br /&gt;
**** 基于预先规划交管算法：[[特殊:我的语言/DPS调度算法详解|DPS调度算法详解]]&lt;br /&gt;
**** 流场规划&lt;br /&gt;
*** 基于网络流的业务规划器&lt;br /&gt;
* LessokajiWeaver编译后处理工具&lt;br /&gt;
* CycleGUI&lt;br /&gt;
&lt;br /&gt;
== 接口 ==&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Medulla-API|Medulla]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Detour-API|Detour]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Clumsy-API|Clumsy]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Simple-API|Simple]]&lt;br /&gt;
&lt;br /&gt;
== 术语和约定 ==&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/通用约定|MDCS开发通用约定]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/定位导航|定位导航]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Medulla]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Detour]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Clumsy]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Simple]]&lt;br /&gt;
&lt;br /&gt;
== 特殊技术方案 ==&lt;br /&gt;
&lt;br /&gt;
当前MDCS的特殊技术方案包括：[[特殊:我的语言/托盘识别|托盘识别]]、[[特殊:我的语言/双车/多车联动|双车/多车联动]]、[[特殊:我的语言/汽车面差检测|汽车面差检测]]、[[特殊:我的语言/天眼系统|天眼系统]]、[[特殊:我的语言/自动装卸车应用|自动装卸车应用]]、[[特殊:我的语言/复合卷料机械手叉车|复合卷料机械手叉车]]、[[特殊:我的语言/清洁机器人|清洁机器人]]、[[特殊:我的语言/设备跟随联动|设备跟随联动]]。其它技术方案还在进一步补充中。&lt;br /&gt;
[[文件:Drliuwechat.png|缩略图|100x100像素|微信联系方式]]&lt;br /&gt;
&lt;br /&gt;
== 链接 ==&lt;br /&gt;
&lt;br /&gt;
*[https://dl.lessokaji.com MDCS下载站]：MDCS的各类程序可在该站上下载&lt;br /&gt;
* [https://dev.lessokaji.com 技术讨论站]：包含FAQ、需求讨论、AGV项目实施经验等技术讨论&lt;br /&gt;
* [https://nuget.lessokaji.com MDCS专用Nuget源]：MDCS主要使用c#进行开发，该源包括主要会用的库&lt;br /&gt;
* [https://git.lessokaji.com MDCS代码库]：git源&lt;br /&gt;
* [https://auth.lessokaji.com MDCS授权站]：License授权、代码阅读和编译权限授权站&lt;br /&gt;
* 一些视频案例：链接：https://pan.baidu.com/s/1foIUJzCnpbEaNoy6ooVbJg 提取码：2of9&lt;br /&gt;
&lt;br /&gt;
__无目录__&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=FAQ&amp;diff=967</id>
		<title>FAQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=FAQ&amp;diff=967"/>
		<updated>2025-09-04T06:22:59Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== 基础问题 ===&lt;br /&gt;
* Q: 机器人在转圈的时候，Detour为什么反馈的方向角从2.2度突然跳到了-357.8度，差了4.4度？&lt;br /&gt;
** A: 2.2度和-357.8度是同一个角度，并没有差了4.4度。另外能问出这个问题的同学，也经常卡在计算两个角度的角度差上，那么可以使用这个公式：&lt;br /&gt;
&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;thdiff = (th1-th2)-round((th1-th2)/360)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 调试原理性问题 ===&lt;br /&gt;
* Q: Simple下任务后，Clumsy的表现和预期不一致，或者做完任务后Simple还报错了，如何调试？&lt;br /&gt;
** A: Simple首先通过对车进行路径搜索（SegmentPlan.FindRoute）搜索到路径，然后通过Compile调用车体类挂载的Coder生成代码，最后通过车体类继承的actualSendScript进行脚本下发。对于Clumsy而言，下发的脚本会保存于debug目录下。首先检查脚本是否正确，然后调试Clumsy插件中继承SimpleAGVInterface的类（一般为AGV类），是否其函数按照正常的方法实现了（见[[通用约定]]）。&lt;br /&gt;
*Q: Simple不给锁，怎么看原因？&lt;br /&gt;
**A: 点开小车的状态面板，看TcStat交管信息。这个字段里显示了为什么不下发锁的原因。&lt;br /&gt;
*Q: Simple似乎死锁了？&lt;br /&gt;
**A: Simple非常非常难遇到真的死锁。可以看BlockedBy字段来判断到底是真的死锁了，还是因为路线图设计问题导致的关键等待。可能所有的车都在等一个关键车下发路线。&lt;br /&gt;
*Q: Simple包络似乎错了，两个车包络明明冲突但相撞了。&lt;br /&gt;
**A: 检查经过的路径的layerName，在不同layerName上的包络互相不冲突。比如layerName&lt;br /&gt;
*Q:使用激光+地纹导航时，出现车辆位置来回拉扯的情况，是怎么回事？&lt;br /&gt;
**A：首先检查detour.json中uscTC是否设置为true。然后还需要判断两个里程计的时序问题，在有独立显卡的工控机上，地纹延迟低，雷达延迟高，需要将单线雷达的time_bias_ms设置为-30至-50（具体根据雷达延迟），若使用核显跑地纹，地纹延迟会上升，此时将雷达和相机的tims_bias_ms都设置为0&lt;br /&gt;
&lt;br /&gt;
=== Detour使用常见问题 ===&lt;br /&gt;
&lt;br /&gt;
* Q:Detour软件没有在匹配地图，定位不理想，虽然建了地图，但地图就像没有用一样。手动拖拽位置也无法恢复位置。&lt;br /&gt;
** A: 这很可能是因为地图回环匹配线程没有开启，比如删了原图层并增加了个新图层。可以到对应面板里点“启动”来启动回环线程。&lt;br /&gt;
* Q: 为什么定不了位？界面不动？为什么电脑重启后无法定位？&lt;br /&gt;
** A: 很可能是因为没有启动。可以点“全部启动”按钮启动定位。如果需要自动后自动全部启动，勾选“自动开启”选项并保存配置。&lt;br /&gt;
&lt;br /&gt;
=== CycleGUI使用问题 ===&lt;br /&gt;
&lt;br /&gt;
* 本地界面的启动参数放置于cyclegui_conf.txt文件中，格式为若干行&amp;quot;参数=xxx&amp;quot;，xxx为数字。可配置的参数包括swapinterval（0/1，表示持续刷新界面还是等垂直同步，或者-1表示GSync）, drawmouse, limitfps, forgetsize（是否不保存上次主界面关闭时的窗口位置）。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E5%BE%85%E6%95%B4%E7%90%86%E7%9A%84%E6%9D%82%E9%A1%B9%E5%86%85%E5%AE%B9&amp;diff=966</id>
		<title>待整理的杂项内容</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E5%BE%85%E6%95%B4%E7%90%86%E7%9A%84%E6%9D%82%E9%A1%B9%E5%86%85%E5%AE%B9&amp;diff=966"/>
		<updated>2025-08-12T09:02:40Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Simple ===&lt;br /&gt;
'''逃逸功能：'''&lt;br /&gt;
&lt;br /&gt;
Simple现在允许多个小车可以发到互相冲突的终点，只要指定一个Escape路径。该Escape路线不会执行，只是用于告诉交管至少保留哪条路径来保证场景不会卡死。使用方法：carprogram的.Forecast方法增加了一个参数，可以传入EscapePlan。&lt;br /&gt;
注意：这个escapeplan只是用于交管计算，内核并不会真的执行这个plan。如果遇到小车必须执行逃逸路径的情况（比如巷道外车辆等待巷道内停留的车辆离开巷道，此时巷道外车辆的tcstat状态会是Escape[xx...]），那么需要由业务下发实际任务。按照设计理念，内核只告诉业务某个车应该走（挡路了），具体怎么走需要业务决定。&lt;br /&gt;
[[文件:E67a478ac2900cd6b7ab025ee445c9d9 .png|无|缩略图|代码示例]]&lt;br /&gt;
此外小车调用AbstractCar.Reset方法时，也可以给一个escape路径（escape可选参数）。这样可以防止其他车因为不知道该小车后续如何运行而把刚初始化的小车堵死。举个例子而言：刚初始化的小车A在长巷道内，另外一台车B要进入巷道更深的地方。希望小车A初始化后立刻出来取货，那么应该给小车A附加一个escape路径去任意一个取货点，这样初始化后，即便上层业务还没有下发取货指令，B车也不会提前进入巷道导致A车堵死在巷道里。&lt;br /&gt;
&lt;br /&gt;
====== Simple的站点交管方式： ======&lt;br /&gt;
交管计算时，会以以下顺序设置站点的计算方式：&lt;br /&gt;
&lt;br /&gt;
# terminal：表示一个停靠终点站；定义为：入站和出站路线绝对不会冲突。该站点只能被一台车占用。一般环线上可以使用（环线不存在交管问题，使用terminal方式配置相对于编程设置escape而言，较为简单）&lt;br /&gt;
# sink：表示该站点无视交管通行矩阵中的冲突。（注：若同时具有terminal标记，仍然只能被一台车占用）&lt;br /&gt;
# mustFree：若某台车要占用该站点，那么mustFree里列举的站点必须不被占用。&lt;br /&gt;
# mutexes：若某台车要占用该站点，那么所有“包含至少一个相同mutexes数字”的站点都必须不被占用。&lt;br /&gt;
# carProgram规定的冲突：包络、&amp;lt;s&amp;gt;优先级&amp;lt;/s&amp;gt;现在使用“可达性状态”。&lt;br /&gt;
&lt;br /&gt;
=== Detour ===&lt;br /&gt;
使用2D激光SLAM算法，首先必须调平雷达！可以使用红外相机调平。&lt;br /&gt;
[[文件:Weixin Image 20231230212150.jpg|缩略图|无|使用红外相机可以看到激光雷达的扫描线]]&lt;br /&gt;
&lt;br /&gt;
定位一定是有延迟的。要求高精度定位时，不光对定位精度要求高，实际上对车体结构、机械、控制的精度同时很高。一般可以将定位数据和轮子编码器数据画在同一个图上进行对比，从而获取延迟数据，这是个常用的分析方法。举例如下：&lt;br /&gt;
[[文件:Excel-latency-actual-draw..png|无|缩略图|使用excel图表功能，可以比较轻松地同时分析定位延迟和机械蠕变等信息。]]DetourLite: 现在增加了二次开发功能，可以将插件放入DetourLite下的plugins目录中。DetourLite开启会自动扫描目录插件完成加载。二次开发主要是匹配雷达并使DetourLite独立运行使用。&lt;br /&gt;
&lt;br /&gt;
=== Medulla ===&lt;br /&gt;
&lt;br /&gt;
=== Clumsy ===&lt;br /&gt;
&lt;br /&gt;
=== 通用常识 ===&lt;br /&gt;
雷达发射的开角腔需要涂黑处理。如果不涂黑则会发生两种可能的问题：1：边缘测距精度严重下降，测距偏小；2：发生掠射，车体壁在雷达看来如同镜子。&lt;br /&gt;
&lt;br /&gt;
AGV实施大量时候需要拍摄现场场景进行分析。拍现场场景的小tip：要横屏拍，要用手机自带的相机和广角，要拍照而不是录像。否则发一个长达1min的镜头缓缓转动的视频，不仅慢，而且抖，纯属浪费时间。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=965</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=965"/>
		<updated>2025-08-11T06:22:11Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:1--&amp;gt;&lt;br /&gt;
MDCS是上海懒书智能科技开发的机器人软件构建框架，包括以下组件。&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
* Medulla：高效的硬件通信、控制和抽象平台。&lt;br /&gt;
* Detour：定位系统，内置激光雷达和视觉SLAM等。&lt;br /&gt;
* Clumsy：机器人运动指令平台，内置AGV/AMR的典型运动能力。&lt;br /&gt;
* Simple：机器人集群管理系统，核心为交通控制和寻路。&lt;br /&gt;
* CycleGUI：针对算法内核交互的回合式GUI框架，可在任何算法中随时提交协程由CycleGUI托管界面，协程仅在需要刷新界面时调用，效率很高。此外还支持''裸眼3D显示''&lt;br /&gt;
* DIVER(Dotnet Integrated Vehicle Runtime): 是一个专门用于载具控制系统的.NET运行环境，可将C#程序开发的Medulla下位硬件控制程序无痛地运行在MCU中。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
更详细地综述见：[[特殊:我的语言/MDCS-Walkthrough|MDCS-Walkthrough]]  [[特殊:我的语言/MDCS概述|&amp;lt;s&amp;gt;MDCS概述&amp;lt;/s&amp;gt;]]&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
== 基本介绍 ==&lt;br /&gt;
&lt;br /&gt;
'''定位系统'''：AGV的定位是由独立模块《Detour》完成。Detour支持激光雷达和视觉的各类SLAM算法，包括[[特殊:我的语言/具有高鲁棒性的激光SLAM算法|具有高鲁棒性的2D激光SLAM算法]]、[[特殊:我的语言/地纹SLAM|地纹SLAM]]、[[特殊:我的语言/天花板SLAM|天花板SLAM]]、[[特殊:我的语言/二维码识别导航|二维码导航]]等，支持[[特殊:我的语言/多定位源的自动综合|多定位源的自动综合]]。Detour可以使用Medulla提供的数据来源、也可以自行获取。整套MDCS实施时一般使用Medulla提供的数据来源。&lt;br /&gt;
&lt;br /&gt;
'''AGV车载系统'''：由Medulla（硬件抽象逻辑）、Clumsy（车体运动抽象）组成并对功能定义；二者原理见[[特殊:我的语言/车体抽象原理|车体抽象原理]]。Medulla+Clumsy可实现各类车体动作，最简单诸如[[特殊:我的语言/巡线行走|巡线行走]]、[[特殊:我的语言/绕障行走|绕障行走]]等，复杂一些的例子如[[特殊:我的语言/自动识别工位并取放货|自动识别工位并取放货]]、[[特殊:我的语言/自动识别托盘取放货|自动识别托盘取放货]]、[[特殊:我的语言/识别料框并堆垛拆垛|识别料框并堆垛拆垛]]、[[特殊:我的语言/联动天眼系统进行装卸车|联动天眼系统进行装卸车]]等。车载软件定义了AGV的能力集以及测试方法，并可由调度软件做动作组合从而完成整套任务。&lt;br /&gt;
&lt;br /&gt;
'''车队调度'''：交管、寻路、包络、可达性分析等内核算法由SimpleCore提供，其原理参见[[特殊:我的语言/调度内核运行原理|内核运行原理]]，SimpleCore提供编程接口使得用户可对具体车型或业务场景编程声明寻路规则、运行脚本、包络、可达性需求等。对调度的运行原理参见：[[特殊:我的语言/AGV任务运行逻辑|AGV任务运行逻辑]] 。MDCS提供一个简单的壳层称为SimpleComposer，其提供UI和基础的车辆通信定义，在此之上还支持插件进一步定义车辆具体细节和业务逻辑。&lt;br /&gt;
&lt;br /&gt;
'''周围系统'''：CycleGUI可用于3D显示和远程界面显示，可快速开发诸如3D标注程序、[[全息座舱]]等应用；DIVER可用于基于MCU低成本快速地开发四向穿梭车、磁导航车、编舞机器人等。V-helper是一套ＭＤＣ（车载程序）的远程监控和运维程序，可监控ＭＤＣ程序的堆栈、检查DObject/Hedingben变量内容等。&lt;br /&gt;
&lt;br /&gt;
== 快速开始 ==&lt;br /&gt;
&lt;br /&gt;
'''定位'''&lt;br /&gt;
&lt;br /&gt;
如果您有Detour使用经验，请阅读 [[特殊:我的语言/下载并部署Detour|下载并部署Detour]] 快速开始。如果您首次使用Detour，请阅读详细教程：首先是 [[特殊:我的语言/安装Detour|安装Detour]] ，然后 [[标定激光雷达外参]] ，然后 [[激光SLAM建图]] ，用于优化地图的 [[激光地图编辑指南]] ，最后 使用激光SLAM功能 。&lt;br /&gt;
&lt;br /&gt;
在激光不友好的场景，我们可以使用地纹SLAM。请阅读[[地纹SLAM技术概述]]来了解这个特性。&lt;br /&gt;
&lt;br /&gt;
'''整车适配'''&lt;br /&gt;
&lt;br /&gt;
对于需要做整车适配的读者，请阅读以下文章。&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/MDCS引擎适配机器人入门教学|MDCS引擎适配机器人入门教学]]、[[特殊:我的语言/叉车适配案例|叉车(牵引车)适配案例]]、[[特殊:我的语言/潜伏顶升车(KIVA类小车)适配案例|潜伏顶升车(KIVA类小车)适配案例]]、[[特殊:我的语言/全向车适配案例|全向车适配案例]]、[[特殊:我的语言/牵引车适配案例|双阿克曼车型适配案例]]&lt;br /&gt;
&lt;br /&gt;
传感器适配&lt;br /&gt;
&lt;br /&gt;
[[2D激光雷达适配]]、[[3D相机适配]]（全局曝光、alt/azi固定的、像素化的3D雷达也算此类）、[[3D激光雷达适配]]、&lt;br /&gt;
&lt;br /&gt;
== 使用手册 ==&lt;br /&gt;
&lt;br /&gt;
=== 通识和入门教学 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/MDCS-Walkthrough|MDCS-Walkthrough]] &lt;br /&gt;
&lt;br /&gt;
[[Detour简介]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS简介|使用手册 - MDCS简介]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/激光SLAM的能力边界|激光SLAM的能力边界]]&lt;br /&gt;
&lt;br /&gt;
[[非标车型使用手册]]&lt;br /&gt;
&lt;br /&gt;
=== 定位导航相关手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 定位导航|使用手册 - 定位导航]]&lt;br /&gt;
&lt;br /&gt;
[[激光SLAM建图|使用手册 - 激光SLAM建图]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 激光SLAM＋反光板建图手册|使用手册 - 激光SLAM+反光板建图手册]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 分析定位问题|使用手册 - 分析定位问题]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 激光＋纹理导航|使用手册 - 激光+纹理导航]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Detour车体编辑器使用教学|使用手册 - Detour车体编辑器使用教学]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 双雷达标定手册|使用手册 - 双雷达标定手册]] / [[特殊:我的语言/标定双激光雷达外参|标定双激光雷达外参]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 在地纹导航中使用二维码快速找回定位|使用手册 - 在地纹导航中使用二维码快速找回定位]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 同时使用激光、地纹、二维码、轮编里程计和IMU进行鲁棒定位|使用手册 - 同时使用激光、地纹、二维码、轮编里程计和IMU进行鲁棒定位]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/标定激光雷达外参|标定激光雷达外参]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - 如何在核显工控机上运行地纹导航]]&lt;br /&gt;
&lt;br /&gt;
[[激光雷达选型测试报告]]&lt;br /&gt;
&lt;br /&gt;
[[输入GPS外部定位]]&lt;br /&gt;
&lt;br /&gt;
[[DetourLite检查表]]&lt;br /&gt;
&lt;br /&gt;
=== 运动控制使用手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用叉车自动取托盘功能|使用叉车自动取托盘功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用自动对准料架功能|使用自动对准料架功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用叉车料架堆叠功能|使用叉车料架堆叠功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/色带和磁条导航|色带和磁条导航]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/纯二维码导航|纯二维码导航]]&lt;br /&gt;
&lt;br /&gt;
=== 调度相关手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 车队管控|使用手册 - 车队管控]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册-routing字段：设置车辆必经点（必不经点）逻辑|使用手册 - routing字段：设置车辆必经点（必不经点）逻辑]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:从使用到开发]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:coder（路径编译器）机制详解]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:包络如何定义]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS软件部署方法介绍|使用手册 - MDCS软件部署方法介绍]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Simple软件文件管理标准化作业|使用手册 - Simple软件文件管理标准化作业]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS适配流程说明|使用手册 - MDCS适配流程说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS适配详细说明|使用手册 - MDCS适配详细说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Simple图层合并手册|使用手册 - Simple图层合并手册]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 寻路启发器功能|使用手册 - 寻路启发器功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 更多交管细节用法|使用手册 - 更多交管细节用法]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 劫持用法|使用手册 - 劫持用法]](用于中途更改路线)&lt;br /&gt;
&lt;br /&gt;
[[可达性状态编程|使用手册 - 可达性状态编程（用于如驶入式巷道叉车避免前车放货后影响后车运行等场景）]]&lt;br /&gt;
&lt;br /&gt;
=== 二次开发相关说明 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何适配新的雷达|如何适配新的雷达]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何使用CycleGUI快速开发UI界面|如何使用CycleGUI快速开发UI界面]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何使用LessokajiWeaver的多语言功能|如何使用LessokajiWeaver的多语言功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - 轨迹跟踪|开发手册 - 轨迹跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - 目标跟踪|开发手册 - 目标跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - SimpleComposer界面开发 - CAD工具|开发手册 - SimpleComposer界面开发 - CAD工具]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Medulla:相机使用方法 Camera Data Access Guide]]&lt;br /&gt;
&lt;br /&gt;
[[如何基于SimpleCore核心库进行调度系统开发]]&lt;br /&gt;
&lt;br /&gt;
=== 杂项 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何查看工控机性能以及功耗墙|如何查看工控机性能以及功耗墙]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 数据录制与回放手册|使用手册 - 数据录制与回放手册]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Linux MDCS部署配置和操作说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/FAQ|FAQ]]&lt;br /&gt;
&lt;br /&gt;
Cheat sheet&lt;br /&gt;
&lt;br /&gt;
[[Detour版本发布记录]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/待整理的杂项内容|待整理的杂项内容]]&lt;br /&gt;
&lt;br /&gt;
== 技术报告 ==&lt;br /&gt;
&lt;br /&gt;
* MDCS架构&lt;br /&gt;
** Medulla软件架构&lt;br /&gt;
** Detour软件架构&lt;br /&gt;
*** Detour激光SLAM算法详解&lt;br /&gt;
*** Detour地面纹理SLAM算法详解&lt;br /&gt;
** Simple软件架构&lt;br /&gt;
*** [[特殊:我的语言/调度内核运行原理|调度内核运行原理]]&lt;br /&gt;
**** 基于预先规划交管算法：[[特殊:我的语言/DPS调度算法详解|DPS调度算法详解]]&lt;br /&gt;
**** 流场规划&lt;br /&gt;
*** 基于网络流的业务规划器&lt;br /&gt;
* LessokajiWeaver编译后处理工具&lt;br /&gt;
* CycleGUI&lt;br /&gt;
&lt;br /&gt;
== 接口 ==&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Medulla-API|Medulla]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Detour-API|Detour]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Clumsy-API|Clumsy]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Simple-API|Simple]]&lt;br /&gt;
&lt;br /&gt;
== 术语和约定 ==&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/通用约定|MDCS开发通用约定]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/定位导航|定位导航]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Medulla]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Detour]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Clumsy]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Simple]]&lt;br /&gt;
&lt;br /&gt;
== 特殊技术方案 ==&lt;br /&gt;
&lt;br /&gt;
当前MDCS的特殊技术方案包括：[[特殊:我的语言/托盘识别|托盘识别]]、[[特殊:我的语言/双车/多车联动|双车/多车联动]]、[[特殊:我的语言/汽车面差检测|汽车面差检测]]、[[特殊:我的语言/天眼系统|天眼系统]]、[[特殊:我的语言/自动装卸车应用|自动装卸车应用]]、[[特殊:我的语言/复合卷料机械手叉车|复合卷料机械手叉车]]、[[特殊:我的语言/清洁机器人|清洁机器人]]、[[特殊:我的语言/设备跟随联动|设备跟随联动]]。其它技术方案还在进一步补充中。&lt;br /&gt;
[[文件:Drliuwechat.png|缩略图|100x100像素|微信联系方式]]&lt;br /&gt;
&lt;br /&gt;
== 链接 ==&lt;br /&gt;
&lt;br /&gt;
*[https://dl.lessokaji.com MDCS下载站]：MDCS的各类程序可在该站上下载&lt;br /&gt;
* [https://dev.lessokaji.com 技术讨论站]：包含FAQ、需求讨论、AGV项目实施经验等技术讨论&lt;br /&gt;
* [https://nuget.lessokaji.com MDCS专用Nuget源]：MDCS主要使用c#进行开发，该源包括主要会用的库&lt;br /&gt;
* [https://git.lessokaji.com MDCS代码库]：git源&lt;br /&gt;
* [https://auth.lessokaji.com MDCS授权站]：License授权、代码阅读和编译权限授权站&lt;br /&gt;
* 一些视频案例：链接：https://pan.baidu.com/s/1foIUJzCnpbEaNoy6ooVbJg 提取码：2of9&lt;br /&gt;
&lt;br /&gt;
__无目录__&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E5%AE%89%E8%A3%85Detour&amp;diff=962</id>
		<title>安装Detour</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E5%AE%89%E8%A3%85Detour&amp;diff=962"/>
		<updated>2025-07-02T06:18:56Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1. 前言 =&lt;br /&gt;
您如果首次使用MDCS，建议阅读【[[MDCS概述]]】，在了解MDCS各子系统功能后下载安装Detour。&lt;br /&gt;
&lt;br /&gt;
= 2. 下载Detour及依赖包 =&lt;br /&gt;
浏览器打开：https://dl.lessokaji.com 。这是MDCS下载站，可下载MDCS（AMR控制全栈软件）发布版。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240521113910923.png|无框|651x651像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-1 MDCS下载页面'''&lt;br /&gt;
&lt;br /&gt;
下载页面由两部分构成：&lt;br /&gt;
&lt;br /&gt;
* 软件包清单。&lt;br /&gt;
* 下载按钮（Zip）。&lt;br /&gt;
&lt;br /&gt;
点击软件包名称，展开分类列表，勾选后点击下载按钮，选中软件被打包到一个zip文件下载。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240521114105532.png|无框|610x610像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-2 勾选软件清单后下载'''&lt;br /&gt;
以Windows版Detour下载为例，如图2-2，“Selected Files”下是选中软件清单，点击“Zip”按钮打包下载。&lt;br /&gt;
&lt;br /&gt;
以Windows版Detour下载为例，如图2-2，“Selected Files”下是选中软件清单，点击“Zip”按钮打包下载。&lt;br /&gt;
&lt;br /&gt;
= 3. 安装 =&lt;br /&gt;
Detour与Medulla配套使用。Medulla接收激光雷达发送的测量数据，统一转换格式后通过共享内存发布给Detour。&amp;lt;blockquote&amp;gt;说明：Windows环境使用Detour.exe，Ubuntu环境使用DetourLite.dll（Detour内核功能）并配套Detour.exe（作为远程客户端）使用。Ubuntu环境通过Mono启动Medulla.exe。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3.1 Windows环境 ==&lt;br /&gt;
[[文件:Image tdrfgyuihjoklp.png|缩略图|使用M2]]&lt;br /&gt;
'''图 3-1 Windows环境的软件清单'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!模块&lt;br /&gt;
!程序&lt;br /&gt;
!用途&lt;br /&gt;
|-&lt;br /&gt;
|Detour&lt;br /&gt;
|Detour.exe&lt;br /&gt;
|Detour主程序&lt;br /&gt;
|-&lt;br /&gt;
|Medulla2&lt;br /&gt;
|Medulla2.exe&lt;br /&gt;
|Medulla2主程序&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|LidarControler.dll&lt;br /&gt;
|激光雷达控制器，部署在medulla的plugins子目录下（下同）&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;说明：Medulla2 &amp;amp; Detour运行在Windows 10以上版本，依赖 .netframework 4.8 [https://dotnet.microsoft.com/en-us/download/dotnet-framework/net48 Download .NET Framework 4.8 | Free official downloads (microsoft.com)]  。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
建议把Detour和Medulla存放在MDCS目录下，以便管理。MDCS目录所在分区至少有80G空闲容量，用于存储Detour和Medulla运行时生成的日志文件和配置数据。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Medulla的目录结构如下：&amp;lt;syntaxhighlight lang=&amp;quot;winbatch&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
D:\work\Playground\mdcs\Medulla 的目录&lt;br /&gt;
&lt;br /&gt;
2024/06/18  10:14    &amp;lt;DIR&amp;gt;          .&lt;br /&gt;
2024/06/18  10:14    &amp;lt;DIR&amp;gt;          ..&lt;br /&gt;
2024/06/13  08:18         3,420,672 Camera3D.dll		// 3D相机控制器，只用激光SLAM时不需要&lt;br /&gt;
2024/06/13  08:18           643,072 CartActivator.dll	// 底盘驱动加载器&lt;br /&gt;
2024/06/13  16:39    &amp;lt;DIR&amp;gt;          diagnosis			// 运行时日志目录&lt;br /&gt;
2024/06/13  08:18           854,016 LidarController.dll	// 激光雷达控制器&lt;br /&gt;
2024/05/21  13:00         3,335,168 MDCSToolBox.dll		// 工具箱，只用激光SLAM时不需要&lt;br /&gt;
2024/06/13  08:18         2,609,152 Medulla.exe			// 主程序，Ubuntu用mono启动&lt;br /&gt;
2024/05/21  13:00            14,544 Medulla.sys			// 主程序库&lt;br /&gt;
2024/06/13  08:18           752,128 NetRemote.exe		// 底盘遥控器，只用激光SLAM时不需要&lt;br /&gt;
2024/06/13  16:20    &amp;lt;DIR&amp;gt;          plugins				// 底盘驱动目录，激光雷达驱动存在此&lt;br /&gt;
2024/05/21  13:00             1,646 remoteconf.json		// 底盘遥控器配置文件&lt;br /&gt;
2024/06/13  16:20               192 startup.iocmd		// 自动加载驱动脚本&lt;br /&gt;
2024/06/13  08:18           758,784 USBCamera.dll		// USB相机控制器，只用激光SLAM时不需要&lt;br /&gt;
2024/06/13  08:18         1,715,712 WinMedulla.dll		// Medulla控制台库&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour的目录结构如下：&amp;lt;syntaxhighlight lang=&amp;quot;winbatch&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 D:\work\Playground\mdcs\Detour 的目录&lt;br /&gt;
&lt;br /&gt;
2024/06/18  09:23    &amp;lt;DIR&amp;gt;          .&lt;br /&gt;
2024/06/18  09:23    &amp;lt;DIR&amp;gt;          ..&lt;br /&gt;
2024/06/17  09:05           142,640 critical.log		// 错误日志&lt;br /&gt;
2024/06/13  10:54       152,167,424 cufft64_10.dll		// 库&lt;br /&gt;
2024/06/13  10:54           226,816 cufftw64_10.dll		// 库&lt;br /&gt;
2024/06/13  10:54           127,488 d2dlib64.dll		// 库&lt;br /&gt;
2024/06/17  09:05         5,914,624 Detour.exe			// 主程序&lt;br /&gt;
2024/06/18  09:28             5,744 detour_127.0.0.1.json	// 作为客户端连接远程DetourLite时&lt;br /&gt;
															// 自动下载的DetourLite配置文件，&lt;br /&gt;
															// detour_{detour_lite_ip}.json&lt;br /&gt;
2024/06/13  10:54    &amp;lt;DIR&amp;gt;          log					// 日志目录&lt;br /&gt;
2024/06/13  10:54        53,050,368 OpenCvSharpExtern.dll	// 库&lt;br /&gt;
2024/06/13  10:54           735,744 regcore_cuda.dll		// 库&lt;br /&gt;
2024/06/18  09:28           154,166 tmpmap.2dlm			// *.2dlm是激光地图文件&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;生产环境需要自动启动Medulla &amp;amp; Detour，且要监控并重启异常退出的进程，我们配套了看门狗程序Wawa，详见【[[看门狗Wawa使用说明]]】。&lt;br /&gt;
&lt;br /&gt;
== 3.2 Ubuntu环境 ==&lt;br /&gt;
[[文件:Image-20240521140212910.png|无框|610x610像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-2 Ubuntu环境下的软件清单'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!模块&lt;br /&gt;
!程序&lt;br /&gt;
!用途&lt;br /&gt;
|-&lt;br /&gt;
|Detour&lt;br /&gt;
|DetourLite&lt;br /&gt;
|DetourLite是Detour内核功能，依赖DotNetCore，与Windows版Detour（作为远程客户端）配套使用。&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|DetourLiteDepends&lt;br /&gt;
|DetourLite的依赖库，解压后放到DetourLite目录。&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|libOpenCvSharpExtern&lt;br /&gt;
|OpenCV依赖库，根据目标系统处理器架构选择arm64 / x64。&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|GDI+（可选）&lt;br /&gt;
|如果使用DetourLite的/getMapPng接口，则要安装GDI+库（sudo apt-get install -y libgdiplus）。&lt;br /&gt;
|-&lt;br /&gt;
|Medullar&lt;br /&gt;
|Medulla.exe&lt;br /&gt;
|Medulla主程序，依赖Mono。&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|LidarControler.dll&lt;br /&gt;
|激光雷达控制器，部署在medulla的plugins子目录下（下同）&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|WinMedulla.dll&lt;br /&gt;
|Medulla库。&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|CartActivator.dll&lt;br /&gt;
|插件加载器。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3.2.1 安装Medulla ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;注意：应使用Ubuntu 16、18或20，截止2024年6月，Mono官方支持的Ubuntu最高版本是20.04，Medulla &amp;amp; DetourLite在这3个发布版做过充分测试。&amp;lt;/blockquote&amp;gt;参考[https://www.mono-project.com/download/stable/#download-lin Mono官网指南]安装Mono。安装完毕后使用&amp;quot;mono --version&amp;quot;核对其版本，应是6.12以上，如下。&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Mono JIT compiler version 6.12.0.200 (tarball Tue Jul 11 21:34:53 UTC 2023)&lt;br /&gt;
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com&lt;br /&gt;
        TLS:           __thread&lt;br /&gt;
        SIGSEGV:       altstack&lt;br /&gt;
        Notifications: epoll&lt;br /&gt;
        Architecture:  amd64&lt;br /&gt;
        Disabled:      none&lt;br /&gt;
        Misc:          softdebug &lt;br /&gt;
        Interpreter:   yes&lt;br /&gt;
        LLVM:          yes(610)&lt;br /&gt;
        Suspend:       hybrid&lt;br /&gt;
        GC:            sgen (concurrent by default)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Medulla使用.netframework 4.8开发，在Ubuntu使用Mono启动。Mono是.NET Framework的开源实现，由微软赞助。请根据官网指南 Download - Stable | Mono (mono-project.com) 安装。&lt;br /&gt;
&lt;br /&gt;
使用mono启动Medulla：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
$ mono Medulla.exe&lt;br /&gt;
Lessokaji Medulla Version 1.2.0.3961, 64bit&lt;br /&gt;
Main Thread ID: 1&lt;br /&gt;
Medulla starting up...&lt;br /&gt;
Medulla command ready&lt;br /&gt;
Initialize Shared Objects for program Medulla&lt;br /&gt;
Mono or Linux which doesn't support named MMF, use file.&lt;br /&gt;
Create Shared Object dumplog&lt;br /&gt;
SO&amp;gt;&amp;gt; Exist dumplog:6579279&lt;br /&gt;
Initialize Diagnosis cache&lt;br /&gt;
Run on Mono or Linux which doesn't support named MMF, use file.&lt;br /&gt;
initializing io object&lt;br /&gt;
Create Shared Object mse&lt;br /&gt;
SO&amp;gt;&amp;gt; Exist mse:6581375&lt;br /&gt;
MSE engine initialized&lt;br /&gt;
run startup.iocmd script...&lt;br /&gt;
$: loader = io load CartActivator.dll&lt;br /&gt;
[IO] Loading Library CartActivator.dll...&lt;br /&gt;
 Costura attach required assemblies for CartActivator.dll...&lt;br /&gt;
$: frontlidar = io load plugins/sicknano.dll&lt;br /&gt;
[IO] Loading Library plugins/sicknano.dll...&lt;br /&gt;
$: frontlidar setMaskDist 50 20000&lt;br /&gt;
$: frontlidar Start 6060&lt;br /&gt;
$: frontlidar setMirror false&lt;br /&gt;
$: ui=io load WinMedulla.dll&lt;br /&gt;
[IO] Loading Library WinMedulla.dll...&lt;br /&gt;
 Costura attach required assemblies for WinMedulla.dll...&lt;br /&gt;
Starting HTTP Server, STM&lt;br /&gt;
HTTP Server listen on http://*:8007/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Medulla启动后在8007端口启动Web端口，可用浏览器访问 &amp;lt;nowiki&amp;gt;http://192.168.100.100:8007/simple.html&amp;lt;/nowiki&amp;gt; （假设Medulla所在工控机的IP是192.168.100.100），可见Medulla运行状态，如下图所示。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240618104132637.png|无框|638x638像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-3 Medulla的监控页面'''&lt;br /&gt;
&lt;br /&gt;
=== 3.2.2 安装DetourLite ===&lt;br /&gt;
根据微软dotNet官网指南 Download .NET 6.0 (Linux, macOS, and Windows) (microsoft.com) 安装.NET SDK 6.0。&amp;lt;blockquote&amp;gt;备注：Ubuntu16、18、20的包管理器没有.NET 6源（参见官网指南），因此使用二进制安装，安装后应把dotnet加入PATH环境变量。&lt;br /&gt;
&lt;br /&gt;
假设dotnet安装目录是~/dotnet，则在~/.bashrc加入 export PATH=$PATH:~/dotnet/dotnet 。&amp;lt;/blockquote&amp;gt;使用dotnet启动DetourLite：&lt;br /&gt;
 dotnet DetourLite.dll&lt;br /&gt;
&lt;br /&gt;
DetourLite不包括UI功能，因此要在Windows上运行Detour（作为客户端），远程连接到DetourLite。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
看门狗Wawa也支持Ubuntu，详见【[[看门狗Wawa使用说明]]】。&lt;br /&gt;
&lt;br /&gt;
[[文件:2114D627-27C0-42EC-8C9D-757BE0BDFD15.png|无框|620x620像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-3 作为远程客户端使用的Detour'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
客户端Detour连接远程DetourLite步骤：&lt;br /&gt;
&lt;br /&gt;
# 概览标签，选择“使用远程算法核（简单配置）”。&lt;br /&gt;
# 填入DetourLite所在主机的IP地址，然后点击“连接”按钮。&lt;br /&gt;
# 连接成功后，状态栏会提示“已获取x.x.x.x上的配置文件。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;注意：在启动作为客户端的Detour时，必须删除Detour目录下的detour.json，否则Detour会加载本地配置文件，拒绝连接远程Detour。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
自2024/6/17后，下载站的Detour.exe支持远程设置DetourLite参数，如果您使用老版本，请升级。&lt;br /&gt;
&lt;br /&gt;
[[文件:1718764541745.png|无框|805x805像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''图 3-5 Detour可远程同步的组件参数'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour可远程同步DetourLite的组件、里程计参数。组件是车体编辑器中的传感器，激光SLAM传感器就是2D/3D激光雷达；里程计是“里程计”标签列表的&amp;quot;odometry_n&amp;quot;(n≥0)，包括激光里程计、地纹里程计和轮里程计。&lt;br /&gt;
&lt;br /&gt;
当Detour连接DetourLite后，在Detour配置激光雷达或里程计属性时，Detour更新本地配置副本后同步DetourLite。下面我们详细讲解Detour和DetourLite的协作关系。&lt;br /&gt;
&lt;br /&gt;
DetourLite启动时自动读取同目录的detour.json，如果detour.json包含激光地图文件属性，则自动加载激光地图。观察DetourLite控制台输出可见此过程，如下图所示。&lt;br /&gt;
&lt;br /&gt;
[[文件:1718767175461.png|无框|758x758像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-6 DetourLite启动后的控制台输出'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如图3-6所示，DetourLite加载&amp;quot;detour.json&amp;quot;，随后加载配置文件中指向的激光地图&amp;quot;mainmap_0618_edit_yh.2dlm&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
Detour连接DetourLite，状态栏提示&amp;quot;load map, but cannot find ...&amp;quot;，如下图所示。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240619112420197.png|无框|811x811像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-7 远程连接DetourLite时的提示'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果DetourLite未加载激光雷达，Detour提示”读取...远程配置成功“。出现&amp;quot;cannot find map file&amp;quot;提示是因为本地没有激光地图文件。此时有两种处理方法，一是从DetourLtie拷贝激光地图文件到本地，二是使用”单线激光SLAM“标签下”其他功能 / 下载远程图层数据至本机图层“。建议使用方法一。Detour在连接DetourLite后，将其配置读入内存，并在Detour目录下生成&amp;quot;detour_{ip}.json&amp;quot;副本（ip是DetourLite所在PC地址），其图层关联的激光地图文件名称与DetourLite一致，如下图所示。如果使用“加载图层”装入另一个本地激光地图文件，就会同步给DetourLite，导致DetourLite下次启动错误加载不存在激光地图而报错。&lt;br /&gt;
&lt;br /&gt;
[[文件:1718768074021.png|无框|623x623像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-8 DetourLite配置所用的激光地图文件名'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
由于底盘轮廓不在远程同步范围，因此在项目开始时，应使用Detour在本地编辑好底盘宽高和轮廓（概况 / 车体布局 / 编辑），在车体编辑器中部署激光雷达，然后上传到DetourLite，使用Detour的远程参数同步功能标定雷达外参。&lt;br /&gt;
&lt;br /&gt;
在建图时，如果DetourLite没加载激光地图，则会自动创建。建图完毕后使用“其他功能 / 下载远程图层数据到本地图层”，然后另存为与DetourLite相同的名称，或者从DetourLite目录下载都可以。&lt;br /&gt;
&lt;br /&gt;
= 4. 配置激光雷达 =&lt;br /&gt;
[[文件:Image-20240521144346393.png|无框|530x530像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 4-1 激光雷达电气原理示例'''&lt;br /&gt;
&lt;br /&gt;
我们用2D激光雷达来说明配置方法。如图4-1所示，Medulla通过激光雷达驱动（插件）接收2D激光雷达的测量数据，经解码后传给Detour（或DetourLite）。&lt;br /&gt;
&lt;br /&gt;
== 4.1 兼容激光雷达清单 ==&lt;br /&gt;
Medulla支持的激光雷达型号（通过项目实践验证）如下。激光雷达驱动开发请阅读【开发激光雷达驱动】。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2D雷达清单：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!品牌&lt;br /&gt;
!型号&lt;br /&gt;
|-&lt;br /&gt;
|SICK（西克）&lt;br /&gt;
|LMS511，nano，S300&lt;br /&gt;
|-&lt;br /&gt;
|P+F（倍加福）&lt;br /&gt;
|R2000&lt;br /&gt;
|-&lt;br /&gt;
|万集&lt;br /&gt;
|716，716mini，719&lt;br /&gt;
|-&lt;br /&gt;
|兴颂&lt;br /&gt;
|HE-3051，SE1035&lt;br /&gt;
|-&lt;br /&gt;
|富瑞&lt;br /&gt;
|H1系列&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3D雷达清单：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!品牌&lt;br /&gt;
!型号&lt;br /&gt;
|-&lt;br /&gt;
|觅道（Livox）&lt;br /&gt;
|Mid70（用于物体识别，不能用于导航），Mid360（非均匀扫描周期，可用于&amp;lt;1m/s的低速导航）&lt;br /&gt;
|-&lt;br /&gt;
|速腾&lt;br /&gt;
|M1，Helios&lt;br /&gt;
|-&lt;br /&gt;
|万集&lt;br /&gt;
|WLR720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
雷达驱动可在开发站下载：[https://dev.lessokaji.com/index.php?PHPSESSID=p70a3knelida520lh61225h1f4&amp;amp;board=3.0 传感器/功能插件]&lt;br /&gt;
&lt;br /&gt;
== 4.2 2D激光雷达驱动 ==&lt;br /&gt;
Medulla启动时自动读取同目录下的startup.iocmd，根据指令启动驱动，举例如下。&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// 指令使用类JavaScript语法。&lt;br /&gt;
&lt;br /&gt;
// 加载CartActivator.dll，作为WinMedulla加载器。&lt;br /&gt;
loader = io load plugins/CartActivator.dll&lt;br /&gt;
&lt;br /&gt;
// 加载前激光雷达驱动，以SICK nano3为例。&lt;br /&gt;
// frontlidar是激光雷达名称，在WinMedulla的对象列表可见&lt;br /&gt;
frontlidar = io load plugins/sicknano.dll&lt;br /&gt;
// 设置前雷达测量距离：50mm内忽略，最大测距20,000mm。&lt;br /&gt;
frontlidar setMaskDist 50 20000&lt;br /&gt;
// 前雷达驱动监听6060端口（SICK SOPAS配置nano3，使用UDP单播，目标端口6060）。&lt;br /&gt;
frontlidar Start 6060&lt;br /&gt;
// 前雷达正装。如果是倒装雷达，则setMirror为true（雷达倒装后，扫描顺序颠倒）。&lt;br /&gt;
frontlidar setMirror false&lt;br /&gt;
&lt;br /&gt;
// 加载Medulla控制台，并显示。&lt;br /&gt;
// Ubuntu环境则注释以下两行，改用 :8007/simple.html 监控页面&lt;br /&gt;
ui=io load plugins\WinMedulla.dll  &lt;br /&gt;
ui Show&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
修改完startup.iocmd后，启动Medulla.exe，出现WinMedulla主窗口。&lt;br /&gt;
[[文件:Image-20240521150404636.png|无框|590x590像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 4-2 查看前激光雷达的数据'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WinMedulla是Medulla控制台，在左侧对象列表中可见刚配置的frontlidar。如果驱动工作正常，则可见窗体中间的数据在变化，说明已收到雷达数据。点击窗体右侧的“view”按钮，弹出点云监控窗口，使用鼠标滚轮缩放，鼠标中键按压拖动，检查点云是否与雷达观测一致。&amp;lt;blockquote&amp;gt;备注：由于Mono不支持WinForm，因此Ubuntu环境下改用:8007/simple.html监控Medulla运行，激光雷达数据更新时可在页面观察到。由于监控页面不能显示点云数据，因此在首次使用Medulla时，建议先用Windows版Medulla熟悉激光雷达输出点云，掌握Medulla的激光雷达应用后再切到Ubuntu环境。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4.3 3D激光雷达驱动 ==&lt;br /&gt;
3D激光雷达驱动使用与2D激光雷达相同。&lt;br /&gt;
&lt;br /&gt;
= 5. 配置Detour =&lt;br /&gt;
Detour配置可分为三步：部署激光雷达、标定激光雷达外参，启用激光里程计。&lt;br /&gt;
&lt;br /&gt;
对于潜伏车型，激光雷达一般安装在车头/车尾或对角，不在底盘运动中心上；对于单舵轮底盘（比如叉车），也是如此（运动中心在两个从动轮连线中心）。为了把激光雷达（逻辑上）移动到底盘运动中心，使观测中心与运动中心重合，以便运动控制算法根据当前位姿跟踪轨迹。我们需要知道激光雷达安装在车体的那个位置，这就是“部署激光雷达”步骤，使用车体编辑器把激光雷达放到底盘上。然后调整激光雷达外参，使其“移动”到底盘运动中心，这就是“标定激光雷达外参”，通过激光雷达参数配置执行。标定完成后就可以启动激光里程计，使用激光SLAM输出的实时位姿。&amp;lt;blockquote&amp;gt;注意：'''激光SLAM有其能力边界'''。如果您首次使用激光SLAM，建议阅读【[[激光SLAM能力边界]]】。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5.1 部署激光雷达 ==&lt;br /&gt;
启动Detour，在“概况”页面上点击”车体布局“的“编辑”按钮，打开车体编辑器。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611101435344-8072077.png|无框|803x803像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 5-1 车体编辑器'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
激光雷达安装在底盘之上（我们把AMR抽象为底盘），因此先要编辑底盘，如下图所示。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240618140148287.png|无框|588x588像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 5-2 选择底盘'''&lt;br /&gt;
&lt;br /&gt;
鼠标点击底盘内空白处选择。本例的属性列表可见该底盘W750L1200，contour是构成矩形底盘的4个角的坐标。对于矩形底盘，在修改长宽后，可直接修改contour的坐标值。对于多边形底盘，使用“动作”标签的“重绘轮廓“，使用鼠标左键依次点击创建底盘轮廓。&amp;lt;blockquote&amp;gt;注意：Detour会过滤底盘轮廓之内的点云。在重绘底盘后，应在“概况”页面观察AMR图标附近是否有车体造成点云（噪音），如有则适当扩大底盘轮廓。这种车体与激光雷达干涉造成的噪音点必须清除，否则会干扰建图和定位。&amp;lt;/blockquote&amp;gt;点击车体编辑器的“添加”按钮，在下拉菜单中选择激光雷达类型，然后点击菜单下方的车体布局的激光雷达安装位置，新增一个激光雷达。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611101655915-8072217.png|无框|584x584像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 5-3 增加菜单的传感器类型'''&lt;br /&gt;
&lt;br /&gt;
“添加”菜单中的激光雷达类型如下表：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!类型&lt;br /&gt;
!用途&lt;br /&gt;
|-&lt;br /&gt;
|单线激光雷达&lt;br /&gt;
|即2D激光雷达，只有一个0度的扫描平面，适用于室内导航场景。&lt;br /&gt;
|-&lt;br /&gt;
|同步多2D雷达拼接&lt;br /&gt;
|用于把多个2D激光雷达测量数据拼接为一个，适用于单个2D激光雷达视野不足，用2个激光雷达拼接以形成全向视野场景。&lt;br /&gt;
|-&lt;br /&gt;
|3D激光雷达&lt;br /&gt;
|一般为16、32线的多线激光雷达，在垂直方向以不同角度扫描，形成立体点云，适用于室外导航（包括避障）场景。&lt;br /&gt;
|-&lt;br /&gt;
|二向化3D雷达&lt;br /&gt;
|把3D雷达测量数据二向化为具备空间特征的二向化数据，供SLAM算法使用。（3D激光雷达都要二向化后使用）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611102403514.png|无框|636x636像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 5-3 激光雷达的安装位置外参'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
选择新增的激光雷达，属性列表中的x、y、th就是其安装位姿，x &amp;amp; y可根据车体机械设计图参数填入，th根据激光雷达手册提供的参数填入。Detour使用右手坐标系，+X轴为食指方向，+Y轴为中指方向，+Z为大拇指方向，th就是激光雷达相对于+X轴的角度。对于3D激光雷达，z是雷达安装高度，根据车体机械设计图参数填入。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
激光雷达的命名风格如下：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!名称&lt;br /&gt;
!用途&lt;br /&gt;
|-&lt;br /&gt;
|frontlidar&lt;br /&gt;
|安装在车头的激光雷达，一般是第一个雷达。&lt;br /&gt;
|-&lt;br /&gt;
|backlidar&lt;br /&gt;
|安装在车尾的激光雷达，一般是第二个雷达。&lt;br /&gt;
|-&lt;br /&gt;
|midlidar&lt;br /&gt;
|拼接frontlidar &amp;amp; backlidar后的“中”雷达，位于车体中心，坐标为 ( x: 0, y: 0, th:0 )。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 5.1.1 3D激光雷达 ===&lt;br /&gt;
3D激光雷达能够提供三维空间特征，这是它与2D雷达不同之处。所谓“二向化3D雷达“，是把空间特征投影为2D，因此需要配置相关参数。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
打开车体编辑器，选择要设置的二向化3D雷达，以下图为例。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240618120022183.png|无框]]&lt;br /&gt;
&lt;br /&gt;
'''图 5-5 二向化3D雷达相关参数'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!参数&lt;br /&gt;
!含义&lt;br /&gt;
!取值建议&lt;br /&gt;
|-&lt;br /&gt;
|minVStruct&lt;br /&gt;
|垂直结构最小高度。墙、树形成的垂直结构形成空间特征。&lt;br /&gt;
|以垂直扫描间隔2度的速腾16线雷达为例，两条相邻扫描线在 30米处的高度差是1046mm（小于这个值的物体只是一个点， 不能形成垂直线段）。如果建图轮廓在30米内，minVStruct=1000（大于1米的垂直结构参与计算）。&lt;br /&gt;
|-&lt;br /&gt;
|minScans&lt;br /&gt;
|扫描到垂直结构的最少扫描线数。&lt;br /&gt;
|与minVStruct配套使用。本例为3，表示长度&amp;gt;1000mm且至少被3条线扫描到的垂直结构可用于计算。&lt;br /&gt;
|-&lt;br /&gt;
|Zfadout&lt;br /&gt;
|垂直结构距离0度扫描平面的距离。&lt;br /&gt;
|越靠近0度扫描线的垂直结构，其计算权重越高。与0度扫描线 相交的垂直结构，其距离为0。小于Zfadout的垂直结构将被 赋予高权重。&lt;br /&gt;
|-&lt;br /&gt;
|scale&lt;br /&gt;
|点云缩放比例。&lt;br /&gt;
|对点云计算有影响力的点集中在30米之内，用于室内导航的 2D激光雷达测量距离一般30米以内，在室外则不然。因此 室外场景需要把3D激光雷达的点云尺度做适当缩放，以利 点云配准。一般而言，3D激光雷达的scale=0.5，对应于 60米以内点云，如果距离更远，则scale适当降低。在调整 scale时，底盘尺寸（宽高）和雷达外参（x &amp;amp; y）等比调整， 比如scale=0.5时，底盘尺寸如果是L2000W1000，则改为 L1000W500。调整scale后，遥控AMR自旋，detour输出 位姿应平滑变化，不应出现抖动或大幅跳动现象（这种 现象由于尺度配置错误导致应配准点云被过滤造成）。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 5.2 标定激光雷达外参 ==&lt;br /&gt;
如果您是首次标定激光雷达外参，请顺序阅读以下文章：&lt;br /&gt;
&lt;br /&gt;
* 【[[标定激光雷达外参]]】&lt;br /&gt;
* 【[[标定双激光雷达外参]]】&lt;br /&gt;
&lt;br /&gt;
== 5.3 启用激光里程计 ==&lt;br /&gt;
激光雷达测量数据输入激光SLAM算法，通过激光里程计计算，输出为机器人实时位姿。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611103919322.png|无框|640x640像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 5-4 激光里程计'''&lt;br /&gt;
在“里程计”标签，选择2D激光（odometry_0），其&amp;quot;lidar&amp;quot;字段的值与激光雷达关联。对于使用单激光雷达的车型，一般为&amp;quot;frontlidar&amp;quot;（参考4.1的激光雷达命名风格）；对于使用双激光雷达的车型，一般为“midlidar”。&lt;br /&gt;
&lt;br /&gt;
在“里程计”标签，选择2D激光（odometry_0），其&amp;quot;lidar&amp;quot;字段的值与激光雷达关联。对于使用单激光雷达的车型，一般为&amp;quot;frontlidar&amp;quot;（参考4.1的激光雷达命名风格）；对于使用双激光雷达的车型，一般为“midlidar”。&lt;br /&gt;
&lt;br /&gt;
查看选中的激光里程计状态，应该为“已启动”，否则点击“启动”按钮。激光里程计数据可在“状态”标签的列表查看。&lt;br /&gt;
&lt;br /&gt;
= 6. 获取授权证书 =&lt;br /&gt;
未授权的Detour可以使用60分钟，供体验Detour功能或测试Detour性能使用，超时后重起Detour可继续使用60分钟。&lt;br /&gt;
&lt;br /&gt;
如果您已购买Detour授权证书，请按照以下步骤在Auth站注册，然后下载证书。如果您希望购买Detour授权证书，或试用有疑问，请联系懒书科技技术支持唐工（13501683672，微信同号）咨询。&lt;br /&gt;
&lt;br /&gt;
# 浏览器打开：&amp;lt;nowiki&amp;gt;https://auth.lessokaji.com/login&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
# 点击“Register”链接以注册账号。请不要使用简单密码（比如1234之类），以保护您的数字资产安全。&lt;br /&gt;
# 注册后通知懒书科技，等待设置证书数量。&lt;br /&gt;
&lt;br /&gt;
在需要授权的工控机上启动Detour，复制“概况”标签下方的“DeviceID”。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611104936877-8074179.png|无框|821x821像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 6-1 授权信息的DeviceID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果您使用DetourLite，请从DetourLite的控制台输出获取DeviceID，如图6-2所示。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611122507804-8079908.png|无框|801x801像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 6-2 DetourLite的Device ID'''&lt;br /&gt;
&lt;br /&gt;
登入Auth站，选择Inventory的&amp;quot;MDCS2-license&amp;quot;。&amp;lt;blockquote&amp;gt;注意：MDCS-license将被废弃，请勿使用！&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611105143316-8074306.png|无框|546x546像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 6-3 选择MDCS2授权证书'''&lt;br /&gt;
&lt;br /&gt;
点击“Activate”按钮，输入Device ID&amp;quot;。以图5-1为例，DeviceID是&amp;quot;4D222EB2BEE27897&amp;quot;，则输入&amp;quot;4D222EB2BEE27897&amp;quot;（没有双引号）。如果是&amp;quot;x2&amp;quot;规格授权，则在DeviceID后加&amp;quot;x2&amp;quot;后缀，比如&amp;quot;4D222EB2BEE27897x2&amp;quot;。&amp;lt;blockquote&amp;gt;提示：授权规格分为&amp;quot;x1&amp;quot;、“x2&amp;quot;。&amp;quot;x1&amp;quot;就是不带后缀的DeviceID。请根据报价单给出的授权规格输入后缀，如有疑问请咨询懒书技术支持工程师。&amp;lt;/blockquote&amp;gt;[[文件:Image-20240611105433306-8074474.png|无框|689x689像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 6-4 激活设备'''&lt;br /&gt;
&lt;br /&gt;
Description建议使用车型命名，以便管理。比如&amp;quot;{项目编号} - {序号}&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
填写完毕后，点击“Activate”按钮，把下载的证书文件存入Detour目录（与Detour.exe或DetourLite.exe同级）。重启Detour，此时主界面的“试用版”信息消失，激活成功。&lt;br /&gt;
填写完毕后，点击“Activate”按钮，把下载的证书文件存入Detour目录（与Detour.exe或DetourLite.exe同级）。重启Detour，此时主界面的“试用版”信息消失，激活成功。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image_tdrfgyuihjoklp.png&amp;diff=961</id>
		<title>文件:Image tdrfgyuihjoklp.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image_tdrfgyuihjoklp.png&amp;diff=961"/>
		<updated>2025-07-02T06:17:48Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;asdf&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E5%AE%89%E8%A3%85Detour&amp;diff=960</id>
		<title>安装Detour</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E5%AE%89%E8%A3%85Detour&amp;diff=960"/>
		<updated>2025-07-02T06:15:39Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1. 前言 =&lt;br /&gt;
您如果首次使用MDCS，建议阅读【[[MDCS概述]]】，在了解MDCS各子系统功能后下载安装Detour。&lt;br /&gt;
&lt;br /&gt;
= 2. 下载Detour及依赖包 =&lt;br /&gt;
浏览器打开：https://dl.lessokaji.com 。这是MDCS下载站，可下载MDCS（AMR控制全栈软件）发布版。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240521113910923.png|无框|651x651像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-1 MDCS下载页面'''&lt;br /&gt;
&lt;br /&gt;
下载页面由两部分构成：&lt;br /&gt;
&lt;br /&gt;
* 软件包清单。&lt;br /&gt;
* 下载按钮（Zip）。&lt;br /&gt;
&lt;br /&gt;
点击软件包名称，展开分类列表，勾选后点击下载按钮，选中软件被打包到一个zip文件下载。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240521114105532.png|无框|610x610像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-2 勾选软件清单后下载'''&lt;br /&gt;
以Windows版Detour下载为例，如图2-2，“Selected Files”下是选中软件清单，点击“Zip”按钮打包下载。&lt;br /&gt;
&lt;br /&gt;
以Windows版Detour下载为例，如图2-2，“Selected Files”下是选中软件清单，点击“Zip”按钮打包下载。&lt;br /&gt;
&lt;br /&gt;
= 3. 安装 =&lt;br /&gt;
Detour与Medulla配套使用。Medulla接收激光雷达发送的测量数据，统一转换格式后通过共享内存发布给Detour。&amp;lt;blockquote&amp;gt;说明：Windows环境使用Detour.exe，Ubuntu环境使用DetourLite.dll（Detour内核功能）并配套Detour.exe（作为远程客户端）使用。Ubuntu环境通过Mono启动Medulla.exe。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3.1 Windows环境 ==&lt;br /&gt;
[[文件:Image-20240521135107986.png|无框|610x610像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-1 Windows环境的软件清单'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!模块&lt;br /&gt;
!程序&lt;br /&gt;
!用途&lt;br /&gt;
|-&lt;br /&gt;
|Detour&lt;br /&gt;
|Detour.exe&lt;br /&gt;
|Detour主程序&lt;br /&gt;
|-&lt;br /&gt;
|Medullar&lt;br /&gt;
|Medulla.exe&lt;br /&gt;
|Medulla主程序&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|LidarControler.dll&lt;br /&gt;
|激光雷达控制器，部署在medulla的plugins子目录下（下同）&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|WinMedulla.dll&lt;br /&gt;
|Medulla库。&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|CartActivator.dll&lt;br /&gt;
|如果需要控制车辆，则需要该加载器。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;说明：Medulla &amp;amp; Detour运行在Windows 10以上版本，依赖 .netframework 4.8 [https://dotnet.microsoft.com/en-us/download/dotnet-framework/net48 Download .NET Framework 4.8 | Free official downloads (microsoft.com)]  。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
建议把Detour和Medulla存放在MDCS目录下，以便管理。MDCS目录所在分区至少有80G空闲容量，用于存储Detour和Medulla运行时生成的日志文件和配置数据。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Medulla的目录结构如下：&amp;lt;syntaxhighlight lang=&amp;quot;winbatch&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
D:\work\Playground\mdcs\Medulla 的目录&lt;br /&gt;
&lt;br /&gt;
2024/06/18  10:14    &amp;lt;DIR&amp;gt;          .&lt;br /&gt;
2024/06/18  10:14    &amp;lt;DIR&amp;gt;          ..&lt;br /&gt;
2024/06/13  08:18         3,420,672 Camera3D.dll		// 3D相机控制器，只用激光SLAM时不需要&lt;br /&gt;
2024/06/13  08:18           643,072 CartActivator.dll	// 底盘驱动加载器&lt;br /&gt;
2024/06/13  16:39    &amp;lt;DIR&amp;gt;          diagnosis			// 运行时日志目录&lt;br /&gt;
2024/06/13  08:18           854,016 LidarController.dll	// 激光雷达控制器&lt;br /&gt;
2024/05/21  13:00         3,335,168 MDCSToolBox.dll		// 工具箱，只用激光SLAM时不需要&lt;br /&gt;
2024/06/13  08:18         2,609,152 Medulla.exe			// 主程序，Ubuntu用mono启动&lt;br /&gt;
2024/05/21  13:00            14,544 Medulla.sys			// 主程序库&lt;br /&gt;
2024/06/13  08:18           752,128 NetRemote.exe		// 底盘遥控器，只用激光SLAM时不需要&lt;br /&gt;
2024/06/13  16:20    &amp;lt;DIR&amp;gt;          plugins				// 底盘驱动目录，激光雷达驱动存在此&lt;br /&gt;
2024/05/21  13:00             1,646 remoteconf.json		// 底盘遥控器配置文件&lt;br /&gt;
2024/06/13  16:20               192 startup.iocmd		// 自动加载驱动脚本&lt;br /&gt;
2024/06/13  08:18           758,784 USBCamera.dll		// USB相机控制器，只用激光SLAM时不需要&lt;br /&gt;
2024/06/13  08:18         1,715,712 WinMedulla.dll		// Medulla控制台库&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour的目录结构如下：&amp;lt;syntaxhighlight lang=&amp;quot;winbatch&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 D:\work\Playground\mdcs\Detour 的目录&lt;br /&gt;
&lt;br /&gt;
2024/06/18  09:23    &amp;lt;DIR&amp;gt;          .&lt;br /&gt;
2024/06/18  09:23    &amp;lt;DIR&amp;gt;          ..&lt;br /&gt;
2024/06/17  09:05           142,640 critical.log		// 错误日志&lt;br /&gt;
2024/06/13  10:54       152,167,424 cufft64_10.dll		// 库&lt;br /&gt;
2024/06/13  10:54           226,816 cufftw64_10.dll		// 库&lt;br /&gt;
2024/06/13  10:54           127,488 d2dlib64.dll		// 库&lt;br /&gt;
2024/06/17  09:05         5,914,624 Detour.exe			// 主程序&lt;br /&gt;
2024/06/18  09:28             5,744 detour_127.0.0.1.json	// 作为客户端连接远程DetourLite时&lt;br /&gt;
															// 自动下载的DetourLite配置文件，&lt;br /&gt;
															// detour_{detour_lite_ip}.json&lt;br /&gt;
2024/06/13  10:54    &amp;lt;DIR&amp;gt;          log					// 日志目录&lt;br /&gt;
2024/06/13  10:54        53,050,368 OpenCvSharpExtern.dll	// 库&lt;br /&gt;
2024/06/13  10:54           735,744 regcore_cuda.dll		// 库&lt;br /&gt;
2024/06/18  09:28           154,166 tmpmap.2dlm			// *.2dlm是激光地图文件&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;生产环境需要自动启动Medulla &amp;amp; Detour，且要监控并重启异常退出的进程，我们配套了看门狗程序Wawa，详见【[[看门狗Wawa使用说明]]】。&lt;br /&gt;
&lt;br /&gt;
== 3.2 Ubuntu环境 ==&lt;br /&gt;
[[文件:Image-20240521140212910.png|无框|610x610像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-2 Ubuntu环境下的软件清单'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!模块&lt;br /&gt;
!程序&lt;br /&gt;
!用途&lt;br /&gt;
|-&lt;br /&gt;
|Detour&lt;br /&gt;
|DetourLite&lt;br /&gt;
|DetourLite是Detour内核功能，依赖DotNetCore，与Windows版Detour（作为远程客户端）配套使用。&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|DetourLiteDepends&lt;br /&gt;
|DetourLite的依赖库，解压后放到DetourLite目录。&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|libOpenCvSharpExtern&lt;br /&gt;
|OpenCV依赖库，根据目标系统处理器架构选择arm64 / x64。&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|GDI+（可选）&lt;br /&gt;
|如果使用DetourLite的/getMapPng接口，则要安装GDI+库（sudo apt-get install -y libgdiplus）。&lt;br /&gt;
|-&lt;br /&gt;
|Medullar&lt;br /&gt;
|Medulla.exe&lt;br /&gt;
|Medulla主程序，依赖Mono。&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|LidarControler.dll&lt;br /&gt;
|激光雷达控制器，部署在medulla的plugins子目录下（下同）&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|WinMedulla.dll&lt;br /&gt;
|Medulla库。&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|CartActivator.dll&lt;br /&gt;
|插件加载器。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3.2.1 安装Medulla ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;注意：应使用Ubuntu 16、18或20，截止2024年6月，Mono官方支持的Ubuntu最高版本是20.04，Medulla &amp;amp; DetourLite在这3个发布版做过充分测试。&amp;lt;/blockquote&amp;gt;参考[https://www.mono-project.com/download/stable/#download-lin Mono官网指南]安装Mono。安装完毕后使用&amp;quot;mono --version&amp;quot;核对其版本，应是6.12以上，如下。&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Mono JIT compiler version 6.12.0.200 (tarball Tue Jul 11 21:34:53 UTC 2023)&lt;br /&gt;
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com&lt;br /&gt;
        TLS:           __thread&lt;br /&gt;
        SIGSEGV:       altstack&lt;br /&gt;
        Notifications: epoll&lt;br /&gt;
        Architecture:  amd64&lt;br /&gt;
        Disabled:      none&lt;br /&gt;
        Misc:          softdebug &lt;br /&gt;
        Interpreter:   yes&lt;br /&gt;
        LLVM:          yes(610)&lt;br /&gt;
        Suspend:       hybrid&lt;br /&gt;
        GC:            sgen (concurrent by default)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Medulla使用.netframework 4.8开发，在Ubuntu使用Mono启动。Mono是.NET Framework的开源实现，由微软赞助。请根据官网指南 Download - Stable | Mono (mono-project.com) 安装。&lt;br /&gt;
&lt;br /&gt;
使用mono启动Medulla：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
$ mono Medulla.exe&lt;br /&gt;
Lessokaji Medulla Version 1.2.0.3961, 64bit&lt;br /&gt;
Main Thread ID: 1&lt;br /&gt;
Medulla starting up...&lt;br /&gt;
Medulla command ready&lt;br /&gt;
Initialize Shared Objects for program Medulla&lt;br /&gt;
Mono or Linux which doesn't support named MMF, use file.&lt;br /&gt;
Create Shared Object dumplog&lt;br /&gt;
SO&amp;gt;&amp;gt; Exist dumplog:6579279&lt;br /&gt;
Initialize Diagnosis cache&lt;br /&gt;
Run on Mono or Linux which doesn't support named MMF, use file.&lt;br /&gt;
initializing io object&lt;br /&gt;
Create Shared Object mse&lt;br /&gt;
SO&amp;gt;&amp;gt; Exist mse:6581375&lt;br /&gt;
MSE engine initialized&lt;br /&gt;
run startup.iocmd script...&lt;br /&gt;
$: loader = io load CartActivator.dll&lt;br /&gt;
[IO] Loading Library CartActivator.dll...&lt;br /&gt;
 Costura attach required assemblies for CartActivator.dll...&lt;br /&gt;
$: frontlidar = io load plugins/sicknano.dll&lt;br /&gt;
[IO] Loading Library plugins/sicknano.dll...&lt;br /&gt;
$: frontlidar setMaskDist 50 20000&lt;br /&gt;
$: frontlidar Start 6060&lt;br /&gt;
$: frontlidar setMirror false&lt;br /&gt;
$: ui=io load WinMedulla.dll&lt;br /&gt;
[IO] Loading Library WinMedulla.dll...&lt;br /&gt;
 Costura attach required assemblies for WinMedulla.dll...&lt;br /&gt;
Starting HTTP Server, STM&lt;br /&gt;
HTTP Server listen on http://*:8007/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Medulla启动后在8007端口启动Web端口，可用浏览器访问 &amp;lt;nowiki&amp;gt;http://192.168.100.100:8007/simple.html&amp;lt;/nowiki&amp;gt; （假设Medulla所在工控机的IP是192.168.100.100），可见Medulla运行状态，如下图所示。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240618104132637.png|无框|638x638像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-3 Medulla的监控页面'''&lt;br /&gt;
&lt;br /&gt;
=== 3.2.2 安装DetourLite ===&lt;br /&gt;
根据微软dotNet官网指南 Download .NET 6.0 (Linux, macOS, and Windows) (microsoft.com) 安装.NET SDK 6.0。&amp;lt;blockquote&amp;gt;备注：Ubuntu16、18、20的包管理器没有.NET 6源（参见官网指南），因此使用二进制安装，安装后应把dotnet加入PATH环境变量。&lt;br /&gt;
&lt;br /&gt;
假设dotnet安装目录是~/dotnet，则在~/.bashrc加入 export PATH=$PATH:~/dotnet/dotnet 。&amp;lt;/blockquote&amp;gt;使用dotnet启动DetourLite：&lt;br /&gt;
 dotnet DetourLite.dll&lt;br /&gt;
&lt;br /&gt;
DetourLite不包括UI功能，因此要在Windows上运行Detour（作为客户端），远程连接到DetourLite。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
看门狗Wawa也支持Ubuntu，详见【[[看门狗Wawa使用说明]]】。&lt;br /&gt;
&lt;br /&gt;
[[文件:2114D627-27C0-42EC-8C9D-757BE0BDFD15.png|无框|620x620像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-3 作为远程客户端使用的Detour'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
客户端Detour连接远程DetourLite步骤：&lt;br /&gt;
&lt;br /&gt;
# 概览标签，选择“使用远程算法核（简单配置）”。&lt;br /&gt;
# 填入DetourLite所在主机的IP地址，然后点击“连接”按钮。&lt;br /&gt;
# 连接成功后，状态栏会提示“已获取x.x.x.x上的配置文件。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;注意：在启动作为客户端的Detour时，必须删除Detour目录下的detour.json，否则Detour会加载本地配置文件，拒绝连接远程Detour。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
自2024/6/17后，下载站的Detour.exe支持远程设置DetourLite参数，如果您使用老版本，请升级。&lt;br /&gt;
&lt;br /&gt;
[[文件:1718764541745.png|无框|805x805像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''图 3-5 Detour可远程同步的组件参数'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour可远程同步DetourLite的组件、里程计参数。组件是车体编辑器中的传感器，激光SLAM传感器就是2D/3D激光雷达；里程计是“里程计”标签列表的&amp;quot;odometry_n&amp;quot;(n≥0)，包括激光里程计、地纹里程计和轮里程计。&lt;br /&gt;
&lt;br /&gt;
当Detour连接DetourLite后，在Detour配置激光雷达或里程计属性时，Detour更新本地配置副本后同步DetourLite。下面我们详细讲解Detour和DetourLite的协作关系。&lt;br /&gt;
&lt;br /&gt;
DetourLite启动时自动读取同目录的detour.json，如果detour.json包含激光地图文件属性，则自动加载激光地图。观察DetourLite控制台输出可见此过程，如下图所示。&lt;br /&gt;
&lt;br /&gt;
[[文件:1718767175461.png|无框|758x758像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-6 DetourLite启动后的控制台输出'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如图3-6所示，DetourLite加载&amp;quot;detour.json&amp;quot;，随后加载配置文件中指向的激光地图&amp;quot;mainmap_0618_edit_yh.2dlm&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
Detour连接DetourLite，状态栏提示&amp;quot;load map, but cannot find ...&amp;quot;，如下图所示。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240619112420197.png|无框|811x811像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-7 远程连接DetourLite时的提示'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果DetourLite未加载激光雷达，Detour提示”读取...远程配置成功“。出现&amp;quot;cannot find map file&amp;quot;提示是因为本地没有激光地图文件。此时有两种处理方法，一是从DetourLtie拷贝激光地图文件到本地，二是使用”单线激光SLAM“标签下”其他功能 / 下载远程图层数据至本机图层“。建议使用方法一。Detour在连接DetourLite后，将其配置读入内存，并在Detour目录下生成&amp;quot;detour_{ip}.json&amp;quot;副本（ip是DetourLite所在PC地址），其图层关联的激光地图文件名称与DetourLite一致，如下图所示。如果使用“加载图层”装入另一个本地激光地图文件，就会同步给DetourLite，导致DetourLite下次启动错误加载不存在激光地图而报错。&lt;br /&gt;
&lt;br /&gt;
[[文件:1718768074021.png|无框|623x623像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-8 DetourLite配置所用的激光地图文件名'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
由于底盘轮廓不在远程同步范围，因此在项目开始时，应使用Detour在本地编辑好底盘宽高和轮廓（概况 / 车体布局 / 编辑），在车体编辑器中部署激光雷达，然后上传到DetourLite，使用Detour的远程参数同步功能标定雷达外参。&lt;br /&gt;
&lt;br /&gt;
在建图时，如果DetourLite没加载激光地图，则会自动创建。建图完毕后使用“其他功能 / 下载远程图层数据到本地图层”，然后另存为与DetourLite相同的名称，或者从DetourLite目录下载都可以。&lt;br /&gt;
&lt;br /&gt;
= 4. 配置激光雷达 =&lt;br /&gt;
[[文件:Image-20240521144346393.png|无框|530x530像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 4-1 激光雷达电气原理示例'''&lt;br /&gt;
&lt;br /&gt;
我们用2D激光雷达来说明配置方法。如图4-1所示，Medulla通过激光雷达驱动（插件）接收2D激光雷达的测量数据，经解码后传给Detour（或DetourLite）。&lt;br /&gt;
&lt;br /&gt;
== 4.1 兼容激光雷达清单 ==&lt;br /&gt;
Medulla支持的激光雷达型号（通过项目实践验证）如下。激光雷达驱动开发请阅读【开发激光雷达驱动】。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2D雷达清单：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!品牌&lt;br /&gt;
!型号&lt;br /&gt;
|-&lt;br /&gt;
|SICK（西克）&lt;br /&gt;
|LMS511，nano，S300&lt;br /&gt;
|-&lt;br /&gt;
|P+F（倍加福）&lt;br /&gt;
|R2000&lt;br /&gt;
|-&lt;br /&gt;
|万集&lt;br /&gt;
|716，716mini，719&lt;br /&gt;
|-&lt;br /&gt;
|兴颂&lt;br /&gt;
|HE-3051，SE1035&lt;br /&gt;
|-&lt;br /&gt;
|富瑞&lt;br /&gt;
|H1系列&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3D雷达清单：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!品牌&lt;br /&gt;
!型号&lt;br /&gt;
|-&lt;br /&gt;
|觅道（Livox）&lt;br /&gt;
|Mid70（用于物体识别，不能用于导航），Mid360（非均匀扫描周期，可用于&amp;lt;1m/s的低速导航）&lt;br /&gt;
|-&lt;br /&gt;
|速腾&lt;br /&gt;
|M1，Helios&lt;br /&gt;
|-&lt;br /&gt;
|万集&lt;br /&gt;
|WLR720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
雷达驱动可在开发站下载：[https://dev.lessokaji.com/index.php?PHPSESSID=p70a3knelida520lh61225h1f4&amp;amp;board=3.0 传感器/功能插件]&lt;br /&gt;
&lt;br /&gt;
== 4.2 2D激光雷达驱动 ==&lt;br /&gt;
Medulla启动时自动读取同目录下的startup.iocmd，根据指令启动驱动，举例如下。&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// 指令使用类JavaScript语法。&lt;br /&gt;
&lt;br /&gt;
// 加载CartActivator.dll，作为WinMedulla加载器。&lt;br /&gt;
loader = io load plugins/CartActivator.dll&lt;br /&gt;
&lt;br /&gt;
// 加载前激光雷达驱动，以SICK nano3为例。&lt;br /&gt;
// frontlidar是激光雷达名称，在WinMedulla的对象列表可见&lt;br /&gt;
frontlidar = io load plugins/sicknano.dll&lt;br /&gt;
// 设置前雷达测量距离：50mm内忽略，最大测距20,000mm。&lt;br /&gt;
frontlidar setMaskDist 50 20000&lt;br /&gt;
// 前雷达驱动监听6060端口（SICK SOPAS配置nano3，使用UDP单播，目标端口6060）。&lt;br /&gt;
frontlidar Start 6060&lt;br /&gt;
// 前雷达正装。如果是倒装雷达，则setMirror为true（雷达倒装后，扫描顺序颠倒）。&lt;br /&gt;
frontlidar setMirror false&lt;br /&gt;
&lt;br /&gt;
// 加载Medulla控制台，并显示。&lt;br /&gt;
// Ubuntu环境则注释以下两行，改用 :8007/simple.html 监控页面&lt;br /&gt;
ui=io load plugins\WinMedulla.dll  &lt;br /&gt;
ui Show&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
修改完startup.iocmd后，启动Medulla.exe，出现WinMedulla主窗口。&lt;br /&gt;
[[文件:Image-20240521150404636.png|无框|590x590像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 4-2 查看前激光雷达的数据'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WinMedulla是Medulla控制台，在左侧对象列表中可见刚配置的frontlidar。如果驱动工作正常，则可见窗体中间的数据在变化，说明已收到雷达数据。点击窗体右侧的“view”按钮，弹出点云监控窗口，使用鼠标滚轮缩放，鼠标中键按压拖动，检查点云是否与雷达观测一致。&amp;lt;blockquote&amp;gt;备注：由于Mono不支持WinForm，因此Ubuntu环境下改用:8007/simple.html监控Medulla运行，激光雷达数据更新时可在页面观察到。由于监控页面不能显示点云数据，因此在首次使用Medulla时，建议先用Windows版Medulla熟悉激光雷达输出点云，掌握Medulla的激光雷达应用后再切到Ubuntu环境。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4.3 3D激光雷达驱动 ==&lt;br /&gt;
3D激光雷达驱动使用与2D激光雷达相同。&lt;br /&gt;
&lt;br /&gt;
= 5. 配置Detour =&lt;br /&gt;
Detour配置可分为三步：部署激光雷达、标定激光雷达外参，启用激光里程计。&lt;br /&gt;
&lt;br /&gt;
对于潜伏车型，激光雷达一般安装在车头/车尾或对角，不在底盘运动中心上；对于单舵轮底盘（比如叉车），也是如此（运动中心在两个从动轮连线中心）。为了把激光雷达（逻辑上）移动到底盘运动中心，使观测中心与运动中心重合，以便运动控制算法根据当前位姿跟踪轨迹。我们需要知道激光雷达安装在车体的那个位置，这就是“部署激光雷达”步骤，使用车体编辑器把激光雷达放到底盘上。然后调整激光雷达外参，使其“移动”到底盘运动中心，这就是“标定激光雷达外参”，通过激光雷达参数配置执行。标定完成后就可以启动激光里程计，使用激光SLAM输出的实时位姿。&amp;lt;blockquote&amp;gt;注意：'''激光SLAM有其能力边界'''。如果您首次使用激光SLAM，建议阅读【[[激光SLAM能力边界]]】。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5.1 部署激光雷达 ==&lt;br /&gt;
启动Detour，在“概况”页面上点击”车体布局“的“编辑”按钮，打开车体编辑器。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611101435344-8072077.png|无框|803x803像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 5-1 车体编辑器'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
激光雷达安装在底盘之上（我们把AMR抽象为底盘），因此先要编辑底盘，如下图所示。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240618140148287.png|无框|588x588像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 5-2 选择底盘'''&lt;br /&gt;
&lt;br /&gt;
鼠标点击底盘内空白处选择。本例的属性列表可见该底盘W750L1200，contour是构成矩形底盘的4个角的坐标。对于矩形底盘，在修改长宽后，可直接修改contour的坐标值。对于多边形底盘，使用“动作”标签的“重绘轮廓“，使用鼠标左键依次点击创建底盘轮廓。&amp;lt;blockquote&amp;gt;注意：Detour会过滤底盘轮廓之内的点云。在重绘底盘后，应在“概况”页面观察AMR图标附近是否有车体造成点云（噪音），如有则适当扩大底盘轮廓。这种车体与激光雷达干涉造成的噪音点必须清除，否则会干扰建图和定位。&amp;lt;/blockquote&amp;gt;点击车体编辑器的“添加”按钮，在下拉菜单中选择激光雷达类型，然后点击菜单下方的车体布局的激光雷达安装位置，新增一个激光雷达。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611101655915-8072217.png|无框|584x584像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 5-3 增加菜单的传感器类型'''&lt;br /&gt;
&lt;br /&gt;
“添加”菜单中的激光雷达类型如下表：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!类型&lt;br /&gt;
!用途&lt;br /&gt;
|-&lt;br /&gt;
|单线激光雷达&lt;br /&gt;
|即2D激光雷达，只有一个0度的扫描平面，适用于室内导航场景。&lt;br /&gt;
|-&lt;br /&gt;
|同步多2D雷达拼接&lt;br /&gt;
|用于把多个2D激光雷达测量数据拼接为一个，适用于单个2D激光雷达视野不足，用2个激光雷达拼接以形成全向视野场景。&lt;br /&gt;
|-&lt;br /&gt;
|3D激光雷达&lt;br /&gt;
|一般为16、32线的多线激光雷达，在垂直方向以不同角度扫描，形成立体点云，适用于室外导航（包括避障）场景。&lt;br /&gt;
|-&lt;br /&gt;
|二向化3D雷达&lt;br /&gt;
|把3D雷达测量数据二向化为具备空间特征的二向化数据，供SLAM算法使用。（3D激光雷达都要二向化后使用）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611102403514.png|无框|636x636像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 5-3 激光雷达的安装位置外参'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
选择新增的激光雷达，属性列表中的x、y、th就是其安装位姿，x &amp;amp; y可根据车体机械设计图参数填入，th根据激光雷达手册提供的参数填入。Detour使用右手坐标系，+X轴为食指方向，+Y轴为中指方向，+Z为大拇指方向，th就是激光雷达相对于+X轴的角度。对于3D激光雷达，z是雷达安装高度，根据车体机械设计图参数填入。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
激光雷达的命名风格如下：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!名称&lt;br /&gt;
!用途&lt;br /&gt;
|-&lt;br /&gt;
|frontlidar&lt;br /&gt;
|安装在车头的激光雷达，一般是第一个雷达。&lt;br /&gt;
|-&lt;br /&gt;
|backlidar&lt;br /&gt;
|安装在车尾的激光雷达，一般是第二个雷达。&lt;br /&gt;
|-&lt;br /&gt;
|midlidar&lt;br /&gt;
|拼接frontlidar &amp;amp; backlidar后的“中”雷达，位于车体中心，坐标为 ( x: 0, y: 0, th:0 )。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 5.1.1 3D激光雷达 ===&lt;br /&gt;
3D激光雷达能够提供三维空间特征，这是它与2D雷达不同之处。所谓“二向化3D雷达“，是把空间特征投影为2D，因此需要配置相关参数。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
打开车体编辑器，选择要设置的二向化3D雷达，以下图为例。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240618120022183.png|无框]]&lt;br /&gt;
&lt;br /&gt;
'''图 5-5 二向化3D雷达相关参数'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!参数&lt;br /&gt;
!含义&lt;br /&gt;
!取值建议&lt;br /&gt;
|-&lt;br /&gt;
|minVStruct&lt;br /&gt;
|垂直结构最小高度。墙、树形成的垂直结构形成空间特征。&lt;br /&gt;
|以垂直扫描间隔2度的速腾16线雷达为例，两条相邻扫描线在 30米处的高度差是1046mm（小于这个值的物体只是一个点， 不能形成垂直线段）。如果建图轮廓在30米内，minVStruct=1000（大于1米的垂直结构参与计算）。&lt;br /&gt;
|-&lt;br /&gt;
|minScans&lt;br /&gt;
|扫描到垂直结构的最少扫描线数。&lt;br /&gt;
|与minVStruct配套使用。本例为3，表示长度&amp;gt;1000mm且至少被3条线扫描到的垂直结构可用于计算。&lt;br /&gt;
|-&lt;br /&gt;
|Zfadout&lt;br /&gt;
|垂直结构距离0度扫描平面的距离。&lt;br /&gt;
|越靠近0度扫描线的垂直结构，其计算权重越高。与0度扫描线 相交的垂直结构，其距离为0。小于Zfadout的垂直结构将被 赋予高权重。&lt;br /&gt;
|-&lt;br /&gt;
|scale&lt;br /&gt;
|点云缩放比例。&lt;br /&gt;
|对点云计算有影响力的点集中在30米之内，用于室内导航的 2D激光雷达测量距离一般30米以内，在室外则不然。因此 室外场景需要把3D激光雷达的点云尺度做适当缩放，以利 点云配准。一般而言，3D激光雷达的scale=0.5，对应于 60米以内点云，如果距离更远，则scale适当降低。在调整 scale时，底盘尺寸（宽高）和雷达外参（x &amp;amp; y）等比调整， 比如scale=0.5时，底盘尺寸如果是L2000W1000，则改为 L1000W500。调整scale后，遥控AMR自旋，detour输出 位姿应平滑变化，不应出现抖动或大幅跳动现象（这种 现象由于尺度配置错误导致应配准点云被过滤造成）。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 5.2 标定激光雷达外参 ==&lt;br /&gt;
如果您是首次标定激光雷达外参，请顺序阅读以下文章：&lt;br /&gt;
&lt;br /&gt;
* 【[[标定激光雷达外参]]】&lt;br /&gt;
* 【[[标定双激光雷达外参]]】&lt;br /&gt;
&lt;br /&gt;
== 5.3 启用激光里程计 ==&lt;br /&gt;
激光雷达测量数据输入激光SLAM算法，通过激光里程计计算，输出为机器人实时位姿。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611103919322.png|无框|640x640像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 5-4 激光里程计'''&lt;br /&gt;
在“里程计”标签，选择2D激光（odometry_0），其&amp;quot;lidar&amp;quot;字段的值与激光雷达关联。对于使用单激光雷达的车型，一般为&amp;quot;frontlidar&amp;quot;（参考4.1的激光雷达命名风格）；对于使用双激光雷达的车型，一般为“midlidar”。&lt;br /&gt;
&lt;br /&gt;
在“里程计”标签，选择2D激光（odometry_0），其&amp;quot;lidar&amp;quot;字段的值与激光雷达关联。对于使用单激光雷达的车型，一般为&amp;quot;frontlidar&amp;quot;（参考4.1的激光雷达命名风格）；对于使用双激光雷达的车型，一般为“midlidar”。&lt;br /&gt;
&lt;br /&gt;
查看选中的激光里程计状态，应该为“已启动”，否则点击“启动”按钮。激光里程计数据可在“状态”标签的列表查看。&lt;br /&gt;
&lt;br /&gt;
= 6. 获取授权证书 =&lt;br /&gt;
未授权的Detour可以使用60分钟，供体验Detour功能或测试Detour性能使用，超时后重起Detour可继续使用60分钟。&lt;br /&gt;
&lt;br /&gt;
如果您已购买Detour授权证书，请按照以下步骤在Auth站注册，然后下载证书。如果您希望购买Detour授权证书，或试用有疑问，请联系懒书科技技术支持唐工（13501683672，微信同号）咨询。&lt;br /&gt;
&lt;br /&gt;
# 浏览器打开：&amp;lt;nowiki&amp;gt;https://auth.lessokaji.com/login&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
# 点击“Register”链接以注册账号。请不要使用简单密码（比如1234之类），以保护您的数字资产安全。&lt;br /&gt;
# 注册后通知懒书科技，等待设置证书数量。&lt;br /&gt;
&lt;br /&gt;
在需要授权的工控机上启动Detour，复制“概况”标签下方的“DeviceID”。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611104936877-8074179.png|无框|821x821像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 6-1 授权信息的DeviceID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果您使用DetourLite，请从DetourLite的控制台输出获取DeviceID，如图6-2所示。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611122507804-8079908.png|无框|801x801像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 6-2 DetourLite的Device ID'''&lt;br /&gt;
&lt;br /&gt;
登入Auth站，选择Inventory的&amp;quot;MDCS2-license&amp;quot;。&amp;lt;blockquote&amp;gt;注意：MDCS-license将被废弃，请勿使用！&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611105143316-8074306.png|无框|546x546像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 6-3 选择MDCS2授权证书'''&lt;br /&gt;
&lt;br /&gt;
点击“Activate”按钮，输入Device ID&amp;quot;。以图5-1为例，DeviceID是&amp;quot;4D222EB2BEE27897&amp;quot;，则输入&amp;quot;4D222EB2BEE27897&amp;quot;（没有双引号）。如果是&amp;quot;x2&amp;quot;规格授权，则在DeviceID后加&amp;quot;x2&amp;quot;后缀，比如&amp;quot;4D222EB2BEE27897x2&amp;quot;。&amp;lt;blockquote&amp;gt;提示：授权规格分为&amp;quot;x1&amp;quot;、“x2&amp;quot;。&amp;quot;x1&amp;quot;就是不带后缀的DeviceID。请根据报价单给出的授权规格输入后缀，如有疑问请咨询懒书技术支持工程师。&amp;lt;/blockquote&amp;gt;[[文件:Image-20240611105433306-8074474.png|无框|689x689像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 6-4 激活设备'''&lt;br /&gt;
&lt;br /&gt;
Description建议使用车型命名，以便管理。比如&amp;quot;{项目编号} - {序号}&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
填写完毕后，点击“Activate”按钮，把下载的证书文件存入Detour目录（与Detour.exe或DetourLite.exe同级）。重启Detour，此时主界面的“试用版”信息消失，激活成功。&lt;br /&gt;
填写完毕后，点击“Activate”按钮，把下载的证书文件存入Detour目录（与Detour.exe或DetourLite.exe同级）。重启Detour，此时主界面的“试用版”信息消失，激活成功。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E5%AE%89%E8%A3%85Detour&amp;diff=959</id>
		<title>安装Detour</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E5%AE%89%E8%A3%85Detour&amp;diff=959"/>
		<updated>2025-07-02T06:14:20Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​/* 3.1 Windows环境 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1. 前言 =&lt;br /&gt;
您如果首次使用MDCS，建议阅读【[[MDCS概述]]】，在了解MDCS各子系统功能后下载安装Detour。&lt;br /&gt;
&lt;br /&gt;
= 2. 下载Detour及依赖包 =&lt;br /&gt;
浏览器打开：https://dl.lessokaji.com 。这是MDCS下载站，可下载MDCS（AMR控制全栈软件）发布版。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240521113910923.png|无框|651x651像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-1 MDCS下载页面'''&lt;br /&gt;
&lt;br /&gt;
下载页面由两部分构成：&lt;br /&gt;
&lt;br /&gt;
* 软件包清单。&lt;br /&gt;
* 下载按钮（Zip）。&lt;br /&gt;
&lt;br /&gt;
点击软件包名称，展开分类列表，勾选后点击下载按钮，选中软件被打包到一个zip文件下载。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240521114105532.png|无框|610x610像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-2 勾选软件清单后下载'''&lt;br /&gt;
以Windows版Detour下载为例，如图2-2，“Selected Files”下是选中软件清单，点击“Zip”按钮打包下载。&lt;br /&gt;
&lt;br /&gt;
以Windows版Detour下载为例，如图2-2，“Selected Files”下是选中软件清单，点击“Zip”按钮打包下载。&lt;br /&gt;
&lt;br /&gt;
= 3. 安装 =&lt;br /&gt;
Detour与Medulla配套使用。Medulla接收激光雷达发送的测量数据，统一转换格式后通过共享内存发布给Detour。&amp;lt;blockquote&amp;gt;说明：Windows环境使用Detour.exe，Ubuntu环境使用DetourLite.dll（Detour内核功能）并配套Detour.exe（作为远程客户端）使用。Ubuntu环境通过Mono启动Medulla.exe。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3.1 Windows环境 ==&lt;br /&gt;
[[文件:Image-20240521135107986.png|无框|610x610像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-1 Windows环境的软件清单'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!模块&lt;br /&gt;
!程序&lt;br /&gt;
!用途&lt;br /&gt;
|-&lt;br /&gt;
|Detour&lt;br /&gt;
|Detour.exe&lt;br /&gt;
|Detour主程序&lt;br /&gt;
|-&lt;br /&gt;
|Medullar&lt;br /&gt;
|Medulla.exe&lt;br /&gt;
|Medulla主程序&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|LidarControler.dll&lt;br /&gt;
|激光雷达控制器，部署在medulla的plugins子目录下（下同）&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|WinMedulla.dll&lt;br /&gt;
|Medulla库。&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|CartActivator.dll&lt;br /&gt;
|如果需要控制车辆，则需要该加载器。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;说明：Medulla &amp;amp; Detour运行在Windows 10以上版本，依赖 .netframework 4.8 [[(https://dotnet.microsoft.com/en-us/download/dotnet-framework/net48|Download .NET Framework 4.8 | Free official downloads (microsoft.com)]]  。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
建议把Detour和Medulla存放在MDCS目录下，以便管理。MDCS目录所在分区至少有80G空闲容量，用于存储Detour和Medulla运行时生成的日志文件和配置数据。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Medulla的目录结构如下：&amp;lt;syntaxhighlight lang=&amp;quot;winbatch&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
D:\work\Playground\mdcs\Medulla 的目录&lt;br /&gt;
&lt;br /&gt;
2024/06/18  10:14    &amp;lt;DIR&amp;gt;          .&lt;br /&gt;
2024/06/18  10:14    &amp;lt;DIR&amp;gt;          ..&lt;br /&gt;
2024/06/13  08:18         3,420,672 Camera3D.dll		// 3D相机控制器，只用激光SLAM时不需要&lt;br /&gt;
2024/06/13  08:18           643,072 CartActivator.dll	// 底盘驱动加载器&lt;br /&gt;
2024/06/13  16:39    &amp;lt;DIR&amp;gt;          diagnosis			// 运行时日志目录&lt;br /&gt;
2024/06/13  08:18           854,016 LidarController.dll	// 激光雷达控制器&lt;br /&gt;
2024/05/21  13:00         3,335,168 MDCSToolBox.dll		// 工具箱，只用激光SLAM时不需要&lt;br /&gt;
2024/06/13  08:18         2,609,152 Medulla.exe			// 主程序，Ubuntu用mono启动&lt;br /&gt;
2024/05/21  13:00            14,544 Medulla.sys			// 主程序库&lt;br /&gt;
2024/06/13  08:18           752,128 NetRemote.exe		// 底盘遥控器，只用激光SLAM时不需要&lt;br /&gt;
2024/06/13  16:20    &amp;lt;DIR&amp;gt;          plugins				// 底盘驱动目录，激光雷达驱动存在此&lt;br /&gt;
2024/05/21  13:00             1,646 remoteconf.json		// 底盘遥控器配置文件&lt;br /&gt;
2024/06/13  16:20               192 startup.iocmd		// 自动加载驱动脚本&lt;br /&gt;
2024/06/13  08:18           758,784 USBCamera.dll		// USB相机控制器，只用激光SLAM时不需要&lt;br /&gt;
2024/06/13  08:18         1,715,712 WinMedulla.dll		// Medulla控制台库&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour的目录结构如下：&amp;lt;syntaxhighlight lang=&amp;quot;winbatch&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 D:\work\Playground\mdcs\Detour 的目录&lt;br /&gt;
&lt;br /&gt;
2024/06/18  09:23    &amp;lt;DIR&amp;gt;          .&lt;br /&gt;
2024/06/18  09:23    &amp;lt;DIR&amp;gt;          ..&lt;br /&gt;
2024/06/17  09:05           142,640 critical.log		// 错误日志&lt;br /&gt;
2024/06/13  10:54       152,167,424 cufft64_10.dll		// 库&lt;br /&gt;
2024/06/13  10:54           226,816 cufftw64_10.dll		// 库&lt;br /&gt;
2024/06/13  10:54           127,488 d2dlib64.dll		// 库&lt;br /&gt;
2024/06/17  09:05         5,914,624 Detour.exe			// 主程序&lt;br /&gt;
2024/06/18  09:28             5,744 detour_127.0.0.1.json	// 作为客户端连接远程DetourLite时&lt;br /&gt;
															// 自动下载的DetourLite配置文件，&lt;br /&gt;
															// detour_{detour_lite_ip}.json&lt;br /&gt;
2024/06/13  10:54    &amp;lt;DIR&amp;gt;          log					// 日志目录&lt;br /&gt;
2024/06/13  10:54        53,050,368 OpenCvSharpExtern.dll	// 库&lt;br /&gt;
2024/06/13  10:54           735,744 regcore_cuda.dll		// 库&lt;br /&gt;
2024/06/18  09:28           154,166 tmpmap.2dlm			// *.2dlm是激光地图文件&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;生产环境需要自动启动Medulla &amp;amp; Detour，且要监控并重启异常退出的进程，我们配套了看门狗程序Wawa，详见【[[看门狗Wawa使用说明]]】。&lt;br /&gt;
&lt;br /&gt;
== 3.2 Ubuntu环境 ==&lt;br /&gt;
[[文件:Image-20240521140212910.png|无框|610x610像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-2 Ubuntu环境下的软件清单'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!模块&lt;br /&gt;
!程序&lt;br /&gt;
!用途&lt;br /&gt;
|-&lt;br /&gt;
|Detour&lt;br /&gt;
|DetourLite&lt;br /&gt;
|DetourLite是Detour内核功能，依赖DotNetCore，与Windows版Detour（作为远程客户端）配套使用。&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|DetourLiteDepends&lt;br /&gt;
|DetourLite的依赖库，解压后放到DetourLite目录。&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|libOpenCvSharpExtern&lt;br /&gt;
|OpenCV依赖库，根据目标系统处理器架构选择arm64 / x64。&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|GDI+（可选）&lt;br /&gt;
|如果使用DetourLite的/getMapPng接口，则要安装GDI+库（sudo apt-get install -y libgdiplus）。&lt;br /&gt;
|-&lt;br /&gt;
|Medullar&lt;br /&gt;
|Medulla.exe&lt;br /&gt;
|Medulla主程序，依赖Mono。&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|LidarControler.dll&lt;br /&gt;
|激光雷达控制器，部署在medulla的plugins子目录下（下同）&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|WinMedulla.dll&lt;br /&gt;
|Medulla库。&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|CartActivator.dll&lt;br /&gt;
|插件加载器。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3.2.1 安装Medulla ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;注意：应使用Ubuntu 16、18或20，截止2024年6月，Mono官方支持的Ubuntu最高版本是20.04，Medulla &amp;amp; DetourLite在这3个发布版做过充分测试。&amp;lt;/blockquote&amp;gt;参考[https://www.mono-project.com/download/stable/#download-lin Mono官网指南]安装Mono。安装完毕后使用&amp;quot;mono --version&amp;quot;核对其版本，应是6.12以上，如下。&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Mono JIT compiler version 6.12.0.200 (tarball Tue Jul 11 21:34:53 UTC 2023)&lt;br /&gt;
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com&lt;br /&gt;
        TLS:           __thread&lt;br /&gt;
        SIGSEGV:       altstack&lt;br /&gt;
        Notifications: epoll&lt;br /&gt;
        Architecture:  amd64&lt;br /&gt;
        Disabled:      none&lt;br /&gt;
        Misc:          softdebug &lt;br /&gt;
        Interpreter:   yes&lt;br /&gt;
        LLVM:          yes(610)&lt;br /&gt;
        Suspend:       hybrid&lt;br /&gt;
        GC:            sgen (concurrent by default)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Medulla使用.netframework 4.8开发，在Ubuntu使用Mono启动。Mono是.NET Framework的开源实现，由微软赞助。请根据官网指南 Download - Stable | Mono (mono-project.com) 安装。&lt;br /&gt;
&lt;br /&gt;
使用mono启动Medulla：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
$ mono Medulla.exe&lt;br /&gt;
Lessokaji Medulla Version 1.2.0.3961, 64bit&lt;br /&gt;
Main Thread ID: 1&lt;br /&gt;
Medulla starting up...&lt;br /&gt;
Medulla command ready&lt;br /&gt;
Initialize Shared Objects for program Medulla&lt;br /&gt;
Mono or Linux which doesn't support named MMF, use file.&lt;br /&gt;
Create Shared Object dumplog&lt;br /&gt;
SO&amp;gt;&amp;gt; Exist dumplog:6579279&lt;br /&gt;
Initialize Diagnosis cache&lt;br /&gt;
Run on Mono or Linux which doesn't support named MMF, use file.&lt;br /&gt;
initializing io object&lt;br /&gt;
Create Shared Object mse&lt;br /&gt;
SO&amp;gt;&amp;gt; Exist mse:6581375&lt;br /&gt;
MSE engine initialized&lt;br /&gt;
run startup.iocmd script...&lt;br /&gt;
$: loader = io load CartActivator.dll&lt;br /&gt;
[IO] Loading Library CartActivator.dll...&lt;br /&gt;
 Costura attach required assemblies for CartActivator.dll...&lt;br /&gt;
$: frontlidar = io load plugins/sicknano.dll&lt;br /&gt;
[IO] Loading Library plugins/sicknano.dll...&lt;br /&gt;
$: frontlidar setMaskDist 50 20000&lt;br /&gt;
$: frontlidar Start 6060&lt;br /&gt;
$: frontlidar setMirror false&lt;br /&gt;
$: ui=io load WinMedulla.dll&lt;br /&gt;
[IO] Loading Library WinMedulla.dll...&lt;br /&gt;
 Costura attach required assemblies for WinMedulla.dll...&lt;br /&gt;
Starting HTTP Server, STM&lt;br /&gt;
HTTP Server listen on http://*:8007/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Medulla启动后在8007端口启动Web端口，可用浏览器访问 &amp;lt;nowiki&amp;gt;http://192.168.100.100:8007/simple.html&amp;lt;/nowiki&amp;gt; （假设Medulla所在工控机的IP是192.168.100.100），可见Medulla运行状态，如下图所示。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240618104132637.png|无框|638x638像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-3 Medulla的监控页面'''&lt;br /&gt;
&lt;br /&gt;
=== 3.2.2 安装DetourLite ===&lt;br /&gt;
根据微软dotNet官网指南 Download .NET 6.0 (Linux, macOS, and Windows) (microsoft.com) 安装.NET SDK 6.0。&amp;lt;blockquote&amp;gt;备注：Ubuntu16、18、20的包管理器没有.NET 6源（参见官网指南），因此使用二进制安装，安装后应把dotnet加入PATH环境变量。&lt;br /&gt;
&lt;br /&gt;
假设dotnet安装目录是~/dotnet，则在~/.bashrc加入 export PATH=$PATH:~/dotnet/dotnet 。&amp;lt;/blockquote&amp;gt;使用dotnet启动DetourLite：&lt;br /&gt;
 dotnet DetourLite.dll&lt;br /&gt;
&lt;br /&gt;
DetourLite不包括UI功能，因此要在Windows上运行Detour（作为客户端），远程连接到DetourLite。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
看门狗Wawa也支持Ubuntu，详见【[[看门狗Wawa使用说明]]】。&lt;br /&gt;
&lt;br /&gt;
[[文件:2114D627-27C0-42EC-8C9D-757BE0BDFD15.png|无框|620x620像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-3 作为远程客户端使用的Detour'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
客户端Detour连接远程DetourLite步骤：&lt;br /&gt;
&lt;br /&gt;
# 概览标签，选择“使用远程算法核（简单配置）”。&lt;br /&gt;
# 填入DetourLite所在主机的IP地址，然后点击“连接”按钮。&lt;br /&gt;
# 连接成功后，状态栏会提示“已获取x.x.x.x上的配置文件。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;注意：在启动作为客户端的Detour时，必须删除Detour目录下的detour.json，否则Detour会加载本地配置文件，拒绝连接远程Detour。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
自2024/6/17后，下载站的Detour.exe支持远程设置DetourLite参数，如果您使用老版本，请升级。&lt;br /&gt;
&lt;br /&gt;
[[文件:1718764541745.png|无框|805x805像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''图 3-5 Detour可远程同步的组件参数'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour可远程同步DetourLite的组件、里程计参数。组件是车体编辑器中的传感器，激光SLAM传感器就是2D/3D激光雷达；里程计是“里程计”标签列表的&amp;quot;odometry_n&amp;quot;(n≥0)，包括激光里程计、地纹里程计和轮里程计。&lt;br /&gt;
&lt;br /&gt;
当Detour连接DetourLite后，在Detour配置激光雷达或里程计属性时，Detour更新本地配置副本后同步DetourLite。下面我们详细讲解Detour和DetourLite的协作关系。&lt;br /&gt;
&lt;br /&gt;
DetourLite启动时自动读取同目录的detour.json，如果detour.json包含激光地图文件属性，则自动加载激光地图。观察DetourLite控制台输出可见此过程，如下图所示。&lt;br /&gt;
&lt;br /&gt;
[[文件:1718767175461.png|无框|758x758像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-6 DetourLite启动后的控制台输出'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如图3-6所示，DetourLite加载&amp;quot;detour.json&amp;quot;，随后加载配置文件中指向的激光地图&amp;quot;mainmap_0618_edit_yh.2dlm&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
Detour连接DetourLite，状态栏提示&amp;quot;load map, but cannot find ...&amp;quot;，如下图所示。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240619112420197.png|无框|811x811像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-7 远程连接DetourLite时的提示'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果DetourLite未加载激光雷达，Detour提示”读取...远程配置成功“。出现&amp;quot;cannot find map file&amp;quot;提示是因为本地没有激光地图文件。此时有两种处理方法，一是从DetourLtie拷贝激光地图文件到本地，二是使用”单线激光SLAM“标签下”其他功能 / 下载远程图层数据至本机图层“。建议使用方法一。Detour在连接DetourLite后，将其配置读入内存，并在Detour目录下生成&amp;quot;detour_{ip}.json&amp;quot;副本（ip是DetourLite所在PC地址），其图层关联的激光地图文件名称与DetourLite一致，如下图所示。如果使用“加载图层”装入另一个本地激光地图文件，就会同步给DetourLite，导致DetourLite下次启动错误加载不存在激光地图而报错。&lt;br /&gt;
&lt;br /&gt;
[[文件:1718768074021.png|无框|623x623像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-8 DetourLite配置所用的激光地图文件名'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
由于底盘轮廓不在远程同步范围，因此在项目开始时，应使用Detour在本地编辑好底盘宽高和轮廓（概况 / 车体布局 / 编辑），在车体编辑器中部署激光雷达，然后上传到DetourLite，使用Detour的远程参数同步功能标定雷达外参。&lt;br /&gt;
&lt;br /&gt;
在建图时，如果DetourLite没加载激光地图，则会自动创建。建图完毕后使用“其他功能 / 下载远程图层数据到本地图层”，然后另存为与DetourLite相同的名称，或者从DetourLite目录下载都可以。&lt;br /&gt;
&lt;br /&gt;
= 4. 配置激光雷达 =&lt;br /&gt;
[[文件:Image-20240521144346393.png|无框|530x530像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 4-1 激光雷达电气原理示例'''&lt;br /&gt;
&lt;br /&gt;
我们用2D激光雷达来说明配置方法。如图4-1所示，Medulla通过激光雷达驱动（插件）接收2D激光雷达的测量数据，经解码后传给Detour（或DetourLite）。&lt;br /&gt;
&lt;br /&gt;
== 4.1 兼容激光雷达清单 ==&lt;br /&gt;
Medulla支持的激光雷达型号（通过项目实践验证）如下。激光雷达驱动开发请阅读【开发激光雷达驱动】。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2D雷达清单：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!品牌&lt;br /&gt;
!型号&lt;br /&gt;
|-&lt;br /&gt;
|SICK（西克）&lt;br /&gt;
|LMS511，nano，S300&lt;br /&gt;
|-&lt;br /&gt;
|P+F（倍加福）&lt;br /&gt;
|R2000&lt;br /&gt;
|-&lt;br /&gt;
|万集&lt;br /&gt;
|716，716mini，719&lt;br /&gt;
|-&lt;br /&gt;
|兴颂&lt;br /&gt;
|HE-3051，SE1035&lt;br /&gt;
|-&lt;br /&gt;
|富瑞&lt;br /&gt;
|H1系列&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3D雷达清单：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!品牌&lt;br /&gt;
!型号&lt;br /&gt;
|-&lt;br /&gt;
|觅道（Livox）&lt;br /&gt;
|Mid70（用于物体识别，不能用于导航），Mid360（非均匀扫描周期，可用于&amp;lt;1m/s的低速导航）&lt;br /&gt;
|-&lt;br /&gt;
|速腾&lt;br /&gt;
|M1，Helios&lt;br /&gt;
|-&lt;br /&gt;
|万集&lt;br /&gt;
|WLR720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
雷达驱动可在开发站下载：[https://dev.lessokaji.com/index.php?PHPSESSID=p70a3knelida520lh61225h1f4&amp;amp;board=3.0 传感器/功能插件]&lt;br /&gt;
&lt;br /&gt;
== 4.2 2D激光雷达驱动 ==&lt;br /&gt;
Medulla启动时自动读取同目录下的startup.iocmd，根据指令启动驱动，举例如下。&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// 指令使用类JavaScript语法。&lt;br /&gt;
&lt;br /&gt;
// 加载CartActivator.dll，作为WinMedulla加载器。&lt;br /&gt;
loader = io load plugins/CartActivator.dll&lt;br /&gt;
&lt;br /&gt;
// 加载前激光雷达驱动，以SICK nano3为例。&lt;br /&gt;
// frontlidar是激光雷达名称，在WinMedulla的对象列表可见&lt;br /&gt;
frontlidar = io load plugins/sicknano.dll&lt;br /&gt;
// 设置前雷达测量距离：50mm内忽略，最大测距20,000mm。&lt;br /&gt;
frontlidar setMaskDist 50 20000&lt;br /&gt;
// 前雷达驱动监听6060端口（SICK SOPAS配置nano3，使用UDP单播，目标端口6060）。&lt;br /&gt;
frontlidar Start 6060&lt;br /&gt;
// 前雷达正装。如果是倒装雷达，则setMirror为true（雷达倒装后，扫描顺序颠倒）。&lt;br /&gt;
frontlidar setMirror false&lt;br /&gt;
&lt;br /&gt;
// 加载Medulla控制台，并显示。&lt;br /&gt;
// Ubuntu环境则注释以下两行，改用 :8007/simple.html 监控页面&lt;br /&gt;
ui=io load plugins\WinMedulla.dll  &lt;br /&gt;
ui Show&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
修改完startup.iocmd后，启动Medulla.exe，出现WinMedulla主窗口。&lt;br /&gt;
[[文件:Image-20240521150404636.png|无框|590x590像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 4-2 查看前激光雷达的数据'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WinMedulla是Medulla控制台，在左侧对象列表中可见刚配置的frontlidar。如果驱动工作正常，则可见窗体中间的数据在变化，说明已收到雷达数据。点击窗体右侧的“view”按钮，弹出点云监控窗口，使用鼠标滚轮缩放，鼠标中键按压拖动，检查点云是否与雷达观测一致。&amp;lt;blockquote&amp;gt;备注：由于Mono不支持WinForm，因此Ubuntu环境下改用:8007/simple.html监控Medulla运行，激光雷达数据更新时可在页面观察到。由于监控页面不能显示点云数据，因此在首次使用Medulla时，建议先用Windows版Medulla熟悉激光雷达输出点云，掌握Medulla的激光雷达应用后再切到Ubuntu环境。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4.3 3D激光雷达驱动 ==&lt;br /&gt;
3D激光雷达驱动使用与2D激光雷达相同。&lt;br /&gt;
&lt;br /&gt;
= 5. 配置Detour =&lt;br /&gt;
Detour配置可分为三步：部署激光雷达、标定激光雷达外参，启用激光里程计。&lt;br /&gt;
&lt;br /&gt;
对于潜伏车型，激光雷达一般安装在车头/车尾或对角，不在底盘运动中心上；对于单舵轮底盘（比如叉车），也是如此（运动中心在两个从动轮连线中心）。为了把激光雷达（逻辑上）移动到底盘运动中心，使观测中心与运动中心重合，以便运动控制算法根据当前位姿跟踪轨迹。我们需要知道激光雷达安装在车体的那个位置，这就是“部署激光雷达”步骤，使用车体编辑器把激光雷达放到底盘上。然后调整激光雷达外参，使其“移动”到底盘运动中心，这就是“标定激光雷达外参”，通过激光雷达参数配置执行。标定完成后就可以启动激光里程计，使用激光SLAM输出的实时位姿。&amp;lt;blockquote&amp;gt;注意：'''激光SLAM有其能力边界'''。如果您首次使用激光SLAM，建议阅读【[[激光SLAM能力边界]]】。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5.1 部署激光雷达 ==&lt;br /&gt;
启动Detour，在“概况”页面上点击”车体布局“的“编辑”按钮，打开车体编辑器。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611101435344-8072077.png|无框|803x803像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 5-1 车体编辑器'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
激光雷达安装在底盘之上（我们把AMR抽象为底盘），因此先要编辑底盘，如下图所示。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240618140148287.png|无框|588x588像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 5-2 选择底盘'''&lt;br /&gt;
&lt;br /&gt;
鼠标点击底盘内空白处选择。本例的属性列表可见该底盘W750L1200，contour是构成矩形底盘的4个角的坐标。对于矩形底盘，在修改长宽后，可直接修改contour的坐标值。对于多边形底盘，使用“动作”标签的“重绘轮廓“，使用鼠标左键依次点击创建底盘轮廓。&amp;lt;blockquote&amp;gt;注意：Detour会过滤底盘轮廓之内的点云。在重绘底盘后，应在“概况”页面观察AMR图标附近是否有车体造成点云（噪音），如有则适当扩大底盘轮廓。这种车体与激光雷达干涉造成的噪音点必须清除，否则会干扰建图和定位。&amp;lt;/blockquote&amp;gt;点击车体编辑器的“添加”按钮，在下拉菜单中选择激光雷达类型，然后点击菜单下方的车体布局的激光雷达安装位置，新增一个激光雷达。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611101655915-8072217.png|无框|584x584像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 5-3 增加菜单的传感器类型'''&lt;br /&gt;
&lt;br /&gt;
“添加”菜单中的激光雷达类型如下表：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!类型&lt;br /&gt;
!用途&lt;br /&gt;
|-&lt;br /&gt;
|单线激光雷达&lt;br /&gt;
|即2D激光雷达，只有一个0度的扫描平面，适用于室内导航场景。&lt;br /&gt;
|-&lt;br /&gt;
|同步多2D雷达拼接&lt;br /&gt;
|用于把多个2D激光雷达测量数据拼接为一个，适用于单个2D激光雷达视野不足，用2个激光雷达拼接以形成全向视野场景。&lt;br /&gt;
|-&lt;br /&gt;
|3D激光雷达&lt;br /&gt;
|一般为16、32线的多线激光雷达，在垂直方向以不同角度扫描，形成立体点云，适用于室外导航（包括避障）场景。&lt;br /&gt;
|-&lt;br /&gt;
|二向化3D雷达&lt;br /&gt;
|把3D雷达测量数据二向化为具备空间特征的二向化数据，供SLAM算法使用。（3D激光雷达都要二向化后使用）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611102403514.png|无框|636x636像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 5-3 激光雷达的安装位置外参'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
选择新增的激光雷达，属性列表中的x、y、th就是其安装位姿，x &amp;amp; y可根据车体机械设计图参数填入，th根据激光雷达手册提供的参数填入。Detour使用右手坐标系，+X轴为食指方向，+Y轴为中指方向，+Z为大拇指方向，th就是激光雷达相对于+X轴的角度。对于3D激光雷达，z是雷达安装高度，根据车体机械设计图参数填入。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
激光雷达的命名风格如下：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!名称&lt;br /&gt;
!用途&lt;br /&gt;
|-&lt;br /&gt;
|frontlidar&lt;br /&gt;
|安装在车头的激光雷达，一般是第一个雷达。&lt;br /&gt;
|-&lt;br /&gt;
|backlidar&lt;br /&gt;
|安装在车尾的激光雷达，一般是第二个雷达。&lt;br /&gt;
|-&lt;br /&gt;
|midlidar&lt;br /&gt;
|拼接frontlidar &amp;amp; backlidar后的“中”雷达，位于车体中心，坐标为 ( x: 0, y: 0, th:0 )。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 5.1.1 3D激光雷达 ===&lt;br /&gt;
3D激光雷达能够提供三维空间特征，这是它与2D雷达不同之处。所谓“二向化3D雷达“，是把空间特征投影为2D，因此需要配置相关参数。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
打开车体编辑器，选择要设置的二向化3D雷达，以下图为例。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240618120022183.png|无框]]&lt;br /&gt;
&lt;br /&gt;
'''图 5-5 二向化3D雷达相关参数'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!参数&lt;br /&gt;
!含义&lt;br /&gt;
!取值建议&lt;br /&gt;
|-&lt;br /&gt;
|minVStruct&lt;br /&gt;
|垂直结构最小高度。墙、树形成的垂直结构形成空间特征。&lt;br /&gt;
|以垂直扫描间隔2度的速腾16线雷达为例，两条相邻扫描线在 30米处的高度差是1046mm（小于这个值的物体只是一个点， 不能形成垂直线段）。如果建图轮廓在30米内，minVStruct=1000（大于1米的垂直结构参与计算）。&lt;br /&gt;
|-&lt;br /&gt;
|minScans&lt;br /&gt;
|扫描到垂直结构的最少扫描线数。&lt;br /&gt;
|与minVStruct配套使用。本例为3，表示长度&amp;gt;1000mm且至少被3条线扫描到的垂直结构可用于计算。&lt;br /&gt;
|-&lt;br /&gt;
|Zfadout&lt;br /&gt;
|垂直结构距离0度扫描平面的距离。&lt;br /&gt;
|越靠近0度扫描线的垂直结构，其计算权重越高。与0度扫描线 相交的垂直结构，其距离为0。小于Zfadout的垂直结构将被 赋予高权重。&lt;br /&gt;
|-&lt;br /&gt;
|scale&lt;br /&gt;
|点云缩放比例。&lt;br /&gt;
|对点云计算有影响力的点集中在30米之内，用于室内导航的 2D激光雷达测量距离一般30米以内，在室外则不然。因此 室外场景需要把3D激光雷达的点云尺度做适当缩放，以利 点云配准。一般而言，3D激光雷达的scale=0.5，对应于 60米以内点云，如果距离更远，则scale适当降低。在调整 scale时，底盘尺寸（宽高）和雷达外参（x &amp;amp; y）等比调整， 比如scale=0.5时，底盘尺寸如果是L2000W1000，则改为 L1000W500。调整scale后，遥控AMR自旋，detour输出 位姿应平滑变化，不应出现抖动或大幅跳动现象（这种 现象由于尺度配置错误导致应配准点云被过滤造成）。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 5.2 标定激光雷达外参 ==&lt;br /&gt;
如果您是首次标定激光雷达外参，请顺序阅读以下文章：&lt;br /&gt;
&lt;br /&gt;
* 【[[标定激光雷达外参]]】&lt;br /&gt;
* 【[[标定双激光雷达外参]]】&lt;br /&gt;
&lt;br /&gt;
== 5.3 启用激光里程计 ==&lt;br /&gt;
激光雷达测量数据输入激光SLAM算法，通过激光里程计计算，输出为机器人实时位姿。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611103919322.png|无框|640x640像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 5-4 激光里程计'''&lt;br /&gt;
在“里程计”标签，选择2D激光（odometry_0），其&amp;quot;lidar&amp;quot;字段的值与激光雷达关联。对于使用单激光雷达的车型，一般为&amp;quot;frontlidar&amp;quot;（参考4.1的激光雷达命名风格）；对于使用双激光雷达的车型，一般为“midlidar”。&lt;br /&gt;
&lt;br /&gt;
在“里程计”标签，选择2D激光（odometry_0），其&amp;quot;lidar&amp;quot;字段的值与激光雷达关联。对于使用单激光雷达的车型，一般为&amp;quot;frontlidar&amp;quot;（参考4.1的激光雷达命名风格）；对于使用双激光雷达的车型，一般为“midlidar”。&lt;br /&gt;
&lt;br /&gt;
查看选中的激光里程计状态，应该为“已启动”，否则点击“启动”按钮。激光里程计数据可在“状态”标签的列表查看。&lt;br /&gt;
&lt;br /&gt;
= 6. 获取授权证书 =&lt;br /&gt;
未授权的Detour可以使用60分钟，供体验Detour功能或测试Detour性能使用，超时后重起Detour可继续使用60分钟。&lt;br /&gt;
&lt;br /&gt;
如果您已购买Detour授权证书，请按照以下步骤在Auth站注册，然后下载证书。如果您希望购买Detour授权证书，或试用有疑问，请联系懒书科技技术支持唐工（13501683672，微信同号）咨询。&lt;br /&gt;
&lt;br /&gt;
# 浏览器打开：&amp;lt;nowiki&amp;gt;https://auth.lessokaji.com/login&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
# 点击“Register”链接以注册账号。请不要使用简单密码（比如1234之类），以保护您的数字资产安全。&lt;br /&gt;
# 注册后通知懒书科技，等待设置证书数量。&lt;br /&gt;
&lt;br /&gt;
在需要授权的工控机上启动Detour，复制“概况”标签下方的“DeviceID”。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611104936877-8074179.png|无框|821x821像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 6-1 授权信息的DeviceID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果您使用DetourLite，请从DetourLite的控制台输出获取DeviceID，如图6-2所示。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611122507804-8079908.png|无框|801x801像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 6-2 DetourLite的Device ID'''&lt;br /&gt;
&lt;br /&gt;
登入Auth站，选择Inventory的&amp;quot;MDCS2-license&amp;quot;。&amp;lt;blockquote&amp;gt;注意：MDCS-license将被废弃，请勿使用！&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611105143316-8074306.png|无框|546x546像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 6-3 选择MDCS2授权证书'''&lt;br /&gt;
&lt;br /&gt;
点击“Activate”按钮，输入Device ID&amp;quot;。以图5-1为例，DeviceID是&amp;quot;4D222EB2BEE27897&amp;quot;，则输入&amp;quot;4D222EB2BEE27897&amp;quot;（没有双引号）。如果是&amp;quot;x2&amp;quot;规格授权，则在DeviceID后加&amp;quot;x2&amp;quot;后缀，比如&amp;quot;4D222EB2BEE27897x2&amp;quot;。&amp;lt;blockquote&amp;gt;提示：授权规格分为&amp;quot;x1&amp;quot;、“x2&amp;quot;。&amp;quot;x1&amp;quot;就是不带后缀的DeviceID。请根据报价单给出的授权规格输入后缀，如有疑问请咨询懒书技术支持工程师。&amp;lt;/blockquote&amp;gt;[[文件:Image-20240611105433306-8074474.png|无框|689x689像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 6-4 激活设备'''&lt;br /&gt;
&lt;br /&gt;
Description建议使用车型命名，以便管理。比如&amp;quot;{项目编号} - {序号}&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
填写完毕后，点击“Activate”按钮，把下载的证书文件存入Detour目录（与Detour.exe或DetourLite.exe同级）。重启Detour，此时主界面的“试用版”信息消失，激活成功。&lt;br /&gt;
填写完毕后，点击“Activate”按钮，把下载的证书文件存入Detour目录（与Detour.exe或DetourLite.exe同级）。重启Detour，此时主界面的“试用版”信息消失，激活成功。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E5%BE%85%E6%95%B4%E7%90%86%E7%9A%84%E6%9D%82%E9%A1%B9%E5%86%85%E5%AE%B9&amp;diff=916</id>
		<title>待整理的杂项内容</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E5%BE%85%E6%95%B4%E7%90%86%E7%9A%84%E6%9D%82%E9%A1%B9%E5%86%85%E5%AE%B9&amp;diff=916"/>
		<updated>2025-06-29T08:33:31Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​/* 通用常识 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Simple ===&lt;br /&gt;
'''逃逸功能：'''&lt;br /&gt;
&lt;br /&gt;
Simple现在允许多个小车可以发到互相冲突的终点，只要指定一个Escape路径。该Escape路线不会执行，只是用于告诉交管至少保留哪条路径来保证场景不会卡死。使用方法：carprogram的.Forecast方法增加了一个参数，可以传入EscapePlan。&lt;br /&gt;
注意：这个escapeplan只是用于交管计算，内核并不会真的执行这个plan。如果遇到小车必须执行逃逸路径的情况（比如巷道外车辆等待巷道内停留的车辆离开巷道，此时巷道外车辆的tcstat状态会是Escape[xx...]），那么需要由业务下发实际任务。按照设计理念，内核只告诉业务某个车应该走（挡路了），具体怎么走需要业务决定。&lt;br /&gt;
[[文件:E67a478ac2900cd6b7ab025ee445c9d9 .png|无|缩略图|代码示例]]&lt;br /&gt;
此外小车调用AbstractCar.Reset方法时，也可以给一个escape路径（escape可选参数）。这样可以防止其他车因为不知道该小车后续如何运行而把刚初始化的小车堵死。举个例子而言：刚初始化的小车A在长巷道内，另外一台车B要进入巷道更深的地方。希望小车A初始化后立刻出来取货，那么应该给小车A附加一个escape路径去任意一个取货点，这样初始化后，即便上层业务还没有下发取货指令，B车也不会提前进入巷道导致A车堵死在巷道里。&lt;br /&gt;
&lt;br /&gt;
====== Simple的站点交管方式： ======&lt;br /&gt;
交管计算时，会以以下顺序设置站点的计算方式：&lt;br /&gt;
&lt;br /&gt;
# terminal：表示一个停靠终点站；定义为：入站和出站路线绝对不会冲突。该站点只能被一台车占用。一般环线上可以使用（环线不存在交管问题，使用terminal方式配置相对于编程设置escape而言，较为简单）&lt;br /&gt;
# sink：表示该站点无视交管通行矩阵中的冲突。（注：若同时具有terminal标记，仍然只能被一台车占用）&lt;br /&gt;
# mustFree：若某台车要占用该站点，那么mustFree里列举的站点必须不被占用。&lt;br /&gt;
# mutexes：若某台车要占用该站点，那么所有“包含至少一个相同mutexes数字”的站点都必须不被占用。&lt;br /&gt;
# carProgram规定的冲突：包络、&amp;lt;s&amp;gt;优先级&amp;lt;/s&amp;gt;现在使用“可达性状态”。&lt;br /&gt;
&lt;br /&gt;
=== Detour ===&lt;br /&gt;
使用2D激光SLAM算法，首先必须调平雷达！可以使用红外相机调平。&lt;br /&gt;
[[文件:Weixin Image 20231230212150.jpg|缩略图|无|使用红外相机可以看到激光雷达的扫描线]]&lt;br /&gt;
&lt;br /&gt;
定位一定是有延迟的。要求高精度定位时，不光对定位精度要求高，实际上对车体结构、机械、控制的精度同时很高。一般可以将定位数据和轮子编码器数据画在同一个图上进行对比，从而获取延迟数据，这是个常用的分析方法。举例如下：&lt;br /&gt;
[[文件:Excel-latency-actual-draw..png|无|缩略图|使用excel图表功能，可以比较轻松地同时分析定位延迟和机械蠕变等信息。]]&lt;br /&gt;
&lt;br /&gt;
=== Medulla ===&lt;br /&gt;
&lt;br /&gt;
=== Clumsy ===&lt;br /&gt;
&lt;br /&gt;
=== 通用常识 ===&lt;br /&gt;
雷达发射的开角腔需要涂黑处理。如果不涂黑则会发生两种可能的问题：1：边缘测距精度严重下降，测距偏小；2：发生掠射，车体壁在雷达看来如同镜子。&lt;br /&gt;
&lt;br /&gt;
AGV实施大量时候需要拍摄现场场景进行分析。拍现场场景的小tip：要横屏拍，要用手机自带的相机和广角，要拍照而不是录像。否则发一个长达1min的镜头缓缓转动的视频，不仅慢，而且抖，纯属浪费时间。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_Linux_MDCS%E9%83%A8%E7%BD%B2%E9%85%8D%E7%BD%AE%E5%92%8C%E6%93%8D%E4%BD%9C%E8%AF%B4%E6%98%8E&amp;diff=915</id>
		<title>使用手册 - Linux MDCS部署配置和操作说明</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_Linux_MDCS%E9%83%A8%E7%BD%B2%E9%85%8D%E7%BD%AE%E5%92%8C%E6%93%8D%E4%BD%9C%E8%AF%B4%E6%98%8E&amp;diff=915"/>
		<updated>2025-06-23T06:14:50Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
'''MDCS 环境部署'''                                                                 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
自行配置&lt;br /&gt;
1.配置mono&lt;br /&gt;
        注意：不同的cpu对应不同的离线软件包 一定先确定系统版本 输入lscpu  即可查看-建议离线安装比较快&lt;br /&gt;
        &lt;br /&gt;
[[文件:Li1.png|502x502像素]]&lt;br /&gt;
&lt;br /&gt;
根据mono官网要求和系统版本配置mono环境，要求mono版本&amp;gt;=6.12&lt;br /&gt;
Download - Stable  | Mono (mono-project.com)&lt;br /&gt;
&lt;br /&gt;
* 联网--需要根据对应的unbutun版本进行下载&lt;br /&gt;
&lt;br /&gt;
 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF&lt;br /&gt;
 echo &amp;quot;deb https://download.mono-project.com/repo/ubuntu xenial main&amp;quot; | sudo tee /etc/apt/sources.list.d/mono-official.list&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install mono-complete&lt;br /&gt;
 mono --version&lt;br /&gt;
&lt;br /&gt;
* 不联网&lt;br /&gt;
&lt;br /&gt;
 拷贝6.12的安装包至没网的电脑。然后执行以下命令。解压完后将解压目录下对应的文件夹里的内 容拷贝至/usr/local目录下对应的文件夹内。&lt;br /&gt;
 安装前务必保证硬件空间大于2G&lt;br /&gt;
 mkdir mono&lt;br /&gt;
 tar xvf mono-6.12.0.182.tar.xz&lt;br /&gt;
 cd mono-6.12.0.182&lt;br /&gt;
 ./configure -prefix=/home/local    //如果没有local mkdir /home/local&lt;br /&gt;
 make -j4&lt;br /&gt;
 make install&lt;br /&gt;
2. 配置. Net&lt;br /&gt;
根据. Net官网要求和系统版本配置dotnet环境，要求dotnet版本=6&lt;br /&gt;
在 Linux 上手动安装 .NET - .NET  | Microsoft Docs&lt;br /&gt;
&lt;br /&gt;
* 联网&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get update; \&lt;br /&gt;
 sudo apt-get install -y apt-transport-https &amp;amp;&amp;amp; \&lt;br /&gt;
 sudo apt-get update &amp;amp;&amp;amp; \&lt;br /&gt;
 sudo apt-get install -y dotnet-sdk-6.0&lt;br /&gt;
&lt;br /&gt;
* 不联网&lt;br /&gt;
&lt;br /&gt;
 Download .NET 6.0 (Linux, macOS, and Windows) (microsoft.com) 在有网的电脑上下载对应架 构的二进制文件压缩包，拷贝至没网的电脑。然后&lt;br /&gt;
 export DOTNET_ROOT=~/.dotnet&lt;br /&gt;
 mkdir -p &amp;quot;$DOTNET_ROOT&amp;quot; &amp;amp;&amp;amp; tar zxf dotnet-sdk-6.0.100-linux-x64.tar.gz -C &amp;quot;$DOTNET_ROOT&amp;quot;&lt;br /&gt;
 export PATH=$PATH:$DOTNET_ROOT&lt;br /&gt;
 在/home/usename/MDCS/Detour路径下执行以下命令&lt;br /&gt;
&lt;br /&gt;
前面的 export 命令只会使 .NET CLI 命令对运行它的终端会话可用。&lt;br /&gt;
你可以编辑 shell 配置文件，永久地添加这些命令。   Linux 提供了许多不同的 shell，每个都有不同 的配置文件。   例如：&lt;br /&gt;
  Bash Shell ：~/.bash_profile、~/.bashrc&lt;br /&gt;
  Korn Shell ：~/.kshrc 或 .profile&lt;br /&gt;
  Z Shell ：~/.zshrc 或 .zprofile&lt;br /&gt;
为 shell 编辑相应的源文件，并将  :$~/.dotnet  添加到现有  PATH  语句的末尾。   如果不包含 	PATH 语句，则使用  export PATH=$PATH:$~/.dotnet 添加新行。&lt;br /&gt;
另外，将 export DOTNET_ROOT=$~/.dotnet 添加至文件的末尾。&lt;br /&gt;
&lt;br /&gt;
如果打不开Detour可以看下报错 ，可能出现的是，这种情况是libOpenCvSharpExtern.so文件损坏，可以ldd libOpenCvSharpExtern.so看看是否损坏，需要更新或者需要下载对应cpu版本的libOpenCvSharpExtern。&lt;br /&gt;
&lt;br /&gt;
[[文件:Li2.png|559x559像素]]&lt;br /&gt;
&lt;br /&gt;
MDCS 配置                                                                       &lt;br /&gt;
&lt;br /&gt;
路径配置&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了确保以下所有的配置和操作在任意linux系统中都适配，请按照以下要求构建文件夹保存 MDCS文件。&lt;br /&gt;
在任意位置创建MDCS文件夹，文件夹下创建Medulla、Clumsy文件夹，每个文件夹下分别存放 对应软件的相关文件。  MDCS文件夹下创建DetouLite文件夹，  DetourLite文件下再创建            DetourLite文件夹用以存放相关软件，同时创建lib文件夹用以存放&lt;br /&gt;
libOpenCvSharpExtern.so。&lt;br /&gt;
以下操作以文件夹创建在home/username为例，若创建在其他路径请自行修改对应路径。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Medulla配置&lt;br /&gt;
1. 首先Medulla文件夹里至少要有Medulla.exe和plugins文件夹，  plugins文件夹里包含 CartActivator.dll和LidarController.dll等dll文件。&lt;br /&gt;
2. 将生成编译的Medulla适配程序(例xxx_m.dll)放入同目录下的plugins文件夹，如果适配程 序还引用了其它的库，也一并放入plugins文件夹(例如雷达、  USB摄像头等)&lt;br /&gt;
3. 在medulla目录下新建startup.iocmd文件，拷入以下内容&lt;br /&gt;
&lt;br /&gt;
loader = io load plugins/CartActivator.dll&lt;br /&gt;
cart = loader load plugins/xxx.dll&lt;br /&gt;
lidar = io load plugins/LidarController.dll&lt;br /&gt;
frontlidar = lidar init SimulateLidar&lt;br /&gt;
frontlidar3d = lidar init SimulateLidar3D&lt;br /&gt;
4. 运行Medulla.exe，如果打不开出现闪退，可能的原因是MSVC运行库未安装，  官方下载地 址。&lt;br /&gt;
2. Detour配置&lt;br /&gt;
1. 打开Detour之前要先打开Medulla&lt;br /&gt;
2. 首先DetourLite/DetourLite文件夹里至少要有DetourLite.dll ，  DetourLite/lib文件夹下要有 libOpenCvSharpExtern.so ，没有so文件可能会闪退。&lt;br /&gt;
3. Clumsy配置&lt;br /&gt;
&lt;br /&gt;
1. 打开Clumsy之前要先打开Medulla、  Detour。&lt;br /&gt;
&lt;br /&gt;
MDCS操作说明                                                                 &lt;br /&gt;
&lt;br /&gt;
Medulla&lt;br /&gt;
1. 进入ssh，获取root权&lt;br /&gt;
&lt;br /&gt;
2. mono启动Medulla&lt;br /&gt;
&lt;br /&gt;
[[文件:Li3.png]]&lt;br /&gt;
&lt;br /&gt;
4. 打开Edge浏览器，输入http://IP:8007/simple.html进入medulla web 界面。(请确保使用Edge打 开页面)&lt;br /&gt;
	( IP地址查找命令：  ifconfig 或 hostname - I)&lt;br /&gt;
&lt;br /&gt;
[[文件:Li4.png]]&lt;br /&gt;
&lt;br /&gt;
5. Web界面信息&lt;br /&gt;
&lt;br /&gt;
[[文件:Li5.png]]&lt;br /&gt;
&lt;br /&gt;
单击查看点云后会进入点云显示界面，可以用滚轮调整大小，或是按住鼠标中键拖动。&lt;br /&gt;
&lt;br /&gt;
[[文件:Li6.png]]&lt;br /&gt;
&lt;br /&gt;
1. 进入ssh，获取root权限，进入 cd MDCS/DetourLite目录&lt;br /&gt;
&lt;br /&gt;
[[文件:Li7.png]]&lt;br /&gt;
&lt;br /&gt;
2. 打开detour软件，输入~/.dotnet/dotnet DetourLite.dll&lt;br /&gt;
&lt;br /&gt;
[[文件:Li8.png]]&lt;br /&gt;
&lt;br /&gt;
3. 打开Detour软件(自己或服务器电脑桌面上或者MDCS文件夹里)，选择概览-使用远程算法核-远程 设备，输入IP 点击连接&lt;br /&gt;
&lt;br /&gt;
[[文件:Li9.png]]&lt;br /&gt;
&lt;br /&gt;
4. 如果地图已经建好，请选择 单线激光SlAM-选择图层-下载远程地图即可&lt;br /&gt;
&lt;br /&gt;
[[文件:Li10.png]]&lt;br /&gt;
&lt;br /&gt;
5. 如果未建图，选择建图模式-遥控小车进行运行业务路线完成后，锁定图层-上传本机图层到远程图 层即可&lt;br /&gt;
&lt;br /&gt;
[[文件:Li11.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Clumsy&lt;br /&gt;
1. 进入ssh,获取root权限，进入小车Clumsy目录 cd MDCS/Clumsy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
[[文件:Li12.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. 打开Clumsy 输入 mono Clumsy.exe -no_ui&lt;br /&gt;
&lt;br /&gt;
4. 打开浏览器，输入http://IP:8008/simple.html 进入clusmy web界面&lt;br /&gt;
	( IP同查找见Medulla第四条)&lt;br /&gt;
&lt;br /&gt;
[[文件:Li14.png]]&lt;br /&gt;
&lt;br /&gt;
此处，运动参数和小车状态的具体条目可将鼠标移至每个条目上，会自动显示参数解释&lt;br /&gt;
&lt;br /&gt;
[[文件:Li15.png]]&lt;br /&gt;
&lt;br /&gt;
左侧的按钮单击即可执行对应的功能。其中，单击遥控器按钮后会出现遥控器界面&lt;br /&gt;
&lt;br /&gt;
[[文件:Li16.png]]&lt;br /&gt;
&lt;br /&gt;
此处的遥控器是一个示例，不同项目的遥控器不同，可以在对应的remoteconfig.json中修改和绑定。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Simple&lt;br /&gt;
此处展示在同一局域网下的windows系统电脑中使用simple。&lt;br /&gt;
以上3个软件都成功开启后，我们打开simple调度软件&lt;br /&gt;
1. 打开SimpleComposer&lt;br /&gt;
&lt;br /&gt;
[[文件:Li17.png]]&lt;br /&gt;
&lt;br /&gt;
2. 添加小车，双击修改小车IP以及基础速度&lt;br /&gt;
&lt;br /&gt;
[[文件:Li18.png]]&lt;br /&gt;
&lt;br /&gt;
3. 选中小车，点击定位即可看到小车&lt;br /&gt;
&lt;br /&gt;
[[文件:Li19.png]]&lt;br /&gt;
&lt;br /&gt;
4. 绘制路径以及其他请参考《MDCS建图和路线绘制》&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q&amp;amp;A                                                                             &lt;br /&gt;
1. Q：为什么mono和dotnet运行软件会出错&lt;br /&gt;
A：请确保mono版本&amp;gt;=6.12 ，   dotnet版本==5&lt;br /&gt;
2. Q：出现以下错误是什么原因？&lt;br /&gt;
&lt;br /&gt;
[[文件:Li20.png]]&lt;br /&gt;
&lt;br /&gt;
A：请和对接人员确认是否把以上dll拷到RosLIdar.dll目录下了。&lt;br /&gt;
3. Q：如果出现Error: Adress Already in use这个报错，无法打开网页怎么办？&lt;br /&gt;
A：检查有没有监听8007口的mono进程。这个进程不会在 ps -a 的时候显示，但是会在后台一直 监听导致端口占用。可以用 netstat -tunlp | grep 8007 来检查一下，有的话直接把进程杀了就行 了。&lt;br /&gt;
4. Q：如果出现以下报错怎么处理？&lt;br /&gt;
&lt;br /&gt;
[[文件:Li21.png]]&lt;br /&gt;
&lt;br /&gt;
A：这个报错是缺libOpenCvSharpExtern.so ，和对接人员确认是否已经拷过来了。没有的话拷到 DetourLite.dll相同目录下，执行 ldd命令，然后执行 export LD_LIBRARY_PATH=./ 即可。&lt;br /&gt;
5. Q：如何读取bag文件？&lt;br /&gt;
&lt;br /&gt;
A：首先确认已经安装好roscore和rosbridge环境。新开终端执行roslaunch rosbridge_server  rosbridge_websocket.launch。新开一个终端执行 rosbag play filename.bag --topic &lt;br /&gt;
/scan_orig播放medulla中需要接收的topic，如此topic名字是scan_orig&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E5%85%A8%E6%81%AF%E5%BA%A7%E8%88%B1&amp;diff=914</id>
		<title>全息座舱</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E5%85%A8%E6%81%AF%E5%BA%A7%E8%88%B1&amp;diff=914"/>
		<updated>2025-05-17T17:07:38Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;CycleGUI的典型应用。使用高帧率相机捕捉人脸位置并精确提取瞳孔位置，渲染双眼各自图片，使用光栅屏幕进行交织成像，最后使用负折射率板将将屏幕画面成像于空中。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
眼球追踪全息屏幕的延迟构成：&lt;br /&gt;
&lt;br /&gt;
# 摄像头快门延迟=8ms ...8ms&lt;br /&gt;
# 摄像头画面传输延迟=6ms ...14ms&lt;br /&gt;
# （到达电脑时约+1ms），进行人眼位置提取、视线提取等操作。使用显卡加速，~10ms（Laptop 3070@1.4G） ...24ms&lt;br /&gt;
# 唤醒CycleGUI，渲染，~1ms  ...25ms&lt;br /&gt;
# Present延迟（DXGI的Independent Hardware Flip）加显示器刷新一帧（和刷新率有关，目前能买到的大尺寸高分辨率光栅屏一般为60hz）的延迟，~8ms ...33ms 注：这个延迟一般也叫T1延迟&lt;br /&gt;
# 显示器像素反应延迟（T2延迟），这个比较复杂。测试使用的【珠海臻像27寸5K全息屏】延迟为10ms以内。 ...43ms&lt;br /&gt;
效果上基本流畅，略有迟钝。后续升级应该可以大幅度消减1、2、3项目的延迟，压缩到10ms以内；此外使用8K光栅屏可以降低到10ms以内，即整体延迟控制在20ms以内。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
全息屏幕调试要点（本质上类似于游戏电竞调试延迟）：&lt;br /&gt;
&lt;br /&gt;
# libVRender.dll同目录下应放一个cyclegui_conf.txt，写入swapinterval=-1。这会启用gsync模式。&lt;br /&gt;
# 使用Nvidia显卡时，在控制面板找Vulkan/OpenGL present method，设置为prefer layered on DXGI swapchain，这使得渲染内容直接出屏。&lt;br /&gt;
# 可使用PresentMon检查总延迟，总延迟应该在一个刷新周期以内（如60Hz屏幕必须在16.666ms以内）。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E5%85%A8%E6%81%AF%E5%BA%A7%E8%88%B1&amp;diff=913</id>
		<title>全息座舱</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E5%85%A8%E6%81%AF%E5%BA%A7%E8%88%B1&amp;diff=913"/>
		<updated>2025-05-17T17:04:04Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​创建页面，内容为“CycleGUI的典型应用。使用高帧率相机捕捉人脸位置并精确提取瞳孔位置，渲染双眼各自图片，使用光栅屏幕进行交织成像，最后使用负折射率板将将屏幕画面成像于空中。   眼球追踪全息屏幕的延迟构成：  # 摄像头快门延迟=8ms ...8ms # 摄像头画面传输延迟=6ms ...14ms # （到达电脑时约+1ms），进行人眼位置提取、视线提取等操作。使用显卡加速，~10ms（Lapt…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;CycleGUI的典型应用。使用高帧率相机捕捉人脸位置并精确提取瞳孔位置，渲染双眼各自图片，使用光栅屏幕进行交织成像，最后使用负折射率板将将屏幕画面成像于空中。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
眼球追踪全息屏幕的延迟构成：&lt;br /&gt;
&lt;br /&gt;
# 摄像头快门延迟=8ms ...8ms&lt;br /&gt;
# 摄像头画面传输延迟=6ms ...14ms&lt;br /&gt;
# （到达电脑时约+1ms），进行人眼位置提取、视线提取等操作。使用显卡加速，~10ms（Laptop 3070@1.4G） ...24ms&lt;br /&gt;
# 唤醒CycleGUI，渲染，~1ms  ...25ms&lt;br /&gt;
# Present延迟（DXGI的Independent Hardware Flip）加显示器刷新一帧（和刷新率有关，目前能买到的大尺寸高分辨率光栅屏一般为60hz）的延迟，~8ms ...33ms 注：这个延迟一般也叫T1延迟&lt;br /&gt;
# 显示器像素反应延迟（T2延迟），这个比较复杂。测试使用的【珠海臻像27寸5K全息屏】延迟为5ms左右。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
全息屏幕调试要点（本质上类似于游戏电竞调试延迟）：&lt;br /&gt;
&lt;br /&gt;
# libVRender.dll同目录下应放一个cyclegui_conf.txt，写入swapinterval=-1。这会启用gsync模式。&lt;br /&gt;
# 使用Nvidia显卡时，在控制面板找Vulkan/OpenGL present method，设置为prefer layered on DXGI swapchain，这使得渲染内容直接出屏。&lt;br /&gt;
# 可使用PresentMon检查总延迟，总延迟应该在一个刷新周期以内（如60Hz屏幕必须在16.666ms以内）。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=912</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=912"/>
		<updated>2025-05-17T16:31:11Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​/* 使用手册 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:1--&amp;gt;&lt;br /&gt;
MDCS是上海懒书智能科技开发的机器人软件构建框架，包括以下组件。&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
* Medulla：高效的硬件通信、控制和抽象平台。&lt;br /&gt;
* Detour：定位系统，内置激光雷达和视觉SLAM等。&lt;br /&gt;
* Clumsy：机器人运动指令平台，内置AGV/AMR的典型运动能力。&lt;br /&gt;
* Simple：机器人集群管理系统，核心为交通控制和寻路。&lt;br /&gt;
* CycleGUI：针对算法内核交互的回合式GUI框架，可在任何算法中随时提交协程由CycleGUI托管界面，协程仅在需要刷新界面时调用，效率很高。&lt;br /&gt;
* DIVER(Dotnet Integrated Vehicle Runtime): 是一个专门用于载具控制系统的.NET运行环境，可将C#程序开发的Medulla下位硬件控制程序无痛地运行在MCU中。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
更详细地综述见：[[特殊:我的语言/MDCS-Walkthrough|MDCS-Walkthrough]]  [[特殊:我的语言/MDCS概述|&amp;lt;s&amp;gt;MDCS概述&amp;lt;/s&amp;gt;]]&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
== 基本介绍 ==&lt;br /&gt;
&lt;br /&gt;
'''定位系统'''：AGV的定位是由独立模块《Detour》完成。Detour支持激光雷达和视觉的各类SLAM算法，包括[[特殊:我的语言/具有高鲁棒性的激光SLAM算法|具有高鲁棒性的2D激光SLAM算法]]、[[特殊:我的语言/地纹SLAM|地纹SLAM]]、[[特殊:我的语言/天花板SLAM|天花板SLAM]]、[[特殊:我的语言/二维码识别导航|二维码导航]]等，支持[[特殊:我的语言/多定位源的自动综合|多定位源的自动综合]]。Detour可以使用Medulla提供的数据来源、也可以自行获取。整套MDCS实施时一般使用Medulla提供的数据来源。&lt;br /&gt;
&lt;br /&gt;
'''AGV车载系统'''：由Medulla（硬件抽象逻辑）、Clumsy（车体运动抽象）组成并对功能定义；二者原理见[[特殊:我的语言/车体抽象原理|车体抽象原理]]。Medulla+Clumsy可实现各类车体动作，最简单诸如[[特殊:我的语言/巡线行走|巡线行走]]、[[特殊:我的语言/绕障行走|绕障行走]]等，复杂一些的例子如[[特殊:我的语言/自动识别工位并取放货|自动识别工位并取放货]]、[[特殊:我的语言/自动识别托盘取放货|自动识别托盘取放货]]、[[特殊:我的语言/识别料框并堆垛拆垛|识别料框并堆垛拆垛]]、[[特殊:我的语言/联动天眼系统进行装卸车|联动天眼系统进行装卸车]]等。车载软件定义了AGV的能力集以及测试方法，并可由调度软件做动作组合从而完成整套任务。&lt;br /&gt;
&lt;br /&gt;
'''车队调度'''：交管、寻路、包络、可达性分析等内核算法由SimpleCore提供，其原理参见[[特殊:我的语言/调度内核运行原理|内核运行原理]]，SimpleCore提供编程接口使得用户可对具体车型或业务场景编程声明寻路规则、运行脚本、包络、可达性需求等。对调度的运行原理参见：[[特殊:我的语言/AGV任务运行逻辑|AGV任务运行逻辑]] 。MDCS提供一个简单的壳层称为SimpleComposer，其提供UI和基础的车辆通信定义，在此之上还支持插件进一步定义车辆具体细节和业务逻辑。&lt;br /&gt;
&lt;br /&gt;
'''周围系统'''：CycleGUI可用于3D显示和远程界面显示，可快速开发诸如3D标注程序、[[全息座舱]]等应用；DIVER可用于基于MCU低成本快速地开发四向穿梭车、磁导航车、编舞机器人等。V-helper是一套ＭＤＣ（车载程序）的远程监控和运维程序，可监控ＭＤＣ程序的堆栈、检查DObject/Hedingben变量内容等。&lt;br /&gt;
&lt;br /&gt;
== 快速开始 ==&lt;br /&gt;
&lt;br /&gt;
'''定位'''&lt;br /&gt;
&lt;br /&gt;
如果您有Detour使用经验，请阅读 [[特殊:我的语言/下载并部署Detour|下载并部署Detour]] 快速开始。如果您首次使用Detour，请阅读详细教程：首先是 [[特殊:我的语言/安装Detour|安装Detour]] ，然后 [[标定激光雷达外参]] ，然后 [[激光SLAM建图]] ，用于优化地图的 [[激光地图编辑指南]] ，最后 使用激光SLAM功能 。&lt;br /&gt;
&lt;br /&gt;
在激光不友好的场景，我们可以使用地纹SLAM。请阅读[[地纹SLAM技术概述]]来了解这个特性。&lt;br /&gt;
&lt;br /&gt;
'''整车适配'''&lt;br /&gt;
&lt;br /&gt;
对于需要做整车适配的读者，请阅读以下文章。&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/MDCS引擎适配机器人入门教学|MDCS引擎适配机器人入门教学]]、[[特殊:我的语言/叉车适配案例|叉车(牵引车)适配案例]]、[[特殊:我的语言/潜伏顶升车(KIVA类小车)适配案例|潜伏顶升车(KIVA类小车)适配案例]]、[[特殊:我的语言/全向车适配案例|全向车适配案例]]、[[特殊:我的语言/牵引车适配案例|双阿克曼车型适配案例]]&lt;br /&gt;
&lt;br /&gt;
传感器适配&lt;br /&gt;
&lt;br /&gt;
[[2D激光雷达适配]]、[[3D相机适配]]（全局曝光、alt/azi固定的、像素化的3D雷达也算此类）、[[3D激光雷达适配]]、&lt;br /&gt;
&lt;br /&gt;
== 使用手册 ==&lt;br /&gt;
&lt;br /&gt;
=== 通识和入门教学 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/MDCS-Walkthrough|MDCS-Walkthrough]] &lt;br /&gt;
&lt;br /&gt;
[[Detour简介]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS简介|使用手册 - MDCS简介]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/激光SLAM的能力边界|激光SLAM的能力边界]]&lt;br /&gt;
&lt;br /&gt;
=== 定位导航相关手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 定位导航|使用手册 - 定位导航]]&lt;br /&gt;
&lt;br /&gt;
[[激光SLAM建图|使用手册 - 激光SLAM建图]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 激光SLAM＋反光板建图手册|使用手册 - 激光SLAM+反光板建图手册]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 分析定位问题|使用手册 - 分析定位问题]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 激光＋纹理导航|使用手册 - 激光+纹理导航]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Detour车体编辑器使用教学|使用手册 - Detour车体编辑器使用教学]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 双雷达标定手册|使用手册 - 双雷达标定手册]] / [[特殊:我的语言/标定双激光雷达外参|标定双激光雷达外参]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 在地纹导航中使用二维码快速找回定位|使用手册 - 在地纹导航中使用二维码快速找回定位]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 同时使用激光、地纹、二维码、轮编里程计和IMU进行鲁棒定位|使用手册 - 同时使用激光、地纹、二维码、轮编里程计和IMU进行鲁棒定位]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/标定激光雷达外参|标定激光雷达外参]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - 如何在核显工控机上运行地纹导航]]&lt;br /&gt;
&lt;br /&gt;
[[激光雷达选型测试报告]]&lt;br /&gt;
&lt;br /&gt;
[[输入GPS外部定位]]&lt;br /&gt;
&lt;br /&gt;
=== 运动控制使用手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用叉车自动取托盘功能|使用叉车自动取托盘功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用自动对准料架功能|使用自动对准料架功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用叉车料架堆叠功能|使用叉车料架堆叠功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/色带和磁条导航|色带和磁条导航]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/纯二维码导航|纯二维码导航]]&lt;br /&gt;
&lt;br /&gt;
=== 调度相关手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 车队管控|使用手册 - 车队管控]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册-routing字段：设置车辆必经点（必不经点）逻辑|使用手册 - routing字段：设置车辆必经点（必不经点）逻辑]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:从使用到开发]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:coder（路径编译器）机制详解]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:包络如何定义]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS软件部署方法介绍|使用手册 - MDCS软件部署方法介绍]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Simple软件文件管理标准化作业|使用手册 - Simple软件文件管理标准化作业]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS适配流程说明|使用手册 - MDCS适配流程说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS适配详细说明|使用手册 - MDCS适配详细说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Simple图层合并手册|使用手册 - Simple图层合并手册]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 寻路启发器功能|使用手册 - 寻路启发器功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 更多交管细节用法|使用手册 - 更多交管细节用法]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 劫持用法|使用手册 - 劫持用法]](用于中途更改路线)&lt;br /&gt;
&lt;br /&gt;
[[可达性状态编程|使用手册 - 可达性状态编程（用于如驶入式巷道叉车避免前车放货后影响后车运行等场景）]]&lt;br /&gt;
&lt;br /&gt;
=== 二次开发相关说明 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何适配新的雷达|如何适配新的雷达]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何使用CycleGUI快速开发UI界面|如何使用CycleGUI快速开发UI界面]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何使用LessokajiWeaver的多语言功能|如何使用LessokajiWeaver的多语言功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - 轨迹跟踪|开发手册 - 轨迹跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - 目标跟踪|开发手册 - 目标跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - SimpleComposer界面开发 - CAD工具|开发手册 - SimpleComposer界面开发 - CAD工具]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Medulla:相机使用方法 Camera Data Access Guide]]&lt;br /&gt;
&lt;br /&gt;
[[如何基于SimpleCore核心库进行调度系统开发]]&lt;br /&gt;
&lt;br /&gt;
=== 杂项 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何查看工控机性能以及功耗墙|如何查看工控机性能以及功耗墙]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 数据录制与回放手册|使用手册 - 数据录制与回放手册]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Linux MDCS部署配置和操作说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/FAQ|FAQ]]&lt;br /&gt;
&lt;br /&gt;
Cheat sheet&lt;br /&gt;
&lt;br /&gt;
[[Detour版本发布记录]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/待整理的杂项内容|待整理的杂项内容]]&lt;br /&gt;
&lt;br /&gt;
== 技术报告 ==&lt;br /&gt;
&lt;br /&gt;
* MDCS架构&lt;br /&gt;
** Medulla软件架构&lt;br /&gt;
** Detour软件架构&lt;br /&gt;
*** Detour激光SLAM算法详解&lt;br /&gt;
*** Detour地面纹理SLAM算法详解&lt;br /&gt;
** Simple软件架构&lt;br /&gt;
*** [[特殊:我的语言/调度内核运行原理|调度内核运行原理]]&lt;br /&gt;
**** 基于预先规划交管算法：[[特殊:我的语言/DPS调度算法详解|DPS调度算法详解]]&lt;br /&gt;
**** 流场规划&lt;br /&gt;
*** 基于网络流的业务规划器&lt;br /&gt;
* LessokajiWeaver编译后处理工具&lt;br /&gt;
* CycleGUI&lt;br /&gt;
&lt;br /&gt;
== 接口 ==&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Medulla-API|Medulla]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Detour-API|Detour]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Clumsy-API|Clumsy]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Simple-API|Simple]]&lt;br /&gt;
&lt;br /&gt;
== 术语和约定 ==&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/通用约定|MDCS开发通用约定]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/定位导航|定位导航]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Medulla]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Detour]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Clumsy]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Simple]]&lt;br /&gt;
&lt;br /&gt;
== 特殊技术方案 ==&lt;br /&gt;
&lt;br /&gt;
当前MDCS的特殊技术方案包括：[[特殊:我的语言/托盘识别|托盘识别]]、[[特殊:我的语言/双车/多车联动|双车/多车联动]]、[[特殊:我的语言/汽车面差检测|汽车面差检测]]、[[特殊:我的语言/天眼系统|天眼系统]]、[[特殊:我的语言/自动装卸车应用|自动装卸车应用]]、[[特殊:我的语言/复合卷料机械手叉车|复合卷料机械手叉车]]、[[特殊:我的语言/清洁机器人|清洁机器人]]、[[特殊:我的语言/设备跟随联动|设备跟随联动]]。其它技术方案还在进一步补充中。&lt;br /&gt;
[[文件:Drliuwechat.png|缩略图|100x100像素|微信联系方式]]&lt;br /&gt;
&lt;br /&gt;
== 链接 ==&lt;br /&gt;
&lt;br /&gt;
*[https://dl.lessokaji.com MDCS下载站]：MDCS的各类程序可在该站上下载&lt;br /&gt;
* [https://dev.lessokaji.com 技术讨论站]：包含FAQ、需求讨论、AGV项目实施经验等技术讨论&lt;br /&gt;
* [https://nuget.lessokaji.com MDCS专用Nuget源]：MDCS主要使用c#进行开发，该源包括主要会用的库&lt;br /&gt;
* [https://git.lessokaji.com MDCS代码库]：git源&lt;br /&gt;
* [https://auth.lessokaji.com MDCS授权站]：License授权、代码阅读和编译权限授权站&lt;br /&gt;
* 一些视频案例：链接：https://pan.baidu.com/s/1foIUJzCnpbEaNoy6ooVbJg 提取码：2of9&lt;br /&gt;
&lt;br /&gt;
__无目录__&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=911</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=911"/>
		<updated>2025-05-14T13:43:57Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:1--&amp;gt;&lt;br /&gt;
MDCS是上海懒书智能科技开发的机器人软件构建框架，包括以下组件。&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
* Medulla：高效的硬件通信、控制和抽象平台。&lt;br /&gt;
* Detour：定位系统，内置激光雷达和视觉SLAM等。&lt;br /&gt;
* Clumsy：机器人运动指令平台，内置AGV/AMR的典型运动能力。&lt;br /&gt;
* Simple：机器人集群管理系统，核心为交通控制和寻路。&lt;br /&gt;
* CycleGUI：针对算法内核交互的回合式GUI框架，可在任何算法中随时提交协程由CycleGUI托管界面，协程仅在需要刷新界面时调用，效率很高。&lt;br /&gt;
* DIVER(Dotnet Integrated Vehicle Runtime): 是一个专门用于载具控制系统的.NET运行环境，可将C#程序开发的Medulla下位硬件控制程序无痛地运行在MCU中。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
更详细地综述见：[[特殊:我的语言/MDCS-Walkthrough|MDCS-Walkthrough]]  [[特殊:我的语言/MDCS概述|&amp;lt;s&amp;gt;MDCS概述&amp;lt;/s&amp;gt;]]&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
== 基本介绍 ==&lt;br /&gt;
&lt;br /&gt;
'''定位系统'''：AGV的定位是由独立模块《Detour》完成。Detour支持激光雷达和视觉的各类SLAM算法，包括[[特殊:我的语言/具有高鲁棒性的激光SLAM算法|具有高鲁棒性的2D激光SLAM算法]]、[[特殊:我的语言/地纹SLAM|地纹SLAM]]、[[特殊:我的语言/天花板SLAM|天花板SLAM]]、[[特殊:我的语言/二维码识别导航|二维码导航]]等，支持[[特殊:我的语言/多定位源的自动综合|多定位源的自动综合]]。Detour可以使用Medulla提供的数据来源、也可以自行获取。整套MDCS实施时一般使用Medulla提供的数据来源。&lt;br /&gt;
&lt;br /&gt;
'''AGV车载系统'''：由Medulla（硬件抽象逻辑）、Clumsy（车体运动抽象）组成并对功能定义；二者原理见[[特殊:我的语言/车体抽象原理|车体抽象原理]]。Medulla+Clumsy可实现各类车体动作，最简单诸如[[特殊:我的语言/巡线行走|巡线行走]]、[[特殊:我的语言/绕障行走|绕障行走]]等，复杂一些的例子如[[特殊:我的语言/自动识别工位并取放货|自动识别工位并取放货]]、[[特殊:我的语言/自动识别托盘取放货|自动识别托盘取放货]]、[[特殊:我的语言/识别料框并堆垛拆垛|识别料框并堆垛拆垛]]、[[特殊:我的语言/联动天眼系统进行装卸车|联动天眼系统进行装卸车]]等。车载软件定义了AGV的能力集以及测试方法，并可由调度软件做动作组合从而完成整套任务。&lt;br /&gt;
&lt;br /&gt;
'''车队调度'''：交管、寻路、包络、可达性分析等内核算法由SimpleCore提供，其原理参见[[特殊:我的语言/调度内核运行原理|内核运行原理]]，SimpleCore提供编程接口使得用户可对具体车型或业务场景编程声明寻路规则、运行脚本、包络、可达性需求等。对调度的运行原理参见：[[特殊:我的语言/AGV任务运行逻辑|AGV任务运行逻辑]] 。MDCS提供一个简单的壳层称为SimpleComposer，其提供UI和基础的车辆通信定义，在此之上还支持插件进一步定义车辆具体细节和业务逻辑。&lt;br /&gt;
&lt;br /&gt;
== 快速开始 ==&lt;br /&gt;
&lt;br /&gt;
'''定位'''&lt;br /&gt;
&lt;br /&gt;
如果您有Detour使用经验，请阅读 [[特殊:我的语言/下载并部署Detour|下载并部署Detour]] 快速开始。如果您首次使用Detour，请阅读详细教程：首先是 [[特殊:我的语言/安装Detour|安装Detour]] ，然后 [[标定激光雷达外参]] ，然后 [[激光SLAM建图]] ，用于优化地图的 [[激光地图编辑指南]] ，最后 使用激光SLAM功能 。&lt;br /&gt;
&lt;br /&gt;
在激光不友好的场景，我们可以使用地纹SLAM。请阅读[[地纹SLAM技术概述]]来了解这个特性。&lt;br /&gt;
&lt;br /&gt;
'''整车适配'''&lt;br /&gt;
&lt;br /&gt;
对于需要做整车适配的读者，请阅读以下文章。&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/MDCS引擎适配机器人入门教学|MDCS引擎适配机器人入门教学]]、[[特殊:我的语言/叉车适配案例|叉车(牵引车)适配案例]]、[[特殊:我的语言/潜伏顶升车(KIVA类小车)适配案例|潜伏顶升车(KIVA类小车)适配案例]]、[[特殊:我的语言/全向车适配案例|全向车适配案例]]、[[特殊:我的语言/牵引车适配案例|双阿克曼车型适配案例]]&lt;br /&gt;
&lt;br /&gt;
传感器适配&lt;br /&gt;
&lt;br /&gt;
[[2D激光雷达适配]]、[[3D相机适配]]（全局曝光、alt/azi固定的、像素化的3D雷达也算此类）、[[3D激光雷达适配]]、&lt;br /&gt;
&lt;br /&gt;
== 使用手册 ==&lt;br /&gt;
&lt;br /&gt;
=== 通识和入门教学 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/MDCS-Walkthrough|MDCS-Walkthrough]] &lt;br /&gt;
&lt;br /&gt;
[[Detour简介]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS简介|使用手册 - MDCS简介]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/激光SLAM的能力边界|激光SLAM的能力边界]]&lt;br /&gt;
&lt;br /&gt;
=== 定位导航相关手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 定位导航|使用手册 - 定位导航]]&lt;br /&gt;
&lt;br /&gt;
[[激光SLAM建图|使用手册 - 激光SLAM建图]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 激光SLAM＋反光板建图手册|使用手册 - 激光SLAM+反光板建图手册]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 分析定位问题|使用手册 - 分析定位问题]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 激光＋纹理导航|使用手册 - 激光+纹理导航]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Detour车体编辑器使用教学|使用手册 - Detour车体编辑器使用教学]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 双雷达标定手册|使用手册 - 双雷达标定手册]] / [[特殊:我的语言/标定双激光雷达外参|标定双激光雷达外参]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 在地纹导航中使用二维码快速找回定位|使用手册 - 在地纹导航中使用二维码快速找回定位]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 同时使用激光、地纹、二维码、轮编里程计和IMU进行鲁棒定位|使用手册 - 同时使用激光、地纹、二维码、轮编里程计和IMU进行鲁棒定位]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/标定激光雷达外参|标定激光雷达外参]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - 如何在核显工控机上运行地纹导航]]&lt;br /&gt;
&lt;br /&gt;
[[激光雷达选型测试报告]]&lt;br /&gt;
&lt;br /&gt;
[[输入GPS外部定位]]&lt;br /&gt;
&lt;br /&gt;
=== 运动控制使用手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用叉车自动取托盘功能|使用叉车自动取托盘功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用自动对准料架功能|使用自动对准料架功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用叉车料架堆叠功能|使用叉车料架堆叠功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/色带和磁条导航|色带和磁条导航]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/纯二维码导航|纯二维码导航]]&lt;br /&gt;
&lt;br /&gt;
=== 调度相关手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 车队管控|使用手册 - 车队管控]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册-routing字段：设置车辆必经点（必不经点）逻辑|使用手册 - routing字段：设置车辆必经点（必不经点）逻辑]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:从使用到开发]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:coder（路径编译器）机制详解]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:包络如何定义]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS软件部署方法介绍|使用手册 - MDCS软件部署方法介绍]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Simple软件文件管理标准化作业|使用手册 - Simple软件文件管理标准化作业]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS适配流程说明|使用手册 - MDCS适配流程说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS适配详细说明|使用手册 - MDCS适配详细说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Simple图层合并手册|使用手册 - Simple图层合并手册]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 寻路启发器功能|使用手册 - 寻路启发器功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 更多交管细节用法|使用手册 - 更多交管细节用法]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 劫持用法|使用手册 - 劫持用法]](用于中途更改路线)&lt;br /&gt;
&lt;br /&gt;
[[可达性状态编程|使用手册 - 可达性状态编程（用于如驶入式巷道叉车避免前车放货后影响后车运行等场景）]]&lt;br /&gt;
&lt;br /&gt;
=== 二次开发相关说明 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何适配新的雷达|如何适配新的雷达]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何使用CycleGUI快速开发UI界面|如何使用CycleGUI快速开发UI界面]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何使用LessokajiWeaver的多语言功能|如何使用LessokajiWeaver的多语言功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - 轨迹跟踪|开发手册 - 轨迹跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - 目标跟踪|开发手册 - 目标跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - SimpleComposer界面开发 - CAD工具|开发手册 - SimpleComposer界面开发 - CAD工具]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Medulla:相机使用方法 Camera Data Access Guide]]&lt;br /&gt;
&lt;br /&gt;
[[如何基于SimpleCore核心库进行调度系统开发]]&lt;br /&gt;
&lt;br /&gt;
=== 杂项 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何查看工控机性能以及功耗墙|如何查看工控机性能以及功耗墙]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 数据录制与回放手册|使用手册 - 数据录制与回放手册]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Linux MDCS部署配置和操作说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/FAQ|FAQ]]&lt;br /&gt;
&lt;br /&gt;
Cheat sheet&lt;br /&gt;
&lt;br /&gt;
[[Detour版本发布记录]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/待整理的杂项内容|待整理的杂项内容]]&lt;br /&gt;
&lt;br /&gt;
== 技术报告 ==&lt;br /&gt;
&lt;br /&gt;
* MDCS架构&lt;br /&gt;
** Medulla软件架构&lt;br /&gt;
** Detour软件架构&lt;br /&gt;
*** Detour激光SLAM算法详解&lt;br /&gt;
*** Detour地面纹理SLAM算法详解&lt;br /&gt;
** Simple软件架构&lt;br /&gt;
*** [[特殊:我的语言/调度内核运行原理|调度内核运行原理]]&lt;br /&gt;
**** 基于预先规划交管算法：[[特殊:我的语言/DPS调度算法详解|DPS调度算法详解]]&lt;br /&gt;
**** 流场规划&lt;br /&gt;
*** 基于网络流的业务规划器&lt;br /&gt;
* LessokajiWeaver编译后处理工具&lt;br /&gt;
* CycleGUI&lt;br /&gt;
&lt;br /&gt;
== 接口 ==&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Medulla-API|Medulla]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Detour-API|Detour]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Clumsy-API|Clumsy]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Simple-API|Simple]]&lt;br /&gt;
&lt;br /&gt;
== 术语和约定 ==&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/通用约定|MDCS开发通用约定]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/定位导航|定位导航]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Medulla]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Detour]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Clumsy]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Simple]]&lt;br /&gt;
&lt;br /&gt;
== 特殊技术方案 ==&lt;br /&gt;
&lt;br /&gt;
当前MDCS的特殊技术方案包括：[[特殊:我的语言/托盘识别|托盘识别]]、[[特殊:我的语言/双车/多车联动|双车/多车联动]]、[[特殊:我的语言/汽车面差检测|汽车面差检测]]、[[特殊:我的语言/天眼系统|天眼系统]]、[[特殊:我的语言/自动装卸车应用|自动装卸车应用]]、[[特殊:我的语言/复合卷料机械手叉车|复合卷料机械手叉车]]、[[特殊:我的语言/清洁机器人|清洁机器人]]、[[特殊:我的语言/设备跟随联动|设备跟随联动]]。其它技术方案还在进一步补充中。&lt;br /&gt;
[[文件:Drliuwechat.png|缩略图|100x100像素|微信联系方式]]&lt;br /&gt;
&lt;br /&gt;
== 链接 ==&lt;br /&gt;
&lt;br /&gt;
*[https://dl.lessokaji.com MDCS下载站]：MDCS的各类程序可在该站上下载&lt;br /&gt;
* [https://dev.lessokaji.com 技术讨论站]：包含FAQ、需求讨论、AGV项目实施经验等技术讨论&lt;br /&gt;
* [https://nuget.lessokaji.com MDCS专用Nuget源]：MDCS主要使用c#进行开发，该源包括主要会用的库&lt;br /&gt;
* [https://git.lessokaji.com MDCS代码库]：git源&lt;br /&gt;
* [https://auth.lessokaji.com MDCS授权站]：License授权、代码阅读和编译权限授权站&lt;br /&gt;
* 一些视频案例：链接：https://pan.baidu.com/s/1foIUJzCnpbEaNoy6ooVbJg 提取码：2of9&lt;br /&gt;
&lt;br /&gt;
__无目录__&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=910</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=910"/>
		<updated>2025-05-14T13:41:44Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​/* 链接 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
[[文件:MDCS-2023.png|缩略图|159x159像素|MDCS logo 2023]]&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:1--&amp;gt;&lt;br /&gt;
MDCS是上海懒书智能科技开发的机器人软件构建框架，包括以下组件。&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
* Medulla：高效的硬件通信、控制和抽象平台。&lt;br /&gt;
* Detour：定位系统，内置激光雷达和视觉SLAM等。&lt;br /&gt;
* Clumsy：机器人运动指令平台，内置AGV/AMR的典型运动能力。&lt;br /&gt;
* Simple：机器人集群管理系统，核心为交通控制和寻路。&lt;br /&gt;
* CycleGUI：针对算法内核交互的回合式GUI框架，可在任何算法中随时提交协程由CycleGUI托管界面，协程仅在需要刷新界面时调用，效率很高。&lt;br /&gt;
* DIVER(Dotnet Integrated Vehicle Runtime): 是一个专门用于载具控制系统的.NET运行环境，可将C#程序开发的Medulla下位硬件控制程序无痛地运行在MCU中。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
更详细地综述见：[[特殊:我的语言/MDCS-Walkthrough|MDCS-Walkthrough]]  [[特殊:我的语言/MDCS概述|&amp;lt;s&amp;gt;MDCS概述&amp;lt;/s&amp;gt;]]&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
== 基本介绍 ==&lt;br /&gt;
&lt;br /&gt;
'''定位系统'''：AGV的定位是由独立模块《Detour》完成。Detour支持激光雷达和视觉的各类SLAM算法，包括[[特殊:我的语言/具有高鲁棒性的激光SLAM算法|具有高鲁棒性的2D激光SLAM算法]]、[[特殊:我的语言/地纹SLAM|地纹SLAM]]、[[特殊:我的语言/天花板SLAM|天花板SLAM]]、[[特殊:我的语言/二维码识别导航|二维码导航]]等，支持[[特殊:我的语言/多定位源的自动综合|多定位源的自动综合]]。Detour可以使用Medulla提供的数据来源、也可以自行获取。整套MDCS实施时一般使用Medulla提供的数据来源。&lt;br /&gt;
&lt;br /&gt;
'''AGV车载系统'''：由Medulla（硬件抽象逻辑）、Clumsy（车体运动抽象）组成并对功能定义；二者原理见[[特殊:我的语言/车体抽象原理|车体抽象原理]]。Medulla+Clumsy可实现各类车体动作，最简单诸如[[特殊:我的语言/巡线行走|巡线行走]]、[[特殊:我的语言/绕障行走|绕障行走]]等，复杂一些的例子如[[特殊:我的语言/自动识别工位并取放货|自动识别工位并取放货]]、[[特殊:我的语言/自动识别托盘取放货|自动识别托盘取放货]]、[[特殊:我的语言/识别料框并堆垛拆垛|识别料框并堆垛拆垛]]、[[特殊:我的语言/联动天眼系统进行装卸车|联动天眼系统进行装卸车]]等。车载软件定义了AGV的能力集以及测试方法，并可由调度软件做动作组合从而完成整套任务。&lt;br /&gt;
&lt;br /&gt;
'''车队调度'''：交管、寻路、包络、可达性分析等内核算法由SimpleCore提供，其原理参见[[特殊:我的语言/调度内核运行原理|内核运行原理]]，SimpleCore提供编程接口使得用户可对具体车型或业务场景编程声明寻路规则、运行脚本、包络、可达性需求等。对调度的运行原理参见：[[特殊:我的语言/AGV任务运行逻辑|AGV任务运行逻辑]] 。MDCS提供一个简单的壳层称为SimpleComposer，其提供UI和基础的车辆通信定义，在此之上还支持插件进一步定义车辆具体细节和业务逻辑。&lt;br /&gt;
&lt;br /&gt;
== 快速开始 ==&lt;br /&gt;
&lt;br /&gt;
'''定位'''&lt;br /&gt;
&lt;br /&gt;
如果您有Detour使用经验，请阅读 [[特殊:我的语言/下载并部署Detour|下载并部署Detour]] 快速开始。如果您首次使用Detour，请阅读详细教程：首先是 [[特殊:我的语言/安装Detour|安装Detour]] ，然后 [[标定激光雷达外参]] ，然后 [[激光SLAM建图]] ，用于优化地图的 [[激光地图编辑指南]] ，最后 使用激光SLAM功能 。&lt;br /&gt;
&lt;br /&gt;
在激光不友好的场景，我们可以使用地纹SLAM。请阅读[[地纹SLAM技术概述]]来了解这个特性。&lt;br /&gt;
&lt;br /&gt;
'''整车适配'''&lt;br /&gt;
&lt;br /&gt;
对于需要做整车适配的读者，请阅读以下文章。&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/MDCS引擎适配机器人入门教学|MDCS引擎适配机器人入门教学]]、[[特殊:我的语言/叉车适配案例|叉车(牵引车)适配案例]]、[[特殊:我的语言/潜伏顶升车(KIVA类小车)适配案例|潜伏顶升车(KIVA类小车)适配案例]]、[[特殊:我的语言/全向车适配案例|全向车适配案例]]、[[特殊:我的语言/牵引车适配案例|双阿克曼车型适配案例]]&lt;br /&gt;
&lt;br /&gt;
传感器适配&lt;br /&gt;
&lt;br /&gt;
[[2D激光雷达适配]]、[[3D相机适配]]（全局曝光、alt/azi固定的、像素化的3D雷达也算此类）、[[3D激光雷达适配]]、&lt;br /&gt;
&lt;br /&gt;
== 使用手册 ==&lt;br /&gt;
&lt;br /&gt;
=== 通识和入门教学 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/MDCS-Walkthrough|MDCS-Walkthrough]] &lt;br /&gt;
&lt;br /&gt;
[[Detour简介]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS简介|使用手册 - MDCS简介]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/激光SLAM的能力边界|激光SLAM的能力边界]]&lt;br /&gt;
&lt;br /&gt;
=== 定位导航相关手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 定位导航|使用手册 - 定位导航]]&lt;br /&gt;
&lt;br /&gt;
[[激光SLAM建图|使用手册 - 激光SLAM建图]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 激光SLAM＋反光板建图手册|使用手册 - 激光SLAM+反光板建图手册]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 分析定位问题|使用手册 - 分析定位问题]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 激光＋纹理导航|使用手册 - 激光+纹理导航]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Detour车体编辑器使用教学|使用手册 - Detour车体编辑器使用教学]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 双雷达标定手册|使用手册 - 双雷达标定手册]] / [[特殊:我的语言/标定双激光雷达外参|标定双激光雷达外参]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 在地纹导航中使用二维码快速找回定位|使用手册 - 在地纹导航中使用二维码快速找回定位]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 同时使用激光、地纹、二维码、轮编里程计和IMU进行鲁棒定位|使用手册 - 同时使用激光、地纹、二维码、轮编里程计和IMU进行鲁棒定位]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/标定激光雷达外参|标定激光雷达外参]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - 如何在核显工控机上运行地纹导航]]&lt;br /&gt;
&lt;br /&gt;
[[激光雷达选型测试报告]]&lt;br /&gt;
&lt;br /&gt;
[[输入GPS外部定位]]&lt;br /&gt;
&lt;br /&gt;
=== 运动控制使用手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用叉车自动取托盘功能|使用叉车自动取托盘功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用自动对准料架功能|使用自动对准料架功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用叉车料架堆叠功能|使用叉车料架堆叠功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/色带和磁条导航|色带和磁条导航]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/纯二维码导航|纯二维码导航]]&lt;br /&gt;
&lt;br /&gt;
=== 调度相关手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 车队管控|使用手册 - 车队管控]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册-routing字段：设置车辆必经点（必不经点）逻辑|使用手册 - routing字段：设置车辆必经点（必不经点）逻辑]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:从使用到开发]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:coder（路径编译器）机制详解]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:包络如何定义]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS软件部署方法介绍|使用手册 - MDCS软件部署方法介绍]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Simple软件文件管理标准化作业|使用手册 - Simple软件文件管理标准化作业]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS适配流程说明|使用手册 - MDCS适配流程说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS适配详细说明|使用手册 - MDCS适配详细说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Simple图层合并手册|使用手册 - Simple图层合并手册]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 寻路启发器功能|使用手册 - 寻路启发器功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 更多交管细节用法|使用手册 - 更多交管细节用法]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 劫持用法|使用手册 - 劫持用法]](用于中途更改路线)&lt;br /&gt;
&lt;br /&gt;
[[可达性状态编程|使用手册 - 可达性状态编程（用于如驶入式巷道叉车避免前车放货后影响后车运行等场景）]]&lt;br /&gt;
&lt;br /&gt;
=== 二次开发相关说明 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何适配新的雷达|如何适配新的雷达]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何使用CycleGUI快速开发UI界面|如何使用CycleGUI快速开发UI界面]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何使用LessokajiWeaver的多语言功能|如何使用LessokajiWeaver的多语言功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - 轨迹跟踪|开发手册 - 轨迹跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - 目标跟踪|开发手册 - 目标跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - SimpleComposer界面开发 - CAD工具|开发手册 - SimpleComposer界面开发 - CAD工具]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Medulla:相机使用方法 Camera Data Access Guide]]&lt;br /&gt;
&lt;br /&gt;
[[如何基于SimpleCore核心库进行调度系统开发]]&lt;br /&gt;
&lt;br /&gt;
=== 杂项 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何查看工控机性能以及功耗墙|如何查看工控机性能以及功耗墙]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 数据录制与回放手册|使用手册 - 数据录制与回放手册]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Linux MDCS部署配置和操作说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/FAQ|FAQ]]&lt;br /&gt;
&lt;br /&gt;
Cheat sheet&lt;br /&gt;
&lt;br /&gt;
[[Detour版本发布记录]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/待整理的杂项内容|待整理的杂项内容]]&lt;br /&gt;
&lt;br /&gt;
== 技术报告 ==&lt;br /&gt;
&lt;br /&gt;
* MDCS架构&lt;br /&gt;
** Medulla软件架构&lt;br /&gt;
** Detour软件架构&lt;br /&gt;
*** Detour激光SLAM算法详解&lt;br /&gt;
*** Detour地面纹理SLAM算法详解&lt;br /&gt;
** Simple软件架构&lt;br /&gt;
*** [[特殊:我的语言/调度内核运行原理|调度内核运行原理]]&lt;br /&gt;
**** 基于预先规划交管算法：[[特殊:我的语言/DPS调度算法详解|DPS调度算法详解]]&lt;br /&gt;
**** 流场规划&lt;br /&gt;
*** 基于网络流的业务规划器&lt;br /&gt;
* LessokajiWeaver编译后处理工具&lt;br /&gt;
* CycleGUI&lt;br /&gt;
&lt;br /&gt;
== 接口 ==&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Medulla-API|Medulla]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Detour-API|Detour]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Clumsy-API|Clumsy]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Simple-API|Simple]]&lt;br /&gt;
&lt;br /&gt;
== 术语和约定 ==&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/通用约定|MDCS开发通用约定]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/定位导航|定位导航]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Medulla]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Detour]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Clumsy]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Simple]]&lt;br /&gt;
&lt;br /&gt;
== 特殊技术方案 ==&lt;br /&gt;
&lt;br /&gt;
当前MDCS的特殊技术方案包括：[[特殊:我的语言/托盘识别|托盘识别]]、[[特殊:我的语言/双车/多车联动|双车/多车联动]]、[[特殊:我的语言/汽车面差检测|汽车面差检测]]、[[特殊:我的语言/天眼系统|天眼系统]]、[[特殊:我的语言/自动装卸车应用|自动装卸车应用]]、[[特殊:我的语言/复合卷料机械手叉车|复合卷料机械手叉车]]、[[特殊:我的语言/清洁机器人|清洁机器人]]、[[特殊:我的语言/设备跟随联动|设备跟随联动]]。其它技术方案还在进一步补充中。&lt;br /&gt;
[[文件:Drliuwechat.png|缩略图|100x100像素|微信联系方式]]&lt;br /&gt;
&lt;br /&gt;
== 链接 ==&lt;br /&gt;
&lt;br /&gt;
*[https://dl.lessokaji.com MDCS下载站]：MDCS的各类程序可在该站上下载&lt;br /&gt;
* [https://dev.lessokaji.com 技术讨论站]：包含FAQ、需求讨论、AGV项目实施经验等技术讨论&lt;br /&gt;
* [https://nuget.lessokaji.com MDCS专用Nuget源]：MDCS主要使用c#进行开发，该源包括主要会用的库&lt;br /&gt;
* [https://git.lessokaji.com MDCS代码库]：git源&lt;br /&gt;
* [https://auth.lessokaji.com MDCS授权站]：License授权、代码阅读和编译权限授权站&lt;br /&gt;
* 一些视频案例：链接：https://pan.baidu.com/s/1foIUJzCnpbEaNoy6ooVbJg 提取码：2of9&lt;br /&gt;
&lt;br /&gt;
__无目录__&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Drliuwechat.png&amp;diff=909</id>
		<title>文件:Drliuwechat.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Drliuwechat.png&amp;diff=909"/>
		<updated>2025-05-14T13:38:02Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;wechat&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Mmqrcode1747229738988.png&amp;diff=908</id>
		<title>文件:Mmqrcode1747229738988.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Mmqrcode1747229738988.png&amp;diff=908"/>
		<updated>2025-05-14T13:36:35Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;wechat&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=Detour-API&amp;diff=907</id>
		<title>Detour-API</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=Detour-API&amp;diff=907"/>
		<updated>2025-04-28T08:34:02Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​/* 2.4.1 外部定位源 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= 1. 前言 =&lt;br /&gt;
Detour在4321端口启动Web API服务，为上层应用提供定位、配置和辅助功能。&lt;br /&gt;
&lt;br /&gt;
= 2. 接口定义 =&lt;br /&gt;
&lt;br /&gt;
== 2.1 定位 ==&lt;br /&gt;
&lt;br /&gt;
=== 2.1.1 读取位姿 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/getPos '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/getPos&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;x&amp;quot;: 190702.844,		// 位置单位是毫米，使用直角坐标系&lt;br /&gt;
    &amp;quot;y&amp;quot;: 336956.9,&lt;br /&gt;
    &amp;quot;th&amp;quot;: 113.340424,		// 角度单位是度&lt;br /&gt;
    &amp;quot;l_step&amp;quot;: 27,			// 定位步长，=2表示定位正常，=9999表示手动输入位置&lt;br /&gt;
    					   // &amp;gt;2表示回环失败，此时机器人位置附近的关键帧配准得分低于阈值，&lt;br /&gt;
    					   // 或关键帧计算出的位姿与当前位姿偏差过大而被过滤。l_step值&lt;br /&gt;
    					   // 越大表示回环失败时间越长。一般而言，在行驶时，可能存在&lt;br /&gt;
    					   // 短暂的激光SLAM定位不良区域，l_step&amp;lt;15可继续行驶，用&lt;br /&gt;
    					   // 激光里程计继续输出位姿，此时激光里程计累计误差较小。&lt;br /&gt;
    					   // l_step&amp;gt;15时应停车，重新定位成功后继续。&lt;br /&gt;
    &amp;quot;tick&amp;quot;: 63855102200497	// 时间戳，系统时间的Tick&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// 如果发生错误，比如激光雷达停止发送测量数据，则error属性&lt;br /&gt;
// 显示错误。使用位姿接口数据时，应校验error字段，如非null则位姿不可用。&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;x&amp;quot;: 129163.734,&lt;br /&gt;
    &amp;quot;y&amp;quot;: 416628.938,&lt;br /&gt;
    &amp;quot;th&amp;quot;: 138.75148,&lt;br /&gt;
    &amp;quot;l_step&amp;quot;: 200,&lt;br /&gt;
    &amp;quot;tick&amp;quot;: 63855105852361,&lt;br /&gt;
    &amp;quot;error&amp;quot;: &amp;quot;Timeout&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 使用l_step判断建图质量。建图后遥控移动机器人沿工作路线走一圈，观察l_step值，由于不存在理想的SLAM环境，因此l_step值会短暂&amp;gt;2，一般&amp;lt;7以内可认为SLAM稳定工作。如在固定路段出现回环失败现象，则要考虑应对措施，比如用挡板改善环境轮廓、用反光棒切换到有反SLAM。&lt;br /&gt;
* 在运行时，可根据l_step结合运动状态判断“盲目行驶”风险，如l_step&amp;gt;15且在移动，应停车报警，恢复定位后继续行驶。l_step计算涉及多个因素，因此用范围来判断，如给出的&amp;lt;15区间，可根据实际情况调整区间使用。&lt;br /&gt;
* 激光SLAM以激光里程计输出位姿（x, y, theta）。激光里程计根据相邻激光雷达帧点云计算位移（距离和角度），积分以推算移动机器人航迹，激光里程计持续输出位姿。回环线程则搜索移动机器人附近的关键帧（路标），计算激光雷达帧点云与它们的配准程度，锁定配准得分高于阈值且最高的关键帧，以此修正激光里程计的累积误差，这个过程称为回环。l_step=2表示移动机器人当前位姿附近的关键帧被锁定，因而获得精确位置。l_step&amp;gt;2则表示回环失败，激光里程计继续输出位姿，但是关键帧锁定失败，因此累积误差不能消除，其值越大，输出位姿的误差性可能越大。l_step&amp;lt;15是我们给出的经验区间。&lt;br /&gt;
&lt;br /&gt;
=== 2.1.2 暂停定位 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/pause '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/pause&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;success&amp;quot;: true,&lt;br /&gt;
    &amp;quot;id&amp;quot;: 0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 与“恢复定位”接口配套使用。在Detour发布“紧耦合”特性之前，此接口用于暂停Detour定位功能（包括激光里程计和回环功能），改用目标跟随、巡线或轮里程计等其他定位手段行驶，通过特定场景后恢复定位，并用“指定位置重定位”功能重定位，以恢复激光SLAM功能。&lt;br /&gt;
* 暂停定位接口相当于关闭Detour，使其不再输出位姿，此时“读取位姿”接口将返回&amp;quot;timeout&amp;quot;错误。&lt;br /&gt;
&lt;br /&gt;
=== 2.1.3 恢复定位 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/resume '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/resume&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;success&amp;quot;: true,&lt;br /&gt;
    &amp;quot;id&amp;quot;: 0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.1.4 全局重定位 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/relocalize '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/relocalize&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;performed&amp;quot;: true		// 执行成功&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 全局重定位指令Detour搜索所有关键帧，取与当前点云配准分数最高者锁定，获得移动机器人当前位姿。如果点云与关键帧配准分数均低于阈值，则重定位失败。&lt;br /&gt;
* 全局重定位应用在环境轮廓稳定且有独特几何特征区域。如果环境轮廓与数个关键帧相似，且得分相差无几，则会定位到错误位置。建议在固定位置使用重定位接口，比如在干道旁设置固定的重定位站点。&lt;br /&gt;
&lt;br /&gt;
=== 2.1.5 指定位置重定位 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/setLocation '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// 以(x, y, th)设定移动机器人当前位姿，注意它们都是float类型，值都应有小数点后1位。&lt;br /&gt;
// 激光里程计的航迹切到给定位姿。&lt;br /&gt;
// 如果给定位姿与实际位姿的距离过大，将导致回环失败（可锁定关键帧给出的观测位姿与当前位姿差&lt;br /&gt;
// 大于误差范围时，关键帧将被丢弃，见detour参数说明）。&lt;br /&gt;
GET http://127.0.0.1:4321/setLocation?x=100.0&amp;amp;y=100.0&amp;amp;th=90.0&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;x&amp;quot;: 102.061165,&lt;br /&gt;
    &amp;quot;y&amp;quot;: 97.67917,&lt;br /&gt;
    &amp;quot;th&amp;quot;: 90.0271454,&lt;br /&gt;
    &amp;quot;l_step&amp;quot;: 10000,&lt;br /&gt;
    &amp;quot;tick&amp;quot;: 63855111242596&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 一般用于SLAM不良区域。比如潜伏式牵引车使用目标跟踪功能从料车缓存机构走出时（料车腿和缓存机构遮挡雷达视野而导致定位错误），指定位置使激光SLAM重新定位。&lt;br /&gt;
&lt;br /&gt;
=== 2.1.6 指定关键帧回环 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/relocalize '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// 指示激光SLAM优先选用给定的关键帧。&lt;br /&gt;
// preferredKfId赋值为逗号分隔的关键帧Id集合。&lt;br /&gt;
// 给定的关键帧被列入优先选用集合，提高其匹配权重。&lt;br /&gt;
GET http://127.0.0.1:4321/setPreferredKFID?preferredKfiId=1130788673,1815389948&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;success&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 如果同一个站点的停准精度差异是锁定不同关键帧所致，可使用此接口指示激光SLAM选用特定的关键帧，以提高SLAM精度稳定性。在有限视野场景下（如180度激光雷达视野，或周围环境轮廓不良），可能会锁定不同关键帧（如站点前关键帧由于点云配准分数较低而未选用）而带来厘米级定位误差。此接口用于提高特定关键帧权重，以稳定锁定该关键帧，获得稳定的位姿。&lt;br /&gt;
&lt;br /&gt;
=== 2.1.7 启停回环功能 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/switchPosMatch '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// 启用（或停用）给定图层的回环功能。&lt;br /&gt;
// disable=false表示启用，true表示停用。&lt;br /&gt;
// name是图层名称（单线激光SLAM标签的Lidar点云图层）&lt;br /&gt;
GET http://127.0.0.1:4321/switchPosMatch?disabled=false&amp;amp;name=mainmap&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;performed&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 停用给定图层的回环功能时，激光SLAM不再搜索该图层的关键帧。&lt;br /&gt;
* 本接口与暂停定位接口的差异在于，前者只是停用指定图层回环功能，激光里程计继续输出位姿；后者停止激光里程计和回环，输出位姿不可使用。&lt;br /&gt;
&lt;br /&gt;
=== 2.1.8 开启建图/锁定图层 ===&lt;br /&gt;
*'''方法'''：GET '''路径'''：/call?cmd=ground.SwitchMode(1) '''返回'''：{&amp;quot;result&amp;quot;:&amp;quot;void&amp;quot;}  举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// 开启或关闭建图&lt;br /&gt;
// 一般ground表示地纹图层名称，mainmap是激光图层名称&lt;br /&gt;
// 0是建图  1锁定图层&lt;br /&gt;
GET http:/call?cmd=ground.SwitchMode(1)&lt;br /&gt;
return&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;result&amp;quot;:&amp;quot;void&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
** 注意图层名称，开启建图和锁定UI界面的状态并不会变化。&lt;br /&gt;
&lt;br /&gt;
== 2.2 配置 ==&lt;br /&gt;
&lt;br /&gt;
=== 2.2.1 加载地图 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/loadMap '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// 指定图层加载激光地图。&lt;br /&gt;
// name是图层名称，fn是激光地图文件名称。&lt;br /&gt;
GET http://127.0.0.1:4321/loadMap?name=mainmap&amp;amp;fn=mainmap.2dlm&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;performed&amp;quot;: true,&lt;br /&gt;
    &amp;quot;success&amp;quot;: false&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 可用于激光地图切换场景。比如移动机器人乘坐电梯到二楼时，把激光地图从一楼切换到二楼。&lt;br /&gt;
&lt;br /&gt;
=== 2.2.2 保存地图 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/saveMap '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/saveMap?name=mainmap&amp;amp;fn=mainmap.2dlm&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;performed&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 图层的激光地图修改后，使用本接口将其存入激光地图文件。&lt;br /&gt;
2dlm地图格式可以参考该C#代码：[https://dev.lessokaji.com/index.php?topic=249.0 2dlm地图文件格式 (lessokaji.com])&lt;br /&gt;
&lt;br /&gt;
=== 2.2.3 读取配置文件 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/getConf '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/getConf&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;overrideLanguage&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
    &amp;quot;license&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;initX&amp;quot;: 15659.2,&lt;br /&gt;
    &amp;quot;initY&amp;quot;: 2436.9,&lt;br /&gt;
    &amp;quot;initTh&amp;quot;: 11.7,&lt;br /&gt;
    &amp;quot;recordLastPos&amp;quot;: true,&lt;br /&gt;
    &amp;quot;layout&amp;quot;: {&lt;br /&gt;
        &amp;quot;chassis&amp;quot;: {&lt;br /&gt;
            &amp;quot;width&amp;quot;: 1200.0,&lt;br /&gt;
            &amp;quot;length&amp;quot;: 2000.0,&lt;br /&gt;
            &amp;quot;contour&amp;quot;: [&lt;br /&gt;
                -445.0,&lt;br /&gt;
                330.0,&lt;br /&gt;
                445.0,&lt;br /&gt;
                330.0,&lt;br /&gt;
                445.0,&lt;br /&gt;
                -330.0,&lt;br /&gt;
                -445.0,&lt;br /&gt;
                -330.0&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;components&amp;quot;: [&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;odometries&amp;quot;: [&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;positioning&amp;quot;: [&lt;br /&gt;
     ],&lt;br /&gt;
    &amp;quot;autoStart&amp;quot;: true,&lt;br /&gt;
    &amp;quot;debug&amp;quot;: true,&lt;br /&gt;
    &amp;quot;useGPU&amp;quot;: true,&lt;br /&gt;
    &amp;quot;TCtimeWndSz&amp;quot;: 150,&lt;br /&gt;
    &amp;quot;TCtimeWndLimit&amp;quot;: 700,&lt;br /&gt;
    &amp;quot;useTC&amp;quot;: true,&lt;br /&gt;
    &amp;quot;guru&amp;quot;: {&lt;br /&gt;
        &amp;quot;SpatialIndex2StageCache&amp;quot;: 4194304,&lt;br /&gt;
        &amp;quot;SpatialIndex1StageCache&amp;quot;: 1048576,&lt;br /&gt;
        &amp;quot;ICPFastIterFac&amp;quot;: 0.8,&lt;br /&gt;
        &amp;quot;ICPUseFastMode&amp;quot;: false,&lt;br /&gt;
        &amp;quot;ICP2DMaxIter&amp;quot;: 16,&lt;br /&gt;
        &amp;quot;RippleEnableEqualize&amp;quot;: true,&lt;br /&gt;
        &amp;quot;Lidar2dMapMaxIter&amp;quot;: 50,&lt;br /&gt;
        &amp;quot;phaseLockLvl&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;rotMapProjectionLength&amp;quot;: 500.0,&lt;br /&gt;
        &amp;quot;gicp_p2pfac&amp;quot;: 0.02,&lt;br /&gt;
        &amp;quot;extractPlaneThresE&amp;quot;: 700.0,&lt;br /&gt;
        &amp;quot;lo3dlineWeightScale&amp;quot;: 0.3,&lt;br /&gt;
        &amp;quot;inputScale&amp;quot;: 1.0,&lt;br /&gt;
        &amp;quot;Lidar2DRippleDistDecay&amp;quot;: 15000.0,&lt;br /&gt;
        &amp;quot;Lidar2DRippleScale&amp;quot;: 1.0,&lt;br /&gt;
        &amp;quot;SI2DRectSmall&amp;quot;: 130,&lt;br /&gt;
        &amp;quot;SI2DRectBig&amp;quot;: 600,&lt;br /&gt;
        &amp;quot;TCVarMax&amp;quot;: 1600.0,&lt;br /&gt;
        &amp;quot;TCMaxBadEdges&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;TCKalmanUseCurrentFac&amp;quot;: 0.2,&lt;br /&gt;
        &amp;quot;debugReg2D&amp;quot;: true,&lt;br /&gt;
        &amp;quot;ICP2ddebugSource&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;ICP2dReflexWeightTranslateFac&amp;quot;: 3.0,&lt;br /&gt;
        &amp;quot;TCInterconnectType&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;TCAutoCaliberation&amp;quot;: false,&lt;br /&gt;
        &amp;quot;dumpCriticalData&amp;quot;: false,&lt;br /&gt;
        &amp;quot;dumpLocation&amp;quot;: false,&lt;br /&gt;
        &amp;quot;logKeepDays&amp;quot;: 7,&lt;br /&gt;
        &amp;quot;GOAllowSO3&amp;quot;: false,&lt;br /&gt;
        &amp;quot;TCAllowSO3&amp;quot;: true,&lt;br /&gt;
        &amp;quot;MaxTCIters&amp;quot;: 1000,&lt;br /&gt;
        &amp;quot;GOStopMvmt&amp;quot;: 1.0,&lt;br /&gt;
        &amp;quot;TCDiscardFactor&amp;quot;: 0.4,&lt;br /&gt;
        &amp;quot;TCCouplingSigmaVXY&amp;quot;: 0.2,&lt;br /&gt;
        &amp;quot;TCCouplingSigmaVTh&amp;quot;: 0.5&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;recordPosInterval&amp;quot;: 500,&lt;br /&gt;
    &amp;quot;minimized&amp;quot;: false&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 本接口返回Detour使用的配置文件内容，一般是detour.json。&lt;br /&gt;
* 可结合本接口和组件属性赋值接口实现激光雷达自动标定功能。首先读出配置，解析出要标定的激光雷达外参值（x, y, th），根据激光雷达外参标定方法实现移动机器人的标定行走功能，使用读取位姿、启停回环功能、组件属性赋值等接口计算并设置外参。&lt;br /&gt;
&lt;br /&gt;
=== 2.2.4 组件属性赋值 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/set '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// 可设置以下组件的属性值：&lt;br /&gt;
//   - 车体部件。车体布局编辑器中列出的车体部件，一般是激光雷达，比如frontlidar。&lt;br /&gt;
//   - 里程计。里程计标签中的里程计。&lt;br /&gt;
//   - 地图。单线激光SLAM标签中的Lidar点云图层，比如mainmap。&lt;br /&gt;
// path是对象属性，本例是frontlidar.x，即激光雷达的x外参。&lt;br /&gt;
// val是值。&lt;br /&gt;
GET http://127.0.0.1:4321/set?path=frontlidar.x&amp;amp;val=500&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;success&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* Detour使用该接口配置DetourLite参数。由于组件属性赋值不支持创建组件，因此在Detour创建激光雷达时，该雷达不会同步给DetourLite，进而触发对该雷达属性赋值时报“DetourLite参数设置错误”提示。&lt;br /&gt;
&lt;br /&gt;
=== 2.2.5 上传资源 ===&lt;br /&gt;
'''方法'''：POST '''路径'''：/uploadRes '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// fn是资源文件名。&lt;br /&gt;
// POST Body是上传的资源文件内容。&lt;br /&gt;
POST http://127.0.0.1:4321/uploadRes?fn=foo&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;performed&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 本接口可向Detour所在目录上传文件。比如激光地图文件。&lt;br /&gt;
&lt;br /&gt;
=== 2.2.6 下载资源 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/downloadRes '''返回'''：字节流&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/downloadRes?fn=foo&lt;br /&gt;
&lt;br /&gt;
// 返回foo文件内容的字节流&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.2.7 保存导航配置 ===&lt;br /&gt;
'''方法'''：Get'''路径'''：/set '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// &lt;br /&gt;
// 比如保存雷达名称，就可以保存所有配置信息到本地了&lt;br /&gt;
Get http://127.0.0.1:4321/set?path=frontlidar.name&amp;amp;val=frontlidar&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;performed&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2.2.8 外部加载二维码地图 ===&lt;br /&gt;
'''方法'''：Get'''路径'''：/call?cmd=tagmap.load()'''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// load 里面输入二维码地图路径即可&lt;br /&gt;
Get 127.0.0.1:4321/call?cmd=tagmap.load(d:/src/detour/build/fuck.json)&lt;br /&gt;
&lt;br /&gt;
re&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;performed&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2.3 状态 ==&lt;br /&gt;
&lt;br /&gt;
=== 2.3.1 读取运行统计 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/getStat '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/getStat&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;runningSeconds&amp;quot;: 878.7448942,&lt;br /&gt;
    &amp;quot;layoutStat&amp;quot;: {&lt;br /&gt;
        &amp;quot;frontlidar&amp;quot;: {&lt;br /&gt;
            &amp;quot;status&amp;quot;: &amp;quot;等待帧&amp;quot;,&lt;br /&gt;
            &amp;quot;lidar_tick&amp;quot;: 2542,&lt;br /&gt;
            &amp;quot;interval&amp;quot;: 77,&lt;br /&gt;
            &amp;quot;validPoints&amp;quot;: 196,&lt;br /&gt;
            &amp;quot;preprocessTime&amp;quot;: 0.0,&lt;br /&gt;
            &amp;quot;timeBudget&amp;quot;: 81.036527022839024,&lt;br /&gt;
            &amp;quot;reflexN&amp;quot;: 0.0,&lt;br /&gt;
            &amp;quot;selfFitting&amp;quot;: 0.0&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;cart_odometry&amp;quot;: {&lt;br /&gt;
            &amp;quot;status&amp;quot;: &amp;quot;初始化捕捉完毕&amp;quot;,&lt;br /&gt;
            &amp;quot;use&amp;quot;: true,&lt;br /&gt;
            &amp;quot;feedstate&amp;quot;: &amp;quot;未开始捕获&amp;quot;,&lt;br /&gt;
            &amp;quot;time&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
            &amp;quot;counter&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;pos&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
            &amp;quot;selfFitting&amp;quot;: 0.0&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;odoStat&amp;quot;: {&lt;br /&gt;
        &amp;quot;odometry_0&amp;quot;: {&lt;br /&gt;
            &amp;quot;reg_ms&amp;quot;: 6.0,&lt;br /&gt;
            &amp;quot;loop_ms&amp;quot;: 136.0,&lt;br /&gt;
            &amp;quot;interval&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;reg_mode&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;kf_state&amp;quot;: &amp;quot;10011/+1&amp;quot;,&lt;br /&gt;
            &amp;quot;SeqScore&amp;quot;: 0.950587451,&lt;br /&gt;
            &amp;quot;LOScore&amp;quot;: 0.9299651,&lt;br /&gt;
            &amp;quot;kfreason&amp;quot;: &amp;quot;.&amp;quot;,&lt;br /&gt;
            &amp;quot;otherDebug&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;status&amp;quot;: &amp;quot;waitframe&amp;quot;,&lt;br /&gt;
            &amp;quot;pause&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;posStat&amp;quot;: {},&lt;br /&gt;
    &amp;quot;TCStat&amp;quot;: {&lt;br /&gt;
        &amp;quot;commitId&amp;quot;: 1394,&lt;br /&gt;
        &amp;quot;computeStat&amp;quot;: &amp;quot;tcfrontlidar...tp&amp;quot;,&lt;br /&gt;
        &amp;quot;fitmethod&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;goIters&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;discarding&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;fitexplain&amp;quot;: &amp;quot;frontlidar:5L/1.61&amp;quot;,&lt;br /&gt;
        &amp;quot;poseEstim&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
        &amp;quot;TCPerf&amp;quot;: &amp;quot;rigid:0.054,go:0.0622,post:0.0188&amp;quot;,&lt;br /&gt;
        &amp;quot;CouplingScores&amp;quot;: &amp;quot;frontlidar(5):1.00/1.00&amp;quot;,&lt;br /&gt;
        &amp;quot;TCVar&amp;quot;: 0.0,&lt;br /&gt;
        &amp;quot;err&amp;quot;: 0.0,&lt;br /&gt;
        &amp;quot;historyLs&amp;quot;: &amp;quot;frontlidar:N1/5&amp;quot;,&lt;br /&gt;
        &amp;quot;powers&amp;quot;: &amp;quot;True:(,()&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;GOStat&amp;quot;: {&lt;br /&gt;
        &amp;quot;maxTension&amp;quot;: 0.0,&lt;br /&gt;
        &amp;quot;edgeN&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;OPS&amp;quot;: 8,&lt;br /&gt;
        &amp;quot;Use&amp;quot;: true&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;licence&amp;quot;: &amp;quot;DID:4D222EB2BEE27897&amp;quot;,&lt;br /&gt;
    &amp;quot;globalStat&amp;quot;: {&lt;br /&gt;
        &amp;quot;paused&amp;quot;: false,&lt;br /&gt;
        &amp;quot;IsSettingPosition&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 返回结果与Detour上相应对象的状态一致。&lt;br /&gt;
&lt;br /&gt;
=== 2.3.2 导出工作区 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/dumpWorkspace '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/dumpWorkspace&lt;br /&gt;
&lt;br /&gt;
OK&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 在Detour的log/workspace目录下生成图像日志，包括一张PNG图片，内容为Detour主界面的地图；一个运行日志文件。&lt;br /&gt;
&lt;br /&gt;
=== 2.3.3 读取点云 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/getSensors '''返回'''：字节流&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/getSensors&lt;br /&gt;
&lt;br /&gt;
// 返回字节流是点云数据，伪代码表述格式如下：&lt;br /&gt;
[&lt;br /&gt;
	{	// 激光雷达&lt;br /&gt;
		lidar.name : String;	// 雷达名称，C# String类型&lt;br /&gt;
		keyFrame.x : float;		// 关键帧位姿&lt;br /&gt;
		keyFrame.y : float;&lt;br /&gt;
		keyFrame.th : float;&lt;br /&gt;
		pointCloud.length : int;	// 点云数组长度&lt;br /&gt;
		[&lt;br /&gt;
			point.x : float;	// 测量点坐标&lt;br /&gt;
             point.y : float;&lt;br /&gt;
		]&lt;br /&gt;
	}&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* Detour使用此接口读取DetourLite点云数据。&lt;br /&gt;
* 调用该接口的频率应控制在2Hz以内，以免干扰Detour内核计算性能。&lt;br /&gt;
* 非必要不使用原则。如，在丢定位时（如l_step&amp;gt;15），在管控的维护功能界面显示点云，以帮助操作者识别移动机器人实际位姿，然后使用指定位置重定位接口找回定位。在这个场景中，只需在处理定位问题时读取点云，处理完毕后停止调用接口。&lt;br /&gt;
&lt;br /&gt;
=== 2.3.4 读取版本 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/getVersion '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/getVersion&lt;br /&gt;
&lt;br /&gt;
shicong-liu@2024-06-26T13:25:22+08|master_b8dc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2.4 操作 ==&lt;br /&gt;
&lt;br /&gt;
=== 2.4.1 调用方法 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/call '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// 调用对象方法。&lt;br /&gt;
// cmd是对象方法。本例是调用cart_odometry.capture()方法，即&lt;br /&gt;
// 触发外部定位源cart_odometry（轮里程计）的捕获方法。&lt;br /&gt;
GET http://127.0.0.1:4321/call?cmd=cart_odometry.capture()&lt;br /&gt;
&lt;br /&gt;
// 返回该方法的返回值&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;result&amp;quot;: &amp;quot;void&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 本接口相当于RPC（Remote Procedure Call）调用。应根据代码调用。&lt;br /&gt;
&lt;br /&gt;
=== 2.4.2 设置激光雷达蒙板 ===&lt;br /&gt;
'''方法'''：POST '''路径'''：/setLidar2DOdometryMask '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// odometry是里程计标签中的里程计名称。本例的odometry_0是默认激光里程计名称。&lt;br /&gt;
// POST Body是蒙板顶点数组，用于构造出封闭多边形，落在多边形内的点云都会被过滤。&lt;br /&gt;
POST http://127.0.0.1:4321/setLidar2DOdometryMask?odometry=odometry_0&lt;br /&gt;
[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;X&amp;quot;: 123,&lt;br /&gt;
        &amp;quot;Y&amp;quot;: 456&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;X&amp;quot;: 123,&lt;br /&gt;
        &amp;quot;Y&amp;quot;: 456&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;X&amp;quot;: 123,&lt;br /&gt;
        &amp;quot;Y&amp;quot;: 456&lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;success&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 本接口只影响内存中的配置，不会存入配置文件。&lt;br /&gt;
* 坐标参考车体编辑器，直角坐标系的原点在底盘几何中心。&lt;br /&gt;
&lt;br /&gt;
= 2.4 定位 =&lt;br /&gt;
&lt;br /&gt;
=== 2.4.1 外部定位源 ===&lt;br /&gt;
输入外部定位源前，首先要在车体编辑器里增加对应的“外部定位源”部件&lt;br /&gt;
&lt;br /&gt;
'''方法'''：POST '''路径'''：/postExternPosition '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// name是外部定位源。本例的cart_odometry是IMU轮里程计。&lt;br /&gt;
// POST Body是外部定位源的航迹。&lt;br /&gt;
POST http://127.0.0.1:4321/postExternPosition?name=cart_odometry&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;cart_odometry&amp;quot;,	// 轮里程计+IMU对应在Detour中的部件名&lt;br /&gt;
  &amp;quot;counter&amp;quot;: 0,				// 单调+1&lt;br /&gt;
  &amp;quot;hasTranslation&amp;quot;: true,	 // 可移动，(x, y) &lt;br /&gt;
  &amp;quot;hasRotation&amp;quot;: true,		// 可旋转，(th)&lt;br /&gt;
  &amp;quot;is3D&amp;quot;: false,			// 在三维平面运动，输出(x, y, z, th)&lt;br /&gt;
  &amp;quot;is2D&amp;quot;: true,				// 在二维平面运动，输出(x, y, th)&lt;br /&gt;
  &amp;quot;integrated&amp;quot;: true,	// 是否通过积分得到的位姿(轮里程计通过积分获得，gps是绝对位置)&lt;br /&gt;
  &amp;quot;startingTick&amp;quot;: 0,		// 时间戳，不变则表示这是一条航迹。程序启动时可用系统Ticks为初始值&lt;br /&gt;
  &amp;quot;x&amp;quot;: 0.0,				   // 当前位姿&lt;br /&gt;
  &amp;quot;y&amp;quot;: 0.0,&lt;br /&gt;
  &amp;quot;z&amp;quot;: 0.0,				   // 二维平面的z总是0&lt;br /&gt;
  &amp;quot;th&amp;quot;: 0.0,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;performed&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
说明：&lt;br /&gt;
&lt;br /&gt;
* 向Detour推送外部定位源的位姿。外部定位源一般是IMU轮里程计、GNSS RTK。Detour紧耦合功能融合多个里程计，择优输出一个位姿。&lt;br /&gt;
* IMU轮里程计的位姿发布频率建议20Hz（经测试获得的经验值）。&lt;br /&gt;
* 外部定位源的inputType=&amp;quot;web&amp;quot;，默认是&amp;quot;internal&amp;quot;（表示从Medulla发布）。设置错误将导致接口调用失败。&lt;br /&gt;
* 集成外部定位源时，应测试其发布频率，以免过快或过慢频率干扰紧耦合错误选用里程计。&lt;br /&gt;
* 以下是外部定位源表：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+定位源类型和设置方法&lt;br /&gt;
!&lt;br /&gt;
!hasTranslation&lt;br /&gt;
!hasRotation&lt;br /&gt;
!is3D&lt;br /&gt;
!is2D&lt;br /&gt;
!integrated&lt;br /&gt;
!toRemap&lt;br /&gt;
|-&lt;br /&gt;
|GNSS定位&lt;br /&gt;
|true&lt;br /&gt;
|true&lt;br /&gt;
如果有的话&lt;br /&gt;
|false&lt;br /&gt;
|true&lt;br /&gt;
|false&lt;br /&gt;
|true&lt;br /&gt;
经纬度-地图位置需要标定：[[使用手册 - 卫星或基站定位标定|使用手册]]&lt;br /&gt;
|-&lt;br /&gt;
|轮编里程计（须自行融合IMU）&lt;br /&gt;
|true&lt;br /&gt;
|true&lt;br /&gt;
|false&lt;br /&gt;
|true&lt;br /&gt;
|true&lt;br /&gt;
须自行积分，直接从0开始积分即可&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.4.2 外部二维码输入 ===&lt;br /&gt;
'''方法'''：Get'''路径'''：/call?cmd=lesstag.inputextern(id,x,y,th) '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// id,x,y,th分别表示二维码的tag，xyth数值。&lt;br /&gt;
Get http://127.0.0.1:4321/call?cmd=lesstag.inputextern(id,x,y,th)&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;result&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
说明：&lt;br /&gt;
&lt;br /&gt;
* 配置此项功能需要把D参数中二维码配置useExtern改成true才可以生效&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=Detour-API&amp;diff=906</id>
		<title>Detour-API</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=Detour-API&amp;diff=906"/>
		<updated>2025-04-28T08:26:21Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​/* 2.4.1 外部定位源 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= 1. 前言 =&lt;br /&gt;
Detour在4321端口启动Web API服务，为上层应用提供定位、配置和辅助功能。&lt;br /&gt;
&lt;br /&gt;
= 2. 接口定义 =&lt;br /&gt;
&lt;br /&gt;
== 2.1 定位 ==&lt;br /&gt;
&lt;br /&gt;
=== 2.1.1 读取位姿 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/getPos '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/getPos&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;x&amp;quot;: 190702.844,		// 位置单位是毫米，使用直角坐标系&lt;br /&gt;
    &amp;quot;y&amp;quot;: 336956.9,&lt;br /&gt;
    &amp;quot;th&amp;quot;: 113.340424,		// 角度单位是度&lt;br /&gt;
    &amp;quot;l_step&amp;quot;: 27,			// 定位步长，=2表示定位正常，=9999表示手动输入位置&lt;br /&gt;
    					   // &amp;gt;2表示回环失败，此时机器人位置附近的关键帧配准得分低于阈值，&lt;br /&gt;
    					   // 或关键帧计算出的位姿与当前位姿偏差过大而被过滤。l_step值&lt;br /&gt;
    					   // 越大表示回环失败时间越长。一般而言，在行驶时，可能存在&lt;br /&gt;
    					   // 短暂的激光SLAM定位不良区域，l_step&amp;lt;15可继续行驶，用&lt;br /&gt;
    					   // 激光里程计继续输出位姿，此时激光里程计累计误差较小。&lt;br /&gt;
    					   // l_step&amp;gt;15时应停车，重新定位成功后继续。&lt;br /&gt;
    &amp;quot;tick&amp;quot;: 63855102200497	// 时间戳，系统时间的Tick&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// 如果发生错误，比如激光雷达停止发送测量数据，则error属性&lt;br /&gt;
// 显示错误。使用位姿接口数据时，应校验error字段，如非null则位姿不可用。&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;x&amp;quot;: 129163.734,&lt;br /&gt;
    &amp;quot;y&amp;quot;: 416628.938,&lt;br /&gt;
    &amp;quot;th&amp;quot;: 138.75148,&lt;br /&gt;
    &amp;quot;l_step&amp;quot;: 200,&lt;br /&gt;
    &amp;quot;tick&amp;quot;: 63855105852361,&lt;br /&gt;
    &amp;quot;error&amp;quot;: &amp;quot;Timeout&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 使用l_step判断建图质量。建图后遥控移动机器人沿工作路线走一圈，观察l_step值，由于不存在理想的SLAM环境，因此l_step值会短暂&amp;gt;2，一般&amp;lt;7以内可认为SLAM稳定工作。如在固定路段出现回环失败现象，则要考虑应对措施，比如用挡板改善环境轮廓、用反光棒切换到有反SLAM。&lt;br /&gt;
* 在运行时，可根据l_step结合运动状态判断“盲目行驶”风险，如l_step&amp;gt;15且在移动，应停车报警，恢复定位后继续行驶。l_step计算涉及多个因素，因此用范围来判断，如给出的&amp;lt;15区间，可根据实际情况调整区间使用。&lt;br /&gt;
* 激光SLAM以激光里程计输出位姿（x, y, theta）。激光里程计根据相邻激光雷达帧点云计算位移（距离和角度），积分以推算移动机器人航迹，激光里程计持续输出位姿。回环线程则搜索移动机器人附近的关键帧（路标），计算激光雷达帧点云与它们的配准程度，锁定配准得分高于阈值且最高的关键帧，以此修正激光里程计的累积误差，这个过程称为回环。l_step=2表示移动机器人当前位姿附近的关键帧被锁定，因而获得精确位置。l_step&amp;gt;2则表示回环失败，激光里程计继续输出位姿，但是关键帧锁定失败，因此累积误差不能消除，其值越大，输出位姿的误差性可能越大。l_step&amp;lt;15是我们给出的经验区间。&lt;br /&gt;
&lt;br /&gt;
=== 2.1.2 暂停定位 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/pause '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/pause&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;success&amp;quot;: true,&lt;br /&gt;
    &amp;quot;id&amp;quot;: 0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 与“恢复定位”接口配套使用。在Detour发布“紧耦合”特性之前，此接口用于暂停Detour定位功能（包括激光里程计和回环功能），改用目标跟随、巡线或轮里程计等其他定位手段行驶，通过特定场景后恢复定位，并用“指定位置重定位”功能重定位，以恢复激光SLAM功能。&lt;br /&gt;
* 暂停定位接口相当于关闭Detour，使其不再输出位姿，此时“读取位姿”接口将返回&amp;quot;timeout&amp;quot;错误。&lt;br /&gt;
&lt;br /&gt;
=== 2.1.3 恢复定位 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/resume '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/resume&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;success&amp;quot;: true,&lt;br /&gt;
    &amp;quot;id&amp;quot;: 0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.1.4 全局重定位 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/relocalize '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/relocalize&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;performed&amp;quot;: true		// 执行成功&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 全局重定位指令Detour搜索所有关键帧，取与当前点云配准分数最高者锁定，获得移动机器人当前位姿。如果点云与关键帧配准分数均低于阈值，则重定位失败。&lt;br /&gt;
* 全局重定位应用在环境轮廓稳定且有独特几何特征区域。如果环境轮廓与数个关键帧相似，且得分相差无几，则会定位到错误位置。建议在固定位置使用重定位接口，比如在干道旁设置固定的重定位站点。&lt;br /&gt;
&lt;br /&gt;
=== 2.1.5 指定位置重定位 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/setLocation '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// 以(x, y, th)设定移动机器人当前位姿，注意它们都是float类型，值都应有小数点后1位。&lt;br /&gt;
// 激光里程计的航迹切到给定位姿。&lt;br /&gt;
// 如果给定位姿与实际位姿的距离过大，将导致回环失败（可锁定关键帧给出的观测位姿与当前位姿差&lt;br /&gt;
// 大于误差范围时，关键帧将被丢弃，见detour参数说明）。&lt;br /&gt;
GET http://127.0.0.1:4321/setLocation?x=100.0&amp;amp;y=100.0&amp;amp;th=90.0&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;x&amp;quot;: 102.061165,&lt;br /&gt;
    &amp;quot;y&amp;quot;: 97.67917,&lt;br /&gt;
    &amp;quot;th&amp;quot;: 90.0271454,&lt;br /&gt;
    &amp;quot;l_step&amp;quot;: 10000,&lt;br /&gt;
    &amp;quot;tick&amp;quot;: 63855111242596&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 一般用于SLAM不良区域。比如潜伏式牵引车使用目标跟踪功能从料车缓存机构走出时（料车腿和缓存机构遮挡雷达视野而导致定位错误），指定位置使激光SLAM重新定位。&lt;br /&gt;
&lt;br /&gt;
=== 2.1.6 指定关键帧回环 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/relocalize '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// 指示激光SLAM优先选用给定的关键帧。&lt;br /&gt;
// preferredKfId赋值为逗号分隔的关键帧Id集合。&lt;br /&gt;
// 给定的关键帧被列入优先选用集合，提高其匹配权重。&lt;br /&gt;
GET http://127.0.0.1:4321/setPreferredKFID?preferredKfiId=1130788673,1815389948&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;success&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 如果同一个站点的停准精度差异是锁定不同关键帧所致，可使用此接口指示激光SLAM选用特定的关键帧，以提高SLAM精度稳定性。在有限视野场景下（如180度激光雷达视野，或周围环境轮廓不良），可能会锁定不同关键帧（如站点前关键帧由于点云配准分数较低而未选用）而带来厘米级定位误差。此接口用于提高特定关键帧权重，以稳定锁定该关键帧，获得稳定的位姿。&lt;br /&gt;
&lt;br /&gt;
=== 2.1.7 启停回环功能 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/switchPosMatch '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// 启用（或停用）给定图层的回环功能。&lt;br /&gt;
// disable=false表示启用，true表示停用。&lt;br /&gt;
// name是图层名称（单线激光SLAM标签的Lidar点云图层）&lt;br /&gt;
GET http://127.0.0.1:4321/switchPosMatch?disabled=false&amp;amp;name=mainmap&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;performed&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 停用给定图层的回环功能时，激光SLAM不再搜索该图层的关键帧。&lt;br /&gt;
* 本接口与暂停定位接口的差异在于，前者只是停用指定图层回环功能，激光里程计继续输出位姿；后者停止激光里程计和回环，输出位姿不可使用。&lt;br /&gt;
&lt;br /&gt;
=== 2.1.8 开启建图/锁定图层 ===&lt;br /&gt;
*'''方法'''：GET '''路径'''：/call?cmd=ground.SwitchMode(1) '''返回'''：{&amp;quot;result&amp;quot;:&amp;quot;void&amp;quot;}  举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// 开启或关闭建图&lt;br /&gt;
// 一般ground表示地纹图层名称，mainmap是激光图层名称&lt;br /&gt;
// 0是建图  1锁定图层&lt;br /&gt;
GET http:/call?cmd=ground.SwitchMode(1)&lt;br /&gt;
return&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;result&amp;quot;:&amp;quot;void&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
** 注意图层名称，开启建图和锁定UI界面的状态并不会变化。&lt;br /&gt;
&lt;br /&gt;
== 2.2 配置 ==&lt;br /&gt;
&lt;br /&gt;
=== 2.2.1 加载地图 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/loadMap '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// 指定图层加载激光地图。&lt;br /&gt;
// name是图层名称，fn是激光地图文件名称。&lt;br /&gt;
GET http://127.0.0.1:4321/loadMap?name=mainmap&amp;amp;fn=mainmap.2dlm&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;performed&amp;quot;: true,&lt;br /&gt;
    &amp;quot;success&amp;quot;: false&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 可用于激光地图切换场景。比如移动机器人乘坐电梯到二楼时，把激光地图从一楼切换到二楼。&lt;br /&gt;
&lt;br /&gt;
=== 2.2.2 保存地图 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/saveMap '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/saveMap?name=mainmap&amp;amp;fn=mainmap.2dlm&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;performed&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 图层的激光地图修改后，使用本接口将其存入激光地图文件。&lt;br /&gt;
2dlm地图格式可以参考该C#代码：[https://dev.lessokaji.com/index.php?topic=249.0 2dlm地图文件格式 (lessokaji.com])&lt;br /&gt;
&lt;br /&gt;
=== 2.2.3 读取配置文件 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/getConf '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/getConf&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;overrideLanguage&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
    &amp;quot;license&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;initX&amp;quot;: 15659.2,&lt;br /&gt;
    &amp;quot;initY&amp;quot;: 2436.9,&lt;br /&gt;
    &amp;quot;initTh&amp;quot;: 11.7,&lt;br /&gt;
    &amp;quot;recordLastPos&amp;quot;: true,&lt;br /&gt;
    &amp;quot;layout&amp;quot;: {&lt;br /&gt;
        &amp;quot;chassis&amp;quot;: {&lt;br /&gt;
            &amp;quot;width&amp;quot;: 1200.0,&lt;br /&gt;
            &amp;quot;length&amp;quot;: 2000.0,&lt;br /&gt;
            &amp;quot;contour&amp;quot;: [&lt;br /&gt;
                -445.0,&lt;br /&gt;
                330.0,&lt;br /&gt;
                445.0,&lt;br /&gt;
                330.0,&lt;br /&gt;
                445.0,&lt;br /&gt;
                -330.0,&lt;br /&gt;
                -445.0,&lt;br /&gt;
                -330.0&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;components&amp;quot;: [&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;odometries&amp;quot;: [&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;positioning&amp;quot;: [&lt;br /&gt;
     ],&lt;br /&gt;
    &amp;quot;autoStart&amp;quot;: true,&lt;br /&gt;
    &amp;quot;debug&amp;quot;: true,&lt;br /&gt;
    &amp;quot;useGPU&amp;quot;: true,&lt;br /&gt;
    &amp;quot;TCtimeWndSz&amp;quot;: 150,&lt;br /&gt;
    &amp;quot;TCtimeWndLimit&amp;quot;: 700,&lt;br /&gt;
    &amp;quot;useTC&amp;quot;: true,&lt;br /&gt;
    &amp;quot;guru&amp;quot;: {&lt;br /&gt;
        &amp;quot;SpatialIndex2StageCache&amp;quot;: 4194304,&lt;br /&gt;
        &amp;quot;SpatialIndex1StageCache&amp;quot;: 1048576,&lt;br /&gt;
        &amp;quot;ICPFastIterFac&amp;quot;: 0.8,&lt;br /&gt;
        &amp;quot;ICPUseFastMode&amp;quot;: false,&lt;br /&gt;
        &amp;quot;ICP2DMaxIter&amp;quot;: 16,&lt;br /&gt;
        &amp;quot;RippleEnableEqualize&amp;quot;: true,&lt;br /&gt;
        &amp;quot;Lidar2dMapMaxIter&amp;quot;: 50,&lt;br /&gt;
        &amp;quot;phaseLockLvl&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;rotMapProjectionLength&amp;quot;: 500.0,&lt;br /&gt;
        &amp;quot;gicp_p2pfac&amp;quot;: 0.02,&lt;br /&gt;
        &amp;quot;extractPlaneThresE&amp;quot;: 700.0,&lt;br /&gt;
        &amp;quot;lo3dlineWeightScale&amp;quot;: 0.3,&lt;br /&gt;
        &amp;quot;inputScale&amp;quot;: 1.0,&lt;br /&gt;
        &amp;quot;Lidar2DRippleDistDecay&amp;quot;: 15000.0,&lt;br /&gt;
        &amp;quot;Lidar2DRippleScale&amp;quot;: 1.0,&lt;br /&gt;
        &amp;quot;SI2DRectSmall&amp;quot;: 130,&lt;br /&gt;
        &amp;quot;SI2DRectBig&amp;quot;: 600,&lt;br /&gt;
        &amp;quot;TCVarMax&amp;quot;: 1600.0,&lt;br /&gt;
        &amp;quot;TCMaxBadEdges&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;TCKalmanUseCurrentFac&amp;quot;: 0.2,&lt;br /&gt;
        &amp;quot;debugReg2D&amp;quot;: true,&lt;br /&gt;
        &amp;quot;ICP2ddebugSource&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;ICP2dReflexWeightTranslateFac&amp;quot;: 3.0,&lt;br /&gt;
        &amp;quot;TCInterconnectType&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;TCAutoCaliberation&amp;quot;: false,&lt;br /&gt;
        &amp;quot;dumpCriticalData&amp;quot;: false,&lt;br /&gt;
        &amp;quot;dumpLocation&amp;quot;: false,&lt;br /&gt;
        &amp;quot;logKeepDays&amp;quot;: 7,&lt;br /&gt;
        &amp;quot;GOAllowSO3&amp;quot;: false,&lt;br /&gt;
        &amp;quot;TCAllowSO3&amp;quot;: true,&lt;br /&gt;
        &amp;quot;MaxTCIters&amp;quot;: 1000,&lt;br /&gt;
        &amp;quot;GOStopMvmt&amp;quot;: 1.0,&lt;br /&gt;
        &amp;quot;TCDiscardFactor&amp;quot;: 0.4,&lt;br /&gt;
        &amp;quot;TCCouplingSigmaVXY&amp;quot;: 0.2,&lt;br /&gt;
        &amp;quot;TCCouplingSigmaVTh&amp;quot;: 0.5&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;recordPosInterval&amp;quot;: 500,&lt;br /&gt;
    &amp;quot;minimized&amp;quot;: false&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 本接口返回Detour使用的配置文件内容，一般是detour.json。&lt;br /&gt;
* 可结合本接口和组件属性赋值接口实现激光雷达自动标定功能。首先读出配置，解析出要标定的激光雷达外参值（x, y, th），根据激光雷达外参标定方法实现移动机器人的标定行走功能，使用读取位姿、启停回环功能、组件属性赋值等接口计算并设置外参。&lt;br /&gt;
&lt;br /&gt;
=== 2.2.4 组件属性赋值 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/set '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// 可设置以下组件的属性值：&lt;br /&gt;
//   - 车体部件。车体布局编辑器中列出的车体部件，一般是激光雷达，比如frontlidar。&lt;br /&gt;
//   - 里程计。里程计标签中的里程计。&lt;br /&gt;
//   - 地图。单线激光SLAM标签中的Lidar点云图层，比如mainmap。&lt;br /&gt;
// path是对象属性，本例是frontlidar.x，即激光雷达的x外参。&lt;br /&gt;
// val是值。&lt;br /&gt;
GET http://127.0.0.1:4321/set?path=frontlidar.x&amp;amp;val=500&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;success&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* Detour使用该接口配置DetourLite参数。由于组件属性赋值不支持创建组件，因此在Detour创建激光雷达时，该雷达不会同步给DetourLite，进而触发对该雷达属性赋值时报“DetourLite参数设置错误”提示。&lt;br /&gt;
&lt;br /&gt;
=== 2.2.5 上传资源 ===&lt;br /&gt;
'''方法'''：POST '''路径'''：/uploadRes '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// fn是资源文件名。&lt;br /&gt;
// POST Body是上传的资源文件内容。&lt;br /&gt;
POST http://127.0.0.1:4321/uploadRes?fn=foo&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;performed&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 本接口可向Detour所在目录上传文件。比如激光地图文件。&lt;br /&gt;
&lt;br /&gt;
=== 2.2.6 下载资源 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/downloadRes '''返回'''：字节流&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/downloadRes?fn=foo&lt;br /&gt;
&lt;br /&gt;
// 返回foo文件内容的字节流&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.2.7 保存导航配置 ===&lt;br /&gt;
'''方法'''：Get'''路径'''：/set '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// &lt;br /&gt;
// 比如保存雷达名称，就可以保存所有配置信息到本地了&lt;br /&gt;
Get http://127.0.0.1:4321/set?path=frontlidar.name&amp;amp;val=frontlidar&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;performed&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2.2.8 外部加载二维码地图 ===&lt;br /&gt;
'''方法'''：Get'''路径'''：/call?cmd=tagmap.load()'''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// load 里面输入二维码地图路径即可&lt;br /&gt;
Get 127.0.0.1:4321/call?cmd=tagmap.load(d:/src/detour/build/fuck.json)&lt;br /&gt;
&lt;br /&gt;
re&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;performed&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2.3 状态 ==&lt;br /&gt;
&lt;br /&gt;
=== 2.3.1 读取运行统计 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/getStat '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/getStat&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;runningSeconds&amp;quot;: 878.7448942,&lt;br /&gt;
    &amp;quot;layoutStat&amp;quot;: {&lt;br /&gt;
        &amp;quot;frontlidar&amp;quot;: {&lt;br /&gt;
            &amp;quot;status&amp;quot;: &amp;quot;等待帧&amp;quot;,&lt;br /&gt;
            &amp;quot;lidar_tick&amp;quot;: 2542,&lt;br /&gt;
            &amp;quot;interval&amp;quot;: 77,&lt;br /&gt;
            &amp;quot;validPoints&amp;quot;: 196,&lt;br /&gt;
            &amp;quot;preprocessTime&amp;quot;: 0.0,&lt;br /&gt;
            &amp;quot;timeBudget&amp;quot;: 81.036527022839024,&lt;br /&gt;
            &amp;quot;reflexN&amp;quot;: 0.0,&lt;br /&gt;
            &amp;quot;selfFitting&amp;quot;: 0.0&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;cart_odometry&amp;quot;: {&lt;br /&gt;
            &amp;quot;status&amp;quot;: &amp;quot;初始化捕捉完毕&amp;quot;,&lt;br /&gt;
            &amp;quot;use&amp;quot;: true,&lt;br /&gt;
            &amp;quot;feedstate&amp;quot;: &amp;quot;未开始捕获&amp;quot;,&lt;br /&gt;
            &amp;quot;time&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
            &amp;quot;counter&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;pos&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
            &amp;quot;selfFitting&amp;quot;: 0.0&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;odoStat&amp;quot;: {&lt;br /&gt;
        &amp;quot;odometry_0&amp;quot;: {&lt;br /&gt;
            &amp;quot;reg_ms&amp;quot;: 6.0,&lt;br /&gt;
            &amp;quot;loop_ms&amp;quot;: 136.0,&lt;br /&gt;
            &amp;quot;interval&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;reg_mode&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;kf_state&amp;quot;: &amp;quot;10011/+1&amp;quot;,&lt;br /&gt;
            &amp;quot;SeqScore&amp;quot;: 0.950587451,&lt;br /&gt;
            &amp;quot;LOScore&amp;quot;: 0.9299651,&lt;br /&gt;
            &amp;quot;kfreason&amp;quot;: &amp;quot;.&amp;quot;,&lt;br /&gt;
            &amp;quot;otherDebug&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;status&amp;quot;: &amp;quot;waitframe&amp;quot;,&lt;br /&gt;
            &amp;quot;pause&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;posStat&amp;quot;: {},&lt;br /&gt;
    &amp;quot;TCStat&amp;quot;: {&lt;br /&gt;
        &amp;quot;commitId&amp;quot;: 1394,&lt;br /&gt;
        &amp;quot;computeStat&amp;quot;: &amp;quot;tcfrontlidar...tp&amp;quot;,&lt;br /&gt;
        &amp;quot;fitmethod&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;goIters&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;discarding&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;fitexplain&amp;quot;: &amp;quot;frontlidar:5L/1.61&amp;quot;,&lt;br /&gt;
        &amp;quot;poseEstim&amp;quot;: &amp;quot;/&amp;quot;,&lt;br /&gt;
        &amp;quot;TCPerf&amp;quot;: &amp;quot;rigid:0.054,go:0.0622,post:0.0188&amp;quot;,&lt;br /&gt;
        &amp;quot;CouplingScores&amp;quot;: &amp;quot;frontlidar(5):1.00/1.00&amp;quot;,&lt;br /&gt;
        &amp;quot;TCVar&amp;quot;: 0.0,&lt;br /&gt;
        &amp;quot;err&amp;quot;: 0.0,&lt;br /&gt;
        &amp;quot;historyLs&amp;quot;: &amp;quot;frontlidar:N1/5&amp;quot;,&lt;br /&gt;
        &amp;quot;powers&amp;quot;: &amp;quot;True:(,()&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;GOStat&amp;quot;: {&lt;br /&gt;
        &amp;quot;maxTension&amp;quot;: 0.0,&lt;br /&gt;
        &amp;quot;edgeN&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;OPS&amp;quot;: 8,&lt;br /&gt;
        &amp;quot;Use&amp;quot;: true&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;licence&amp;quot;: &amp;quot;DID:4D222EB2BEE27897&amp;quot;,&lt;br /&gt;
    &amp;quot;globalStat&amp;quot;: {&lt;br /&gt;
        &amp;quot;paused&amp;quot;: false,&lt;br /&gt;
        &amp;quot;IsSettingPosition&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 返回结果与Detour上相应对象的状态一致。&lt;br /&gt;
&lt;br /&gt;
=== 2.3.2 导出工作区 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/dumpWorkspace '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/dumpWorkspace&lt;br /&gt;
&lt;br /&gt;
OK&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 在Detour的log/workspace目录下生成图像日志，包括一张PNG图片，内容为Detour主界面的地图；一个运行日志文件。&lt;br /&gt;
&lt;br /&gt;
=== 2.3.3 读取点云 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/getSensors '''返回'''：字节流&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/getSensors&lt;br /&gt;
&lt;br /&gt;
// 返回字节流是点云数据，伪代码表述格式如下：&lt;br /&gt;
[&lt;br /&gt;
	{	// 激光雷达&lt;br /&gt;
		lidar.name : String;	// 雷达名称，C# String类型&lt;br /&gt;
		keyFrame.x : float;		// 关键帧位姿&lt;br /&gt;
		keyFrame.y : float;&lt;br /&gt;
		keyFrame.th : float;&lt;br /&gt;
		pointCloud.length : int;	// 点云数组长度&lt;br /&gt;
		[&lt;br /&gt;
			point.x : float;	// 测量点坐标&lt;br /&gt;
             point.y : float;&lt;br /&gt;
		]&lt;br /&gt;
	}&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* Detour使用此接口读取DetourLite点云数据。&lt;br /&gt;
* 调用该接口的频率应控制在2Hz以内，以免干扰Detour内核计算性能。&lt;br /&gt;
* 非必要不使用原则。如，在丢定位时（如l_step&amp;gt;15），在管控的维护功能界面显示点云，以帮助操作者识别移动机器人实际位姿，然后使用指定位置重定位接口找回定位。在这个场景中，只需在处理定位问题时读取点云，处理完毕后停止调用接口。&lt;br /&gt;
&lt;br /&gt;
=== 2.3.4 读取版本 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/getVersion '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
GET http://127.0.0.1:4321/getVersion&lt;br /&gt;
&lt;br /&gt;
shicong-liu@2024-06-26T13:25:22+08|master_b8dc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2.4 操作 ==&lt;br /&gt;
&lt;br /&gt;
=== 2.4.1 调用方法 ===&lt;br /&gt;
'''方法'''：GET '''路径'''：/call '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// 调用对象方法。&lt;br /&gt;
// cmd是对象方法。本例是调用cart_odometry.capture()方法，即&lt;br /&gt;
// 触发外部定位源cart_odometry（轮里程计）的捕获方法。&lt;br /&gt;
GET http://127.0.0.1:4321/call?cmd=cart_odometry.capture()&lt;br /&gt;
&lt;br /&gt;
// 返回该方法的返回值&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;result&amp;quot;: &amp;quot;void&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 本接口相当于RPC（Remote Procedure Call）调用。应根据代码调用。&lt;br /&gt;
&lt;br /&gt;
=== 2.4.2 设置激光雷达蒙板 ===&lt;br /&gt;
'''方法'''：POST '''路径'''：/setLidar2DOdometryMask '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// odometry是里程计标签中的里程计名称。本例的odometry_0是默认激光里程计名称。&lt;br /&gt;
// POST Body是蒙板顶点数组，用于构造出封闭多边形，落在多边形内的点云都会被过滤。&lt;br /&gt;
POST http://127.0.0.1:4321/setLidar2DOdometryMask?odometry=odometry_0&lt;br /&gt;
[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;X&amp;quot;: 123,&lt;br /&gt;
        &amp;quot;Y&amp;quot;: 456&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;X&amp;quot;: 123,&lt;br /&gt;
        &amp;quot;Y&amp;quot;: 456&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;X&amp;quot;: 123,&lt;br /&gt;
        &amp;quot;Y&amp;quot;: 456&lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;success&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;说明：&lt;br /&gt;
&lt;br /&gt;
* 本接口只影响内存中的配置，不会存入配置文件。&lt;br /&gt;
* 坐标参考车体编辑器，直角坐标系的原点在底盘几何中心。&lt;br /&gt;
&lt;br /&gt;
= 2.4 定位 =&lt;br /&gt;
&lt;br /&gt;
=== 2.4.1 外部定位源 ===&lt;br /&gt;
输入外部定位源前，首先要在车体编辑器里增加对应的“外部定位源”部件&lt;br /&gt;
&lt;br /&gt;
'''方法'''：POST '''路径'''：/postExternPosition '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// name是外部定位源。本例的cart_odometry是IMU轮里程计。&lt;br /&gt;
// POST Body是外部定位源的航迹。&lt;br /&gt;
POST http://127.0.0.1:4321/postExternPosition?name=cart_odometry&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;cart_odometry&amp;quot;,	// 轮里程计+IMU对应在Detour中的部件名&lt;br /&gt;
  &amp;quot;counter&amp;quot;: 0,				// 单调+1&lt;br /&gt;
  &amp;quot;hasTranslation&amp;quot;: true,	 // 可移动，(x, y) &lt;br /&gt;
  &amp;quot;hasRotation&amp;quot;: true,		// 可旋转，(th)&lt;br /&gt;
  &amp;quot;is3D&amp;quot;: false,			// 在三维平面运动，输出(x, y, z, th)&lt;br /&gt;
  &amp;quot;is2D&amp;quot;: true,				// 在二维平面运动，输出(x, y, th)&lt;br /&gt;
  &amp;quot;integrated&amp;quot;: true,	// 是否通过积分得到的位姿(轮里程计通过积分获得，gps是绝对位置)&lt;br /&gt;
  &amp;quot;startingTick&amp;quot;: 0,		// 时间戳，不变则表示这是一条航迹。程序启动时可用系统Ticks为初始值&lt;br /&gt;
  &amp;quot;x&amp;quot;: 0.0,				   // 当前位姿&lt;br /&gt;
  &amp;quot;y&amp;quot;: 0.0,&lt;br /&gt;
  &amp;quot;z&amp;quot;: 0.0,				   // 二维平面的z总是0&lt;br /&gt;
  &amp;quot;th&amp;quot;: 0.0,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;performed&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
说明：&lt;br /&gt;
&lt;br /&gt;
* 向Detour推送外部定位源的位姿。外部定位源一般是IMU轮里程计、GNSS RTK。Detour紧耦合功能融合多个里程计，择优输出一个位姿。&lt;br /&gt;
* IMU轮里程计的位姿发布频率建议20Hz（经测试获得的经验值）。&lt;br /&gt;
* 外部定位源的inputType=&amp;quot;web&amp;quot;，默认是&amp;quot;internal&amp;quot;（表示从Medulla发布）。设置错误将导致接口调用失败。&lt;br /&gt;
* 集成外部定位源时，应测试其发布频率，以免过快或过慢频率干扰紧耦合错误选用里程计。&lt;br /&gt;
&lt;br /&gt;
=== 2.4.2 外部二维码输入 ===&lt;br /&gt;
'''方法'''：Get'''路径'''：/call?cmd=lesstag.inputextern(id,x,y,th) '''返回'''：JSON&lt;br /&gt;
&lt;br /&gt;
举例：&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// id,x,y,th分别表示二维码的tag，xyth数值。&lt;br /&gt;
Get http://127.0.0.1:4321/call?cmd=lesstag.inputextern(id,x,y,th)&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;result&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
说明：&lt;br /&gt;
&lt;br /&gt;
* 配置此项功能需要把D参数中二维码配置useExtern改成true才可以生效&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=FAQ&amp;diff=900</id>
		<title>FAQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=FAQ&amp;diff=900"/>
		<updated>2025-04-17T06:03:57Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​/* 基础问题 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== 基础问题 ===&lt;br /&gt;
* Q: 机器人在转圈的时候，Detour为什么反馈的方向角从2.2度突然跳到了-357.8度，差了4.4度？&lt;br /&gt;
** A: 2.2度和-357.8度是同一个角度，并没有差了4.4度。另外能问出这个问题的同学，也经常卡在计算两个角度的角度差上，那么可以使用这个公式：&lt;br /&gt;
&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;thdiff = (th1-th2)-round((th1-th2)/360)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 调试原理性问题 ===&lt;br /&gt;
* Q: Simple下任务后，Clumsy的表现和预期不一致，或者做完任务后Simple还报错了，如何调试？&lt;br /&gt;
** A: Simple首先通过对车进行路径搜索（SegmentPlan.FindRoute）搜索到路径，然后通过Compile调用车体类挂载的Coder生成代码，最后通过车体类继承的actualSendScript进行脚本下发。对于Clumsy而言，下发的脚本会保存于debug目录下。首先检查脚本是否正确，然后调试Clumsy插件中继承SimpleAGVInterface的类（一般为AGV类），是否其函数按照正常的方法实现了（见[[通用约定]]）。&lt;br /&gt;
*Q: Simple不给锁，怎么看原因？&lt;br /&gt;
**A: 点开小车的状态面板，看TcStat交管信息。这个字段里显示了为什么不下发锁的原因。&lt;br /&gt;
*Q: Simple似乎死锁了？&lt;br /&gt;
**A: Simple非常非常难遇到真的死锁。可以看BlockedBy字段来判断到底是真的死锁了，还是因为路线图设计问题导致的关键等待。可能所有的车都在等一个关键车下发路线。&lt;br /&gt;
*Q: Simple包络似乎错了，两个车包络明明冲突但相撞了。&lt;br /&gt;
**A: 检查经过的路径的layerName，在不同layerName上的包络互相不冲突。比如layerName&lt;br /&gt;
*Q:使用激光+地纹导航时，出现车辆位置来回拉扯的情况，是怎么回事？&lt;br /&gt;
**A：首先检查detour.json中uscTC是否设置为true。然后还需要判断两个里程计的时序问题，在有独立显卡的工控机上，地纹延迟低，雷达延迟高，需要将单线雷达的time_bias_ms设置为-30至-50（具体根据雷达延迟），若使用核显跑地纹，地纹延迟会上升，此时将雷达和相机的tims_bias_ms都设置为0&lt;br /&gt;
&lt;br /&gt;
=== Detour使用常见问题 ===&lt;br /&gt;
&lt;br /&gt;
* Q:Detour软件没有在匹配地图，定位不理想，虽然建了地图，但地图就像没有用一样。手动拖拽位置也无法恢复位置。&lt;br /&gt;
** A: 这很可能是因为地图回环匹配线程没有开启，比如删了原图层并增加了个新图层。可以到对应面板里点“启动”来启动回环线程。&lt;br /&gt;
* Q: 为什么定不了位？界面不动？为什么电脑重启后无法定位？&lt;br /&gt;
** A: 很可能是因为没有启动。可以点“全部启动”按钮启动定位。如果需要自动后自动全部启动，勾选“自动开启”选项并保存配置。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E8%BE%93%E5%85%A5GPS%E5%A4%96%E9%83%A8%E5%AE%9A%E4%BD%8D&amp;diff=899</id>
		<title>输入GPS外部定位</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E8%BE%93%E5%85%A5GPS%E5%A4%96%E9%83%A8%E5%AE%9A%E4%BD%8D&amp;diff=899"/>
		<updated>2025-04-15T20:49:01Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;使用PostExternalFeed方法。可以使用[https://dev.lessokaji.com/index.php?topic=147.msg547#msg547 参考代码]或使用WebAPI。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DR刘:&lt;br /&gt;
&lt;br /&gt;
GPS的UI放到cyclegui里了。使用127.0.0.1:4322访问。首先要增加externposition，注意增加了一个属性叫remap。然后增加Mapping的Coordination Remapper，默认名位gnss_map。启动GPS后，应该看到lastX/lastY开始有数据。接下来首先要标定。标定时，gnss_map要在caliberation上。先建好激光地图。然后开到至少两个位置，并点Place site here。此时地图会出现白色的点，表示标定的GPS位置。&lt;br /&gt;
&lt;br /&gt;
DR刘:&lt;br /&gt;
&lt;br /&gt;
最后使用时，切换gnss_map为output模式就可以了&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E8%BE%93%E5%85%A5GPS%E5%A4%96%E9%83%A8%E5%AE%9A%E4%BD%8D&amp;diff=898</id>
		<title>输入GPS外部定位</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E8%BE%93%E5%85%A5GPS%E5%A4%96%E9%83%A8%E5%AE%9A%E4%BD%8D&amp;diff=898"/>
		<updated>2025-04-15T10:42:29Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​创建页面，内容为“使用PostExternalFeed方法。可以使用[https://dev.lessokaji.com/index.php?topic=147.msg547#msg547 参考代码]或使用WebAPI。”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;使用PostExternalFeed方法。可以使用[https://dev.lessokaji.com/index.php?topic=147.msg547#msg547 参考代码]或使用WebAPI。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=897</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=897"/>
		<updated>2025-04-15T10:38:37Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​/* 定位导航相关手册 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
[[文件:MDCS-2023.png|缩略图|159x159像素|MDCS logo 2023]]&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:1--&amp;gt;&lt;br /&gt;
MDCS是上海懒书智能科技开发的机器人软件构建框架，包括以下组件。&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
* Medulla：高效的硬件通信、控制和抽象平台。&lt;br /&gt;
* Detour：定位系统，内置激光雷达和视觉SLAM等。&lt;br /&gt;
* Clumsy：机器人运动指令平台，内置AGV/AMR的典型运动能力。&lt;br /&gt;
* Simple：机器人集群管理系统，核心为交通控制和寻路。&lt;br /&gt;
* CycleGUI：针对算法内核交互的回合式GUI框架，可在任何算法中随时提交协程由CycleGUI托管界面，协程仅在需要刷新界面时调用，效率很高。&lt;br /&gt;
* DIVER(Dotnet Integrated Vehicle Runtime): 是一个专门用于载具控制系统的.NET运行环境，可将C#程序开发的Medulla下位硬件控制程序无痛地运行在MCU中。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
更详细地综述见：[[特殊:我的语言/MDCS-Walkthrough|MDCS-Walkthrough]]  [[特殊:我的语言/MDCS概述|&amp;lt;s&amp;gt;MDCS概述&amp;lt;/s&amp;gt;]]&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
== 基本介绍 ==&lt;br /&gt;
&lt;br /&gt;
'''定位系统'''：AGV的定位是由独立模块《Detour》完成。Detour支持激光雷达和视觉的各类SLAM算法，包括[[特殊:我的语言/具有高鲁棒性的激光SLAM算法|具有高鲁棒性的2D激光SLAM算法]]、[[特殊:我的语言/地纹SLAM|地纹SLAM]]、[[特殊:我的语言/天花板SLAM|天花板SLAM]]、[[特殊:我的语言/二维码识别导航|二维码导航]]等，支持[[特殊:我的语言/多定位源的自动综合|多定位源的自动综合]]。Detour可以使用Medulla提供的数据来源、也可以自行获取。整套MDCS实施时一般使用Medulla提供的数据来源。&lt;br /&gt;
&lt;br /&gt;
'''AGV车载系统'''：由Medulla（硬件抽象逻辑）、Clumsy（车体运动抽象）组成并对功能定义；二者原理见[[特殊:我的语言/车体抽象原理|车体抽象原理]]。Medulla+Clumsy可实现各类车体动作，最简单诸如[[特殊:我的语言/巡线行走|巡线行走]]、[[特殊:我的语言/绕障行走|绕障行走]]等，复杂一些的例子如[[特殊:我的语言/自动识别工位并取放货|自动识别工位并取放货]]、[[特殊:我的语言/自动识别托盘取放货|自动识别托盘取放货]]、[[特殊:我的语言/识别料框并堆垛拆垛|识别料框并堆垛拆垛]]、[[特殊:我的语言/联动天眼系统进行装卸车|联动天眼系统进行装卸车]]等。车载软件定义了AGV的能力集以及测试方法，并可由调度软件做动作组合从而完成整套任务。&lt;br /&gt;
&lt;br /&gt;
'''车队调度'''：交管、寻路、包络、可达性分析等内核算法由SimpleCore提供，其原理参见[[特殊:我的语言/调度内核运行原理|内核运行原理]]，SimpleCore提供编程接口使得用户可对具体车型或业务场景编程声明寻路规则、运行脚本、包络、可达性需求等。对调度的运行原理参见：[[特殊:我的语言/AGV任务运行逻辑|AGV任务运行逻辑]] 。MDCS提供一个简单的壳层称为SimpleComposer，其提供UI和基础的车辆通信定义，在此之上还支持插件进一步定义车辆具体细节和业务逻辑。&lt;br /&gt;
&lt;br /&gt;
== 快速开始 ==&lt;br /&gt;
&lt;br /&gt;
'''定位'''&lt;br /&gt;
&lt;br /&gt;
如果您有Detour使用经验，请阅读 [[特殊:我的语言/下载并部署Detour|下载并部署Detour]] 快速开始。如果您首次使用Detour，请阅读详细教程：首先是 [[特殊:我的语言/安装Detour|安装Detour]] ，然后 [[标定激光雷达外参]] ，然后 [[激光SLAM建图]] ，用于优化地图的 [[激光地图编辑指南]] ，最后 使用激光SLAM功能 。&lt;br /&gt;
&lt;br /&gt;
在激光不友好的场景，我们可以使用地纹SLAM。请阅读[[地纹SLAM技术概述]]来了解这个特性。&lt;br /&gt;
&lt;br /&gt;
'''整车适配'''&lt;br /&gt;
&lt;br /&gt;
对于需要做整车适配的读者，请阅读以下文章。&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/MDCS引擎适配机器人入门教学|MDCS引擎适配机器人入门教学]]、[[特殊:我的语言/叉车适配案例|叉车(牵引车)适配案例]]、[[特殊:我的语言/潜伏顶升车(KIVA类小车)适配案例|潜伏顶升车(KIVA类小车)适配案例]]、[[特殊:我的语言/全向车适配案例|全向车适配案例]]、[[特殊:我的语言/牵引车适配案例|双阿克曼车型适配案例]]&lt;br /&gt;
&lt;br /&gt;
传感器适配&lt;br /&gt;
&lt;br /&gt;
[[2D激光雷达适配]]、[[3D相机适配]]（全局曝光、alt/azi固定的、像素化的3D雷达也算此类）、[[3D激光雷达适配]]、&lt;br /&gt;
&lt;br /&gt;
== 使用手册 ==&lt;br /&gt;
&lt;br /&gt;
=== 通识和入门教学 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/MDCS-Walkthrough|MDCS-Walkthrough]] &lt;br /&gt;
&lt;br /&gt;
[[Detour简介]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS简介|使用手册 - MDCS简介]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/激光SLAM的能力边界|激光SLAM的能力边界]]&lt;br /&gt;
&lt;br /&gt;
=== 定位导航相关手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 定位导航|使用手册 - 定位导航]]&lt;br /&gt;
&lt;br /&gt;
[[激光SLAM建图|使用手册 - 激光SLAM建图]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 激光SLAM＋反光板建图手册|使用手册 - 激光SLAM+反光板建图手册]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 分析定位问题|使用手册 - 分析定位问题]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 激光＋纹理导航|使用手册 - 激光+纹理导航]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Detour车体编辑器使用教学|使用手册 - Detour车体编辑器使用教学]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 双雷达标定手册|使用手册 - 双雷达标定手册]] / [[特殊:我的语言/标定双激光雷达外参|标定双激光雷达外参]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 在地纹导航中使用二维码快速找回定位|使用手册 - 在地纹导航中使用二维码快速找回定位]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 同时使用激光、地纹、二维码、轮编里程计和IMU进行鲁棒定位|使用手册 - 同时使用激光、地纹、二维码、轮编里程计和IMU进行鲁棒定位]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/标定激光雷达外参|标定激光雷达外参]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - 如何在核显工控机上运行地纹导航]]&lt;br /&gt;
&lt;br /&gt;
[[激光雷达选型测试报告]]&lt;br /&gt;
&lt;br /&gt;
[[输入GPS外部定位]]&lt;br /&gt;
&lt;br /&gt;
=== 运动控制使用手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用叉车自动取托盘功能|使用叉车自动取托盘功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用自动对准料架功能|使用自动对准料架功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用叉车料架堆叠功能|使用叉车料架堆叠功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/色带和磁条导航|色带和磁条导航]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/纯二维码导航|纯二维码导航]]&lt;br /&gt;
&lt;br /&gt;
=== 调度相关手册 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 车队管控|使用手册 - 车队管控]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册-routing字段：设置车辆必经点（必不经点）逻辑|使用手册 - routing字段：设置车辆必经点（必不经点）逻辑]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:从使用到开发]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:coder（路径编译器）机制详解]]  &lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Simple:包络如何定义]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS软件部署方法介绍|使用手册 - MDCS软件部署方法介绍]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Simple软件文件管理标准化作业|使用手册 - Simple软件文件管理标准化作业]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS适配流程说明|使用手册 - MDCS适配流程说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - MDCS适配详细说明|使用手册 - MDCS适配详细说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - Simple图层合并手册|使用手册 - Simple图层合并手册]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 寻路启发器功能|使用手册 - 寻路启发器功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 更多交管细节用法|使用手册 - 更多交管细节用法]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 劫持用法|使用手册 - 劫持用法]](用于中途更改路线)&lt;br /&gt;
&lt;br /&gt;
[[可达性状态编程|使用手册 - 可达性状态编程（用于如驶入式巷道叉车避免前车放货后影响后车运行等场景）]]&lt;br /&gt;
&lt;br /&gt;
=== 二次开发相关说明 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何适配新的雷达|如何适配新的雷达]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何使用CycleGUI快速开发UI界面|如何使用CycleGUI快速开发UI界面]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何使用LessokajiWeaver的多语言功能|如何使用LessokajiWeaver的多语言功能]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - 轨迹跟踪|开发手册 - 轨迹跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - 目标跟踪|开发手册 - 目标跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/开发手册 - SimpleComposer界面开发 - CAD工具|开发手册 - SimpleComposer界面开发 - CAD工具]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Medulla:相机使用方法 Camera Data Access Guide]]&lt;br /&gt;
&lt;br /&gt;
[[如何基于SimpleCore核心库进行调度系统开发]]&lt;br /&gt;
&lt;br /&gt;
=== 杂项 ===&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/如何查看工控机性能以及功耗墙|如何查看工控机性能以及功耗墙]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/使用手册 - 数据录制与回放手册|使用手册 - 数据录制与回放手册]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Linux MDCS部署配置和操作说明]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/FAQ|FAQ]]&lt;br /&gt;
&lt;br /&gt;
Cheat sheet&lt;br /&gt;
&lt;br /&gt;
[[Detour版本发布记录]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/待整理的杂项内容|待整理的杂项内容]]&lt;br /&gt;
&lt;br /&gt;
== 技术报告 ==&lt;br /&gt;
&lt;br /&gt;
* MDCS架构&lt;br /&gt;
** Medulla软件架构&lt;br /&gt;
** Detour软件架构&lt;br /&gt;
*** Detour激光SLAM算法详解&lt;br /&gt;
*** Detour地面纹理SLAM算法详解&lt;br /&gt;
** Simple软件架构&lt;br /&gt;
*** [[特殊:我的语言/调度内核运行原理|调度内核运行原理]]&lt;br /&gt;
**** 基于预先规划交管算法：[[特殊:我的语言/DPS调度算法详解|DPS调度算法详解]]&lt;br /&gt;
**** 流场规划&lt;br /&gt;
*** 基于网络流的业务规划器&lt;br /&gt;
* LessokajiWeaver编译后处理工具&lt;br /&gt;
* CycleGUI&lt;br /&gt;
&lt;br /&gt;
== 接口 ==&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Medulla-API|Medulla]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Detour-API|Detour]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Clumsy-API|Clumsy]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/Simple-API|Simple]]&lt;br /&gt;
&lt;br /&gt;
== 术语和约定 ==&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/通用约定|MDCS开发通用约定]]&lt;br /&gt;
&lt;br /&gt;
[[特殊:我的语言/定位导航|定位导航]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Medulla]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Detour]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Clumsy]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Simple]]&lt;br /&gt;
&lt;br /&gt;
== 特殊技术方案 ==&lt;br /&gt;
&lt;br /&gt;
当前MDCS的特殊技术方案包括：[[特殊:我的语言/托盘识别|托盘识别]]、[[特殊:我的语言/双车/多车联动|双车/多车联动]]、[[特殊:我的语言/汽车面差检测|汽车面差检测]]、[[特殊:我的语言/天眼系统|天眼系统]]、[[特殊:我的语言/自动装卸车应用|自动装卸车应用]]、[[特殊:我的语言/复合卷料机械手叉车|复合卷料机械手叉车]]、[[特殊:我的语言/清洁机器人|清洁机器人]]、[[特殊:我的语言/设备跟随联动|设备跟随联动]]。其它技术方案还在进一步补充中。&lt;br /&gt;
&lt;br /&gt;
== 链接 ==&lt;br /&gt;
&lt;br /&gt;
* [https://dl.lessokaji.com MDCS下载站]：MDCS的各类程序可在该站上下载&lt;br /&gt;
* [https://dev.lessokaji.com 技术讨论站]：包含FAQ、需求讨论、AGV项目实施经验等技术讨论&lt;br /&gt;
* [https://nuget.lessokaji.com MDCS专用Nuget源]：MDCS主要使用c#进行开发，该源包括主要会用的库&lt;br /&gt;
* [https://git.lessokaji.com MDCS代码库]：git源&lt;br /&gt;
* [https://auth.lessokaji.com MDCS授权站]：License授权、代码阅读和编译权限授权站&lt;br /&gt;
* 一些视频案例：链接：https://pan.baidu.com/s/1foIUJzCnpbEaNoy6ooVbJg 提取码：2of9&lt;br /&gt;
__无目录__&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E5%8F%AF%E8%BE%BE%E6%80%A7%E7%8A%B6%E6%80%81%E7%BC%96%E7%A8%8B&amp;diff=896</id>
		<title>可达性状态编程</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E5%8F%AF%E8%BE%BE%E6%80%A7%E7%8A%B6%E6%80%81%E7%BC%96%E7%A8%8B&amp;diff=896"/>
		<updated>2025-04-07T05:49:45Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​/* 【四向穿梭车场景中，多台车向同一个巷道送货】Demo。 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;可达性状态编程是SimpleCore提供的重要功能。AGV集群运行时经常出现多车的业务相关的通行顺序，这些通行顺序和地图、包络等无关，仅仅和场景状态有关。比如以下一些典型场景：&lt;br /&gt;
* 四向穿梭车场景中，多台车向同一个巷道送货。&lt;br /&gt;
* 驶入式巷道中，多台叉车向同一个巷道送货或取货。&lt;br /&gt;
* 产线对接时，使用两台车分别进行取满托盘、送空托盘。&lt;br /&gt;
* 车辆各自去不同地点加工，在最终汇集路线上保持特定排序。&lt;br /&gt;
&lt;br /&gt;
Simple提供Reachability功能来自动化处理这些冲突。类似于编程器（Coder）和包络（Enveloper），可达状态也是通过插件来声明的。可用的方法包括：&lt;br /&gt;
&lt;br /&gt;
* SiteReachability/TrackReachability中：Require/Reject/Declare/Clear，分别为“需要某个状态”，“如果某状态存在则拒绝”，“声明一个状态”，“清除某个状态”&lt;br /&gt;
* 可以使用Scene.DeclareOracleState/ClearOracleState来生成'''主要由调度生成的状态'''。&lt;br /&gt;
* '''如果主要由车辆生成、消灭的状态'''，出现运行异常情况使得状态无法消除或增加，可以使用Scene.RemoveReachabilityState/AddReachabilityState来从外部增加或删除状态（比如车辆故障，人工拿走了货物或放下了货物等）。&lt;br /&gt;
* 使用Scene.conf.status.reachabilityState 查看全部状态。&lt;br /&gt;
&lt;br /&gt;
=== 【四向穿梭车场景中，多台车向同一个巷道送货】Demo。 ===&lt;br /&gt;
[[文件:四向穿梭车多车送货举例.jpg|缩略图|四向穿梭车多车送货举例，A车B车同时往一个巷道送货。此时只能B车先送货后，A车才能送货。否则A车放下的货物会妨碍B车将货物送达终点。]]&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public class LoadedTest : SiteReachability&amp;lt;ReachabilityTestCar&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 public override int priority =&amp;gt; 1;&lt;br /&gt;
 public override bool Use() =&amp;gt; plan.fields.ContainsKey(&amp;quot;put&amp;quot;); //对于该点，是否使用本判定器？&lt;br /&gt;
 public override bool Block() =&amp;gt; false; //若使用本判定器，是否还使用别的判定器？&lt;br /&gt;
 public override void Prompt() =&amp;gt; this.Reject($&amp;quot;cargo{site.id}&amp;quot;); //如何判定？&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class PutCargo : SiteReachability&amp;lt;ReachabilityTestCar&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 public override int priority =&amp;gt; 1;&lt;br /&gt;
 public override bool Use() =&amp;gt; plan.fields.ContainsKey(&amp;quot;put&amp;quot;) &amp;amp;&amp;amp; curSeg == plan.segments.Count - 1;&lt;br /&gt;
 public override bool Block() =&amp;gt; false;&lt;br /&gt;
 public override void Prompt() =&amp;gt; Declare($&amp;quot;cargo{site.id}&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;理解要点：&lt;br /&gt;
&lt;br /&gt;
# 可达性编程的测试，是对车辆各自进行判断“如果存在某个状态，那么下个点还是否允许走”。它不声明“全局指挥性”的约束——虽然这种约束经常能拆分成车辆的各自判断。&lt;br /&gt;
&lt;br /&gt;
=== 【车辆各自去不同地点加工，在最终汇集路线上保持特定排序】Demo ===&lt;br /&gt;
场景：某主线AGV，路径是环线，小车会按照车号顺序依次行驶。由于车型不同，装配工位因此不同，存在分支路径：会需要AGV停靠在B、C点装配并需要不确定的时间。而在汇入E的时候需要保证原先的跟车顺序。根据Reachability特性，可以实现该功能，方式如下：&lt;br /&gt;
&lt;br /&gt;
[[文件:Image22.png|无框|1117x1117像素]]&lt;br /&gt;
&lt;br /&gt;
根据小车VIN号进行排序，解锁的条件可以提炼成：当前车辆VIN号-1的车辆经过汇入点后，当前车才允许拿到汇入点的锁，因此状态条件如下&lt;br /&gt;
&lt;br /&gt;
Require($&amp;quot;passed{myvin - 1}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Clear($&amp;quot;passed{myvin - 1}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
在Require给锁后把该状态清理&lt;br /&gt;
并且声明当前车的状态，用于后车的下次汇入的条件判断&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public class WaitForVINOrder : SiteReachability&amp;lt;MultiWheelLifterCar&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    public override int priority =&amp;gt; 1;&lt;br /&gt;
    public override bool Block() =&amp;gt; false;&lt;br /&gt;
    public override void Prompt()&lt;br /&gt;
    {&lt;br /&gt;
     if (usingCar.tags.ContainsKey(&amp;quot;Vin&amp;quot;))&lt;br /&gt;
     {&lt;br /&gt;
         var myVin = int.Parse(usingCar.tags[&amp;quot;Vin&amp;quot;]);&lt;br /&gt;
         if (myVin &amp;gt; 0)&lt;br /&gt;
         {&lt;br /&gt;
             Require($&amp;quot;passed{myVin - 1}&amp;quot;);&lt;br /&gt;
             Clear($&amp;quot;passed{myVin - 1}&amp;quot;);&lt;br /&gt;
         }&lt;br /&gt;
&lt;br /&gt;
         Declare($&amp;quot;passed{myVin}&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
    }&lt;br /&gt;
    public override bool Use()&lt;br /&gt;
    {&lt;br /&gt;
        return site.fields.ContainsKey(&amp;quot;confluence&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=MDCS%E5%8F%82%E6%95%B0%E8%A1%A8:Detour&amp;diff=893</id>
		<title>MDCS参数表:Detour</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=MDCS%E5%8F%82%E6%95%B0%E8%A1%A8:Detour&amp;diff=893"/>
		<updated>2025-03-25T04:11:47Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​/* 2.2 激光里程计 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= 一、概述 =&lt;br /&gt;
[[文件:基于优化的SLAM框架.png|无框|592x592像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 1-1 基于优化的SLAM框架'''&lt;br /&gt;
Detour的激光SLAM由前端和后端构成。激光雷达输出点云到前端，前端使用激光里程计得到相邻点云帧间位移，积分出机器人位姿，这就是局部建图。由于积分会累积误差，因此后端使用激光地图纠正激光里程计误差，通过全局优化使激光里程计输出精确的机器人位姿，这称为全局建图。&lt;br /&gt;
&lt;br /&gt;
Detour的激光SLAM由前端和后端构成。激光雷达输出点云到前端，前端使用激光里程计得到相邻点云帧间位移，积分出机器人位姿，这就是局部建图。由于积分会累积误差，因此后端使用激光地图纠正激光里程计误差，通过全局优化使激光里程计输出精确的机器人位姿，这称为全局建图。&lt;br /&gt;
&lt;br /&gt;
当我们在一个空白地图上建图时，Detour把关键帧（激光雷达观测到的环境轮廓，也称为路标）记录到激光地图，并建立关键帧的约束关系，关键帧位姿则通过激光里程计获取。由于激光里程计的累积误差特性，因此我们在建图时要求遥控机器人沿建图路线走来回，使Detour能够从不同角度观测到相同的物体，以图优化消除误差，并建立起正确的关键帧间约束关系（激光地图上关键帧之间的连线）。&lt;br /&gt;
&lt;br /&gt;
在定位模式下，前端以激光里程计持续输出机器人位姿，闭环检测则不断比较点云与邻近关键帧的配准分数，当配准分数大于设定阈值，且当前位姿与激光地图计算所得位姿的误差小于设定阈值时，则通过全局优化修正激光里程计误差。&lt;br /&gt;
&lt;br /&gt;
除激光雷达标定外参以外，Detour的默认参数可用于大多数场景。在特定环境下需要调整前后端参数，这些调整基于最佳实践，我们在参数说明中会提供。如果不清楚要调整的参数，请联系技术支持工程师咨询。&amp;lt;blockquote&amp;gt;提示：修改参数时建议多备份配置文件，每次只修改一组关联参数，以免一次性修改多个参数后引入多个误差，不利于排查问题。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 二、激光SLAM =&lt;br /&gt;
&lt;br /&gt;
== 2.1 激光雷达 ==&lt;br /&gt;
&lt;br /&gt;
=== 2.1.1 2D激光雷达 ===&lt;br /&gt;
[[文件:Image-20241114095213899.png|无框|618x618像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-1 2D激光雷达'''&lt;br /&gt;
&lt;br /&gt;
在车体编辑器中，通过“添加 / 单线雷达”菜单向车体部署2D激光雷达。配置项在detour.json的“layout/components”下，类型为“lidar2d”&lt;br /&gt;
    &amp;quot;components&amp;quot;: [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;lidar2d,component,haveposition&amp;quot;,&lt;br /&gt;
         &amp;quot;options&amp;quot;: {&lt;br /&gt;
           &amp;quot;isCircle&amp;quot;: false,&lt;br /&gt;
           &amp;quot;angleSgn&amp;quot;: 1.0,&lt;br /&gt;
           &amp;quot;endAngle&amp;quot;: 0.0,&lt;br /&gt;
           &amp;quot;rangeStartAngle&amp;quot;: -180.0,&lt;br /&gt;
           &amp;quot;rangeEndAngle&amp;quot;: 180.0,&lt;br /&gt;
           &amp;quot;x&amp;quot;: 350.0,&lt;br /&gt;
           &amp;quot;y&amp;quot;: 10.0,&lt;br /&gt;
           &amp;quot;th&amp;quot;: 0.0,&lt;br /&gt;
           ...&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
2D激光雷达需要关注的是其扫描角度和安装位置，后者一般称为“雷达外参”。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''扫描角度相关参数'''''：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! 参数            !! 说明                                                         !! 取值来源&lt;br /&gt;
|-&lt;br /&gt;
| isCircle        || =true表示激光雷达是360度视野，否则为false。                  || 激光雷达用户手册&lt;br /&gt;
|-&lt;br /&gt;
| angleSgn        || 雷达扫描方向。1 为逆时针，-1为顺时针。&amp;lt;br /&amp;gt;此项为雷达本身特性，不随雷达安装方式（正装/倒装）变化而改变。&amp;lt;br /&amp;gt;（倒装雷达使用雷达驱动的setMirror(true)方法设置）。 || &lt;br /&gt;
|-&lt;br /&gt;
| endAngle        || 雷达每帧扫描结束的角度。此项为雷达本身特性，不随雷达安装方式&amp;lt;br /&amp;gt;变化而改变，也不受rangeStartAngle和rangeEndAngle影响。 || &lt;br /&gt;
|-&lt;br /&gt;
| rangeStartAngle || 雷达实际有效扫描范围开始的角度。                            || 根据车体设计判断，一般是激光&amp;lt;br /&amp;gt;雷达手册提供的参数值。如果&amp;lt;br /&amp;gt;激光雷达视野被车体遮挡，则&amp;lt;br /&amp;gt;应跳过被遮挡角度，以滤掉&amp;lt;br /&amp;gt;遮挡产生的噪声点云。&lt;br /&gt;
|-&lt;br /&gt;
| rangeEndAngle   || 雷达实际有效扫描范围结束的角度。                            || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''雷达安装相关参数'''''：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! 参数 !! 说明 !! 取值来源&lt;br /&gt;
|-&lt;br /&gt;
| x || 激光雷达距离底盘运动中心的X轴距离(mm)。运动中心与轮系相关，叉车（单舵轮）是两个从动轮的连线中点，差动轮（KIVA）是两个驱动轮连线中点，全向底盘则是驱动轮组的连线中点。底盘运动控制算法把底盘认为一个质点，然后把质点运动的线速度和角速度分解到驱动轮。通过x &amp;amp; y参数，可以把激光雷达（逻辑上）移动到底盘运动中心，使之与底盘质点重合，以简化运动控制算法逻辑。 || 初始值来自于车体机械图纸，随后通过标定获得精确值。参见“标定激光雷达外参”。&lt;br /&gt;
|-&lt;br /&gt;
| y || Y轴距离。 || &lt;br /&gt;
|-&lt;br /&gt;
| th || 激光雷达安装角度偏差（度）。 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''有反（使用反光棒/板）SLAM相关参数'''''：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! 参数           !! 说明                                                         !! 取值来源&lt;br /&gt;
|-&lt;br /&gt;
| useReflex       || =true启用有反SLAM功能。                                      || &lt;br /&gt;
|-&lt;br /&gt;
| reflexThres     || 测量点的反射强度阈值，大于该阈值的测量点被认为由反光棒/板形成。激光雷达驱动的setReflexRange方法设置测量点的反射最大值，然后换算为[0, 1]区间的反射率。本参数用途是过滤出反光棒/板的测量点。 || 默认值0.3&lt;br /&gt;
|-&lt;br /&gt;
| reflexChunkThres || 对于存在一组相邻的有反（反射强度&amp;gt;reflexThres）测量点时（比如反光板），使用该参数作为邻近有反测量点的过滤阈值，然后合并相邻有反测量点为一个。 || 默认值2.5&lt;br /&gt;
|-&lt;br /&gt;
| reflexSize      || 反光板最大尺寸(mm)。用于过滤有反噪音点。                     || 默认值100&lt;br /&gt;
|-&lt;br /&gt;
| reflexDistBias  || 反光棒半径(mm)。一般而言，在大动态场景下启用有反SLAM时，建议用统一规格的反光棒。反光棒能够准确反射不同角度射入的测量激光，从而提供稳定一致的测量数据。反光板一般用于较近距离测量，此时入射角产生的反射强度差异可忽略不计。 || 默认值10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''其他参数'''''：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! 参数         !! 说明                                                         !! 取值来源&lt;br /&gt;
|-&lt;br /&gt;
| ignoreDist    || 激光雷达盲区(mm)。用于过滤无效测量点。                       || 激光雷达手册&lt;br /&gt;
|-&lt;br /&gt;
| maxDist       || 激光雷达最大测量距离(mm)。                                  || &lt;br /&gt;
|-&lt;br /&gt;
| time_bias_ms  || 点云帧延迟时间。紧耦合多里程计时，通过该参数降低激光雷达的测量频率，使其与其他低频传感器匹配。 || 默认值0&lt;br /&gt;
|-&lt;br /&gt;
| gridSelSz     || （点云降采样的）占用格尺寸(mm)。                            || 默认值20&lt;br /&gt;
|-&lt;br /&gt;
| correctionType || 激光雷达运动畸变纠正算法。默认值是&amp;quot;angle&amp;quot;，&amp;quot;none&amp;quot;则关闭。  ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.2.2 3D激光雷达 ===&lt;br /&gt;
[[文件:Image-20241114111617876.png|无框|581x581像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-2 3D激光雷达'''&lt;br /&gt;
&lt;br /&gt;
与2D激光雷达相比，3D激光雷达能够提供垂直空间的测量数据，多用于室外场景。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:1640162333564644.png|无框|658x658像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-3 3D点云'''&lt;br /&gt;
&lt;br /&gt;
Detour 3D SLAM的计算过程分为两步，第一步提取3D点云的空间特征，把垂直空间结构（如墙体、树干、立柱）提取为特征线段；第二部把空间特征二向化，输出到SLAM算法。因此3D雷达要配套二向化雷达使用，Livox Mid360（非周期性激光雷达）配套“二向化mid360雷达”，其他3D雷达（比如速腾）配套“二向化3D雷达”。&lt;br /&gt;
&lt;br /&gt;
在应用3D SLAM时，需要理解垂直空间结构。我们以道路旁的围墙举例，如图3-3所示，3D雷达在围墙上有若干条水平扫描线，以3D雷达的水平角分辨率为单位，可绘制出若干垂直线段，构成线段的点数量由3D雷达的垂直角分辨率决定。垂直线段可用其长度和扫描点数量描述。比如 Vn 是水平角度n观察到的垂直线段，其长度为V，有m个测量点。&lt;br /&gt;
&lt;br /&gt;
Detour以高度为垂直结构分配权重。以3D雷达的垂直扫描方向0度为赤道面，距离赤道面越近的垂直结构其权重越高。&lt;br /&gt;
&lt;br /&gt;
二向化后的点云与2D雷达一样，熟悉2D SLAM的用户可以轻松使用3D SLAM。&lt;br /&gt;
如果您首次使用3D SLAM，或者引入一个新型号3D激光雷达，建议使用Detour + Medulla组合以了解3D SLAM或3D雷达性能。Medulla能够显示3D点云，相比于Detour的二向化后的2D点云，它能够看到原始点云，有利于发现与雷达相关的问题。&lt;br /&gt;
&lt;br /&gt;
如果您首次使用3D SLAM，或者引入一个新型号3D激光雷达，建议使用Detour + Medulla组合以了解3D SLAM或3D雷达性能。Medulla能够显示3D点云，相比于Detour的二向化后的2D点云，它能够看到原始点云，有利于发现与雷达相关的问题。&lt;br /&gt;
&lt;br /&gt;
3D雷达的扫描与安装参数与2D雷达相同。我们重点讲解3D SLAM相关的参数。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''雷达特性相关参数'''''：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! 参数         !! 说明                                                         !! 取值来源&lt;br /&gt;
|-&lt;br /&gt;
| integrityThres || 点云总数完整性阈值。对于Livox Mid360这种非周期性扫描雷达，存在点云完整性问题。根据Mid360手册，它需要2s左右观测时间，在此之前输出的点云是被观测物体的部分，这是和周期性扫描雷达不同之处。通过本参数可适配Mid360，经验值是0.6。 || 默认值0.9&lt;br /&gt;
|-&lt;br /&gt;
| decay         || 非周期扫描雷达的衰减过期预计，该参数与decaySt配套使用。当机器人在运动时，对同一个物体的测量点因雷达运动而发生畸变，因此要做运动畸变修正。Mid360非周期性扫描导致运动畸变更甚，因此需要该参数修正。经验值是0.65。 || 默认值0.9&lt;br /&gt;
|-&lt;br /&gt;
| decaySt       || 衰减开始的计数值。Mid360扫描周期是100ms，每周期计数1次。经验值是5。 || 默认值1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
二向化雷达'''''垂直结构相关参数'''''：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! 参数        !! 说明                                                         !! 取值来源&lt;br /&gt;
|-&lt;br /&gt;
| minVStruct  || 垂直结构（线段）长度(mm)。                                   || 默认值1000&lt;br /&gt;
|-&lt;br /&gt;
| minScans    || 垂直结构测量点最低数量。两点定一条线段，该参数一般最小值为3。由于激光雷达以扇面发射测量光束，因此对同一个物体而言，测量点数量与距离有关，距离越远则测量点越少。如果3D雷达使用近距离物体作为定位依据，比如运行在生产线旁的叉车，则测量点数量可增加到6个，以提高垂直结构的识别置信度。如果3D雷达使用远距离物体作为定位依据，比如运行在室外的牵引车，则要降低测量点数量。测量点数量首先根据作业场景做数学估算，即根据定位物体的距离，以及3D激光雷达的垂直角分辨率，计算出合理的测量点数量。然后根据Detour（二向化点云）的建图效果校验，如果出现雷达能够观测但Detour没显示的情况，应调整minScans参数以提高识别率。 || 默认值6&lt;br /&gt;
|-&lt;br /&gt;
| Zfadout     || 3D激光雷达扫描赤道面附近的垂直结构距离偏好值(mm)。赤道面加减Zfadout范围内的垂直结构权重更高。 || 默认值300&lt;br /&gt;
|-&lt;br /&gt;
| pivotFac    || 直线取位比例，与pivotPos配套使用。从点云识别出来的垂直线段以其权重（由minVStruct、minScans、zFadout）降序排列，pivotPos用于在权重列表中采样位置（此处是权重90%处）。两者联合决定应该采纳的垂直结构区间。 || 默认值0.05&lt;br /&gt;
|-&lt;br /&gt;
| pivotPos    || 权重比例，决定权重阈值。                                     || 默认值0.9&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''其他参数'''''：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! 参数     !! 说明                             !! 取值来源&lt;br /&gt;
|-&lt;br /&gt;
| aziRes   || 逻辑上的垂直角分辨率。           || 默认值0.33&lt;br /&gt;
|-&lt;br /&gt;
| merge_dist || 邻近点云合并距离(mm)，&amp;lt;0不合并。 || 默认值50&lt;br /&gt;
|-&lt;br /&gt;
|scale&lt;br /&gt;
|点云缩放比例。对点云计算有影响力的点集中在30米之内，用于室内导航的 2D激光雷达测量距离一般30米以内，在室外则不然。因此 室外场景需要把3D激光雷达的点云尺度做适当缩放，以利 点云配准。一般而言，3D激光雷达的scale=0.5，对应于 60米以内点云，如果距离更远，则scale适当降低。在调整 scale时，底盘尺寸（宽高）和雷达外参（x &amp;amp; y）等比调整， 比如scale=0.5时，底盘尺寸如果是L2000W1000，则改为 L1000W500。调整scale后，遥控AMR自旋，detour输出 位姿应平滑变化，不应出现抖动或大幅跳动现象（这种 现象由于尺度配置错误导致应配准点云被过滤造成）。&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2.2 激光里程计 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 参数说明&lt;br /&gt;
|-&lt;br /&gt;
! 参数           !! 说明                                                         !! 取值来源&lt;br /&gt;
|-&lt;br /&gt;
| localmapErrorXY || 激光里程计最大位置误差(mm)。如果激光里程计输出位姿的变化值大于最大误差，则丢弃。 || 默认值70&lt;br /&gt;
|-&lt;br /&gt;
| localmapErrorTh || 激光里程计最大角度误差(度)。                                 || 默认值3&lt;br /&gt;
|-&lt;br /&gt;
|switchingDist&lt;br /&gt;
|关键帧切换距离。车辆运行超过这个距离必然切换关键帧（并进行地图匹配），如果使用3D雷达并使用了scale缩小地图，可以调小&lt;br /&gt;
|2000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2.3 激光地图 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 参数说明&lt;br /&gt;
|-&lt;br /&gt;
! 参数                                                         !! 说明                                                         !! 取值来源&lt;br /&gt;
|-&lt;br /&gt;
| step_error_xy &amp;amp; step_error_th&amp;lt;br /&amp;gt;baseErrorXY &amp;amp; baseErrorTh || 激光地图输出位姿与当前位姿的误差范围。当闭环检测判断当前点云与激光地图的某个关键帧配准达标时，将锁定该关键帧，并根据此关键帧修正激光里程计误差。如果误差大于设定阈值时，关键帧锁定失败，l_step增大（Detour状态栏的ls即为l_step，锁定关键帧时=2）。设定阈值是计算值，公式为 baseError + l_step * step_error。可知 l_step 越大，位姿误差越大。一般来说，l_step &amp;lt; 16，激光里程计不会出现明显误差，超过则应结合机器人运动状态采取安全措施，比如机器人在运动时 l_step&amp;gt;16 应报警停车。由于激光里程计的角分辨率到0.1度，精确度很好（激光长测距带来的优点），一般调整 step_error_xy 来提高全局优化鲁棒性，使机器人在激光不良区域短距离行走时产生的误差不会导致关键帧锁定失败。step_error_xy 一般经验值100(mm)。 || step_error_xy&amp;lt;br /&amp;gt;默认值50，&amp;lt;br /&amp;gt;step_error_th默认值1。&lt;br /&gt;
|-&lt;br /&gt;
| max_error_xy &amp;amp; max_error_th                                  || 激光地图输出位姿与当前位姿的最大误差值。                     || 9999999 &amp;amp; 180&lt;br /&gt;
|-&lt;br /&gt;
| frame_kill_distance                                          || 建图参数，相邻关键帧间距离的最小值(mm)。（在此距离内如果有2个关键帧，会删除其中1个）                  || 默认值700&lt;br /&gt;
|-&lt;br /&gt;
| frame_distant                                                || 匹配时的关键帧的搜索半径。 || 默认值6000(mm)。（修改过3D雷达的scale，或经常匹配到远处的关键帧，可以减小，如2000）&lt;br /&gt;
|-&lt;br /&gt;
| ScoreThres                                                    || 点云配准及格率值(%)。配准分数&amp;gt;ScoreThres的关键帧可用于全局优化。调整该参数时，应根据机器人沿路线行走时的匹配分数取值（关键帧配准分数在Detour界面可见）。 || 默认值0.35&lt;br /&gt;
|-&lt;br /&gt;
| regConnectedKF                                                || 与锁定关键帧有约束关系（激光地图上关键帧间连线）的关键帧纳入搜索范围。会对匹配速度有少量影响（变慢） || 默认值false，若地图关键帧点云经常不全，可以改为true。&lt;br /&gt;
|-&lt;br /&gt;
| regReflexOnHardCase                                            || =true表示在“匹配困难区域”（黄色）执行有反SLAM算法。      || 默认值true&lt;br /&gt;
|-&lt;br /&gt;
|GregThres&lt;br /&gt;
|如果点云配准小于这个分数，则试图粗匹配。粗匹配会搜索所有可能的匹配，如果匹配情况一般较好，则可以调低这个阈值防止粗匹配（较为耗时且可能在重复场景中可能错位匹配）&lt;br /&gt;
|默认值0.5，若经常错位，可以改为0.4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2.4 Guru ==&lt;br /&gt;
detour.json的&amp;quot;guru&amp;quot;配置段用于配置全局参数。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 参数说明&lt;br /&gt;
|-&lt;br /&gt;
! 参数          !! 说明                                                         !! 取值来源&lt;br /&gt;
|-&lt;br /&gt;
| inputScale    || （全局性）修改点云比例。                                      || 默认值1&lt;br /&gt;
|-&lt;br /&gt;
| Lidar2DAggregateRegistrationThres || 拼接2D雷达，“相对于另一个雷达配准”时的点云配准分数阈值。 || 默认值0.3&lt;br /&gt;
|-&lt;br /&gt;
| useTC         || =true启用紧耦合功能。使用一个里程计时（如仅配置激光雷达），应该关闭。 || 默认值false&lt;br /&gt;
|-&lt;br /&gt;
| autoStart     || 自动启动激光里程计。Detour“概况”标签中的“全部启动”按钮将该参数设为true。 || 默认值false&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=MDCS%E5%8F%82%E6%95%B0%E8%A1%A8:Detour&amp;diff=892</id>
		<title>MDCS参数表:Detour</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=MDCS%E5%8F%82%E6%95%B0%E8%A1%A8:Detour&amp;diff=892"/>
		<updated>2025-03-25T04:08:57Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​/* 2.3 激光地图 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= 一、概述 =&lt;br /&gt;
[[文件:基于优化的SLAM框架.png|无框|592x592像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 1-1 基于优化的SLAM框架'''&lt;br /&gt;
Detour的激光SLAM由前端和后端构成。激光雷达输出点云到前端，前端使用激光里程计得到相邻点云帧间位移，积分出机器人位姿，这就是局部建图。由于积分会累积误差，因此后端使用激光地图纠正激光里程计误差，通过全局优化使激光里程计输出精确的机器人位姿，这称为全局建图。&lt;br /&gt;
&lt;br /&gt;
Detour的激光SLAM由前端和后端构成。激光雷达输出点云到前端，前端使用激光里程计得到相邻点云帧间位移，积分出机器人位姿，这就是局部建图。由于积分会累积误差，因此后端使用激光地图纠正激光里程计误差，通过全局优化使激光里程计输出精确的机器人位姿，这称为全局建图。&lt;br /&gt;
&lt;br /&gt;
当我们在一个空白地图上建图时，Detour把关键帧（激光雷达观测到的环境轮廓，也称为路标）记录到激光地图，并建立关键帧的约束关系，关键帧位姿则通过激光里程计获取。由于激光里程计的累积误差特性，因此我们在建图时要求遥控机器人沿建图路线走来回，使Detour能够从不同角度观测到相同的物体，以图优化消除误差，并建立起正确的关键帧间约束关系（激光地图上关键帧之间的连线）。&lt;br /&gt;
&lt;br /&gt;
在定位模式下，前端以激光里程计持续输出机器人位姿，闭环检测则不断比较点云与邻近关键帧的配准分数，当配准分数大于设定阈值，且当前位姿与激光地图计算所得位姿的误差小于设定阈值时，则通过全局优化修正激光里程计误差。&lt;br /&gt;
&lt;br /&gt;
除激光雷达标定外参以外，Detour的默认参数可用于大多数场景。在特定环境下需要调整前后端参数，这些调整基于最佳实践，我们在参数说明中会提供。如果不清楚要调整的参数，请联系技术支持工程师咨询。&amp;lt;blockquote&amp;gt;提示：修改参数时建议多备份配置文件，每次只修改一组关联参数，以免一次性修改多个参数后引入多个误差，不利于排查问题。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 二、激光SLAM =&lt;br /&gt;
&lt;br /&gt;
== 2.1 激光雷达 ==&lt;br /&gt;
&lt;br /&gt;
=== 2.1.1 2D激光雷达 ===&lt;br /&gt;
[[文件:Image-20241114095213899.png|无框|618x618像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-1 2D激光雷达'''&lt;br /&gt;
&lt;br /&gt;
在车体编辑器中，通过“添加 / 单线雷达”菜单向车体部署2D激光雷达。配置项在detour.json的“layout/components”下，类型为“lidar2d”&lt;br /&gt;
    &amp;quot;components&amp;quot;: [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;lidar2d,component,haveposition&amp;quot;,&lt;br /&gt;
         &amp;quot;options&amp;quot;: {&lt;br /&gt;
           &amp;quot;isCircle&amp;quot;: false,&lt;br /&gt;
           &amp;quot;angleSgn&amp;quot;: 1.0,&lt;br /&gt;
           &amp;quot;endAngle&amp;quot;: 0.0,&lt;br /&gt;
           &amp;quot;rangeStartAngle&amp;quot;: -180.0,&lt;br /&gt;
           &amp;quot;rangeEndAngle&amp;quot;: 180.0,&lt;br /&gt;
           &amp;quot;x&amp;quot;: 350.0,&lt;br /&gt;
           &amp;quot;y&amp;quot;: 10.0,&lt;br /&gt;
           &amp;quot;th&amp;quot;: 0.0,&lt;br /&gt;
           ...&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
2D激光雷达需要关注的是其扫描角度和安装位置，后者一般称为“雷达外参”。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''扫描角度相关参数'''''：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! 参数            !! 说明                                                         !! 取值来源&lt;br /&gt;
|-&lt;br /&gt;
| isCircle        || =true表示激光雷达是360度视野，否则为false。                  || 激光雷达用户手册&lt;br /&gt;
|-&lt;br /&gt;
| angleSgn        || 雷达扫描方向。1 为逆时针，-1为顺时针。&amp;lt;br /&amp;gt;此项为雷达本身特性，不随雷达安装方式（正装/倒装）变化而改变。&amp;lt;br /&amp;gt;（倒装雷达使用雷达驱动的setMirror(true)方法设置）。 || &lt;br /&gt;
|-&lt;br /&gt;
| endAngle        || 雷达每帧扫描结束的角度。此项为雷达本身特性，不随雷达安装方式&amp;lt;br /&amp;gt;变化而改变，也不受rangeStartAngle和rangeEndAngle影响。 || &lt;br /&gt;
|-&lt;br /&gt;
| rangeStartAngle || 雷达实际有效扫描范围开始的角度。                            || 根据车体设计判断，一般是激光&amp;lt;br /&amp;gt;雷达手册提供的参数值。如果&amp;lt;br /&amp;gt;激光雷达视野被车体遮挡，则&amp;lt;br /&amp;gt;应跳过被遮挡角度，以滤掉&amp;lt;br /&amp;gt;遮挡产生的噪声点云。&lt;br /&gt;
|-&lt;br /&gt;
| rangeEndAngle   || 雷达实际有效扫描范围结束的角度。                            || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''雷达安装相关参数'''''：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! 参数 !! 说明 !! 取值来源&lt;br /&gt;
|-&lt;br /&gt;
| x || 激光雷达距离底盘运动中心的X轴距离(mm)。运动中心与轮系相关，叉车（单舵轮）是两个从动轮的连线中点，差动轮（KIVA）是两个驱动轮连线中点，全向底盘则是驱动轮组的连线中点。底盘运动控制算法把底盘认为一个质点，然后把质点运动的线速度和角速度分解到驱动轮。通过x &amp;amp; y参数，可以把激光雷达（逻辑上）移动到底盘运动中心，使之与底盘质点重合，以简化运动控制算法逻辑。 || 初始值来自于车体机械图纸，随后通过标定获得精确值。参见“标定激光雷达外参”。&lt;br /&gt;
|-&lt;br /&gt;
| y || Y轴距离。 || &lt;br /&gt;
|-&lt;br /&gt;
| th || 激光雷达安装角度偏差（度）。 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''有反（使用反光棒/板）SLAM相关参数'''''：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! 参数           !! 说明                                                         !! 取值来源&lt;br /&gt;
|-&lt;br /&gt;
| useReflex       || =true启用有反SLAM功能。                                      || &lt;br /&gt;
|-&lt;br /&gt;
| reflexThres     || 测量点的反射强度阈值，大于该阈值的测量点被认为由反光棒/板形成。激光雷达驱动的setReflexRange方法设置测量点的反射最大值，然后换算为[0, 1]区间的反射率。本参数用途是过滤出反光棒/板的测量点。 || 默认值0.3&lt;br /&gt;
|-&lt;br /&gt;
| reflexChunkThres || 对于存在一组相邻的有反（反射强度&amp;gt;reflexThres）测量点时（比如反光板），使用该参数作为邻近有反测量点的过滤阈值，然后合并相邻有反测量点为一个。 || 默认值2.5&lt;br /&gt;
|-&lt;br /&gt;
| reflexSize      || 反光板最大尺寸(mm)。用于过滤有反噪音点。                     || 默认值100&lt;br /&gt;
|-&lt;br /&gt;
| reflexDistBias  || 反光棒半径(mm)。一般而言，在大动态场景下启用有反SLAM时，建议用统一规格的反光棒。反光棒能够准确反射不同角度射入的测量激光，从而提供稳定一致的测量数据。反光板一般用于较近距离测量，此时入射角产生的反射强度差异可忽略不计。 || 默认值10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''其他参数'''''：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! 参数         !! 说明                                                         !! 取值来源&lt;br /&gt;
|-&lt;br /&gt;
| ignoreDist    || 激光雷达盲区(mm)。用于过滤无效测量点。                       || 激光雷达手册&lt;br /&gt;
|-&lt;br /&gt;
| maxDist       || 激光雷达最大测量距离(mm)。                                  || &lt;br /&gt;
|-&lt;br /&gt;
| time_bias_ms  || 点云帧延迟时间。紧耦合多里程计时，通过该参数降低激光雷达的测量频率，使其与其他低频传感器匹配。 || 默认值0&lt;br /&gt;
|-&lt;br /&gt;
| gridSelSz     || （点云降采样的）占用格尺寸(mm)。                            || 默认值20&lt;br /&gt;
|-&lt;br /&gt;
| correctionType || 激光雷达运动畸变纠正算法。默认值是&amp;quot;angle&amp;quot;，&amp;quot;none&amp;quot;则关闭。  ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.2.2 3D激光雷达 ===&lt;br /&gt;
[[文件:Image-20241114111617876.png|无框|581x581像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-2 3D激光雷达'''&lt;br /&gt;
&lt;br /&gt;
与2D激光雷达相比，3D激光雷达能够提供垂直空间的测量数据，多用于室外场景。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:1640162333564644.png|无框|658x658像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-3 3D点云'''&lt;br /&gt;
&lt;br /&gt;
Detour 3D SLAM的计算过程分为两步，第一步提取3D点云的空间特征，把垂直空间结构（如墙体、树干、立柱）提取为特征线段；第二部把空间特征二向化，输出到SLAM算法。因此3D雷达要配套二向化雷达使用，Livox Mid360（非周期性激光雷达）配套“二向化mid360雷达”，其他3D雷达（比如速腾）配套“二向化3D雷达”。&lt;br /&gt;
&lt;br /&gt;
在应用3D SLAM时，需要理解垂直空间结构。我们以道路旁的围墙举例，如图3-3所示，3D雷达在围墙上有若干条水平扫描线，以3D雷达的水平角分辨率为单位，可绘制出若干垂直线段，构成线段的点数量由3D雷达的垂直角分辨率决定。垂直线段可用其长度和扫描点数量描述。比如 Vn 是水平角度n观察到的垂直线段，其长度为V，有m个测量点。&lt;br /&gt;
&lt;br /&gt;
Detour以高度为垂直结构分配权重。以3D雷达的垂直扫描方向0度为赤道面，距离赤道面越近的垂直结构其权重越高。&lt;br /&gt;
&lt;br /&gt;
二向化后的点云与2D雷达一样，熟悉2D SLAM的用户可以轻松使用3D SLAM。&lt;br /&gt;
如果您首次使用3D SLAM，或者引入一个新型号3D激光雷达，建议使用Detour + Medulla组合以了解3D SLAM或3D雷达性能。Medulla能够显示3D点云，相比于Detour的二向化后的2D点云，它能够看到原始点云，有利于发现与雷达相关的问题。&lt;br /&gt;
&lt;br /&gt;
如果您首次使用3D SLAM，或者引入一个新型号3D激光雷达，建议使用Detour + Medulla组合以了解3D SLAM或3D雷达性能。Medulla能够显示3D点云，相比于Detour的二向化后的2D点云，它能够看到原始点云，有利于发现与雷达相关的问题。&lt;br /&gt;
&lt;br /&gt;
3D雷达的扫描与安装参数与2D雷达相同。我们重点讲解3D SLAM相关的参数。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''雷达特性相关参数'''''：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! 参数         !! 说明                                                         !! 取值来源&lt;br /&gt;
|-&lt;br /&gt;
| integrityThres || 点云总数完整性阈值。对于Livox Mid360这种非周期性扫描雷达，存在点云完整性问题。根据Mid360手册，它需要2s左右观测时间，在此之前输出的点云是被观测物体的部分，这是和周期性扫描雷达不同之处。通过本参数可适配Mid360，经验值是0.6。 || 默认值0.9&lt;br /&gt;
|-&lt;br /&gt;
| decay         || 非周期扫描雷达的衰减过期预计，该参数与decaySt配套使用。当机器人在运动时，对同一个物体的测量点因雷达运动而发生畸变，因此要做运动畸变修正。Mid360非周期性扫描导致运动畸变更甚，因此需要该参数修正。经验值是0.65。 || 默认值0.9&lt;br /&gt;
|-&lt;br /&gt;
| decaySt       || 衰减开始的计数值。Mid360扫描周期是100ms，每周期计数1次。经验值是5。 || 默认值1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
二向化雷达'''''垂直结构相关参数'''''：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! 参数        !! 说明                                                         !! 取值来源&lt;br /&gt;
|-&lt;br /&gt;
| minVStruct  || 垂直结构（线段）长度(mm)。                                   || 默认值1000&lt;br /&gt;
|-&lt;br /&gt;
| minScans    || 垂直结构测量点最低数量。两点定一条线段，该参数一般最小值为3。由于激光雷达以扇面发射测量光束，因此对同一个物体而言，测量点数量与距离有关，距离越远则测量点越少。如果3D雷达使用近距离物体作为定位依据，比如运行在生产线旁的叉车，则测量点数量可增加到6个，以提高垂直结构的识别置信度。如果3D雷达使用远距离物体作为定位依据，比如运行在室外的牵引车，则要降低测量点数量。测量点数量首先根据作业场景做数学估算，即根据定位物体的距离，以及3D激光雷达的垂直角分辨率，计算出合理的测量点数量。然后根据Detour（二向化点云）的建图效果校验，如果出现雷达能够观测但Detour没显示的情况，应调整minScans参数以提高识别率。 || 默认值6&lt;br /&gt;
|-&lt;br /&gt;
| Zfadout     || 3D激光雷达扫描赤道面附近的垂直结构距离偏好值(mm)。赤道面加减Zfadout范围内的垂直结构权重更高。 || 默认值300&lt;br /&gt;
|-&lt;br /&gt;
| pivotFac    || 直线取位比例，与pivotPos配套使用。从点云识别出来的垂直线段以其权重（由minVStruct、minScans、zFadout）降序排列，pivotPos用于在权重列表中采样位置（此处是权重90%处）。两者联合决定应该采纳的垂直结构区间。 || 默认值0.05&lt;br /&gt;
|-&lt;br /&gt;
| pivotPos    || 权重比例，决定权重阈值。                                     || 默认值0.9&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''其他参数'''''：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! 参数     !! 说明                             !! 取值来源&lt;br /&gt;
|-&lt;br /&gt;
| aziRes   || 逻辑上的垂直角分辨率。           || 默认值0.33&lt;br /&gt;
|-&lt;br /&gt;
| merge_dist || 邻近点云合并距离(mm)，&amp;lt;0不合并。 || 默认值50&lt;br /&gt;
|-&lt;br /&gt;
|scale&lt;br /&gt;
|点云缩放比例。对点云计算有影响力的点集中在30米之内，用于室内导航的 2D激光雷达测量距离一般30米以内，在室外则不然。因此 室外场景需要把3D激光雷达的点云尺度做适当缩放，以利 点云配准。一般而言，3D激光雷达的scale=0.5，对应于 60米以内点云，如果距离更远，则scale适当降低。在调整 scale时，底盘尺寸（宽高）和雷达外参（x &amp;amp; y）等比调整， 比如scale=0.5时，底盘尺寸如果是L2000W1000，则改为 L1000W500。调整scale后，遥控AMR自旋，detour输出 位姿应平滑变化，不应出现抖动或大幅跳动现象（这种 现象由于尺度配置错误导致应配准点云被过滤造成）。&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2.2 激光里程计 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 参数说明&lt;br /&gt;
|-&lt;br /&gt;
! 参数           !! 说明                                                         !! 取值来源&lt;br /&gt;
|-&lt;br /&gt;
| localmapErrorXY || 激光里程计最大位置误差(mm)。如果激光里程计输出位姿的变化值大于最大误差，则丢弃。 || 默认值70&lt;br /&gt;
|-&lt;br /&gt;
| localmapErrorTh || 激光里程计最大角度误差(度)。                                 || 默认值3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2.3 激光地图 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 参数说明&lt;br /&gt;
|-&lt;br /&gt;
! 参数                                                         !! 说明                                                         !! 取值来源&lt;br /&gt;
|-&lt;br /&gt;
| step_error_xy &amp;amp; step_error_th&amp;lt;br /&amp;gt;baseErrorXY &amp;amp; baseErrorTh || 激光地图输出位姿与当前位姿的误差范围。当闭环检测判断当前点云与激光地图的某个关键帧配准达标时，将锁定该关键帧，并根据此关键帧修正激光里程计误差。如果误差大于设定阈值时，关键帧锁定失败，l_step增大（Detour状态栏的ls即为l_step，锁定关键帧时=2）。设定阈值是计算值，公式为 baseError + l_step * step_error。可知 l_step 越大，位姿误差越大。一般来说，l_step &amp;lt; 16，激光里程计不会出现明显误差，超过则应结合机器人运动状态采取安全措施，比如机器人在运动时 l_step&amp;gt;16 应报警停车。由于激光里程计的角分辨率到0.1度，精确度很好（激光长测距带来的优点），一般调整 step_error_xy 来提高全局优化鲁棒性，使机器人在激光不良区域短距离行走时产生的误差不会导致关键帧锁定失败。step_error_xy 一般经验值100(mm)。 || step_error_xy&amp;lt;br /&amp;gt;默认值50，&amp;lt;br /&amp;gt;step_error_th默认值1。&lt;br /&gt;
|-&lt;br /&gt;
| max_error_xy &amp;amp; max_error_th                                  || 激光地图输出位姿与当前位姿的最大误差值。                     || 9999999 &amp;amp; 180&lt;br /&gt;
|-&lt;br /&gt;
| frame_kill_distance                                          || 建图参数，相邻关键帧间距离的最小值(mm)。（在此距离内如果有2个关键帧，会删除其中1个）                  || 默认值700&lt;br /&gt;
|-&lt;br /&gt;
| frame_distant                                                || 匹配时的关键帧的搜索半径。 || 默认值6000(mm)。（修改过3D雷达的scale，或经常匹配到远处的关键帧，可以减小，如2000）&lt;br /&gt;
|-&lt;br /&gt;
| ScoreThres                                                    || 点云配准及格率值(%)。配准分数&amp;gt;ScoreThres的关键帧可用于全局优化。调整该参数时，应根据机器人沿路线行走时的匹配分数取值（关键帧配准分数在Detour界面可见）。 || 默认值0.35&lt;br /&gt;
|-&lt;br /&gt;
| regConnectedKF                                                || 与锁定关键帧有约束关系（激光地图上关键帧间连线）的关键帧纳入搜索范围。会对匹配速度有少量影响（变慢） || 默认值false，若地图关键帧点云经常不全，可以改为true。&lt;br /&gt;
|-&lt;br /&gt;
| regReflexOnHardCase                                            || =true表示在“匹配困难区域”（黄色）执行有反SLAM算法。      || 默认值true&lt;br /&gt;
|-&lt;br /&gt;
|GregThres&lt;br /&gt;
|如果点云配准小于这个分数，则试图粗匹配。粗匹配会搜索所有可能的匹配，如果匹配情况一般较好，则可以调低这个阈值防止粗匹配（较为耗时且可能在重复场景中可能错位匹配）&lt;br /&gt;
|默认值0.5，若经常错位，可以改为0.4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2.4 Guru ==&lt;br /&gt;
detour.json的&amp;quot;guru&amp;quot;配置段用于配置全局参数。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 参数说明&lt;br /&gt;
|-&lt;br /&gt;
! 参数          !! 说明                                                         !! 取值来源&lt;br /&gt;
|-&lt;br /&gt;
| inputScale    || （全局性）修改点云比例。                                      || 默认值1&lt;br /&gt;
|-&lt;br /&gt;
| Lidar2DAggregateRegistrationThres || 拼接2D雷达，“相对于另一个雷达配准”时的点云配准分数阈值。 || 默认值0.3&lt;br /&gt;
|-&lt;br /&gt;
| useTC         || =true启用紧耦合功能。使用一个里程计时（如仅配置激光雷达），应该关闭。 || 默认值false&lt;br /&gt;
|-&lt;br /&gt;
| autoStart     || 自动启动激光里程计。Detour“概况”标签中的“全部启动”按钮将该参数设为true。 || 默认值false&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=MDCS%E5%BC%95%E6%93%8E%E9%80%82%E9%85%8D%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%85%A5%E9%97%A8%E6%95%99%E5%AD%A6&amp;diff=890</id>
		<title>MDCS引擎适配机器人入门教学</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=MDCS%E5%BC%95%E6%93%8E%E9%80%82%E9%85%8D%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%85%A5%E9%97%A8%E6%95%99%E5%AD%A6&amp;diff=890"/>
		<updated>2025-03-13T13:37:05Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​创建页面，内容为“//todo...  MDCS分别为4个AGV主要组件，分别为  * '''Medulla，硬件适配软件'''。提供通信抽象，通过插件对接各类硬件。开发者适配车型后，应使用遥控器应用进行遥控车体、试验IO等操作，来验证适配结果，确保硬件适配层不会故障或崩溃。 工作内容：网络或串口编程、适配CAN卡驱动、报文适配、编写遥控逻辑、上下位信号设计、基础动作逻辑 * '''Detour，…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;//todo...&lt;br /&gt;
&lt;br /&gt;
MDCS分别为4个AGV主要组件，分别为&lt;br /&gt;
&lt;br /&gt;
* '''Medulla，硬件适配软件'''。提供通信抽象，通过插件对接各类硬件。开发者适配车型后，应使用遥控器应用进行遥控车体、试验IO等操作，来验证适配结果，确保硬件适配层不会故障或崩溃。 工作内容：网络或串口编程、适配CAN卡驱动、报文适配、编写遥控逻辑、上下位信号设计、基础动作逻辑&lt;br /&gt;
* '''Detour，定位软件'''。''这部分只需要配置。''SLAM导航、二维码、UWB定位相关程序。主要给出车体位姿。开发者应通过Detour对车体各传感器进行标定。若使用激光SLAM导航则应建图。 工作内容：配置传感器、建图、传感器位置标定：óó&lt;br /&gt;
* '''Clumsy，自动驾驶系统'''。定义AGV所有可用的动作，如差速行走、舵轮行走、侧移行走、自动找工位或托盘、调姿取放货等。开发者应通过Clumsy插件实现适配AGV的所有动作，并通过测试类验证动作实现。 工作内容：车体定义、基础动作编程和参数定义、动作测试编程、智能动作编程&lt;br /&gt;
* '''Simple，AGV调度系统'''。Simple是个完备的静态调度系统，即小车路径一旦下发无需更改，调度系统保证小车运行到终点。开发者需要开发业务插件，定义车型、针对车型的路径搜索约束器（限制车型的行走路线，如不可直角拐弯等）、针对车型的路径编程器（将路径转为具体的AGV动作序列）、路径搜索的约束条件、并实现场景所需的业务逻辑；还需要在Clumsy插件编写动作对接函数，使得Simple可以调用Clumsy中定义的动作。开发者的场景实现应具有模拟功能，从而可以上线前模拟验证调度业务的正确性，然后再在实际场景中上线实际业务功能。 工作内容：路径图绘制、路径搜索其发器、路径编程器、业务逻辑的正确编写（对接按钮盒、派发任务、维护任务状态等）&lt;br /&gt;
&lt;br /&gt;
== 工程组织方法介绍 ==&lt;br /&gt;
'''约定1：首先应命名车型名称。'''解决方案中存在一个称为CartAdapters的文件夹，应创建一个以该车型命名的文件夹，并把ClumsyPilot（自动驾驶工程）和MedullaAdapter（硬件适配工程）放入文件夹中。如图下所示：&lt;br /&gt;
&lt;br /&gt;
'''约定2：源代码目录结构必须符合规范'''：所有的车型需要放到CartAdapters中，每个车型一个目录，并且把所有车型资料放到对应的文件夹中。（如车型图片、对接协议、文档等）。&lt;br /&gt;
&lt;br /&gt;
'''约定3：编译结果目录结构必须符合规范'''：编译结果一律放到build文件夹中，每个车型一个文件夹。场景均放到AGVScene目录中，每个场景（项目）设立一个文件夹。&lt;br /&gt;
&lt;br /&gt;
'''指南1：如何在解决方案中新建车型。'''以车型FY2104001为例。&lt;br /&gt;
&lt;br /&gt;
首先要复制MedullaAdapter和ClumsyPilot两个工程：即从已有工程或模板中复制到CartAdapters/FY2104001目录里。然后解决方案里新建一个解决方案文件夹，命名为FY2104001，然后分别导入MedullaAdapter和ClumsyPilot两个工程。最后在build目录里新建一个名为“FY2104001“的文件夹。&lt;br /&gt;
&lt;br /&gt;
随后进行改名：ClumsyPilot工程的程序集名称/默认命名空间改名为”FY2104001_c”，MedullaAdapter工程的程序集/默认命名空间名称改为“FY2104001_m”。&lt;br /&gt;
&lt;br /&gt;
然后将这两个工程的生成事件中的“生成后事件命令行”修改正确：这个命令行将输出文件导出到build/FY2104002目录中，方便管理。&lt;br /&gt;
&lt;br /&gt;
== Medulla开发方法介绍 ==&lt;br /&gt;
'''约定3：MedullaAdapter工程需要实现全部硬件通信、IO读取和处理、和基础运动指令下发功能。'''以下是一些例子：&lt;br /&gt;
&lt;br /&gt;
向某个电机驱动器发送1000rpm的转速、向某个舵轮发送转到45度角并以3000rpm速度行走、货叉向上举升、如果近距离避障雷达触发了则向所有电机下发0速度，左转弯时亮起转向灯。&lt;br /&gt;
&lt;br /&gt;
MedullaAdapter适配完成后，应得到可通过NetRemote应用该程序或AGV遥控器App，人工遥控执行所有AGV动作的程序。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''约定4：MedullaAdapter工程中命名要规范'''。以某型号为BL21001的车型为例：&lt;br /&gt;
&lt;br /&gt;
其中，设备定义类为BL21001Cart。&lt;br /&gt;
&lt;br /&gt;
BL21001有三种轮询，分别控制IO、电机、音乐和电池。命名为IORoutine,MotorRoutine和MusicRoutine和BatteryRoutine。&lt;br /&gt;
&lt;br /&gt;
BL21001的遥控逻辑为BL21001Remote&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''定义1：上位IO（UpperIO）指人工或自动驾驶自动下发的字段'''，如下发速度、下发方向盘角度、下发的避障选择区域等。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''定义2：下位IO（LowerIO）指从硬件读取的字段'''，如实际轮速、实际转角、障碍物信号、电池电量等。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''指南5：如何MedullaAdapter中定义设备。'''以FY2104002Cart为例：&lt;br /&gt;
&lt;br /&gt;
''应指定上位IO和下位IO。''使用AsUpperIO标记字段来指定字段是上位IO，若改字段无上位遥控信号达到300ms，且设置了timeOutReset=true，则会自动恢复为设定的默认值。下位IO使用AsLowerIO标记。这些字段需要设为public。&lt;br /&gt;
&lt;br /&gt;
''可以指定一些监控量，''需要使用IOObjectMonitor进行标记。这些字段需要设为public。&lt;br /&gt;
&lt;br /&gt;
设备可以指定一些UI调试按钮方法，使用IOObjectUtility进行标记。这些方法需要设为public。&lt;br /&gt;
&lt;br /&gt;
''设备应该指定“梯形图逻辑”，''即周期性执行的代码。使用UseLadderLogic来指定。UseLadderLogic需要指定logic类型和scanInterval扫描周期。Logic所指定的梯形图类型需要继承LadderLogic&amp;lt;FY2104002Cart&amp;gt;，并实现Operation方法。&lt;br /&gt;
&lt;br /&gt;
''设备应指定一个遥控器程序。''使用UseManualController来指定，其中manualController类型为遥控逻辑类，它需要继承ManualController&amp;lt;FY2104002Cart&amp;gt;，并实现Operation方法。&lt;br /&gt;
&lt;br /&gt;
''可以指定初始化变量，''使用AsInitParam进行标记。这些变量可以在Medulla的启动脚本startup.iocmd中设置，从而在调用Init时可以使用。&lt;br /&gt;
&lt;br /&gt;
''设备应实现初始化方法Init()''。可以做各个设备的初始化操作。&lt;br /&gt;
&lt;br /&gt;
''可以映射一些空方法到UI界面上，使用IOObjectUtility标记''。这些方法会出现在Medulla的界面中，用户可点击调用，一般用来测试。&lt;br /&gt;
&lt;br /&gt;
以下展示了一个设备的定义案例&lt;br /&gt;
&lt;br /&gt;
'''指南6：如何编写“梯形图逻辑”，应编写什么功能？'''梯形图逻辑是间隔若干ms执行的逻辑程序。需要实现Operation方法，方法里可以使用cart变量来访问设备定义类的成员变量。Operation里应处理报文。如设备初始化方法中启动了一个串口，开发者应在Operation里对串口进行读操作，来解析设备报文，存入下位IO变量（LowerIO）；并根据上位IO变量（UpperIO）组织报文，并对串口进行写操作。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''指南7：遥控逻辑是什么？如何编写遥控逻辑？'''Medulla支持多种不同的控件，如按钮、开关等，可以映射为NetRemote程序的虚拟控件、AGV遥控App的虚拟控件、或Xbox手柄上的物理按钮盒摇杆。遥控逻辑可以访问到这些控件的按键情况和数值，从而可向UpperIO写入数据，进而遥控车体运动。&lt;br /&gt;
&lt;br /&gt;
以某型号为BL21001的包夹式AGV为例。&lt;br /&gt;
&lt;br /&gt;
遥控逻辑类名为BL21001MRemote，继承ManualController&amp;lt;BL21001Cart&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
遥控逻辑类可以定义多个遥控控件，包括Button(按钮)，Switch(开关)，Knob(旋钮)，Stick(摇杆)，DPad(四向键)，Throttle(推杆)，DThrottle(双向推杆)。定义的遥控控件需要增加AsControlItem标记。&lt;br /&gt;
&lt;br /&gt;
以下是个例子：&lt;br /&gt;
&lt;br /&gt;
遥控逻辑类需要实现Operation方法。需要读取定义的控件值，并向一些UpperIO赋值（如，根据direction摇杆的方向对“下发舵轮角度”进行赋值）。&lt;br /&gt;
&lt;br /&gt;
控件的值会在执行Operation方法前自动更新。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''指南9：如何上机验证'''：以FY2104001_m为例&lt;br /&gt;
&lt;br /&gt;
1.将Medulla程序放入指定目录：如桌面startup文件夹。将Medulla的全部核心程序复制入目录，将生成的Medulla适配程序（FY2104001_m.dll）放入plugins文件夹，如果适配程序还引用了其它的库，也一并放入plugins文件夹。&lt;br /&gt;
&lt;br /&gt;
2.编写Medulla启动配置脚本：startup.iocmd文件。基础的例子如下&lt;br /&gt;
&lt;br /&gt;
loader = io load plugins\CartActivator.dll&lt;br /&gt;
&lt;br /&gt;
loader setp com COM1&lt;br /&gt;
&lt;br /&gt;
cart = loader load plugins\FY2104001_m.dll&lt;br /&gt;
&lt;br /&gt;
ui=io load plugins\WinMedulla.dll&lt;br /&gt;
&lt;br /&gt;
ui Show&lt;br /&gt;
&lt;br /&gt;
解析：&lt;br /&gt;
&lt;br /&gt;
使Medulla加载车体加载器插件：loader = io load plugins\CartActivator.dll&lt;br /&gt;
&lt;br /&gt;
设置初始化变量：loader setp com COM1，这里com是FY2104001_m中定义的初始化变量（标记为AsParamInit）&lt;br /&gt;
&lt;br /&gt;
加载FY2104001_m中的车体定义，并把车体记为cart对象。&lt;br /&gt;
&lt;br /&gt;
加载Medulla自带的UI界面库：ui=io load plugins\WinMedulla.dll&lt;br /&gt;
&lt;br /&gt;
显示UI：ui Show&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''说明2：Medulla使用方法和启动配置脚本进一步说明'''&lt;br /&gt;
&lt;br /&gt;
Medulla主程序启动后，逐行地执行脚本，有三种语法：&lt;br /&gt;
&lt;br /&gt;
调用语句：如cart reset，使cart对象调用reset方法。&lt;br /&gt;
&lt;br /&gt;
创建对象语句：如cart = loader load plugins\FY2104001_m.dll，使loader调用load方法，参数为plugins\FY2104001_m.dll，结果对象名称记为cart。&lt;br /&gt;
&lt;br /&gt;
变量赋值语句：如cart.thOffset=1.2，使cart对象的thOffset成员变量赋值为1.2&lt;br /&gt;
&lt;br /&gt;
Medulla的命令语句可以在UI界面的命令执行选项卡直接执行。&lt;br /&gt;
&lt;br /&gt;
加载ui对象后，ui Show方法会弹出硬件控制台界面，会将控制台关闭。如果需要再打开，可以选择ui对象，并点击ShowConsole按钮。&lt;br /&gt;
&lt;br /&gt;
一般AGV可能还有其它传感器要接入Medulla，如激光雷达、3D相机等。以下列举一些常用的代码配置：&lt;br /&gt;
&lt;br /&gt;
加载激光雷达插件：&lt;br /&gt;
&lt;br /&gt;
lidar = io load plugins\LidarController.dll&lt;br /&gt;
&lt;br /&gt;
定义一个名为frontlidar的倍加福R2000雷达对象：&lt;br /&gt;
&lt;br /&gt;
frontlidar = lidar init PnFR2kLidar 192.168.1.11&lt;br /&gt;
&lt;br /&gt;
定义一个名为backlidar的山东科力雷达对象：&lt;br /&gt;
&lt;br /&gt;
backlidar = lidar init sdkeli 192.168.1.11&lt;br /&gt;
&lt;br /&gt;
定义一个名为forklidar的西克Nano Scan雷达对象&lt;br /&gt;
&lt;br /&gt;
forklidar= lidar init sicknano&lt;br /&gt;
&lt;br /&gt;
定义一个名为frontlidar3d的速腾聚创RS16多线雷达对象&lt;br /&gt;
&lt;br /&gt;
frontlidar3d = lidar init RSLidar16 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
指南10：遥控验证方法：&lt;br /&gt;
&lt;br /&gt;
遥控验证用于检测Medulla的硬件对接程序是否正常工作。开发者应尝试使用遥控器指挥小车做各类动作，检查动作的流畅性，并检查基础动作逻辑是否正确（如拍急停应当停车等）&lt;br /&gt;
&lt;br /&gt;
注意Medulla在遥控时，就不再响应自动驾驶程序Clumsy所下发的信号了。&lt;br /&gt;
&lt;br /&gt;
'''1.  打开Medulla硬件对接程序，截图如下。'''&lt;br /&gt;
&lt;br /&gt;
其中红框中标出的cart即为开发的Medulla适配对象。中间的列表列举了所有开发者定义的变量（包括上位变量、下位变量和监控变量），并实时更新显示。用户还可以通过打开监视窗口来图形化地检测变量中的数值变量。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''2.  使用NetRemote桌面版遥控器进行遥控验证。应用截图如下：'''&lt;br /&gt;
&lt;br /&gt;
点击激活遥控后，AMR遥控器开始向Medulla输出遥控数据。如该遥控器是一个潜伏顶升可旋转托盘的AGV遥控画面。用户首先设定速度（即speed控件），点击上下左右键可以控制小车前进、后退、左转、右转。按住up顶升、按住down下降。滑动rot可控制转盘。&lt;br /&gt;
&lt;br /&gt;
另外，可以绑定键盘按键以方便控制。点击“编辑“，右键弹出菜单即可绑定按键。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''3.可使用手机遥控器App进行遥控验证，并作为AGV遥控的主要方式。'''&lt;br /&gt;
&lt;br /&gt;
其截图如下：&lt;br /&gt;
&lt;br /&gt;
类似的，用户可以激活遥控器，或点击编辑模式编辑遥控器面板。遥控器面板编辑完成后可导出为二维码并建议粘贴在车体上，供后续扫码识别使用。&lt;br /&gt;
&lt;br /&gt;
手机遥控器具备两种连接模式，一种是Wifi连接，另一种是蓝牙连接。推荐使用蓝牙连接方式，连接较为简单方便。手机App中点击连接按钮，即显示以下画面：&lt;br /&gt;
&lt;br /&gt;
查看Medulla界面，cart对象中属性页的BTName项，此项的值为该工控机的蓝牙名称（可自行在操作系统设置里更改）。App中选中正确的设备，等待连接完成后即可遥控。连接设定也可以导出为二维码并建议贴在车体上，供后续连接使用。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
指南11：其它外设定义&lt;br /&gt;
&lt;br /&gt;
说明2中已列举了激光雷达插件的使用方法。Medulla还支持以下种类的传感器输入：&lt;br /&gt;
&lt;br /&gt;
USB摄像头，使用方法：&lt;br /&gt;
&lt;br /&gt;
1.  进入命令执行窗口，输入camera = io load plugins\USBCamera.dll&lt;br /&gt;
&lt;br /&gt;
2.  回到对象窗口，可看到当前检查到的摄像头列表。&lt;br /&gt;
&lt;br /&gt;
3.  进入命令执行窗口，输入camera detail Chicony_USB2.0_Camera，查看所有支持的模式。&lt;br /&gt;
&lt;br /&gt;
4.  我们选择模式2(640*480分辨率)，并指定彩色输出。在startup.iocmd中配置&lt;br /&gt;
&lt;br /&gt;
camera = io load plugins\USBCamera.dll&lt;br /&gt;
&lt;br /&gt;
usbcam = camera init Chicony_USB2.0_Camera 2 true&lt;br /&gt;
&lt;br /&gt;
即可创建一个名为usbcam的摄像头对象。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
工业摄像头驱动，支持海康威视、大华、Basler等工业相机，使用方法：&lt;br /&gt;
&lt;br /&gt;
在startup.iocmd中配置：&lt;br /&gt;
&lt;br /&gt;
mv = io load plugins\MVCamera.dll&lt;br /&gt;
&lt;br /&gt;
maincam=mv initMono CA013&lt;br /&gt;
&lt;br /&gt;
其中CA013是摄像头型号，initMono为以单色方式启动。若相机是彩色相机，则使用initColor方法。&lt;br /&gt;
&lt;br /&gt;
== Clumsy开发介绍 ==&lt;br /&gt;
Clumsy是小车的运动控制组件。开发者需要做的是：定义运动控制的输入输出变量、定义参数表、定义动作、定义动作测试例程，并提供调度接口。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
约定1：车型参数表命名规范：以某背负式差速小车BSD10LS为例，命名为BSD10LSConfigs.cs，包含若干个由[FieldMember]标记的参数，为该小车可配置的参数。任何参数都可以放到该类中，Clumsy自动识别、提供默认调参程序并存储参数至clumsy.json配置文件中。支持的参数类型为string/int/float/double，即字符串和数值类。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
指南1：车型定义文件如何编写？以某背负式差速小车BSD10LS为例：&lt;br /&gt;
&lt;br /&gt;
1.     车型定义文件，命名为BSD10LSDef.cs，包含类BSD10LSDef，继承自PilotDefinition&amp;lt;BSD10LSConfigs&amp;gt;。该文件从MedullaAdapter工程中设备定义类BSD10LSCart.cs中摘抄标记了AsUpperIO和AsLowerIO的字段。这些字段中，AsLowerIO字段会自动更新，AsUpperIO字段会自动下发。&lt;br /&gt;
&lt;br /&gt;
2.     车型定义文件还需要重写Init方法，这个方法会在Clumsy启动时调用。此外还需要重写DriveStop方法，在小车静息或遇故障停车时，写入的下位变量。常用的初始化操作包括：&lt;br /&gt;
&lt;br /&gt;
a)      在BSD10LSDef中设定一个静态变量self，并在启动时设置self=this，使得其它类可以访问BSD10LSDef的实例。&lt;br /&gt;
&lt;br /&gt;
b)      调用ClumsyLib.Capture();从而启动Clumsy的传感器采集功能。&lt;br /&gt;
&lt;br /&gt;
c)       启动前台UI或者创建线程后台上报数据等。&lt;br /&gt;
&lt;br /&gt;
3.     需要给车型定位文件增加欲使用的控制方法标记。支持三种控制方法：&lt;br /&gt;
&lt;br /&gt;
a)      CanDifferentialDrive，即差速驱动方法。使用该标记，需要指定type为一个继承了DifferentialWriterClass的差速速度下发类。如：&lt;br /&gt;
&lt;br /&gt;
开发者需要实现WriteLR方法，向驱动器中写入速度。&lt;br /&gt;
&lt;br /&gt;
b)      CanSteeringDrive，即单舵轮驱动方法，类似的，使用该标记需要指定type为一个继承了SteeringWriterClass的舵轮速度下发类。该类除了写入舵轮速度外，还应反馈舵轮角度和速度（角度是必须的，若无速度则可以用刚刚下发的速度代替）。角度单位是度，速度无单位。如：&lt;br /&gt;
&lt;br /&gt;
c)       CanOmniDrive，即全向驱动方法。使用该标记需要指定type为一个继承了OmniWriterClass的全向速度下发类。下发的速度会指定X速度、Y速度和旋转方向（旋转方向为逆时针旋转角度）。须开发者判断如何具体分解速度和旋转至各个舵轮或麦克纳姆轮上，若遇到奇点或限位问题（如舵轮角度已打满，须反向灯），也需要开发者自行计算。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
指南2：如何定义动作并测试动作？动作将参数打包好并返回动作序列（为一个Generator函数），使得可以通过Clumsy的DriveTask进行管理。&lt;br /&gt;
&lt;br /&gt;
1.     如使用内置的一些算法，如LeftRightWheelTracking（差速追踪模型），一个例子如下：&lt;br /&gt;
&lt;br /&gt;
上述代码打包了在BSD10LSConfigs中定义的部分参数，随后可以继续对返回的LeftRightWheelTracking对象进行设置路径点操作，从而完成整套动作。&lt;br /&gt;
&lt;br /&gt;
2.     可以设置一个UI按钮来测试定义的动作。如以下代码所示：&lt;br /&gt;
&lt;br /&gt;
以上代码定义会在Clumsy界面中产生一个测试UI按钮：&lt;br /&gt;
&lt;br /&gt;
接下来用户可在界面上拖拽来查看行走效果，从而进行调参。&lt;br /&gt;
&lt;br /&gt;
3.     如果定义一些更简单的方法，如顶升等，则使用MovementDefinition来定义。该类的Get方法应是一个Generator函数，通过yield return true来表示动作计算完毕待下发，释放CPU资源并等到下一个周期再继续计算动作。这种方法可以使得动作编排足够紧凑，不需要复杂的状态机设计即可完成复杂的动作序列。如：&lt;br /&gt;
&lt;br /&gt;
通过Get()方法返回一个IEnumerable&amp;lt;bool&amp;gt;对象后，可产生一个DriveTask类进行动作执行。例子如下：&lt;br /&gt;
&lt;br /&gt;
4.     Clumsy使用了Nancy作为内置的HTTP服务器。若需要Clumsy额外提供接口给上下位应用，则可以编写一个WebAPIContainer类，并继承NancyModule，从而增加API。&lt;br /&gt;
&lt;br /&gt;
5.     Clumsy若使用Simple作为调度系统，则需要实现AGV.cs类。类中包含所有调度能够使用的动作命令，一般至少包括一个行走命令（如可命名为Go）。&lt;br /&gt;
&lt;br /&gt;
内置运动控制方法介绍见MDCS参考手册。&lt;br /&gt;
&lt;br /&gt;
== Simple开发介绍（待续） ==&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%A0%87%E5%AE%9A%E4%B8%8E%E6%A0%A1%E5%87%86&amp;diff=889</id>
		<title>标定与校准</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%A0%87%E5%AE%9A%E4%B8%8E%E6%A0%A1%E5%87%86&amp;diff=889"/>
		<updated>2025-03-12T10:49:19Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​创建页面，内容为“ == 单线雷达调平 == 车体上使用的所有雷达（包含导航雷达、货叉雷达等）均需要调至水平。。 可以使用反光贴调平雷达   '''5.1.1 使用雷达的反射强度信息'''  首先，按下图方式，在小车四周立至少4个柱子，距离至少5m，角度距离至少60度。  在每个柱子等高位置贴上反光条，打开Medulla的view界面，能够同时看到所有…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== 单线雷达调平 ==&lt;br /&gt;
车体上使用的所有雷达（包含导航雷达、货叉雷达等）均需要调至水平。。&lt;br /&gt;
[[文件:90-poklju7yh6trgbsfdasw.png|缩略图|可以使用反光贴调平雷达]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''5.1.1 使用雷达的反射强度信息'''&lt;br /&gt;
&lt;br /&gt;
首先，按下图方式，在小车四周立至少4个柱子，距离至少5m，角度距离至少60度。&lt;br /&gt;
&lt;br /&gt;
在每个柱子等高位置贴上反光条，打开Medulla的view界面，能够同时看到所有柱子上的反光条（反光条处点云偏红色，其余反光度低处为白色点云），则雷达调平。&lt;br /&gt;
&lt;br /&gt;
'''5.1.2 使用红外相机'''&lt;br /&gt;
[[文件:890ouijlkjh.png|缩略图|使用红外相机调平雷达]]&lt;br /&gt;
某些激光雷达不提供反射强度信息，可使用暗室和红外相机进行标定。在暗室中，激光雷达扫描到的位置可被红外相机观察到，如图5.1.2-1所示。在图5.1-1中每个柱子等高位置做标记，使用红外相机观察是否每个柱子上的标记被激光同时扫到，若能够同时扫到，则雷达调平。&lt;br /&gt;
&lt;br /&gt;
== 舵轮角度校准 ==&lt;br /&gt;
将车处于开阔且定位特征明显的环境中，确保有能够前进10m的空间。打开Medulla、Detour、Clumsy程序。若Detour已经建图，则将“单线激光SLAM”标签页的图层删除。&lt;br /&gt;
&lt;br /&gt;
确保校准舵轮角度之前，舵轮的x、y偏移量已经正确设置。&lt;br /&gt;
&lt;br /&gt;
1.     在“概览”页面，点击“手动输入位置”，将定位设置为0,0,0。&lt;br /&gt;
&lt;br /&gt;
2.     在Clumsy上点击“舵轮直线度校正”按钮，车将依靠里程计前进10m。&lt;br /&gt;
&lt;br /&gt;
3.     应根据下图箭头处的第三个数值th，对Clumsy“车辆配置”标签页的dthBias进行调整。若th值为正，则应减小dthBias；反之，增大dthBias。&lt;br /&gt;
&lt;br /&gt;
4.     重复上述步骤，直到th在0附近震荡，或th的偏差量在技术要求的范围内。&lt;br /&gt;
&lt;br /&gt;
== 导航雷达角度校准 ==&lt;br /&gt;
在校准导航雷达角度前，应先确保完成舵轮角度的校准。&lt;br /&gt;
&lt;br /&gt;
将车处于开阔且定位特征明显的环境中，确保有能够前进10m的空间。打开Medulla、Detour、Clumsy程序。若Detour已经建图，则将“单线激光SLAM”标签页的图层删除。&lt;br /&gt;
&lt;br /&gt;
1.     在“概览”页面，点击“手动输入位置”，将定位设置为0,0,0。&lt;br /&gt;
&lt;br /&gt;
2.     在Clumsy上点击“舵轮直线度校正”按钮，车将依靠里程计前进10m。&lt;br /&gt;
&lt;br /&gt;
3.     应根据上图箭头处的第二个数值y，对Detour“车体布局”，“编辑”页面激光雷达的th进行调整。若y值为正，则应减小dth；反之，增大th。&lt;br /&gt;
&lt;br /&gt;
4.     重复上述步骤，直到y在0附近震荡，或y的偏差量在技术要求的范围内。&lt;br /&gt;
&lt;br /&gt;
== 单线激光雷达取托盘标定 ==&lt;br /&gt;
// todo: 移入取托盘的案例中。&lt;br /&gt;
&lt;br /&gt;
1.     首先将叉车的货叉放在托盘所在高度，并将托盘放置于货叉正前方的标定位置。可先将叉车完全叉入托盘中，再直线退出。&lt;br /&gt;
&lt;br /&gt;
2.     将货叉高度调整到激光雷达能看到待检测固定参照物的高度。打开“车辆配置”标签页的“车体布局编辑器”页面，若发现点云残缺的情况，请检查叉尖雷达的安装是否歪斜，或者货叉是否没有下降到下限位，或者将托盘稍微远离叉车。点云完整后进入下一步。图5.4-1情况即为常见三腿托盘点云残缺的情况。&lt;br /&gt;
&lt;br /&gt;
图5.4-1&lt;br /&gt;
&lt;br /&gt;
3.     在Clumsy界面上选择相应的检测测试按钮。当前以二腿料架为例。在界面上选择“检测测试:二腿料架”，并在UI界面上画一箭头开启检测。该箭头起点应在待检测物的对称中心位置附近，箭头方向从物体本身指向该物体面朝小车一面的正前方，如图5.4-2所示。&lt;br /&gt;
&lt;br /&gt;
图5.4-2&lt;br /&gt;
&lt;br /&gt;
4.     若检测成功，应该在界面上看见指向该待检测物体的青色箭头，见图5.4-2，且控制台上打印待检测物在车体坐标系下的位姿Car(x,y,th)，以及世界坐标系下的位姿World(x,y,th)，见图5.4-3。检测成功则进入下一步，失败则请调整识别算法参数或咨询识别算法开发人员。&lt;br /&gt;
&lt;br /&gt;
图5.4-3&lt;br /&gt;
&lt;br /&gt;
5.     标定雷达的y和th。标定时需选定车体部件“单线雷达-forklidar”。双击属性标签页的th字段进行更改，使得步骤4中控制台打印的角度Car.th在180度附近震荡。后双击属性标签页的y字段进行更改，使得上一步中控制台打印的横向偏移量Car.y在0附近震荡。&lt;br /&gt;
&lt;br /&gt;
6.     标定雷达的x。雷达的x坐标仅影响侧取，若无侧取需求，可直接使用设计图纸上的数值，而无需对x进一步标定。标定前请先将车头方向朝向-90度，且托盘放置于货叉的正前方，此时步骤4中显示的World.x应与小车的x坐标基本一致，将该x坐标值记为δ。将小车调整至车头朝向0度的方向，此时调整雷达的x字段，使得步骤4中控制台的World.x显示在δ附近震荡，即完成x标定。&lt;br /&gt;
&lt;br /&gt;
7.     x，y，th字段值调整完毕后，关闭“车体布局编辑器”，点击“保存配置”按钮。&lt;br /&gt;
&lt;br /&gt;
8.     实车测试。返回Clumsy的“控制面板”标签页。点击“测试取货流程”，等待UI上出现紫色点云后，在地图上用鼠标左键拖曳出大致指向托盘的取货路径。松开鼠标后，车将自动完成取货操作。如图5.4-4所示。若观察到有偏差，请重复上述步骤进行标定。&lt;br /&gt;
&lt;br /&gt;
图5.4-4&lt;br /&gt;
&lt;br /&gt;
== 堆垛标定 ==&lt;br /&gt;
// todo: 移入堆垛的案例中。&lt;br /&gt;
&lt;br /&gt;
1.      约定：下层料框检测所用的雷达为forklidar，上层料框检测所用雷达为forklidarUp。默认forklidar已经按照5.4所述流程完成了标定。&lt;br /&gt;
&lt;br /&gt;
2.      将两层料框摆放至堆叠完成的状态，将货叉叉入上层料框，并将其举升至forklidar可看见下层料框固定参照物的位置。&lt;br /&gt;
&lt;br /&gt;
3.      与5.4中步骤3、4所属方式相同，使用下雷达forklidar的检测算法，记控制台输出的Car(x,y,th)为δx，δy，δth。&lt;br /&gt;
&lt;br /&gt;
4.      使用上雷达forklidarUp的检测算法。调整forklidarUp的th，使得当前控制台输出的Car.th在δth附近震荡；再调整forklidarUp的x、y，使得当前控制台输出的Car.x、Car.y分别在δx、δy附近震荡。&lt;br /&gt;
&lt;br /&gt;
5.      尝试进行堆垛。若有系统性堆垛不准，请调整Clumsy参数表中的StackBiasX、StackBiasY、StackBiasTh。三者分别对应货叉前移、货叉横移、小车旋转角度的偏差的补偿量。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:890ouijlkjh.png&amp;diff=888</id>
		<title>文件:890ouijlkjh.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:890ouijlkjh.png&amp;diff=888"/>
		<updated>2025-03-12T10:47:35Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;890ouijlkjh&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:90-poklju7yh6trgbsfdasw.png&amp;diff=887</id>
		<title>文件:90-poklju7yh6trgbsfdasw.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:90-poklju7yh6trgbsfdasw.png&amp;diff=887"/>
		<updated>2025-03-12T10:46:34Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;90-poklju7yh6trgbsfdasw&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E8%B0%83%E5%BA%A6%E5%86%85%E6%A0%B8%E8%BF%90%E8%A1%8C%E5%8E%9F%E7%90%86&amp;diff=886</id>
		<title>调度内核运行原理</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E8%B0%83%E5%BA%A6%E5%86%85%E6%A0%B8%E8%BF%90%E8%A1%8C%E5%8E%9F%E7%90%86&amp;diff=886"/>
		<updated>2025-03-12T05:13:00Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​/* 总体任务逻辑 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SimpleCore保证静态的任务和路线一定能够完成，从而简化了机器人车队调度的开发困难。静态指路线一旦下发一般不会改变，交管保证满足该路线一定能执行到位且不会发生死锁（即通过死锁预防算法），相对于“解死锁”方法，“死锁预防”方法可以满足在大量工业场景中的工艺需求，如过风淋门、叉车等不允许折返的场景。当然，SimpleCore也支持动态更改路线的需求。所有路线的增加和变更都会进行交通规划计算，保证场景的正常运行。SimpleCore也提供了多种方便路线设计和变更的机制。&lt;br /&gt;
&lt;br /&gt;
=== 交管计算原理 ===&lt;br /&gt;
SimpleCore使用动态规划和搜索方法（DPS算法）进行交通管制。首先使用动态规划计算双车间的通行矩阵，然后在实际车辆需要上锁时，通过进行剪枝的搜索算法进行多车死锁可能性检测并决策。详细的算法可以参考[[DPS调度算法详解]]。&lt;br /&gt;
&lt;br /&gt;
用户可以完全不再关注交管，DPS算法几乎在所有情况下得到正确交管顺序。不过由于算法的取向较为保守，可能在多车长路径交管冲突上选择要求人工介入判断，也可通过调整参数强制要求算法自动判断。&lt;br /&gt;
&lt;br /&gt;
=== 可编程的路径搜索算法 ===&lt;br /&gt;
在SimpleCore框架中，路径搜索算法采用了一种高度可编程的方式，通过Heuristics（启发式）系统来实现灵活的路径规划。其核心是基于A''算法的变体，结合了反射机制和特性（Attribute）系统，''这种设计允许开发者为不同类型的车辆和场景定制搜索行为，而不需要修改核心搜索算法。详细的对路径搜索用法可见[[使用手册 - 寻路启发器功能|使用手册 - 寻路启发器功能 - MDCS wiki]]。&lt;br /&gt;
系统采用的是启发式优先搜索算法（类似A*''），通过以下关键组件实现：''&lt;br /&gt;
* 优先队列（Heap）：维护待探索节点，按优先级（代价+启发值）排序&lt;br /&gt;
&lt;br /&gt;
* 上下文信息（SearchStat和Container等）：表示搜索状态，包含当前位置、累计代价、优先级、路径信息、状态标记等&lt;br /&gt;
&lt;br /&gt;
* 启发式函数：通过自定义方法计算节点的评估值，指导搜索方向&lt;br /&gt;
&lt;br /&gt;
=== 路径编译 ===&lt;br /&gt;
路径编译器将计划路线（表示为站点和路线的序列）转换为 AGV 可以理解和执行的可执行代码。这种转换过程可通过模板或插件的方法完成，类似于编译器。其使用方法见：[[使用手册 - Simple:coder（路径编译器）机制详解|使用手册 - Simple:coder（路径编译器）机制详解 - MDCS wiki]]&lt;br /&gt;
路径编译的方法允许：&lt;br /&gt;
&lt;br /&gt;
* 车辆特定行为：不同的车辆类型可以有不同的代码生成策略&lt;br /&gt;
&lt;br /&gt;
* 站点特定操作：在特定站点的特殊操作（如装载/卸载，调整避障范围，或者为了解决一致性问题对站点微调等）&lt;br /&gt;
&lt;br /&gt;
* 轨道特定参数：速度控制、方向控制等&lt;br /&gt;
&lt;br /&gt;
* 复杂条件：可以使用javascript或者c#程序判断复杂条件（如一口气生成全向磁导航车的控制序列）&lt;br /&gt;
&lt;br /&gt;
=== 总体任务逻辑 ===&lt;br /&gt;
[[文件:Snipaste 2023-12-21 00-04-09.jpg|缩略图|下发任务流程图]]&lt;br /&gt;
下发任务时，首先进行寻路，如通过FindRoute生成一个SegmentPlan，或者手动构造一个SegmentPlan。然后调用Compile方法得到CarProgram。Compile方法默认会做交管规划，若在参数中给了forecast:false，接下来可以Append多个SegmentPlan来继续延长路线并增加事件。&lt;br /&gt;
&lt;br /&gt;
无论Append与否，由于CarProgram需要做交管规划，若参数中给了forecast:false，则需要调用Forecast。调用Forecast时可以给一个escape参数，为一个SegmentPlan，用来设定逃逸路线，该路线只参与交管规划而不执行（可参见交管规划原理）。最后需要调用Queue进行提交。&lt;br /&gt;
&lt;br /&gt;
CarProgram一旦经过规划，必须提交，否则不允许后续生成针对该车的CarProgram。执行期间和Simple设计的交互几乎仅限于交管，详见[[AGV任务运行逻辑|AGV任务运行逻辑 - MDCS wik]]&lt;br /&gt;
&lt;br /&gt;
对于每个车，当前运行的CarProgram执行完毕后，可以继续执行下一个CarProgram。&lt;br /&gt;
&lt;br /&gt;
=== 总结 ===&lt;br /&gt;
SimpleCore调度将'''AMR调度转换为“图的资源占用与释放”问题。'''首先启发式深度优先搜索寻路，可同时搜索可行区域、进行热力计算，并做好流量分配。资源（站点）获取顺序动态规划预计算，执行任务前通过动态规划预先搜索通行顺序的解空间，可通过包络、可达性预计算避免车体和静物之间的物理冲突。最后资源（站点）序列编译为动作脚本，而动作脚本可以完全离线执行，机器人仅在资源上锁/解锁时需要与调度通信。这使得本预计算集群调度具有以下优势：&lt;br /&gt;
&lt;br /&gt;
# 高抽象化 将AMR调度的底层数学问题剥离，软件工程架构更有优势。更容易针对不同车型和业务场景进行交付适配，可应对业务和资产快速变更的时代需求。&lt;br /&gt;
# 高适用性 自动通行顺序预计算，无需针对不同业务场景人工配置交管规则。&lt;br /&gt;
# 低通信复杂度 通信次数极低。AMR的任务已经预计算，网络波动时，不会导致AMR动作失控，AMR将在网络恢复后接续最新交管信息。&lt;br /&gt;
# 低算力需求 相对于“遥控作业型”调度，预计算调度的算力需求低。数百台AMR的交管可在普通个人电脑上运行，无需高配置的服务器工作站。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E8%B0%83%E5%BA%A6%E5%86%85%E6%A0%B8%E8%BF%90%E8%A1%8C%E5%8E%9F%E7%90%86&amp;diff=885</id>
		<title>调度内核运行原理</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E8%B0%83%E5%BA%A6%E5%86%85%E6%A0%B8%E8%BF%90%E8%A1%8C%E5%8E%9F%E7%90%86&amp;diff=885"/>
		<updated>2025-03-12T05:00:44Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​/* 交管计算原理 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SimpleCore保证静态的任务和路线一定能够完成，从而简化了机器人车队调度的开发困难。静态指路线一旦下发一般不会改变，交管保证满足该路线一定能执行到位且不会发生死锁（即通过死锁预防算法），相对于“解死锁”方法，“死锁预防”方法可以满足在大量工业场景中的工艺需求，如过风淋门、叉车等不允许折返的场景。当然，SimpleCore也支持动态更改路线的需求。所有路线的增加和变更都会进行交通规划计算，保证场景的正常运行。SimpleCore也提供了多种方便路线设计和变更的机制。&lt;br /&gt;
&lt;br /&gt;
=== 交管计算原理 ===&lt;br /&gt;
SimpleCore使用动态规划和搜索方法（DPS算法）进行交通管制。首先使用动态规划计算双车间的通行矩阵，然后在实际车辆需要上锁时，通过进行剪枝的搜索算法进行多车死锁可能性检测并决策。详细的算法可以参考[[DPS调度算法详解]]。&lt;br /&gt;
&lt;br /&gt;
用户可以完全不再关注交管，DPS算法几乎在所有情况下得到正确交管顺序。不过由于算法的取向较为保守，可能在多车长路径交管冲突上选择要求人工介入判断，也可通过调整参数强制要求算法自动判断。&lt;br /&gt;
&lt;br /&gt;
=== 可编程的路径搜索算法 ===&lt;br /&gt;
在SimpleCore框架中，路径搜索算法采用了一种高度可编程的方式，通过Heuristics（启发式）系统来实现灵活的路径规划。其核心是基于A''算法的变体，结合了反射机制和特性（Attribute）系统，''这种设计允许开发者为不同类型的车辆和场景定制搜索行为，而不需要修改核心搜索算法。详细的对路径搜索用法可见[[使用手册 - 寻路启发器功能|使用手册 - 寻路启发器功能 - MDCS wiki]]。&lt;br /&gt;
系统采用的是启发式优先搜索算法（类似A*''），通过以下关键组件实现：''&lt;br /&gt;
* 优先队列（Heap）：维护待探索节点，按优先级（代价+启发值）排序&lt;br /&gt;
&lt;br /&gt;
* 上下文信息（SearchStat和Container等）：表示搜索状态，包含当前位置、累计代价、优先级、路径信息、状态标记等&lt;br /&gt;
&lt;br /&gt;
* 启发式函数：通过自定义方法计算节点的评估值，指导搜索方向&lt;br /&gt;
&lt;br /&gt;
=== 路径编译 ===&lt;br /&gt;
路径编译器将计划路线（表示为站点和路线的序列）转换为 AGV 可以理解和执行的可执行代码。这种转换过程可通过模板或插件的方法完成，类似于编译器。其使用方法见：[[使用手册 - Simple:coder（路径编译器）机制详解|使用手册 - Simple:coder（路径编译器）机制详解 - MDCS wiki]]&lt;br /&gt;
路径编译的方法允许：&lt;br /&gt;
&lt;br /&gt;
* 车辆特定行为：不同的车辆类型可以有不同的代码生成策略&lt;br /&gt;
&lt;br /&gt;
* 站点特定操作：在特定站点的特殊操作（如装载/卸载，调整避障范围，或者为了解决一致性问题对站点微调等）&lt;br /&gt;
&lt;br /&gt;
* 轨道特定参数：速度控制、方向控制等&lt;br /&gt;
&lt;br /&gt;
* 复杂条件：可以使用javascript或者c#程序判断复杂条件（如一口气生成全向磁导航车的控制序列）&lt;br /&gt;
&lt;br /&gt;
=== 总体任务逻辑 ===&lt;br /&gt;
[[文件:Snipaste 2023-12-21 00-04-09.jpg|缩略图|下发任务流程图]]&lt;br /&gt;
下发任务时，首先进行寻路，如通过FindRoute生成一个SegmentPlan，或者手动构造一个SegmentPlan。然后调用Compile方法得到CarProgram。Compile方法默认会做交管规划，若在参数中给了forecast:false，接下来可以Append多个SegmentPlan来继续延长路线并增加事件。&lt;br /&gt;
&lt;br /&gt;
无论Append与否，由于CarProgram需要做交管规划，若参数中给了forecast:false，则需要调用Forecast。调用Forecast时可以给一个escape参数，为一个SegmentPlan，用来设定逃逸路线，该路线只参与交管规划而不执行（可参见交管规划原理）。最后需要调用Queue进行提交。&lt;br /&gt;
&lt;br /&gt;
CarProgram一旦经过规划，必须提交，否则不允许后续生成针对该车的CarProgram。&lt;br /&gt;
&lt;br /&gt;
对于每个车，当前运行的CarProgram执行完毕后，可以继续执行下一个CarProgram。&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=3D%E6%BF%80%E5%85%89%E9%9B%B7%E8%BE%BE%E9%80%82%E9%85%8D&amp;diff=884</id>
		<title>3D激光雷达适配</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=3D%E6%BF%80%E5%85%89%E9%9B%B7%E8%BE%BE%E9%80%82%E9%85%8D&amp;diff=884"/>
		<updated>2025-03-10T12:26:58Z</updated>

		<summary type="html">&lt;p&gt;Artheru：​创建页面，内容为“引用LidarContoller，开发一个MainIOObject类继承于LidarDIOObject。参考以下代码获取帧并使用Output()提交点云数据。  == 1.雷达适配参数含义 ==  === 1.1 3D点云数据结构 ===  '''public''' '''struct''' '''LidarPoint3D'''  {      '''public''' '''float''' d;//点云距离      '''public''' '''float''' azimuth;//点云角度      '''public''' '''float''' altitude;//点云俯仰角度      '''public''' '''float''' intensity; //反…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;引用LidarContoller，开发一个MainIOObject类继承于LidarDIOObject。参考以下代码获取帧并使用Output()提交点云数据。&lt;br /&gt;
&lt;br /&gt;
== 1.雷达适配参数含义 ==&lt;br /&gt;
&lt;br /&gt;
=== 1.1 3D点云数据结构 ===&lt;br /&gt;
 '''public''' '''struct''' '''LidarPoint3D'''&lt;br /&gt;
 {&lt;br /&gt;
     '''public''' '''float''' d;//点云距离&lt;br /&gt;
     '''public''' '''float''' azimuth;//点云角度&lt;br /&gt;
     '''public''' '''float''' altitude;//点云俯仰角度&lt;br /&gt;
     '''public''' '''float''' intensity; //反光度（实际上本意指reflectivity，历史原因用错了名称，但为了兼容性目前不做修改）&lt;br /&gt;
     '''public''' '''float''' progression;//点云在帧中的时间顺序在哪&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== 1.2 其余参数说明 ===&lt;br /&gt;
&lt;br /&gt;
* ScanAngleSgn: 雷达硬件属性--扫描方向 1为逆时针，-1为顺时针 对应detour雷达配置中的angleSgn&lt;br /&gt;
* ScanStartAngle: 雷达硬件属性--一帧扫描起始角度（-180°~+180°）&lt;br /&gt;
* ScanEndAngle: 雷达硬件属性--一帧扫描结束角度（-180°~+180°）对应detour雷达配置中的endAngle&lt;br /&gt;
* angleStart: 过滤点云角度用 最小角度&lt;br /&gt;
* angleEnd: 过滤点云角度用 最大角度&lt;br /&gt;
* maxDist: 过滤点云距离用 最大距离&lt;br /&gt;
* minDist: 过滤点云距离用 最小距离&lt;br /&gt;
* ReflexRange: 归一化尺度,从雷达解析的反光度需要除以该值&lt;br /&gt;
* cachedLidar :缓存用于output的帧数据&lt;br /&gt;
* frame: output一帧后加一 output 的帧数量&lt;br /&gt;
* tick: output前更新当前tick&lt;br /&gt;
* scanC: 雷达提供的自上电起帧数量&lt;br /&gt;
* maxReflex: 当前一帧数据中最强的反光率&lt;br /&gt;
* pointsN: 一帧数据的点数&lt;br /&gt;
* mirror: 是否倒装 倒装为true&lt;br /&gt;
&lt;br /&gt;
== 2.3D雷达适配流程 ==&lt;br /&gt;
注意：适配时，雷达正前方为0°&lt;br /&gt;
 '''namespace''' '''LeishenC16_v4_0_8'''&lt;br /&gt;
 {&lt;br /&gt;
     '''public''' '''class''' '''MainIOObject''' : Lidar3DIOObject&lt;br /&gt;
     {&lt;br /&gt;
         '''private''' '''string''' _targetIp;//雷达IP&lt;br /&gt;
         '''private''' '''const''' '''int''' MsopPort = '''2368''';//雷达点云数据发送端口&lt;br /&gt;
         '''private''' '''const''' '''int''' DifopPort = '''2369''';//雷达设备数据发送端口&lt;br /&gt;
 &lt;br /&gt;
         '''public''' '''MainIOObject'''()&lt;br /&gt;
         {&lt;br /&gt;
             //雷达硬件参数&lt;br /&gt;
             ScanAngleSgn = -'''1''';&lt;br /&gt;
             ScanStartAngle = '''180''';&lt;br /&gt;
             ScanEndAngle = -'''180''';&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         [IOObjectMonitor] '''private''' '''int''' _motSpd; //rpm&lt;br /&gt;
         '''private''' '''int''' _returnMode; // 55: strongest&lt;br /&gt;
                                  // 56: last&lt;br /&gt;
                                  // 57: dual&lt;br /&gt;
 &lt;br /&gt;
         [IOObjectMonitor] '''public''' '''long''' CachedTick = '''0''';&lt;br /&gt;
         [IOObjectMonitor] '''public''' '''double''' ScanInterval; // ms&lt;br /&gt;
         [IOObjectMonitor] '''public''' '''double''' RealInterval; // ms&lt;br /&gt;
 &lt;br /&gt;
         [IOObjectUtility]&lt;br /&gt;
         '''public''' '''void''' '''Stuck'''()&lt;br /&gt;
         {&lt;br /&gt;
             Task.Factory.'''StartNew'''(() =&amp;gt;&lt;br /&gt;
             {&lt;br /&gt;
                 '''var''' tic = DateTime.Now;&lt;br /&gt;
                 '''while''' (tic.'''AddSeconds'''('''5''') &amp;gt; DateTime.Now)&lt;br /&gt;
                 {&lt;br /&gt;
                     CachedTick += ('''long''')(Math.'''Sin'''(tic.Ticks) * '''100''');&lt;br /&gt;
                 }&lt;br /&gt;
             });&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         '''public''' '''static''' '''float''' '''ThDiff'''('''float''' th1, '''float''' th2)&lt;br /&gt;
         {&lt;br /&gt;
             '''return''' ('''float''')(th1 - th2 -&lt;br /&gt;
                            Math.'''Round'''((th1 - th2) / '''360.0f''') * '''360''');&lt;br /&gt;
         }&lt;br /&gt;
 		//16线雷达每条线俯仰角度&lt;br /&gt;
         '''private''' '''readonly''' '''float'''[] _altitudeTable = '''new''' '''float'''[]&lt;br /&gt;
         {&lt;br /&gt;
             -'''15''', '''1''', -'''13''', '''3''', -'''11''', '''5''', -'''9''', '''7''', -'''7''', '''9''', -'''5''', '''11''', -'''3''', '''13''', -'''1''', '''15'''&lt;br /&gt;
         };&lt;br /&gt;
 &lt;br /&gt;
         '''private''' '''long''' _startHour;&lt;br /&gt;
 &lt;br /&gt;
         '''private''' '''void''' '''Loop'''('''int''' port1, '''int''' port2)&lt;br /&gt;
         {&lt;br /&gt;
             // MSOP&lt;br /&gt;
             Console.'''WriteLine'''(&amp;quot;RSLidar16 MSOP Starting...&amp;quot;);&lt;br /&gt;
             '''var''' msoPclient = '''new''' '''UdpClient'''(port1);//绑定本地接受端口&lt;br /&gt;
             // msoPclient.Client.Bind(new IPEndPoint(IPAddress.Any, port1));//绑定本地端口?&lt;br /&gt;
             '''var''' sendEndPoint = '''new''' '''IPEndPoint'''(IPAddress.Any, '''0''');//用于获取发送端的ip 和 端口 不用指定port&lt;br /&gt;
             Console.'''WriteLine'''($&amp;quot;RSLidar16 starts streaming on port {MsopPort}&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
             // DIFOP&lt;br /&gt;
             Console.'''WriteLine'''(&amp;quot;LeishenC16 DIFOP Starting...&amp;quot;);&lt;br /&gt;
             '''var''' difoPclient = '''new''' '''UdpClient'''(port2);//绑定本地接受端口&lt;br /&gt;
             // difoPclient.Client.Bind(new IPEndPoint(IPAddress.Any, port2));&lt;br /&gt;
             '''var''' difoPsendEndPoint = '''new''' '''IPEndPoint'''(IPAddress.Any, '''0''');&lt;br /&gt;
 			//获取设备信息&lt;br /&gt;
             '''void''' '''GetDeviceInfo'''()&lt;br /&gt;
             {&lt;br /&gt;
                 '''while''' ('''true''')&lt;br /&gt;
                 {&lt;br /&gt;
                     //读取数据包（difop）&lt;br /&gt;
                     '''var''' pck = difoPclient.'''Receive'''('''ref''' difoPsendEndPoint);&lt;br /&gt;
                     //判断数据包是否来自雷达&lt;br /&gt;
                     '''if''' (difoPsendEndPoint.Address.'''ToString'''() != _targetIp)&lt;br /&gt;
                     {&lt;br /&gt;
                         Console.'''WriteLine'''(&amp;quot;Wrong IP! Trying agian...&amp;quot;);&lt;br /&gt;
                         '''continue''';&lt;br /&gt;
                     }&lt;br /&gt;
                     _motSpd = pck['''8'''] * '''256''' + pck['''9'''];&lt;br /&gt;
                     //计算扫描周期&lt;br /&gt;
                     ScanInterval = '''60f''' / _motSpd * '''1000''';&lt;br /&gt;
                     '''break''';&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
             '''var''' typicalLen = '''0''';&lt;br /&gt;
             '''GetDeviceInfo'''();&lt;br /&gt;
             '''long''' ticLastSent = '''0''';&lt;br /&gt;
             '''long''' ticLast = '''0''';&lt;br /&gt;
             '''var''' lastFrame = '''new''' List&amp;lt;LidarPoint3D&amp;gt;();&lt;br /&gt;
             '''long''' ticNew = '''0''';&lt;br /&gt;
             '''var''' newFrame = '''new''' List&amp;lt;LidarPoint3D&amp;gt;();&lt;br /&gt;
             '''long''' lidarTicLast = -'''1''';&lt;br /&gt;
             '''long''' pTime = '''0''';&lt;br /&gt;
             '''while''' ('''true''')&lt;br /&gt;
             {&lt;br /&gt;
                 //读取数据包（msop）&lt;br /&gt;
                 '''var''' pck = msoPclient.'''Receive'''('''ref''' sendEndPoint);&lt;br /&gt;
                 '''if''' (sendEndPoint.Address.'''ToString'''() != _targetIp || pck.Length != '''1212''')//校验发送方IP,和报文长度&lt;br /&gt;
                 {&lt;br /&gt;
                     Console.'''WriteLine'''(&amp;quot;Invalid UDP package received! from ip:{sendEndPoint.Address.ToString()} pckl:{pck.Length}&amp;quot;);&lt;br /&gt;
                     '''continue''';&lt;br /&gt;
                 }&lt;br /&gt;
                 '''if''' (pck['''1210'''] == '''57''')//按照单回波方式解析的报文,只支持雷达端设置单回波模式&lt;br /&gt;
                 {&lt;br /&gt;
                     Console.'''WriteLine'''($&amp;quot;* Return mode not single return!&amp;quot;);&lt;br /&gt;
                     '''throw''' '''new''' '''Exception'''(&amp;quot;Only single return supported&amp;quot;);&lt;br /&gt;
                 }&lt;br /&gt;
 &lt;br /&gt;
                 //pck 1200y,1201m,1202d,1203h,1204m,1205s&lt;br /&gt;
                 '''var''' second = '''new''' '''DateTime'''(pck['''1200'''] + '''1''', pck['''1201'''], pck['''1202'''], pck['''1203'''], pck['''1204'''], pck['''1205''']).Ticks /&lt;br /&gt;
                              TimeSpan.TicksPerSecond;&lt;br /&gt;
                 '''var''' nanosecond = BitConverter.'''ToInt32'''(pck, '''1206''');&lt;br /&gt;
                 pTime = second * '''1000000''' + nanosecond / '''1000''';//计算当前包的时间戳&lt;br /&gt;
                 '''var''' idx = '''0''';&lt;br /&gt;
                 '''float''' delta = '''0''';&lt;br /&gt;
                 '''for''' ('''var''' i = '''0'''; i &amp;lt; '''12'''; ++i)&lt;br /&gt;
                 {&lt;br /&gt;
                     idx += '''2''';&lt;br /&gt;
                     List&amp;lt;LidarPoint3D&amp;gt; target;&lt;br /&gt;
                     '''var''' azimuth = (pck[idx + '''1'''] * '''256''' + pck[idx]) * '''0.01f''';//按照报文解析方位角&lt;br /&gt;
                     '''if''' (idx + '''100''' &amp;lt; '''1200''')&lt;br /&gt;
                     {&lt;br /&gt;
                         '''var''' aNext = (pck[idx + '''100''' + '''1'''] * '''256''' + pck[idx + '''100''']) * '''0.01f''';&lt;br /&gt;
                         delta = '''ThDiff'''(aNext, azimuth);&lt;br /&gt;
                     }&lt;br /&gt;
 &lt;br /&gt;
                     idx += '''2''';&lt;br /&gt;
 					//判断是否有效&lt;br /&gt;
                     '''bool''' '''DetermineFrame'''()&lt;br /&gt;
                     {&lt;br /&gt;
                         target = lastFrame;&lt;br /&gt;
                         '''var''' eFrameSt = pTime - ('''long''')(azimuth / '''360''' * ScanInterval * '''1000''');&lt;br /&gt;
                         '''if''' (ticLast == '''0''')&lt;br /&gt;
                         {&lt;br /&gt;
                             ticLast = eFrameSt;&lt;br /&gt;
                             '''return''' '''true''';&lt;br /&gt;
                         }&lt;br /&gt;
 &lt;br /&gt;
                         '''if''' (ticLast - ScanInterval * '''1000''' * '''0.1''' &amp;lt; eFrameSt &amp;amp;&amp;amp;&lt;br /&gt;
                             eFrameSt &amp;lt; ticLast + ScanInterval * '''1000''' * '''0.1''') '''return''' '''true'''; // previous frame.&lt;br /&gt;
 &lt;br /&gt;
                         '''if''' (eFrameSt &amp;gt; ticLast + ScanInterval * '''1000''' * '''1.3''')&lt;br /&gt;
                         {&lt;br /&gt;
                             ticLast = eFrameSt;&lt;br /&gt;
                             target.'''Clear'''();&lt;br /&gt;
                             newFrame.'''Clear'''();&lt;br /&gt;
                             '''return''' '''false''';&lt;br /&gt;
                         }&lt;br /&gt;
                         target = newFrame;&lt;br /&gt;
                         '''if''' (eFrameSt &amp;lt; ticLast - ScanInterval * '''1000''' * '''0.3''')&lt;br /&gt;
                             '''return''' '''false'''; // even older frame.&lt;br /&gt;
                         '''if''' (eFrameSt &amp;gt; ticLast + ScanInterval * '''1000''' * '''0.3''')&lt;br /&gt;
                         {&lt;br /&gt;
                             // new frame.&lt;br /&gt;
                             ticNew = eFrameSt;&lt;br /&gt;
                         }&lt;br /&gt;
                         '''return''' '''true''';&lt;br /&gt;
                     }&lt;br /&gt;
                     '''void''' '''Read'''()&lt;br /&gt;
                     {&lt;br /&gt;
                         '''for''' ('''var''' j = '''0'''; j &amp;lt; '''16'''; ++j)&lt;br /&gt;
                         {&lt;br /&gt;
                             '''var''' d = pck[idx + '''1'''] * '''256''' + pck[idx];&lt;br /&gt;
                             '''var''' refl = pck[idx + '''2'''];&lt;br /&gt;
                             idx += '''3''';&lt;br /&gt;
                             target.'''Add'''('''new''' '''LidarPoint3D'''()&lt;br /&gt;
                             {&lt;br /&gt;
                                 azimuth = '''ThDiff'''(mirror ? azimuth - '''180''' : -(azimuth - '''180'''),'''0'''),//减去180度旋转0度方向&lt;br /&gt;
                                 altitude = mirror ? -_altitudeTable[j] : _altitudeTable[j],&lt;br /&gt;
                                 d = d * '''4f''',&lt;br /&gt;
                                 intensity = refl / '''256f''',&lt;br /&gt;
                                 progression = ('''float''')((azimuth - Math.'''Floor'''(azimuth / '''360''') * '''360''') / '''360''')&lt;br /&gt;
                             });&lt;br /&gt;
                         }&lt;br /&gt;
                     }&lt;br /&gt;
 &lt;br /&gt;
                     '''if''' (!'''DetermineFrame'''()) '''continue''';&lt;br /&gt;
                     '''Read'''();&lt;br /&gt;
 					//由于两个俯仰角度的点云只给出一个角度信息，所以另一个需要根据相邻两包的数据进行差值计算&lt;br /&gt;
                     azimuth += delta / '''2''';&lt;br /&gt;
                     '''if''' (azimuth &amp;gt; '''360''') azimuth -= '''360''';&lt;br /&gt;
                     '''if''' (!'''DetermineFrame'''()) '''continue''';&lt;br /&gt;
                     '''Read'''();&lt;br /&gt;
                 }&lt;br /&gt;
 				//计算时间，若大于一个扫描周期，则进行output&lt;br /&gt;
                 '''if''' (pTime - ticLast &amp;gt; ScanInterval * '''1.3''' * '''1000''')&lt;br /&gt;
                 {&lt;br /&gt;
                     '''var''' scanCnt = '''1''';&lt;br /&gt;
                     '''if''' (ticLastSent != '''0''' &amp;amp;&amp;amp; ticLast - ticLastSent &amp;gt; ScanInterval * '''1000''' * '''1.3f''')&lt;br /&gt;
                         scanCnt = ('''int''')Math.'''Round'''((ticLast - ticLastSent) / (ScanInterval * '''1000'''));&lt;br /&gt;
 &lt;br /&gt;
                     scanC += scanCnt;&lt;br /&gt;
                     frame += '''1''';&lt;br /&gt;
                     cachedLidar = lastFrame.'''ToArray'''();&lt;br /&gt;
                     '''if''' (frame &amp;lt; '''10''')&lt;br /&gt;
                         typicalLen = Math.'''Max'''(typicalLen, cachedLidar.Length);&lt;br /&gt;
                     '''else''' '''if''' (typicalLen * '''0.8''' &amp;lt; cachedLidar.Length)&lt;br /&gt;
                         '''Output'''();&lt;br /&gt;
                     '''else'''&lt;br /&gt;
                        Console.'''WriteLine'''($&amp;quot;bad length or corrupted packet, only {cachedLidar.Length} points&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                     RealInterval = (ticLast - ticLastSent) / '''1000d''';&lt;br /&gt;
                     lastFrame = newFrame;&lt;br /&gt;
                     newFrame = '''new''' List&amp;lt;LidarPoint3D&amp;gt;();&lt;br /&gt;
                     ticLastSent = ticLast;&lt;br /&gt;
                     ticLast = ticNew;&lt;br /&gt;
 					//每10帧读取一次difop&lt;br /&gt;
                     '''if''' (scanC % '''10''' == '''0''') '''new''' '''Thread'''(GetDeviceInfo).'''Start'''();&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         '''public''' '''void''' '''Start'''('''string''' ip, '''int''' port1, '''int''' port2)&lt;br /&gt;
         {&lt;br /&gt;
             Console.'''WriteLine'''($&amp;quot;LeishenC16 on {ip}&amp;quot;);&lt;br /&gt;
             '''this'''._targetIp = ip;&lt;br /&gt;
             '''new''' '''Thread'''(() =&amp;gt;&lt;br /&gt;
             {&lt;br /&gt;
                 Console.'''WriteLine'''($&amp;quot;Try LeishenC16&amp;quot;);&lt;br /&gt;
                 '''while''' ('''true''')&lt;br /&gt;
                 {&lt;br /&gt;
                     '''try'''&lt;br /&gt;
                     {&lt;br /&gt;
                         //设置is3D属性为true，代表是3D雷达&lt;br /&gt;
                         is3D = '''true''';&lt;br /&gt;
                         '''Loop'''(port1, port2);&lt;br /&gt;
                     }&lt;br /&gt;
                     '''catch''' (Exception ex)&lt;br /&gt;
                     {&lt;br /&gt;
                         Console.'''WriteLine'''($&amp;quot;msg:{ex.Message}, stack:{ex.StackTrace}&amp;quot;);&lt;br /&gt;
                         Thread.'''Sleep'''('''1000''');&lt;br /&gt;
                     }&lt;br /&gt;
                 }&lt;br /&gt;
             }).'''Start'''();&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
生成插件后，需在Medulla的startup.iocmd中增加以下代码：&lt;br /&gt;
 //io load xxx.dll时，会寻找dll里面class MainIOObject并实例化相应的对象赋值给等号左侧的frontlidar3d&lt;br /&gt;
 frontlidar3d = io load plugins/LeishenC16_v4_0_8.dll&lt;br /&gt;
 //Start对应Start函数，传的参数放在后面，空格隔开。&lt;br /&gt;
 frontlidar3d Start '''192.168'''.'''0.2''' '''2368''' '''2369'''&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
</feed>