<?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=Bruce</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=Bruce"/>
	<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/Bruce"/>
	<updated>2026-04-15T16:01:18Z</updated>
	<subtitle>用户贡献</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%BF%80%E5%85%89SLAM%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B&amp;diff=982</id>
		<title>激光SLAM工作流程</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%BF%80%E5%85%89SLAM%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B&amp;diff=982"/>
		<updated>2025-11-04T09:14:12Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​创建页面，内容为“ = 一、前言 = 本文从应用角度说明Detour的激光SLAM，以便读者从原理角度理解功能，能够在实践中有效定位问题，采取正确的方法处理。  = 二、激光里程计 = &amp;lt;blockquote&amp;gt;参考链接：  Detour简介 - MDCS wiki  安装Detour - MDCS wiki  MDCS参数表:Detour - MDCS wiki [2.2]  使用手册 - 分析定位问题|使用手册 - 分析…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= 一、前言 =&lt;br /&gt;
本文从应用角度说明Detour的激光SLAM，以便读者从原理角度理解功能，能够在实践中有效定位问题，采取正确的方法处理。&lt;br /&gt;
&lt;br /&gt;
= 二、激光里程计 =&lt;br /&gt;
&amp;lt;blockquote&amp;gt;参考链接：&lt;br /&gt;
&lt;br /&gt;
[[Detour简介|Detour简介 - MDCS wiki]]&lt;br /&gt;
&lt;br /&gt;
[[安装Detour|安装Detour - MDCS wiki]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Detour#2.2 激光里程计|MDCS参数表:Detour - MDCS wiki]] [2.2]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - 分析定位问题|使用手册 - 分析定位问题 - MDCS wiki]]&amp;lt;/blockquote&amp;gt;激光里程计是SLAM的“前端模块”。激光里程计接收来自激光雷达的点云（雷达扫描一圈的测量输出），将相邻点云配准，得到相对位移，积分位移得到机器人位姿。&lt;br /&gt;
&lt;br /&gt;
激光里程计由2个模块构成，由里程计线程执行：&lt;br /&gt;
&lt;br /&gt;
* 帧间位移：计算相邻点云的位移，积分为机器人位姿。&lt;br /&gt;
* 局部地图：维护一个机器人航迹上的“小地图”，修正帧间位移计算的累积误差。&lt;br /&gt;
&lt;br /&gt;
== 2.1 运行流程 ==&lt;br /&gt;
&lt;br /&gt;
# 接收点云：等待激光雷达驱动推送的点云帧（雷达扫描一周输出的点云）。&lt;br /&gt;
# 预测位姿：根据机器人的运动速度、角度估计下一个位姿。&lt;br /&gt;
# 更新遮罩：点云中的“移动物体”（包括噪音）被遮罩包裹，在后续计算中被过滤。“移动物体”指低速移动的物体（速度低于1m/s，且在移动）。&lt;br /&gt;
# 帧间位移：计算与上一个点云帧的相对位移。&lt;br /&gt;
# 纠正畸变：纠正点云的运动畸变。&lt;br /&gt;
# 地图配准：点云帧与局部地图的关键帧配准，修正帧间位移的积分累积误差。&lt;br /&gt;
# 质量检查：检查里程计计算质量。&lt;br /&gt;
&lt;br /&gt;
== 2.2 接收点云 ==&lt;br /&gt;
里程计启动时等待点云帧，如果超过10秒则输出：&amp;quot;still waiting for data from xxx after 10s...&amp;quot;。表示激光雷达没输出，一般是驱动（或驱动配置参数）错误引起。&lt;br /&gt;
&lt;br /&gt;
里程计运行时，如果出现跳帧（点云数据丢失）则输出：&amp;quot;dangerous interval: xxx, time lag= xxx ms&amp;quot;。一般是算力低导致里程计来不及处理数据，比如CPU过热后降频；或者激光雷达短暂离线。&lt;br /&gt;
&lt;br /&gt;
当跳帧严重时，输出：&amp;quot;... , lstepInc-&amp;gt;xxx&amp;quot;。lstep将快速增大。此时机器人位姿很可能与实际位姿出现显著偏差，Detour地图界面上的当前点云（青色）与地图轮廓不再贴合。&lt;br /&gt;
&lt;br /&gt;
如果点云输出延迟超过1秒，输出：&amp;quot;Bad interval compared to time lag, lag=xxx, timebudge=xxx, interval= {interval} -&amp;gt; xxx&amp;quot;。以及&amp;quot;Too large time lag and interval, xxx ms, restart, lstep+=xxx -&amp;gt;xxx&amp;quot;。出现这类日志表示激光雷达输出有严重问题，应检查相关硬件（激光雷达、CPU算力）。&amp;lt;blockquote&amp;gt;备注：lstep是激光地图的关键帧锁定步长。正常情况下，lstep=2（Detour状态栏缩写为&amp;quot;ls&amp;quot;）表示关键帧及时锁定，机器人位姿是精确的。当关键帧不能及时锁定时，比如较差的点云质量，lstep会增加。可将lstep当做“置信度”，参见 [[Detour-API|Detour-API - MDCS wiki]] 的 2.1.1。&amp;lt;/blockquote&amp;gt;Detour地图界面将点云帧显示为青色点，这些点构成扫描线。&lt;br /&gt;
[[文件:Image-20230929202213059.png|无框|633x633像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''图 1-1 点云形成的扫描线'''&lt;br /&gt;
&lt;br /&gt;
地图上的白色轮廓线由关键帧的点云构成，框选关键帧，其点云显示为红色点。&lt;br /&gt;
&lt;br /&gt;
[[文件:1014px-Image-20230929190830125.png|无框|634x634像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 1-2 关键帧的点云'''&lt;br /&gt;
&lt;br /&gt;
根据青色扫描线与白色轮廓线可判断机器人位姿是否正确：重合则没问题，脱开则位姿错误。&lt;br /&gt;
&lt;br /&gt;
== 2.3 预测位姿 ==&lt;br /&gt;
根据机器人的移动速度和角度，预测机器人下一个位姿。AGV是低速车辆，其航迹是平滑的，因此预测相对简单，不会输出错误日志。&lt;br /&gt;
&lt;br /&gt;
== 2.4 更新遮罩 ==&lt;br /&gt;
遮罩用于过滤“移动物体”：&lt;br /&gt;
&lt;br /&gt;
* 低速移动：这些物体的移动速度低于1米/秒。比如拖着料车的牵引车，行人等。&lt;br /&gt;
* 持续移动：处于运动状态，或者短暂停下（小于30秒）后移动。&lt;br /&gt;
&lt;br /&gt;
以下不属于“移动物体”：&lt;br /&gt;
&lt;br /&gt;
* 快速移动：移动速度高于1米/秒。比如焊装机器手、总装车间下线的成品轿车（驶去测试区）、室外马路上的车辆。&lt;br /&gt;
* 长时停下：驻留时间大于30秒。比如车间参观人群，在雷达旁长时间站立，然后四散离开。&lt;br /&gt;
&lt;br /&gt;
还有“相对静止”：&lt;br /&gt;
&lt;br /&gt;
* 平库货物。堆放在平库的货物，过一段时间才会被移走。&lt;br /&gt;
&lt;br /&gt;
遮罩不会过滤后两类物体。“快速移动”和“长时停下”物体一般在物流通道和生产区，可将这些区域标记为“物品移动区域”，过滤区域内的点云，与遮罩的动态算法形成互补。&amp;lt;blockquote&amp;gt;注意：不要滥用“物品移动区域”。原则上仅用于物流通道，“相对静止”物体对里程计是非常重要的，如果滥用“物品移动区域”，可能抹掉可用点云，使里程计缺少计算所需点云，造成定位失败率上升。&amp;lt;/blockquote&amp;gt;如果遮罩过滤后的点云数量低于 minPointsAmount，输出：&amp;quot;* observed xxx-&amp;gt;xxx, too few after masking, reset mask, lstep+=10-&amp;gt;xxx&amp;quot;。minPointsAmount是点云配准所需的最少点云数量，过滤后点云低于该阈值时重启遮罩。&lt;br /&gt;
&lt;br /&gt;
== 2.5 帧间位移 ==&lt;br /&gt;
帧间位移包含了点云（无反SLAM）和反射点（有反SLAM）。当帧间点云配准分数低于 ScoreThres时，输出：&amp;quot;Bad Seq, t=xxx ms, cnt=xxx, interval=xxx, score=配准分数, n:xxx-xxx, lstepinc+=5 -&amp;gt;xxx&amp;quot;。这条日志表示点云变化剧烈，无法计算帧间位移，里程计必须重启。&lt;br /&gt;
&lt;br /&gt;
这个问题要结合运行场景来看，以下是可能性，但不是穷举，仅供参考：&lt;br /&gt;
&lt;br /&gt;
* 环境导致：比如机器人下坡，雷达俯仰前后的观测环境剧烈变化。&lt;br /&gt;
* 人为因素：一群人站在雷达前，然后散开；或者人蹲在雷达前操作面板，然后走开。&lt;br /&gt;
* 近距离遮挡：机器人在狭窄走道行走（雷达视野受限），经过近邻立柱时一侧视野被遮挡；或者靠墙旋转。&lt;br /&gt;
&lt;br /&gt;
一般来说，ScoreThres不需要调整，只有在特殊环境下（有固定的点云突变场景，且连续出现）才要调整。对于人为因素，可耦合轮里程计应对，避免近距离遮挡（一群人，物流车等快速移动物体）而“带漂”里程计（相对运动造成）。&amp;lt;blockquote&amp;gt;注意：帧间位移是个相对概念。当周围环境是稳定的，机器人移动时，帧间位移计算不会有问题。当周围环境是动态的，机器人静止时，相对移动的物体会“拉偏”里程计。比如，AGV在车道旁库位停车，有一辆牵引车从雷达前经过，牵引车相对运动会拉偏里程计。在人车混合作业的场景中，如果雷达安装在低位（地牛、潜伏车等），应该耦合轮里程计来增强SLAM鲁棒性。如果AGV未配置IMU（仅用驱动器编码器输出角度误差较大），可在停车时停止里程计（通过API）。&amp;lt;/blockquote&amp;gt;里程计除了计算帧间位移，还保留了最近N次帧间位移配准分数。历史数据如果较差，也会重启里程计，并输出以下日志：&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;sequential xxx history score bad, avg={分数均值}, restart(lvl=xxx), lstepinc+=15-&amp;gt;{xxx}&amp;quot;&lt;br /&gt;
* &amp;quot;xxx history score={分数均值}, too low, restart(lvl=xxx), lstepinc+=1=xxx&amp;quot;&lt;br /&gt;
&lt;br /&gt;
这种情况一般与环境有关，比如靠近墙体旋转。可降低 GoodScore 应对。&amp;lt;blockquote&amp;gt;提示：分析里程计问题时抓住“点云变化程度”这个点。帧间位移配准分数与点云变化程度负相关，变化小分数就高，否则相反。而点云变化程度与雷达视野正相关，如靠墙旋转时，近距离墙体遮挡旋转中的雷达，点云会剧烈变化。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2.6 纠正畸变 ==&lt;br /&gt;
基于运动学纠正点云（的运动）畸变。相关参数是 correctionType、correctionLvl，这些参数由懒书维护，用户无须关心。&amp;lt;blockquote&amp;gt;提示：如果不确定参数默认值，可用Detour.exe创建一个新配置，即见默认值。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2.7 地图配准 ==&lt;br /&gt;
局部地图由里程计维护，用户无须关心。&lt;br /&gt;
&lt;br /&gt;
激光里程计会将当前位姿提交给激光地图，由后者搜索附近关键帧，如果能锁定关键帧，则更新当前位姿。&lt;br /&gt;
&lt;br /&gt;
== 2.8 质量检查 ==&lt;br /&gt;
如果帧间配准分数低于 ScoreThres，则立即重启点云。如果里程计历史分数均值低于 GoodThres，则保留高质量点云后重启（部分重启）。当看到里程计重启日志时（odometry输出日志中有&amp;quot;restart&amp;quot;关键词），可降低GoodThres应对。&lt;br /&gt;
&lt;br /&gt;
= 三、激光地图 =&lt;br /&gt;
&amp;lt;blockquote&amp;gt;参考以下链接：&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - 激光SLAM＋反光板建图手册|使用手册 - 激光SLAM＋反光板建图手册 - MDCS wiki]]&lt;br /&gt;
&lt;br /&gt;
[[激光地图编辑指南|激光地图编辑指南 - MDCS wiki]]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Detour#2.2 激光里程计|MDCS参数表:Detour - MDCS wiki]] [2.3]&amp;lt;/blockquote&amp;gt;激光地图在SLAM被称为“后端模块”。激光地图以较慢频率（相对于前端模块）将点云帧与关键帧配准，在配准分数及格的集合中取分数最高的锁定，然后以这个关键帧来修正里程计的位姿。&lt;br /&gt;
&lt;br /&gt;
== 3.1 运行流程 ==&lt;br /&gt;
&lt;br /&gt;
# 取任务：从任务队列取配准任务。&lt;br /&gt;
# 有反配准：如果机器人在“匹配困难区域”，则执行有反SLAM。&lt;br /&gt;
# 关键帧配准：在给定位姿附近搜索可锁定关键帧。&lt;br /&gt;
&lt;br /&gt;
== 3.2 取任务 ==&lt;br /&gt;
激光里程计通过队列向激光地图提交回环任务。&lt;br /&gt;
&lt;br /&gt;
== 3.3 有反配准 ==&lt;br /&gt;
当机器人在“匹配困难区域”（涂黄区域），或者Detour模式切到“更新匹配困难区域”时，使用反光棒/板进行配准。&lt;br /&gt;
&lt;br /&gt;
执行有反配准时，在Detour地图界面上，相关关键帧旁会出现青色文字，表示配准分数，格式为：&amp;quot;R{分数}&amp;quot;或&amp;quot;Rr{分数}&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20230929203140344.png|无框|658x658像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-1 锁定关键帧'''&lt;br /&gt;
&lt;br /&gt;
当关键帧配准分数及格，但是机器人位姿偏差过大时，日志输出：&amp;quot;反光板配准信度{分数}，但位置偏差过大(ls=xxx vs xxx)，xy:{位置误差}/{最大位置误差},dth:{角度偏差}/{最大角度偏差}，过滤&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
当关键帧配准分数及格，但是机器人位姿落在区域外，日志输出：&amp;quot;反光板配准配准信度{分数}，但位置处于无效区域（见标记的浅蓝位置），xy:{位置误差},dth:{角度误差}，过滤&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20230929211745650.png|无框|661x661像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-2 关键帧不能锁定'''&lt;br /&gt;
&lt;br /&gt;
无论有反或无反，地图对位姿误差的判断方法是一样的：&lt;br /&gt;
&lt;br /&gt;
* 最大位置误差：baseErrorXY + lstep * step_eror_xy&lt;br /&gt;
* 最大角度误差：baseErrorTh + lstep * step_error_th&lt;br /&gt;
&lt;br /&gt;
以位置为例，baseErrorXY是基础范围（误差圆半径），误差随着lstep的增加而扩大，增量是step_error_xy。对于SLAM不良路段，会出现连续几个关键帧锁不上的情况，遇到配准分数及格的关键帧时误差过大而被过滤。此时可增加step_error_xy来应对。&lt;br /&gt;
&lt;br /&gt;
激光里程计的角分辨率为0.1度，角度精度比位置更高，一般不用调整Th参数。&lt;br /&gt;
&lt;br /&gt;
当锁定关键帧时，日志输出：&amp;quot;R({地图文件名}) {xxx}:{xxx}(l={lstep}), from {x坐标},{y坐标},{角度} to:{x坐标},{y坐标},{角度}, delta={位置误差}/{角度误差}({最大位置误差}/{最大角度误差}), s={配准分数}&amp;quot;。&amp;lt;blockquote&amp;gt;提示：日志中的位置坐标，可以在Detour地图界面找到，方法是将鼠标指针放到地图上，状态栏显示的“鼠标位置”就是鼠标在地图的坐标。用这个方法可以在地图上找到日志输出的位置，结合工作环境推断雷达当时观测到的环境轮廓。&amp;lt;/blockquote&amp;gt;关键帧的搜索半径由 frame_distant 参数决定：&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20251104105426052.png|无框]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-3 frame_distant'''&lt;br /&gt;
&lt;br /&gt;
该参数默认值是 5000(mm)，表示以当前位姿为圆心，搜索半径为5米。对于关键帧比较近，且环境特征非常明显的场景，比如位于墙角的立库出口，相邻出库口距离很近，可能会锁错关键帧（如锁到旁边出入口的关键帧），可降低 frame_distant 应对。&amp;lt;blockquote&amp;gt;提示：理解关键帧配准分数非常重要。点云帧与关键帧点云的配准分数越高，该关键帧被选用的可能越大。上例所举的误锁例子，由相邻关键帧的点云相近引起，缩小关键帧搜索半径，能够提高定位精度。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3.4 关键帧配准 ==&lt;br /&gt;
非“匹配困难区域”使用无反SLAM，将点云帧与附近关键帧配准。如果配准分数低于全局定位阈值（GrepThres + lstep * GrepThresK）时，执行全局重定位。Detour地图界面上会显示被搜索关键帧的配准分数，锁定关键帧显示为“实心红圈”，旁边是配准分数，格式是&amp;quot;PC{分数}&amp;quot;（PC表示点云）。全局重定位时锁定的关键帧，分数前缀是&amp;quot;G&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
无反SLAM的输出日志与有反一样，不再复述。&amp;lt;blockquote&amp;gt;提示：什么时候用全局重定位？如果机器人所在位置的环境高度稳定，且特征明显时，可以用全局重定位。一般情况下应该用“指定位置重定位”（Detour界面对应“手动重定位”），找回定位概率要高于全局重定位。Detour会自动记录最新位置，如果AGV掉电维修时移动到其他位置，那么启动时定位会丢失（Detour启动时读入上次开机时的最新位置），如果维修点是固定的，建议用指定位置重定位；如果维修点特征明显，也可用全局重定位。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 四、3D激光雷达 =&lt;br /&gt;
&amp;lt;blockquote&amp;gt;参考链接：&lt;br /&gt;
&lt;br /&gt;
[[安装Detour|安装Detour - MDCS wiki]] [4.3] [5.1.1]&lt;br /&gt;
&lt;br /&gt;
[[MDCS参数表:Detour|MDCS参数表:Detour - MDCS wiki]] [2.2.2]&amp;lt;/blockquote&amp;gt;3D激光雷达（PlanarRotary3DLidar、PlanarMid360）从3D点云中提取“垂直结构”特征，并将其二项化为2D点云。&lt;br /&gt;
&lt;br /&gt;
墙、大树干、电控箱等都是“垂直结构”，它们是稳定的特征点，形成二向化点云。&lt;br /&gt;
&lt;br /&gt;
3D雷达在3D点云中提取“垂直结构”的流程如下：&lt;br /&gt;
&lt;br /&gt;
# 水平切块：以aziRes为分割单位，将3D点云切分为 360 / aziRes 个块（切蛋糕）。&lt;br /&gt;
# 垂直切片：以altRes为分割单位，对分块的3D点云进行垂直切分。&lt;br /&gt;
# 分块寻找垂直结构：遍历水平切块，寻找其中的“垂直结构”。想象用一个圆筒在点云块中移动，如果圆筒中存在若干点，满足：垂直方向上至少有 minScans 个点，且高度大于 minVStruct，且这些点之间的“空洞”高度不大于 maxVHole。那么这些点构成一个“垂直结构”。&lt;br /&gt;
# 垂直结构拟合为向量：将垂直结构的点云拟合为向量，该向量为一条直线，与Z平面形成夹角。&lt;br /&gt;
# 过滤特征：分块中可能存在若干个垂直结构，将代表它们的向量夹角为显著性（越垂直于XY平面的向量越显著），并根据向量到 ZFadeout（距离雷达水平面的高度）的距离，计算出向量权重并排序。然后取 pivotPos（默认值0.9）位置的向量，将其权重（显著性）乘以 pivotFac（默认值0.05），得到权重阈值。凡显著性大于权重阈值的向量均是特征点，随后将其投影到XY平面成为二向化特征点。&lt;br /&gt;
# 合并二向化特征点：将相邻距离小于 merge_dist 的二向化特征点合并。&lt;br /&gt;
&lt;br /&gt;
3D雷达输入3D点云，输出二向化点云，后者包含了丰富的3D空间结构特征，相比于2D雷达，能够显著提高SLAM鲁棒性。&amp;lt;blockquote&amp;gt;提示：增加 merge_dist 可“打薄”点云轮廓线，对于近距离成像性能较差的雷达，可通过这个参数减低近距离点云“跳动”现象。&amp;lt;/blockquote&amp;gt;对于存在“分层”垂直结构的场景，比如1.6米以下是机台，2.5米以上是管道，其间是不稳定的结构，可用 selZ 来选择不同层的垂直结构。selZ是一个数组，本例可设为 selZ=[1500, 2600]。把selZ的每个下标想象为&amp;quot;大刀&amp;quot;，刀在指定高度水平挥出，被砍中的“垂直结构”就是特征点，否则过滤。&lt;br /&gt;
&lt;br /&gt;
室外存在“空旷”场景，比如厂房外的车道，两侧是厂房外墙，刚栽种的行道树（树干直径不超过10厘米）；又如停车场，两边是简单隔墙。前者是“长走廊”场景，两侧外墙形成平行线，只有行道树可供里程计使用；后者是“平库”场景，缺少垂直结构。&lt;br /&gt;
&lt;br /&gt;
对于“长走廊”场景，树冠是里程计的唯一依据，设 minVStruct=20、minMustVStruct=0、filterStdE=50，将树叶作为垂直结构，可提供足够数量的特征点。由于树冠随季节有显著变化，这个方法不能用于生产，应耦合轮里程计应对。&lt;br /&gt;
&lt;br /&gt;
对于“平库”场景，设 allowSinglePoint=true，启用“单点”功能，结合selZ使用。“单点”功能在selZ给出的高度附近寻找点，如有则将其转为特征向量，向量垂直于XY平面，显著性比垂直结构远低。利用这个功能，可以把“马路牙子”作为特征，selZ选择高度50（马路牙子高度一般在100~120mm）。由于室外地面起伏较大，雷达会扫描到地面，在扫描马路牙子同时还会形成一片地面噪音，可将地面标记为“移动物品区域”（涂红），或者修改 pivotPos &amp;amp; pivotFac，建议值 pivotPos=0.5、pivotFac=0.5，过滤地面噪音。&lt;br /&gt;
&lt;br /&gt;
= 五、耦合轮里程计 =&lt;br /&gt;
&amp;lt;blockquote&amp;gt;参考链接：&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - 同时使用激光、地纹、二维码、轮编里程计和IMU进行鲁棒定位|使用手册 - 同时使用激光、地纹、二维码、轮编里程计和IMU进行鲁棒定位 - MDCS wiki]]&lt;br /&gt;
&lt;br /&gt;
[[Detour-API|Detour-API - MDCS wiki]] [2.4.1]&amp;lt;/blockquote&amp;gt;对于雷达安装在低位的AGV，比如潜伏举升、地牛等，实践证明仅靠激光雷达是较难满足搬运要求的。低位雷达容易受到移动物干扰，在人车混杂的工作场景下很容易被干扰。最佳实践是激光雷达加轮里程计，后者根据IMU（提供可靠的角度观测）和驱动轮编码器计算机器人位姿，在激光不良的路段提供另一种定位手段，与激光形成互补。&lt;br /&gt;
&lt;br /&gt;
Detour的“紧耦合”功能可融合多个异构里程计，输出置信度最高的里程计位姿。里程计类型包括（但不限于）激光、地纹、轮里程计、GNSS（北斗）。&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;
* 紧耦合方差（TCVar）：反应多里程计位姿的一致性程度。&lt;br /&gt;
* 耦合分数：包括耦合因子，表示与系统状态的一致性（耦合一致性）；自拟合质量，表示里程计内部一致性（自拟合质量）。&lt;br /&gt;
&lt;br /&gt;
使用紧耦合状态的以下属性分析耦合质量：&lt;br /&gt;
&lt;br /&gt;
* fitexplain（最佳里程计）：&amp;quot;{里程计名称}:{历史位姿总数}L/{耦合分数}&amp;quot;。紧耦合正常工作时，被耦合的里程计轮流被选中，耦合分数大于1。&lt;br /&gt;
* discarding（丢弃里程计）：置信度不合格的里程计被丢弃，出现在这个属性。&lt;br /&gt;
* CouplingScore（耦合分数）：包括耦合因子和自拟合质量，取值范围[0, 1]，可用100分来理解：大于0.85表现良好，低于0.35极差，中间的分别是一般、合格、不合格。&lt;br /&gt;
* err（定位误差圆）：位置估计的标准差（mm）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;注意：使用 Detour + DetourLite组合时，Detour不会显示DetourLite的紧耦合状态，要用 &amp;quot;/getstat&amp;quot; 接口来获得统计对象，然后看其中的TC（紧耦合）状态。&amp;lt;/blockquote&amp;gt;通过“外部定位源”输出里程计位姿时，要注意发布频率。发布频率越高，里程计轨迹越平滑，则自拟合质量越高。高频发布的里程计会“美化”其性能，导致紧耦合一直选用该里程计，失去了鲁棒性。比如，10Hz扫描频率的激光雷达，耦合低成本IMU的轮编里程计，后者以50Hz发布，紧耦合大概率只用轮里程计，应把轮里程计的发布频率降到10Hz。&amp;lt;blockquote&amp;gt;提示：激光雷达 + 轮里程计组合，激光雷达 time_bias_ms 经验值是 -20（默认值），可使激光雷达与轮里程计更好耦合。&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20251104105426052.png&amp;diff=981</id>
		<title>文件:Image-20251104105426052.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20251104105426052.png&amp;diff=981"/>
		<updated>2025-11-04T09:13:53Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image-20251104105426052&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1014px-Image-20230929190830125.png&amp;diff=980</id>
		<title>文件:1014px-Image-20230929190830125.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1014px-Image-20230929190830125.png&amp;diff=980"/>
		<updated>2025-11-04T09:09:48Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1014px-Image-20230929190830125&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=DetourLite%E6%A3%80%E6%9F%A5%E8%A1%A8&amp;diff=964</id>
		<title>DetourLite检查表</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=DetourLite%E6%A3%80%E6%9F%A5%E8%A1%A8&amp;diff=964"/>
		<updated>2025-07-18T02:28:13Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​创建页面，内容为“=== 1. 默认建图模式 === detour.json的激光地图的默认在建图模式，不修改的话可能影响已建地图。&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;   &amp;quot;positioning&amp;quot;: [     {       &amp;quot;type&amp;quot;: &amp;quot;lidarmapsettings,possettings&amp;quot;,       &amp;quot;options&amp;quot;: {         &amp;quot;mode&amp;quot;: 0, // 激光地图工作模式..       }  &amp;lt;/syntaxhighlight&amp;gt;mode对应Detour.exe“单线激光SLAM”的“选中的图层信息”，0是建图模式，1是锁定图层，以此类推。  将mo…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== 1. 默认建图模式 ===&lt;br /&gt;
detour.json的激光地图的默认在建图模式，不修改的话可能影响已建地图。&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;quot;positioning&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;lidarmapsettings,possettings&amp;quot;,&lt;br /&gt;
      &amp;quot;options&amp;quot;: {&lt;br /&gt;
        &amp;quot;mode&amp;quot;: 0, // 激光地图工作模式..&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;mode对应Detour.exe“单线激光SLAM”的“选中的图层信息”，0是建图模式，1是锁定图层，以此类推。&lt;br /&gt;
&lt;br /&gt;
将mode值改为1，使DetourLite启动时处于锁定图层模式。&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;quot;positioning&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;lidarmapsettings,possettings&amp;quot;,&lt;br /&gt;
      &amp;quot;options&amp;quot;: {&lt;br /&gt;
        &amp;quot;mode&amp;quot;: 1,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. 激光地图名为null ===&lt;br /&gt;
detour.json的激光地图名称默认为null。首次建图后该属性不会变更，重启后不会读入地图文件。比如DetourLite首次建图，Detour.exe（客户端）下载远程图层（激光地图）另存到本地，命名为&amp;quot;mainmap.2dlm&amp;quot;作为备份。此时DetourLite的detour.json的激光地图文件名还是null，再次重启后如果处于默认建图模式（见上），则用临时地图文件(tmpmap.2dlm)更新mainmap.2dlm，使地图文件被清空。&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;quot;positioning&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;lidarmapsettings,possettings&amp;quot;,&lt;br /&gt;
      &amp;quot;options&amp;quot;: {&lt;br /&gt;
        &amp;quot;mode&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;addFrameIfNoFrameToReg&amp;quot;: false,&lt;br /&gt;
        &amp;quot;filename&amp;quot;: null, // 激光地图文件名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;注意：本例的mode=0，会触发地图文件被覆盖问题。&lt;br /&gt;
&lt;br /&gt;
修改filename值，并修改mode值，使DetourLite启动后自动加载正确的地图文件，并处于锁定图层模式。&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;quot;positioning&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;lidarmapsettings,possettings&amp;quot;,&lt;br /&gt;
      &amp;quot;options&amp;quot;: {&lt;br /&gt;
        &amp;quot;mode&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;addFrameIfNoFrameToReg&amp;quot;: false,&lt;br /&gt;
        &amp;quot;filename&amp;quot;: &amp;quot;mainmap.2dlm&amp;quot;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=963</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=963"/>
		<updated>2025-07-18T02:08:52Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​/* 快速开始 */&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;
[[特殊:我的语言/使用手册 - 定位导航|使用手册 - 定位导航]]&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>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%9D%9E%E6%A0%87%E8%BD%A6%E5%9E%8B%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C&amp;diff=958</id>
		<title>非标车型使用手册</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E9%9D%9E%E6%A0%87%E8%BD%A6%E5%9E%8B%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C&amp;diff=958"/>
		<updated>2025-06-30T08:36:59Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​/* 3.4.5 场景标签 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;以非标差速底盘地牛说明MDCS的使用方法。&lt;br /&gt;
&lt;br /&gt;
= 一、概述 =&lt;br /&gt;
[[文件:Image-20250627111525131.png|无框|691x691像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 1-1 车型开发架构图'''&lt;br /&gt;
&lt;br /&gt;
MDCS由4个子系统构成，分别部署在上位机和下位机：&lt;br /&gt;
&lt;br /&gt;
* 上位机。用于管理车队的工控机或服务器，部署Simple（管控子系统）以管理车队、任务，通过开放接口向第三方系统开放自动化集成能力。&lt;br /&gt;
** Simple。管控软件，实现车队管理、管控地图配置、任务路线规划、交通管制等功能。车型插件定义特定车型的功能与规格，支持管控软件规划路线与任务编译。&lt;br /&gt;
* 下位机。用于实现移动机器人的运动功能，通过传感器感知环境，执行上位机下发的任务。由3个子系统构成，部署在车载工控机（或嵌入式主板）上。&lt;br /&gt;
** Detour。定位软件，实现激光SLAM（2D/3D Lidar）、地纹SLAM、二维码定位。&lt;br /&gt;
** Clumsy。自动驾驶软件，实现运动控制（行走、旋转、货叉控制等），避障区域（基于激光雷达输出点云）配置，目标识别（通过激光雷达/深度相机识别托盘/货架等），执行上位机下发的任务。车型插件定义移动机器人运动控制相关的信号，比如驱动轮速度、货叉升降控制与高度、SLAM定位置信度等。&lt;br /&gt;
** Medulla。硬件驱动软件，实现与移动机器人硬件（电气模组）的通信能力，比如（电机）驱动器、激光雷达、底盘控制器等。车型插件定义电气模组相关的信号，实现与电气模组的通信功能。&lt;br /&gt;
&lt;br /&gt;
新车型开发的主要任务就是开发车型插件，整定运动参数，配置管控线路。应用新车型的项目还有业务应用开发，即第三方系统部分。业务应用开发不属于本手册范围。&lt;br /&gt;
&lt;br /&gt;
= 二、启动 =&lt;br /&gt;
&lt;br /&gt;
== 2.1 下位机 ==&lt;br /&gt;
顺序启动下位机软件。&amp;lt;blockquote&amp;gt;备注：MDCS对下位机软件的启动顺序没有要求，调试时顺序启动可避免无谓的错误，比如medulla较晚启动，detour未收到点云而触发Clumsy的“盲目驾驶”警报。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.1.1 Medulla ===&lt;br /&gt;
资源管理器打开L100的安装目录，双击&amp;quot;Medulla\Medulla.exe&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250627165034978.png|无框|605x605像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-1 Medulla运行界面'''&lt;br /&gt;
&lt;br /&gt;
窗口左侧的&amp;quot;对象列表&amp;quot;有两个组件：cart是移动机器人的下位信号，frontlidar是导航雷达。这是调试时主要关注的对象。&lt;br /&gt;
&lt;br /&gt;
=== 2.1.2 Detour ===&lt;br /&gt;
资源管理器打开L100的安装目录，双击&amp;quot;Detour\Detour.exe&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250628153846834.png|无框|635x635像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-2 Detour 启动后界面'''&lt;br /&gt;
&lt;br /&gt;
L100 仿真环境已建图。Detour 启动后自动加载地图，勾选 Detour 窗口右下角的&amp;quot;显示选项 \ 跟随小车&amp;quot;，使 L100 在窗口中央，使用鼠标滚轮缩放激光地图。&amp;lt;blockquote&amp;gt;备注：由于 Robopal 不会记录 L100 最后位置，因此 Detour 启动后可能会出现丢定位现象，使用 Detour 的&amp;quot;概览&amp;quot;标签的&amp;quot;全图重定位&amp;quot;可找回定位。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.1.3 Clumsy ===&lt;br /&gt;
资源管理器打开L100的安装目录，双击&amp;quot;Clumsy\ClumsyConsole.exe&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250628155351989.png|无框|524x524像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-3 Clumsy 启动后界面'''&lt;br /&gt;
&lt;br /&gt;
Clumsy 界面由 2 个标签构成。控制面板展示小车的运动状态，以及用于调试的功能列表。车辆配置用于整定运动参数。&lt;br /&gt;
&lt;br /&gt;
== 2.2 上位机 ==&lt;br /&gt;
&lt;br /&gt;
=== 2.2.1 Simple ===&lt;br /&gt;
资源管理器打开L100的安装目录，双击&amp;quot;Simple\SimpleComposer.exe&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751190069399.png|无框|591x591像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-4 Simple 启动后界面'''&lt;br /&gt;
&lt;br /&gt;
使用鼠标滚轮缩放地图，按下滚轮（中键）拖动地图，使 L100 模拟车和管控路线在地图上显示。&lt;br /&gt;
&lt;br /&gt;
== 2.3 仿真环境 ==&lt;br /&gt;
对于不具备物理调试环境的用户，比如缺调试场地、非标AGV尚未制造下线，可以使用仿真环境来调试。仿真环境由以下子系统构成：&lt;br /&gt;
&lt;br /&gt;
* 仿真环境。Robopal是仿真环境软件，实现移动机器人及其运行环境的仿真，模拟配置了2D雷达、安全触边的移动机器人，以及单舵轮、差速底盘，在设定环境中运行。可用于激光SLAM建图和定位，接触式和非接触式避障测试，运动参数整定等调试任务。&lt;br /&gt;
* 设备模拟器。Mimics是自控设备模拟器，实现移动机器人的电机驱动器、点位开关的仿真。可用于运动参数整定等调试任务。&lt;br /&gt;
* 配套应用软件。modbus slave模拟器、西门子S7模拟器等。用于模拟现场总线，与设备模拟器配套使用。&lt;br /&gt;
&lt;br /&gt;
我们以代表车型来说明仿真环境使用方法。&lt;br /&gt;
&lt;br /&gt;
=== 2.3.1 L100地牛 ===&lt;br /&gt;
L100地牛使用差速底盘，配有一个2D激光雷达，系统通信图如下。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250627150427180.png|无框|579x579像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-5 L100仿真通信图'''&lt;br /&gt;
&lt;br /&gt;
L00地牛的PLC负责控制电机驱动器和点位开关，通过串口与车载工控机通信；倍加福R2000激光雷达直连车载工控机网口。仿真L100地牛用Mimics模拟PLC，Mimics是MDCS工具链的设备模拟器，可模拟电气模组，并集成Web界面来修改设备运行参数。用Robopal的180度视野激光雷达代替R2000激光雷达，以便模拟货物遮挡雷达情况下的建图与定位。&lt;br /&gt;
&lt;br /&gt;
Diagslave是Modbus TCP Slave模拟器，Mimics L100模拟器以Modbus TCP替换Modbus RTU，以简化仿真环境搭建。Medulla L100插件也切换为使用Modbus TCP通道。&lt;br /&gt;
&lt;br /&gt;
按照以下步骤启动仿真环境：&lt;br /&gt;
&lt;br /&gt;
# Windows资源管理器打开L100仿真版目录；&lt;br /&gt;
# 双击&amp;quot;modbus\diagslave.exe&amp;quot;，启动Modbus TCP Slave模拟器，运行界面见图2-2；&lt;br /&gt;
# 双击&amp;quot;Mimic\Mimics.exe&amp;quot;，启动L100模拟器，运行界面见图2-3；&lt;br /&gt;
# 浏览器输入&amp;quot;localhost:7200/index.html&amp;quot;，打开Mimics监控页面，见图2-4；&lt;br /&gt;
# 登入Ubuntu，进入Robopal目录，在命令行下执行&amp;quot;./robopal&amp;quot;启动，见图2-5。&lt;br /&gt;
&lt;br /&gt;
==== 2.3.1.1 diagslave ====&lt;br /&gt;
[[文件:Image-20250627151731326.png|无框|555x555像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-6 diagslave的运行窗口'''&lt;br /&gt;
&lt;br /&gt;
diagslavec.exe是命令行程序。可以在资源管理器双击启动，或者在cmd终端启动，启动后都会在cmd终端运行。&amp;lt;blockquote&amp;gt;注意：如果鼠标左键点击命令行窗口的文字，会暂停命令行程序的运行，敲回车键可以解除选择文字并恢复运行。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2.3.1.2 Mimics ====&lt;br /&gt;
[[文件:Image-20250627152134779.png|无框|557x557像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-7 Mimics的运行窗口'''&lt;br /&gt;
&lt;br /&gt;
Mimics.exe也是命令行程序。当日志停止输出时启动完毕。浏览器打开&amp;quot;localhost:7200/index.html&amp;quot;，进入监控页面。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250627152918543.png|无框|515x515像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-8 L100Mimic的监控页面'''&lt;br /&gt;
&lt;br /&gt;
L100模拟器启动后，先要修改RemoteRalIp，这是Robopal所在Ubuntu的IP地址，L100模拟器使用UDP 4344端口向Robopal发送移动机器人的线速度/角速度。如果Robopal的移动机器人不会移动，基本上是这个参数配置错误。&lt;br /&gt;
&lt;br /&gt;
其他属性值参考L100的下位信号说明使用。一般而言，主要是修改IsAutomatic、IsEmergencyStopPressed属性值，用于手/自切换和复位警报。&lt;br /&gt;
&lt;br /&gt;
右侧拟态方法用于模拟升降货叉。&lt;br /&gt;
&lt;br /&gt;
==== 2.3.1.3 Robopal ====&lt;br /&gt;
首先修改L100模拟器的RemotePalIp值，指向运行Robopal的Ubuntu主机。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250627153735146.png|无框|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
'''图2-9 修改RemotePalIp值'''&lt;br /&gt;
&lt;br /&gt;
Ubuntu上进入Robopal目录，检查robopal.cfg配置（如果首次使用），确认lidarRemoteIp指向运行Medulla的主机（Robopal向目标主机的UDP 4343端口推送点云数据）。&lt;br /&gt;
 bruce@u22:~/Robopal$ cat robopal.cfg &lt;br /&gt;
&lt;br /&gt;
 lidarRemoteIp=192.168.3.102&lt;br /&gt;
&lt;br /&gt;
 lidarRemotePort=4343&lt;br /&gt;
&lt;br /&gt;
 listenPort=4344&lt;br /&gt;
&lt;br /&gt;
 world=./worlds/SmallWareHouse.world&lt;br /&gt;
&lt;br /&gt;
 robotsCount=1&lt;br /&gt;
命令行下输入&amp;quot;./Robopal&amp;quot;启动。Robopal是命令行程序，启动后在控制台输出日志，见图2-6，随后弹出仿真环境窗口，见图2-8。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250627154009452.png|无框|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-10 Robopal的控制台输出'''&lt;br /&gt;
&lt;br /&gt;
如果输出日志的speed &amp;amp; angle都是0，表示没收到L100模拟器的运控指令，RemotePalIp配置错误。下图是配置正确时的输出。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250627154234078.png|无框|536x536像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-11 Robopal收到L100模拟器运控指令的输出'''&amp;lt;blockquote&amp;gt;备注：例图是WindTerm SSH到Ubuntu的操作界面，因此左侧有时间戳和行号。&amp;lt;/blockquote&amp;gt;[[文件:Image-20250627154436498.png|无框|523x523像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-12 Robopal的仿真界面'''&lt;br /&gt;
&lt;br /&gt;
Robopal启动后处于暂停状态（左下角的仿真计时器不动），顺序点击&amp;quot;Run&amp;quot;菜单的&amp;quot;One step&amp;quot;、&amp;quot;Pause&amp;quot;启动仿真（也可以在键盘顺序输入&amp;quot;.&amp;quot;、&amp;quot;p&amp;quot;启动）。&lt;br /&gt;
&lt;br /&gt;
启动后计时器跳动，移动机器人的激光雷达扫描线出现。使用鼠标滚轮缩放视图，左键按压拖动视图，左键拖拽移动机器人移动。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250627161652076.png|无框|529x529像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-13 仿真环境启动后界面'''&lt;br /&gt;
&lt;br /&gt;
L100仿真环境模拟了一个小型车间，外间是仓库，内间是生产区，配有一台L100地牛。 &amp;lt;blockquote&amp;gt;注意：Robopal 有个已知错误，在运行一段时间后雷达输出停止。在 4G 内存的 Ubuntu 上，约 52 分钟后出现。此时 Medulla 的 frontlidar 标红，同时弹出“雷达无数据”警告。&amp;lt;/blockquote&amp;gt;[[文件:1751035019133.png|无框|653x653像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-14 Robopal 的模拟雷达异常界面'''&lt;br /&gt;
&lt;br /&gt;
重启 Robopal 可解决问题。Robopal 重启后，L100 位置会跳动到默认位置（靠近 2 根立柱），鼠标拖动 L100 到重启前位置，如果 Detour 上显示定位丢失，则使用“全局重定位”找回位置即可。&lt;br /&gt;
&lt;br /&gt;
== 2.4 看门狗 ==&lt;br /&gt;
MDCS 看门狗可监控下位机程序的运行状态，当程序意外退出时会自动拉起，适用于生产环境。从 &amp;lt;nowiki&amp;gt;https://dev.lessokaji.com/index.php?topic=258.0&amp;lt;/nowiki&amp;gt; 下载看门狗程序。&lt;br /&gt;
&lt;br /&gt;
= 三、使用 =&lt;br /&gt;
&lt;br /&gt;
== 3.1 Medulla ==&lt;br /&gt;
下面分别说明 cart 和 frontlidar 的属性和功能。&lt;br /&gt;
&lt;br /&gt;
=== 3.1.1 cart对象 ===&lt;br /&gt;
cart的信号包括下位信号（由Medulla车型插件定义）、上位信号（由Clumsy车型插件定义）。以&amp;quot;电量%&amp;quot;（BatteryPercent）为例，L100模拟器的默认值是75，Medulla通过Modbus TCP连接L100模拟器，读出75%电量。&lt;br /&gt;
&lt;br /&gt;
L100的下位信号在&amp;quot;PelletTruck\PelletTruckMedulla\PalletTruckDefinition.cs&amp;quot;定义，说明如下。&lt;br /&gt;
&lt;br /&gt;
下位信号的分类说明：&lt;br /&gt;
&lt;br /&gt;
* 状态机。正交的3种工作模式。&lt;br /&gt;
** 自动模式（Automatic）。可执行上位机下发的任务，由Clumsy自主控制。&lt;br /&gt;
** 手动模式（Manual）。可使用Medulla的遥控器控制机器人行走，用于SLAM建图、运动参数整定和故障处理。&lt;br /&gt;
** 故障模式（Malfunction）。当电气模组工况异常、触发安全相关警报时进入，必须解除异常/报警源问题，按下复位键后切换到原来状态（自动/手动）。&lt;br /&gt;
* 诊断。判断移动机器人是否在故障模式，以及故障模式的归因。&lt;br /&gt;
** HasFault。电气模组的异常工况都会触发为True，比如电机驱动器报警、底盘控制心跳停止等。&lt;br /&gt;
** FaultMessage。逗号分割的硬件故障提示。&lt;br /&gt;
* 安全。低级安全包括接触式和非接触式安全响应，高级安全综合定位置信度、安全措施屏蔽和行走状态判定。&lt;br /&gt;
** 接触式安全响应。拍下急停按钮、安全触边触发等需要人接触的安全信号。&lt;br /&gt;
** 非接触式安全响应。避障激光雷达、货叉光电传感器等非接触安全信号。&lt;br /&gt;
** 高级安全。鲁莽驾驶是屏蔽安全措施且在自动模式下行走，一般发生在处理故障后未接触屏蔽，然后切自动模式。盲目驾驶是detour返回的定位置信度（lstep）大于16（经验阈值），且自动模式下连续行走5秒以上。&lt;br /&gt;
* 轮系。驱动轮的目标速度、反馈速度、状态和故障。&lt;br /&gt;
* 货叉。升降状态及高度。&lt;br /&gt;
* 电池。剩余电量。&lt;br /&gt;
&lt;br /&gt;
L100 的上位信号在&amp;quot;PelletTruck\PelletTruckPilot\PelletTruckDefinition.cs&amp;quot;定义，说明如下。&lt;br /&gt;
&lt;br /&gt;
上位信号由 Clumsy 控制，Medulla 读取，下位信号则相反。&lt;br /&gt;
&lt;br /&gt;
Lstep 来自 Detour，表示定位置信度，回环线程锁定关键帧时 Lstep 等于 2，否则会单调递增，直到再次锁定关键帧为止。&lt;br /&gt;
&lt;br /&gt;
SSC 是 Clumsy 的激光雷达避障区域，点云来自导航激光雷达。命名风格为&amp;quot;[fwd|rev|lt|rt]_[fast|slow]_[empty|loaded]&amp;quot;，包括 3 部分（中括号），说明如下：&lt;br /&gt;
&lt;br /&gt;
* 行走方向：fwd 表示前进，rev 表示后退，lt 表示左转，rt 表示右转。&lt;br /&gt;
* 行走速度：fast 表示高速，slow 表示低速。&lt;br /&gt;
* 载货状态：empty 表示空载，loaded 表示带载。&lt;br /&gt;
&lt;br /&gt;
以带载高速前进为例，SSC 名称就是&amp;quot;fwd_fast_loaded&amp;quot;，该场景下应扩大缓行区域长度，使行人侵入缓行区域时可提早减速，停车区域和急停区域同理，保证减速及停车时货物不至于惯性过大而倾倒。再如，带载低速右转，SSC 名称就是&amp;quot;tr_slow_loaded&amp;quot;，应适当扩大区域右侧面积，在右转方向及时发现行人。&lt;br /&gt;
&lt;br /&gt;
=== 3.1.2 frontlidar ===&lt;br /&gt;
L100 配置 1 个激光雷达，仿真环境使用 180 度视野的仿真雷达，视野较小的雷达有助于工程师理解SLAM 能力边界，比如建图时路线必须闭环，使激光雷达从不同角度看到相同的路标。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751031602666.png|无框|586x586像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-1 frontlidar'''&lt;br /&gt;
&lt;br /&gt;
frontlidar 窗口主要看 scanC和 pointsN，前者是点云帧计数器，单调加一，连接雷达后会持续增大；后者是点云的测量点数量，本例配置雷达的角分辨率是 0.25,180° 视野，因此测量点数量 = 180 / 0.25 = 720。&lt;br /&gt;
&lt;br /&gt;
frontlidar 窗口的另一个重要功能是&amp;quot;view&amp;quot;。点击右侧功能列表的&amp;quot;view&amp;quot;，打开点云视窗。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751031978875.png|无框|595x595像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-2 点云视窗'''&lt;br /&gt;
&lt;br /&gt;
对比右侧Robopal 的仿真窗口，激光雷达观测得到的点云在雷达的视野内。点云视窗使用雷达坐标系（右手坐标系），雷达 0 度（雷达正前方）是食指指向的正 X 轴，中指指向正 Y 轴。&amp;lt;blockquote&amp;gt;备注：L100 仿真环境面向新手，配置的模拟雷达未开启噪音功能，因此点云是干净不含噪音的，不像 R2000 的点云有轻微跳动。由于没有噪音，Detour 中的位姿也是稳定的不会轻微波动。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.1.3 MedullaConsole ===&lt;br /&gt;
如果 Medulla的驱动发生异常，比如 frontlidar 没收到点云，对象列表中相应的对象会标红提示。此时可切换到&amp;quot;ui&amp;quot;标签，点击&amp;quot;ShowConsole&amp;quot;打开 MedullaConsole 窗口，查看日志来分析异常。&lt;br /&gt;
&lt;br /&gt;
点击&amp;quot;HideConsole&amp;quot;则隐藏 MedullaConsole 窗口。&amp;lt;blockquote&amp;gt;注意：不要关闭 MedullaConsole 窗口，这会关闭 Medulla 进程。如果要隐藏 MedullaConsole 窗口，应使用&amp;quot;HideConsole&amp;quot;功能。如果要关闭 Medulla，可右键点击在 Windows 任务栏右侧的 Medulla 图标，选择&amp;quot;Exit&amp;quot;菜单退出。&amp;lt;/blockquote&amp;gt;&amp;quot;MessageLogs&amp;quot;功能弹出插件日志对话框，查看通过Medulla.Diagnosis 的 Post 或 Toast 方法输出的日志。Post与 Toast的区别在于后者只显示给定标签的最新消息，适合输出实时刷新的日志，比如 CAN 的调试信息（不会刷屏而挤走其他重要日志）。 &lt;br /&gt;
&lt;br /&gt;
=== 3.1.4 startup.iocmd ===&lt;br /&gt;
位于 Medulla 目录下的 startup.iocmd 是 Medulla 的配置脚本，用于加载驱动，显示 MedullaConsole。L100 模拟器的配置脚本说明如下：&lt;br /&gt;
 # startup.iocmd使用 JavaScript 语法，将&amp;quot;.&amp;quot;替换为空格，方法参数亦然。&lt;br /&gt;
&lt;br /&gt;
 # 比如&amp;quot;frontlidar Start&amp;quot;就是&amp;quot;frontlidar.Start()&amp;quot;，调用 frontlidar 的&lt;br /&gt;
&lt;br /&gt;
 # Start方法，无参数。&lt;br /&gt;
&lt;br /&gt;
 ​&lt;br /&gt;
&lt;br /&gt;
 # 创建车型激活器&lt;br /&gt;
&lt;br /&gt;
 loader = io load plugins/CartActivator.dll&lt;br /&gt;
&lt;br /&gt;
 # 加载 plugins 子目录下的&amp;quot;Medulla 地牛插件库&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 cart = loader load plugins/MedullaPelletTruck.dll&lt;br /&gt;
&lt;br /&gt;
 # 加载 plugins 子目录下的&amp;quot;通用雷达驱动库&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 frontlidar = io load plugins/UniversalLidarDriver.dll&lt;br /&gt;
&lt;br /&gt;
 # frontlidar使用robopal驱动，雷达IP是192.168.3.101，UDP 端口是 4343，角分辨率 0.25°&lt;br /&gt;
&lt;br /&gt;
 frontlidar Setup robopal 192.168.3.101 4343 0.25&lt;br /&gt;
&lt;br /&gt;
 # frontlidar的盲区是10mm，最大测距20,000mm&lt;br /&gt;
&lt;br /&gt;
 frontlidar setMaskDist 10 20000&lt;br /&gt;
&lt;br /&gt;
 # 启动frontlidar&lt;br /&gt;
&lt;br /&gt;
 frontlidar Start&lt;br /&gt;
&lt;br /&gt;
 # 加载WinMedulla库（MedullaConsole 的 WinForm 实现）&lt;br /&gt;
&lt;br /&gt;
 ui=io load plugins\WinMedulla.dll  &lt;br /&gt;
&lt;br /&gt;
 # 显示WinMedulla 监视窗口&lt;br /&gt;
&lt;br /&gt;
 ui Show&lt;br /&gt;
&lt;br /&gt;
=== 3.1.5 监控硬件异常 ===&lt;br /&gt;
移动机器人常见问题是硬件异常，导致不能执行任务。L100的状态机根据上下位信号实时监控硬件异常，当硬件故障或安全异常时，转入故障状态并告警。当L100出现异常时，应观察cart对象的HasFault和HasAlarm信号。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751034226409.png|无框|341x341像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-3 cart对象的故障与警告信号'''&lt;br /&gt;
&lt;br /&gt;
* HasFault：当电气模组出现故障时为True。FaultMessage显示故障硬件名称，如果有多个则以逗号分割。&lt;br /&gt;
* HasAlarm：出现安全隐患时为True。AlarmMessage显示告警源，如果有多个则以逗号分割。&lt;br /&gt;
&lt;br /&gt;
出现HasFault时，应先解决硬件故障。常见硬件故障如下：&lt;br /&gt;
&lt;br /&gt;
* 电机驱动器报警。一般是伴生故障，比如急停时可能引起驱动器过压报警，这种警告无须处理，复位后自动解除。&lt;br /&gt;
* 安全触边报警。应移动地牛，将安全触边脱离障碍物。&lt;br /&gt;
* 货叉探货传感器报警。应移动地牛（或障碍物），使光电传感器前没有障碍物。&lt;br /&gt;
&lt;br /&gt;
出现HasAlarm时，应先判断安全风险，比如行人侵入急停区，则应拍下急停按钮，等行人离开后再松开。&amp;lt;blockquote&amp;gt;注意：L100没有复位按钮，以急停按钮代替。拍下急停按钮，等待 1 秒以上松开，车型插件会创建复位按钮信号，持续 3 秒后消除。&amp;lt;/blockquote&amp;gt;'''当工作模式为手动（Manual）时，L100 也不会执行上位机下发的任务'''。&lt;br /&gt;
&lt;br /&gt;
== 3.2 Detour ==&lt;br /&gt;
关于 Detour 的操作请参考 [[首页|https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5]] 的'''快速开始'''。新手建议使用 L100 地图熟悉定位相关操作，然后进阶学习建图。&amp;lt;blockquote&amp;gt;备注：L100 模拟车的雷达位置是精确的，因此无须标定外参。实物车必须标定外参，Wiki 有详细说明。&amp;lt;/blockquote&amp;gt;开发机一般没有 Detour 授权证书，因此有 '''60 分钟时长限制'''，超时后重启 Detour 即可。&amp;lt;blockquote&amp;gt;备注：Detour 试用超时后，状态栏的位姿不会更新，控制台窗口会持续输出错误提示。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3.3 Clumsy ==&lt;br /&gt;
我们以 L100 地牛来说明 Clumsy 的调试功能。&lt;br /&gt;
&lt;br /&gt;
L100 的调试功能如下：&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;
=== 3.3.1 测试前进行走 ===&lt;br /&gt;
点击 Clumsy 窗口（如果 Clumsy 不是当前活动窗口，点击功能菜单可能无效，要多点一次），点击“测试前进行走”，鼠标左键在左边视图的小车上按下，然后向前进方向拖出一个箭头线，随后松开左键。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250628160443048.png|无框|503x503像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-4 鼠标拖拽出直线路径'''&lt;br /&gt;
&lt;br /&gt;
黄色箭头线段是小车要跟随的轨迹，小车的红色箭头指向车头方向，黄绿色箭头线指向轨迹终点，白色箭头线指向'''预瞄点'''。&lt;br /&gt;
&lt;br /&gt;
Clumsy 的轨迹跟踪算法简要说明如下：&lt;br /&gt;
&lt;br /&gt;
# 预瞄点。计算小车运动中心质点在跟踪路径上的垂足，从垂足延轨迹向前延伸预瞄距离，得到预瞄点。预瞄点作用与我们开车相似，开车时司机看的是前方，而不是车头，车速越快，向前看得越远，如此可以控制加减速以平顺驾驶。&lt;br /&gt;
# 首次转向。小车开始跟踪轨迹时，如果距离轨迹较远，先转向使车头指向轨迹（尽快开到轨迹上），然后向轨迹行走。&lt;br /&gt;
# 跟踪路径。当小车向轨迹行走时，会根据车头指向与直线轨迹的角度差调整车速，夹角越小速度越快。&lt;br /&gt;
# 下一段路径。当小车即将跟踪下一段路径时（测试多段路线），会计算下一段路径与车头指向的夹角，如果是小夹角则速度不减，否则减速。&lt;br /&gt;
&lt;br /&gt;
=== 3.3.2 车辆配置 ===&lt;br /&gt;
运动参数整定是新车型适配的关键任务之一。L100 的运动参数已配好，使用即可。以下是 L100（差速底盘）相关的运动参数说明，供参考。&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;
|vthBias&lt;br /&gt;
|double&lt;br /&gt;
|车体参数：旋转补偿，用于补偿车辆旋转时的偏差&lt;br /&gt;
|-&lt;br /&gt;
|rotSync&lt;br /&gt;
|double&lt;br /&gt;
|车体参数：角度同步阈值，当实际角度与目标角度差小于此值时开始同步&lt;br /&gt;
|-&lt;br /&gt;
|wAcc&lt;br /&gt;
|float&lt;br /&gt;
|车体参数：角度同步加速度，控制角度调整的加速度大小&lt;br /&gt;
|-&lt;br /&gt;
|Stail_l&lt;br /&gt;
|double&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;
|thresAcc&lt;br /&gt;
|double&lt;br /&gt;
|加速阈值，限制车辆加速度大小&lt;br /&gt;
|-&lt;br /&gt;
|thresDeAcc&lt;br /&gt;
|double&lt;br /&gt;
|减速阈值，限制车辆减速度大小&lt;br /&gt;
|-&lt;br /&gt;
|thresRotAcc&lt;br /&gt;
|double&lt;br /&gt;
|转弯加速阈值，限制转弯时的角加速度&lt;br /&gt;
|-&lt;br /&gt;
|maxWSpeed&lt;br /&gt;
|float&lt;br /&gt;
|转弯最大速度，限制车辆旋转的最大角速度&lt;br /&gt;
|-&lt;br /&gt;
|finSpeed&lt;br /&gt;
|double&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;
|distFin&lt;br /&gt;
|int&lt;br /&gt;
|路径结束距离，判断路径是否结束的距离阈值&lt;br /&gt;
|-&lt;br /&gt;
|dthFac&lt;br /&gt;
|float&lt;br /&gt;
|左右差速P，差速转向的比例系数，相当于PID控制中的P参数&lt;br /&gt;
|-&lt;br /&gt;
|lookAhead&lt;br /&gt;
|float&lt;br /&gt;
|点跟踪方法点距，车辆跟踪路径点的前视距离&lt;br /&gt;
|-&lt;br /&gt;
|trackFinDist&lt;br /&gt;
|float&lt;br /&gt;
|判断&amp;quot;已到达终点&amp;quot;的阈值，距离小于此值认为已到达目标点&lt;br /&gt;
|-&lt;br /&gt;
|predict&lt;br /&gt;
|float&lt;br /&gt;
|前进预测量，根据当前速度预测未来位置的时间系数&lt;br /&gt;
|-&lt;br /&gt;
|thScale&lt;br /&gt;
|float&lt;br /&gt;
|转弯预测量，转弯时的预测系数，影响转弯平滑度&lt;br /&gt;
|-&lt;br /&gt;
|nfFac&lt;br /&gt;
|float&lt;br /&gt;
|转弯负反馈量，减少转弯抖动的阻尼系数&lt;br /&gt;
|-&lt;br /&gt;
|stoppingPow&lt;br /&gt;
|double&lt;br /&gt;
|停止幂数，控制车辆接近终点时减速曲线的形状&lt;br /&gt;
|-&lt;br /&gt;
|wayPointFinSpeedFactor&lt;br /&gt;
|float&lt;br /&gt;
|速度越大时，wayPointFinDist 增大的幅度，高速行驶时提前减速的系数&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;
|speedDegThres&lt;br /&gt;
|double&lt;br /&gt;
|角度优先调节的角度范围，当角度偏差大于此值时优先调整角度而非速度&lt;br /&gt;
|-&lt;br /&gt;
|firstThAccuracy&lt;br /&gt;
|float&lt;br /&gt;
|行走指向精度，初始定向时的角度精度要求&lt;br /&gt;
|-&lt;br /&gt;
|stoppingLAFac&lt;br /&gt;
|double&lt;br /&gt;
|接近终点时lookAhead的衰减系数，影响终点附近的路径跟踪平滑度&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3.3.3 SSC ===&lt;br /&gt;
Clumsy 支持导航激光雷达用于避障（使用 Medulla 输出的点云，与 Detour 无关）。避障区域称为 SSC，绘制方法与点位输出型避障雷达相似。避障区间抽象为“行走方向” + “车速” + “带载”的组合，下面以绘制带载高速直行为例说明。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751100609693.png|无框|561x561像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-5 Clumsy 的车体编辑器'''&lt;br /&gt;
&lt;br /&gt;
“车辆配置”标签页，点击“查看/编辑车体布局”打开布局编辑器。车体布局上有一个单线雷达，其名称（name）与 Medulla 的 frontlidar 一致。车体布局上已有 SSC（雷达触边），点选“frontlidarArea”来修改。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751100798306.png|无框|534x534像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-6 SSC 的重绘制功能'''&lt;br /&gt;
&lt;br /&gt;
点选“动作”标签，双击“重绘制”。鼠标左键顺序点击绘制区域的顶点，如下图的红色框。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751100906863.png|无框|535x535像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-7 重新绘制 SSC 轮廓'''&lt;br /&gt;
&lt;br /&gt;
SSC 轮廓是封闭多边形，带载直行时，轮廓宽度应大于托盘，长度应满足高速直行时的减速/停车要求。SSC 的命名风格如下（数据词典语法）：&lt;br /&gt;
&lt;br /&gt;
'''[ fwd | rev | lt | rt ]_[ fast | slow ]_[ empty | loaded ]_[ slowdown | stop | estop ]'''&lt;br /&gt;
&lt;br /&gt;
SSC 名称由 4 部分构成：行驶方向、车速、带载、行为。以下划线连接。&lt;br /&gt;
&lt;br /&gt;
* 行驶方向：fwd（前进），rev（倒走）、lt（左转弯）、rt（右转弯）。&lt;br /&gt;
* 车速：fast（高速），slow（低速）。&lt;br /&gt;
* 带载：empty（空载），loaded（带载）。&lt;br /&gt;
* 行为：slowdown（降速缓行），stop（停车），estop（急停）。&lt;br /&gt;
&lt;br /&gt;
我们正在绘制的 SSC 是带载高速直行的缓行区域，那么 SSC 的 name 就是&amp;quot;fwd_fast_loaded_slowdown&amp;quot;，如下图。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751101787310.png|无框|516x516像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-8 带载高速直行的缓行区间'''&amp;lt;blockquote&amp;gt;SSC 可用布局编辑器菜单的“添加\雷达触边”增加，也可以用菜单删除。新增的雷达触边以“重绘制”功能编辑轮廓。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3.4 Simple ==&lt;br /&gt;
下图显示了 L100 在仿真环境、Detour 和 Simple 地图上的位置。可见 L100 的位置是一致的，这也是激光 SLAM 的目的：使移动机器人使用激光雷达在物理世界中精确定位。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751191333111.png|无框|671x671像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-9 L100 在仿真环境、Detour 和 Simple 地图中的位置'''&lt;br /&gt;
&lt;br /&gt;
Simple的功能以 5 个标签组织：&lt;br /&gt;
&lt;br /&gt;
* 地图。配置激光地图。&lt;br /&gt;
* 进程。配置'''任务插件'''。&lt;br /&gt;
* 车辆。配置'''车队'''。&lt;br /&gt;
* 脚本。查看小车执行的'''任务脚本'''。&lt;br /&gt;
* 场景。配置'''管控地图'''的站点、路径。&lt;br /&gt;
&lt;br /&gt;
=== 3.4.1 地图标签 ===&lt;br /&gt;
[[文件:1751191661158.png|无框|569x569像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-10 地图标签界面'''&lt;br /&gt;
&lt;br /&gt;
导入 Detour 的激光地图文件，作为管控路线配置的依据。&lt;br /&gt;
&lt;br /&gt;
Detour 的激光地图又称为'''稠密地图'''，记录了环境信息，使移动机器人通过激光雷达获得实时位置。稠密地图记录的信息量相当大，这是定位所必须的。Simple 的管控地图也称为'''稀疏地图'''，仅记录由站点和路径构成的路网图，用于规划移动机器人从 A 点到 B 点的路线。&lt;br /&gt;
&lt;br /&gt;
以公交车比喻，司机记忆的地图属于稠密地图，包括路标（医院、学校、超市等有明显特征的地点）、车道宽窄、红绿灯等，这个信息量丰富的地图有助于司机安全驾驶公交车执行客运任务。公交车终点站的调度员使用的地图则是稀疏地图，记录构成线路的站点、发车时刻表，协助调度员合理调度车辆和司机以执行客户计划。&lt;br /&gt;
&lt;br /&gt;
虽然管控程序不会直接使用激光地图，但是激光地图包含的环境轮廓与坐标有助于配置管控路线。所以导入激光地图是 Simple 配置的第一个步骤。&lt;br /&gt;
&lt;br /&gt;
=== 3.4.2 进程标签 ===&lt;br /&gt;
[[文件:1751196976753.png|无框|585x585像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-11 进程标签界面'''&lt;br /&gt;
&lt;br /&gt;
Simple 通过插件机制扩展功能。CDM（链式搬运任务）是标配插件，调度小车执行“取/放”搬运任务。项目的定制功能可通过 Simple 插件实现自定义任务实现。&lt;br /&gt;
&lt;br /&gt;
==== 3.4.2.1 CDM ====&lt;br /&gt;
[[文件:1751197357322.png|无框|571x571像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-12 CDM 的动作列表'''&lt;br /&gt;
&lt;br /&gt;
点选“CDM”，再切换到“动作”标签，可使用 CDM 的功能（以使用频率顺序说明）：&lt;br /&gt;
&lt;br /&gt;
* 初始化所有车辆。Simple 启动后，所有小车处于“未初始化”状态（见图 3-11，小车上有个 X 图标），使用此功能初始化所有小车（详见“车队标签”）。&lt;br /&gt;
* 取放货。双击“取放货”条目，然后鼠标顺序在管控地图上点击“取货”站点、“放货”站点。CDM 自动选择一台就近的空闲小车，然后规划出取放货路径，调度小车执行取放任务。&lt;br /&gt;
* 取货。仅取货。&lt;br /&gt;
* 放货。仅放货（小车上应有货）。&lt;br /&gt;
* 查看任务。弹出任务列表对话框，可取消待执行/执行中的任务，查看已执行的任务。&lt;br /&gt;
* 启动进程 / 关闭进程。启动 / 停止 CDM 任务。&lt;br /&gt;
* 添加 Idle 标签。向小车贴上“空闲”标签（可调度执行任务）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;注意：CDM 要求管控地图上至少有一个“躲避”站点（待命点或库位），当小车挡住另一台小车的任务路线时，CDM 会调度堵路小车去躲避站点。如果没有“躲避”站点，CDM 在规划路线会失败，即便只配置一台小车也是如此。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.4.3 车队标签 ===&lt;br /&gt;
启动仿真环境后，L100在默认位置，Detour 可能会丢定位（Detour 持续记录当前位姿，如果位姿跳变则会丢定位）。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250629195535720.png|无框|689x689像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-13 仿真环境启动后 L100 丢定位'''&lt;br /&gt;
&lt;br /&gt;
参考上图，自上而下来看：&lt;br /&gt;
&lt;br /&gt;
# Robopal 是 L100 的默认位姿。&lt;br /&gt;
# Detour 显示点云与地图有明显偏差（向右下方偏出）。&lt;br /&gt;
# Simple 上L100 位姿与 Detour 一致（位姿来自于 Detour），小车未初始化，且不在站点上。&lt;br /&gt;
&lt;br /&gt;
在 Robopal 窗口，鼠标左键慢慢拖动 L100 到“待命点”站点。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751198377317.png|无框|698x698像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-14 把 L100 拖动到待命点'''&lt;br /&gt;
&lt;br /&gt;
慢速拖动 L100 是让 Detour 能够修正定位误差（如果拖放后定位有错误，使用 Detour 的“全局重定位”修正），如上图所示，点云（绿色线）与地图轮廓已贴合，且小车附近的一个关键帧（红色实心点，右下方有点云配置分数 0.75）被锁定，说明 Detour 已修正定位偏差。&lt;br /&gt;
&lt;br /&gt;
“地牛 1”的属性说明如下：&lt;br /&gt;
&lt;br /&gt;
* siteID：小车所在站点编号，由于未初始化，因此是-1。&lt;br /&gt;
* speed：小车的默认速度(mm/s)是 0.4m/s（速度属性的数据类型是整数，因此使用 mm/s）。&lt;br /&gt;
* address：小车的 IP 地址（Clumsy 所在主机的 IP）。&lt;br /&gt;
* lstatus：小车的状态。&lt;br /&gt;
* id：流水号。&lt;br /&gt;
* name：小车名称。&lt;br /&gt;
* group：小车所在组。有些场景需要分组执行任务，比如“分拣”与“产品下线”由不同组车队执行任务，不可交叉执行。默认填&amp;quot;default&amp;quot;，用于不分组场景。&lt;br /&gt;
&lt;br /&gt;
移动 L100 到待命点，且定位准确时，双击“动作”标签的“初始化”。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751200524675.png|无框|582x582像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-15 初始化后的 L100'''&lt;br /&gt;
&lt;br /&gt;
L100 的“X”消失，初始化成功。&amp;lt;blockquote&amp;gt;注意：小车在站点上才允许初始化。&amp;lt;/blockquote&amp;gt;切换到“状态”标签，看 L100 的状态。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751200956848.png|无框|581x581像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-16 L100 的状态'''&lt;br /&gt;
&lt;br /&gt;
车辆状态反映了小车当前工况，当小车异常时，比如不执行任务，应根据其状态来分析故障源。&lt;br /&gt;
&lt;br /&gt;
* Clumsy 上传的状态。以“车体_”为前缀，实时更新。例图中的“车体_WorkMode”为“Manual”，表示L100 处于手动模式，不会执行 Simple 下发的任务。&lt;br /&gt;
* 交通管制相关状态：&lt;br /&gt;
** holdingLocks：小车当前所在站点编号。&lt;br /&gt;
** pendingLocks：小车执行任务时，会锁定前进方向的 3 个站点（包含当前站点，3 点定 2 条线段，即当前行走的路线和下一段路线）。如果小车在行驶时停下且无报警，应检查 pendingLocks，如果小车在礼让另一辆有交叉路线的小车，pendingLocks 只有 1 个站点，表示'''锁点失败而停车'''。&lt;br /&gt;
** blockedBy：正在礼让的另一台小车编号。&lt;br /&gt;
** TCStat：交通管制状态。&lt;br /&gt;
&lt;br /&gt;
常用动作说明：&lt;br /&gt;
&lt;br /&gt;
* 立即强制结束。向 Clumsy 发送“强制结束”指令，Clumsy 自动重启并丢弃正在执行的任务，小车停下。&lt;br /&gt;
* 现场检修并小车下线。小车停在路上检修故障，调度认为小车下线，不再调度。（现场检修的时间应短，否则小车会堵路）。&lt;br /&gt;
* 返厂检修。下车下线且被移出管控地图（siteID=-1）。把小车移出车道（比如推到路边不会堵路）检修时使用。&lt;br /&gt;
* 小车上线/下线。“状态”的“标记”是一种标签机制，可理解为向小车贴上便签，应用程序可利用标签实现定制功能。比如 CDM 使用“上下线”标签来标记小车能否使用。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;一般而言，当小车执行任务时出现异常，比如硬件故障，任务不能执行时，可用“现场检修”、“返厂检修”来防止 CDM 向它下新任务，然后用“立即强制结束”清除小车任务，处理完毕后用“初始化”使小车上线。&amp;lt;/blockquote&amp;gt;鼠标左键点选 L100，双击“前往站点”动作，然后左键点击目标站点，Simple 会规划一条路线并下发给 L100。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751202335408.png|无框|612x612像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-17 L100 前往待命点的规划路线'''&lt;br /&gt;
&lt;br /&gt;
彩色的规划路线是 L100 的包络线，表示 L100 在空载行走时需要占用的空间。Simple 的路线规划算法基于包络，当 2 台小车的包络有交叠时，则表示它们存在争用，Simple 会计算出通行顺序，使 2 台车安全通过。&amp;lt;blockquote&amp;gt;备注：“前往站点”的快捷方式是鼠标右键点击目标站点。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.4.4 脚本标签 ===&lt;br /&gt;
Simple 将规划路线编译为任务脚本，下发给 Clumsy，后者将执行结果回传 Simple。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751202625972.png|无框|605x605像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-18 L100 执行的一个任务脚本的例子'''&lt;br /&gt;
&lt;br /&gt;
选择脚本条目，双击“显示脚本”动作，可看到脚本内容。脚本使用 JavaScript 语法，Go 是行驶指令，指令小车跟踪直线轨迹行走。除此以外还有取货、放货、SSC 切换等指令，参见 Clumsy 的动作代码。&lt;br /&gt;
&lt;br /&gt;
=== 3.4.5 场景标签 ===&lt;br /&gt;
场景用于编辑管控地图，主要是站点和路径。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751202889451.png|无框|597x597像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-19 场景标签界面'''&lt;br /&gt;
&lt;br /&gt;
管控地图由站点和路径构成。使用“添加”菜单，逐个或连续将站点放入地图，然后用路径连接。&lt;br /&gt;
&lt;br /&gt;
L100 是差速底盘，无须使用圆弧和贝塞尔路径。&lt;br /&gt;
&lt;br /&gt;
Simple规划出路线后，模拟小车顺序走过规划路线的站点和路径，根据站点和路径的属性编译出相应的动作指令，比如行走、停车、旋转、取货等。&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;
|angle&lt;br /&gt;
|float&lt;br /&gt;
|车头指向&lt;br /&gt;
|-&lt;br /&gt;
|turn&lt;br /&gt;
|bool&lt;br /&gt;
|自旋转向&lt;br /&gt;
|-&lt;br /&gt;
|pickup&lt;br /&gt;
|bool&lt;br /&gt;
|可以取货&lt;br /&gt;
|-&lt;br /&gt;
|drop&lt;br /&gt;
|bool&lt;br /&gt;
|可以放货&lt;br /&gt;
|-&lt;br /&gt;
|pdscene&lt;br /&gt;
|string&lt;br /&gt;
|行人检测（Pedestrian Detection）场景名&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;
|pdscene&lt;br /&gt;
|string&lt;br /&gt;
|行人检测场景名称&lt;br /&gt;
|-&lt;br /&gt;
|speed&lt;br /&gt;
|int&lt;br /&gt;
|行驶速度(mm/s)，默认400mm/s&lt;br /&gt;
|-&lt;br /&gt;
|reverse&lt;br /&gt;
|bool&lt;br /&gt;
|倒退行走，与revdst配合使用&lt;br /&gt;
|-&lt;br /&gt;
|revdst&lt;br /&gt;
|int&lt;br /&gt;
|倒退行走的目标地标&lt;br /&gt;
|-&lt;br /&gt;
|turndst&lt;br /&gt;
|int&lt;br /&gt;
|指向终点的turn=true时，在终点自旋到dstAngle&lt;br /&gt;
|-&lt;br /&gt;
|dstAngle&lt;br /&gt;
|int&lt;br /&gt;
|终点的自旋角度&lt;br /&gt;
|-&lt;br /&gt;
|typeInfo&lt;br /&gt;
|int&lt;br /&gt;
|与下段路径的关系： - 0 表示小角度转向，无须减速。 - 1表示根据下段路径夹角计算是否减速。 - 2 表示转到下段路径时必须停车。&lt;br /&gt;
|}&lt;br /&gt;
我们以去取货站点的路线配置为例。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751203529929.png|无框|623x623像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-20 取货路线配置'''&lt;br /&gt;
&lt;br /&gt;
我们希望地牛取货时按照规划路线精确行走，以保证货叉正对托盘，不至于跑偏而叉取失败。上图中选中的2条橙色路径是关键，要求地牛向 6 点方向直行到转弯处停下，然后自旋到 180 度，使货叉正对第 2 条路径，然后倒走进入取货库位。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751204090229.png|无框|619x619像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-21 取货路线的第一个路径'''&lt;br /&gt;
&lt;br /&gt;
第一条路径：&lt;br /&gt;
&lt;br /&gt;
* typeInfo=2：到下条路径前停车。&lt;br /&gt;
* speed=400：速度降到 0.4m/s。&lt;br /&gt;
* turndst=28：到编号为 28 的（路径）终点时自旋。&lt;br /&gt;
* dstAngle=180：自旋到 180 度。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751204394062.png|无框|624x624像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-21 取货路线的自旋站点'''&lt;br /&gt;
&lt;br /&gt;
第一段路径的终点：&lt;br /&gt;
&lt;br /&gt;
* id=28：即路径 turndst 指向的自旋站点。&lt;br /&gt;
* turn=true：自旋站点。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751204497640.png|无框|610x610像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-22 取货路线的第二个路径'''&lt;br /&gt;
&lt;br /&gt;
第二条路径：&lt;br /&gt;
&lt;br /&gt;
* speed=200：降速到 0.2m/s。&lt;br /&gt;
* reverse=true：倒走。&lt;br /&gt;
* revdst=962：倒走的终点编号是 962。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;提示：reverse + revdst、turndst + dstAngle 都是配套使用。当地牛从取货站点离开时，是正走，到自旋站点后转向 89 度。&amp;lt;/blockquote&amp;gt;[[文件:1751204840386.png|无框|585x585像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-23 取货路线的取货站点'''&lt;br /&gt;
&lt;br /&gt;
取货站点：&lt;br /&gt;
&lt;br /&gt;
* group=&amp;quot;default&amp;quot;：使用默认分组。取货和放货站点必须有 group 字段，与小车的 group 配套使用。&lt;br /&gt;
* shelf=true：这是库位。（shelf 表示货架）&lt;br /&gt;
* angle=180：停下时的车头指向 180 度。&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%9D%9E%E6%A0%87%E8%BD%A6%E5%9E%8B%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C&amp;diff=957</id>
		<title>非标车型使用手册</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E9%9D%9E%E6%A0%87%E8%BD%A6%E5%9E%8B%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C&amp;diff=957"/>
		<updated>2025-06-30T08:35:01Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​创建页面，内容为“以非标差速底盘地牛说明MDCS的使用方法。  = 一、概述 = 691x691像素  '''图 1-1 车型开发架构图'''  MDCS由4个子系统构成，分别部署在上位机和下位机：  * 上位机。用于管理车队的工控机或服务器，部署Simple（管控子系统）以管理车队、任务，通过开放接口向第三方系统开放自动化集成能力。 ** Simple。管控软件，实现车…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;以非标差速底盘地牛说明MDCS的使用方法。&lt;br /&gt;
&lt;br /&gt;
= 一、概述 =&lt;br /&gt;
[[文件:Image-20250627111525131.png|无框|691x691像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 1-1 车型开发架构图'''&lt;br /&gt;
&lt;br /&gt;
MDCS由4个子系统构成，分别部署在上位机和下位机：&lt;br /&gt;
&lt;br /&gt;
* 上位机。用于管理车队的工控机或服务器，部署Simple（管控子系统）以管理车队、任务，通过开放接口向第三方系统开放自动化集成能力。&lt;br /&gt;
** Simple。管控软件，实现车队管理、管控地图配置、任务路线规划、交通管制等功能。车型插件定义特定车型的功能与规格，支持管控软件规划路线与任务编译。&lt;br /&gt;
* 下位机。用于实现移动机器人的运动功能，通过传感器感知环境，执行上位机下发的任务。由3个子系统构成，部署在车载工控机（或嵌入式主板）上。&lt;br /&gt;
** Detour。定位软件，实现激光SLAM（2D/3D Lidar）、地纹SLAM、二维码定位。&lt;br /&gt;
** Clumsy。自动驾驶软件，实现运动控制（行走、旋转、货叉控制等），避障区域（基于激光雷达输出点云）配置，目标识别（通过激光雷达/深度相机识别托盘/货架等），执行上位机下发的任务。车型插件定义移动机器人运动控制相关的信号，比如驱动轮速度、货叉升降控制与高度、SLAM定位置信度等。&lt;br /&gt;
** Medulla。硬件驱动软件，实现与移动机器人硬件（电气模组）的通信能力，比如（电机）驱动器、激光雷达、底盘控制器等。车型插件定义电气模组相关的信号，实现与电气模组的通信功能。&lt;br /&gt;
&lt;br /&gt;
新车型开发的主要任务就是开发车型插件，整定运动参数，配置管控线路。应用新车型的项目还有业务应用开发，即第三方系统部分。业务应用开发不属于本手册范围。&lt;br /&gt;
&lt;br /&gt;
= 二、启动 =&lt;br /&gt;
&lt;br /&gt;
== 2.1 下位机 ==&lt;br /&gt;
顺序启动下位机软件。&amp;lt;blockquote&amp;gt;备注：MDCS对下位机软件的启动顺序没有要求，调试时顺序启动可避免无谓的错误，比如medulla较晚启动，detour未收到点云而触发Clumsy的“盲目驾驶”警报。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.1.1 Medulla ===&lt;br /&gt;
资源管理器打开L100的安装目录，双击&amp;quot;Medulla\Medulla.exe&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250627165034978.png|无框|605x605像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-1 Medulla运行界面'''&lt;br /&gt;
&lt;br /&gt;
窗口左侧的&amp;quot;对象列表&amp;quot;有两个组件：cart是移动机器人的下位信号，frontlidar是导航雷达。这是调试时主要关注的对象。&lt;br /&gt;
&lt;br /&gt;
=== 2.1.2 Detour ===&lt;br /&gt;
资源管理器打开L100的安装目录，双击&amp;quot;Detour\Detour.exe&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250628153846834.png|无框|635x635像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-2 Detour 启动后界面'''&lt;br /&gt;
&lt;br /&gt;
L100 仿真环境已建图。Detour 启动后自动加载地图，勾选 Detour 窗口右下角的&amp;quot;显示选项 \ 跟随小车&amp;quot;，使 L100 在窗口中央，使用鼠标滚轮缩放激光地图。&amp;lt;blockquote&amp;gt;备注：由于 Robopal 不会记录 L100 最后位置，因此 Detour 启动后可能会出现丢定位现象，使用 Detour 的&amp;quot;概览&amp;quot;标签的&amp;quot;全图重定位&amp;quot;可找回定位。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.1.3 Clumsy ===&lt;br /&gt;
资源管理器打开L100的安装目录，双击&amp;quot;Clumsy\ClumsyConsole.exe&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250628155351989.png|无框|524x524像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-3 Clumsy 启动后界面'''&lt;br /&gt;
&lt;br /&gt;
Clumsy 界面由 2 个标签构成。控制面板展示小车的运动状态，以及用于调试的功能列表。车辆配置用于整定运动参数。&lt;br /&gt;
&lt;br /&gt;
== 2.2 上位机 ==&lt;br /&gt;
&lt;br /&gt;
=== 2.2.1 Simple ===&lt;br /&gt;
资源管理器打开L100的安装目录，双击&amp;quot;Simple\SimpleComposer.exe&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751190069399.png|无框|591x591像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-4 Simple 启动后界面'''&lt;br /&gt;
&lt;br /&gt;
使用鼠标滚轮缩放地图，按下滚轮（中键）拖动地图，使 L100 模拟车和管控路线在地图上显示。&lt;br /&gt;
&lt;br /&gt;
== 2.3 仿真环境 ==&lt;br /&gt;
对于不具备物理调试环境的用户，比如缺调试场地、非标AGV尚未制造下线，可以使用仿真环境来调试。仿真环境由以下子系统构成：&lt;br /&gt;
&lt;br /&gt;
* 仿真环境。Robopal是仿真环境软件，实现移动机器人及其运行环境的仿真，模拟配置了2D雷达、安全触边的移动机器人，以及单舵轮、差速底盘，在设定环境中运行。可用于激光SLAM建图和定位，接触式和非接触式避障测试，运动参数整定等调试任务。&lt;br /&gt;
* 设备模拟器。Mimics是自控设备模拟器，实现移动机器人的电机驱动器、点位开关的仿真。可用于运动参数整定等调试任务。&lt;br /&gt;
* 配套应用软件。modbus slave模拟器、西门子S7模拟器等。用于模拟现场总线，与设备模拟器配套使用。&lt;br /&gt;
&lt;br /&gt;
我们以代表车型来说明仿真环境使用方法。&lt;br /&gt;
&lt;br /&gt;
=== 2.3.1 L100地牛 ===&lt;br /&gt;
L100地牛使用差速底盘，配有一个2D激光雷达，系统通信图如下。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250627150427180.png|无框|579x579像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-5 L100仿真通信图'''&lt;br /&gt;
&lt;br /&gt;
L00地牛的PLC负责控制电机驱动器和点位开关，通过串口与车载工控机通信；倍加福R2000激光雷达直连车载工控机网口。仿真L100地牛用Mimics模拟PLC，Mimics是MDCS工具链的设备模拟器，可模拟电气模组，并集成Web界面来修改设备运行参数。用Robopal的180度视野激光雷达代替R2000激光雷达，以便模拟货物遮挡雷达情况下的建图与定位。&lt;br /&gt;
&lt;br /&gt;
Diagslave是Modbus TCP Slave模拟器，Mimics L100模拟器以Modbus TCP替换Modbus RTU，以简化仿真环境搭建。Medulla L100插件也切换为使用Modbus TCP通道。&lt;br /&gt;
&lt;br /&gt;
按照以下步骤启动仿真环境：&lt;br /&gt;
&lt;br /&gt;
# Windows资源管理器打开L100仿真版目录；&lt;br /&gt;
# 双击&amp;quot;modbus\diagslave.exe&amp;quot;，启动Modbus TCP Slave模拟器，运行界面见图2-2；&lt;br /&gt;
# 双击&amp;quot;Mimic\Mimics.exe&amp;quot;，启动L100模拟器，运行界面见图2-3；&lt;br /&gt;
# 浏览器输入&amp;quot;localhost:7200/index.html&amp;quot;，打开Mimics监控页面，见图2-4；&lt;br /&gt;
# 登入Ubuntu，进入Robopal目录，在命令行下执行&amp;quot;./robopal&amp;quot;启动，见图2-5。&lt;br /&gt;
&lt;br /&gt;
==== 2.3.1.1 diagslave ====&lt;br /&gt;
[[文件:Image-20250627151731326.png|无框|555x555像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-6 diagslave的运行窗口'''&lt;br /&gt;
&lt;br /&gt;
diagslavec.exe是命令行程序。可以在资源管理器双击启动，或者在cmd终端启动，启动后都会在cmd终端运行。&amp;lt;blockquote&amp;gt;注意：如果鼠标左键点击命令行窗口的文字，会暂停命令行程序的运行，敲回车键可以解除选择文字并恢复运行。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2.3.1.2 Mimics ====&lt;br /&gt;
[[文件:Image-20250627152134779.png|无框|557x557像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-7 Mimics的运行窗口'''&lt;br /&gt;
&lt;br /&gt;
Mimics.exe也是命令行程序。当日志停止输出时启动完毕。浏览器打开&amp;quot;localhost:7200/index.html&amp;quot;，进入监控页面。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250627152918543.png|无框|515x515像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-8 L100Mimic的监控页面'''&lt;br /&gt;
&lt;br /&gt;
L100模拟器启动后，先要修改RemoteRalIp，这是Robopal所在Ubuntu的IP地址，L100模拟器使用UDP 4344端口向Robopal发送移动机器人的线速度/角速度。如果Robopal的移动机器人不会移动，基本上是这个参数配置错误。&lt;br /&gt;
&lt;br /&gt;
其他属性值参考L100的下位信号说明使用。一般而言，主要是修改IsAutomatic、IsEmergencyStopPressed属性值，用于手/自切换和复位警报。&lt;br /&gt;
&lt;br /&gt;
右侧拟态方法用于模拟升降货叉。&lt;br /&gt;
&lt;br /&gt;
==== 2.3.1.3 Robopal ====&lt;br /&gt;
首先修改L100模拟器的RemotePalIp值，指向运行Robopal的Ubuntu主机。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250627153735146.png|无框|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
'''图2-9 修改RemotePalIp值'''&lt;br /&gt;
&lt;br /&gt;
Ubuntu上进入Robopal目录，检查robopal.cfg配置（如果首次使用），确认lidarRemoteIp指向运行Medulla的主机（Robopal向目标主机的UDP 4343端口推送点云数据）。&lt;br /&gt;
 bruce@u22:~/Robopal$ cat robopal.cfg &lt;br /&gt;
&lt;br /&gt;
 lidarRemoteIp=192.168.3.102&lt;br /&gt;
&lt;br /&gt;
 lidarRemotePort=4343&lt;br /&gt;
&lt;br /&gt;
 listenPort=4344&lt;br /&gt;
&lt;br /&gt;
 world=./worlds/SmallWareHouse.world&lt;br /&gt;
&lt;br /&gt;
 robotsCount=1&lt;br /&gt;
命令行下输入&amp;quot;./Robopal&amp;quot;启动。Robopal是命令行程序，启动后在控制台输出日志，见图2-6，随后弹出仿真环境窗口，见图2-8。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250627154009452.png|无框|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-10 Robopal的控制台输出'''&lt;br /&gt;
&lt;br /&gt;
如果输出日志的speed &amp;amp; angle都是0，表示没收到L100模拟器的运控指令，RemotePalIp配置错误。下图是配置正确时的输出。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250627154234078.png|无框|536x536像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-11 Robopal收到L100模拟器运控指令的输出'''&amp;lt;blockquote&amp;gt;备注：例图是WindTerm SSH到Ubuntu的操作界面，因此左侧有时间戳和行号。&amp;lt;/blockquote&amp;gt;[[文件:Image-20250627154436498.png|无框|523x523像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-12 Robopal的仿真界面'''&lt;br /&gt;
&lt;br /&gt;
Robopal启动后处于暂停状态（左下角的仿真计时器不动），顺序点击&amp;quot;Run&amp;quot;菜单的&amp;quot;One step&amp;quot;、&amp;quot;Pause&amp;quot;启动仿真（也可以在键盘顺序输入&amp;quot;.&amp;quot;、&amp;quot;p&amp;quot;启动）。&lt;br /&gt;
&lt;br /&gt;
启动后计时器跳动，移动机器人的激光雷达扫描线出现。使用鼠标滚轮缩放视图，左键按压拖动视图，左键拖拽移动机器人移动。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250627161652076.png|无框|529x529像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-13 仿真环境启动后界面'''&lt;br /&gt;
&lt;br /&gt;
L100仿真环境模拟了一个小型车间，外间是仓库，内间是生产区，配有一台L100地牛。 &amp;lt;blockquote&amp;gt;注意：Robopal 有个已知错误，在运行一段时间后雷达输出停止。在 4G 内存的 Ubuntu 上，约 52 分钟后出现。此时 Medulla 的 frontlidar 标红，同时弹出“雷达无数据”警告。&amp;lt;/blockquote&amp;gt;[[文件:1751035019133.png|无框|653x653像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-14 Robopal 的模拟雷达异常界面'''&lt;br /&gt;
&lt;br /&gt;
重启 Robopal 可解决问题。Robopal 重启后，L100 位置会跳动到默认位置（靠近 2 根立柱），鼠标拖动 L100 到重启前位置，如果 Detour 上显示定位丢失，则使用“全局重定位”找回位置即可。&lt;br /&gt;
&lt;br /&gt;
== 2.4 看门狗 ==&lt;br /&gt;
MDCS 看门狗可监控下位机程序的运行状态，当程序意外退出时会自动拉起，适用于生产环境。从 &amp;lt;nowiki&amp;gt;https://dev.lessokaji.com/index.php?topic=258.0&amp;lt;/nowiki&amp;gt; 下载看门狗程序。&lt;br /&gt;
&lt;br /&gt;
= 三、使用 =&lt;br /&gt;
&lt;br /&gt;
== 3.1 Medulla ==&lt;br /&gt;
下面分别说明 cart 和 frontlidar 的属性和功能。&lt;br /&gt;
&lt;br /&gt;
=== 3.1.1 cart对象 ===&lt;br /&gt;
cart的信号包括下位信号（由Medulla车型插件定义）、上位信号（由Clumsy车型插件定义）。以&amp;quot;电量%&amp;quot;（BatteryPercent）为例，L100模拟器的默认值是75，Medulla通过Modbus TCP连接L100模拟器，读出75%电量。&lt;br /&gt;
&lt;br /&gt;
L100的下位信号在&amp;quot;PelletTruck\PelletTruckMedulla\PalletTruckDefinition.cs&amp;quot;定义，说明如下。&lt;br /&gt;
&lt;br /&gt;
下位信号的分类说明：&lt;br /&gt;
&lt;br /&gt;
* 状态机。正交的3种工作模式。&lt;br /&gt;
** 自动模式（Automatic）。可执行上位机下发的任务，由Clumsy自主控制。&lt;br /&gt;
** 手动模式（Manual）。可使用Medulla的遥控器控制机器人行走，用于SLAM建图、运动参数整定和故障处理。&lt;br /&gt;
** 故障模式（Malfunction）。当电气模组工况异常、触发安全相关警报时进入，必须解除异常/报警源问题，按下复位键后切换到原来状态（自动/手动）。&lt;br /&gt;
* 诊断。判断移动机器人是否在故障模式，以及故障模式的归因。&lt;br /&gt;
** HasFault。电气模组的异常工况都会触发为True，比如电机驱动器报警、底盘控制心跳停止等。&lt;br /&gt;
** FaultMessage。逗号分割的硬件故障提示。&lt;br /&gt;
* 安全。低级安全包括接触式和非接触式安全响应，高级安全综合定位置信度、安全措施屏蔽和行走状态判定。&lt;br /&gt;
** 接触式安全响应。拍下急停按钮、安全触边触发等需要人接触的安全信号。&lt;br /&gt;
** 非接触式安全响应。避障激光雷达、货叉光电传感器等非接触安全信号。&lt;br /&gt;
** 高级安全。鲁莽驾驶是屏蔽安全措施且在自动模式下行走，一般发生在处理故障后未接触屏蔽，然后切自动模式。盲目驾驶是detour返回的定位置信度（lstep）大于16（经验阈值），且自动模式下连续行走5秒以上。&lt;br /&gt;
* 轮系。驱动轮的目标速度、反馈速度、状态和故障。&lt;br /&gt;
* 货叉。升降状态及高度。&lt;br /&gt;
* 电池。剩余电量。&lt;br /&gt;
&lt;br /&gt;
L100 的上位信号在&amp;quot;PelletTruck\PelletTruckPilot\PelletTruckDefinition.cs&amp;quot;定义，说明如下。&lt;br /&gt;
&lt;br /&gt;
上位信号由 Clumsy 控制，Medulla 读取，下位信号则相反。&lt;br /&gt;
&lt;br /&gt;
Lstep 来自 Detour，表示定位置信度，回环线程锁定关键帧时 Lstep 等于 2，否则会单调递增，直到再次锁定关键帧为止。&lt;br /&gt;
&lt;br /&gt;
SSC 是 Clumsy 的激光雷达避障区域，点云来自导航激光雷达。命名风格为&amp;quot;[fwd|rev|lt|rt]_[fast|slow]_[empty|loaded]&amp;quot;，包括 3 部分（中括号），说明如下：&lt;br /&gt;
&lt;br /&gt;
* 行走方向：fwd 表示前进，rev 表示后退，lt 表示左转，rt 表示右转。&lt;br /&gt;
* 行走速度：fast 表示高速，slow 表示低速。&lt;br /&gt;
* 载货状态：empty 表示空载，loaded 表示带载。&lt;br /&gt;
&lt;br /&gt;
以带载高速前进为例，SSC 名称就是&amp;quot;fwd_fast_loaded&amp;quot;，该场景下应扩大缓行区域长度，使行人侵入缓行区域时可提早减速，停车区域和急停区域同理，保证减速及停车时货物不至于惯性过大而倾倒。再如，带载低速右转，SSC 名称就是&amp;quot;tr_slow_loaded&amp;quot;，应适当扩大区域右侧面积，在右转方向及时发现行人。&lt;br /&gt;
&lt;br /&gt;
=== 3.1.2 frontlidar ===&lt;br /&gt;
L100 配置 1 个激光雷达，仿真环境使用 180 度视野的仿真雷达，视野较小的雷达有助于工程师理解SLAM 能力边界，比如建图时路线必须闭环，使激光雷达从不同角度看到相同的路标。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751031602666.png|无框|586x586像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-1 frontlidar'''&lt;br /&gt;
&lt;br /&gt;
frontlidar 窗口主要看 scanC和 pointsN，前者是点云帧计数器，单调加一，连接雷达后会持续增大；后者是点云的测量点数量，本例配置雷达的角分辨率是 0.25,180° 视野，因此测量点数量 = 180 / 0.25 = 720。&lt;br /&gt;
&lt;br /&gt;
frontlidar 窗口的另一个重要功能是&amp;quot;view&amp;quot;。点击右侧功能列表的&amp;quot;view&amp;quot;，打开点云视窗。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751031978875.png|无框|595x595像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-2 点云视窗'''&lt;br /&gt;
&lt;br /&gt;
对比右侧Robopal 的仿真窗口，激光雷达观测得到的点云在雷达的视野内。点云视窗使用雷达坐标系（右手坐标系），雷达 0 度（雷达正前方）是食指指向的正 X 轴，中指指向正 Y 轴。&amp;lt;blockquote&amp;gt;备注：L100 仿真环境面向新手，配置的模拟雷达未开启噪音功能，因此点云是干净不含噪音的，不像 R2000 的点云有轻微跳动。由于没有噪音，Detour 中的位姿也是稳定的不会轻微波动。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.1.3 MedullaConsole ===&lt;br /&gt;
如果 Medulla的驱动发生异常，比如 frontlidar 没收到点云，对象列表中相应的对象会标红提示。此时可切换到&amp;quot;ui&amp;quot;标签，点击&amp;quot;ShowConsole&amp;quot;打开 MedullaConsole 窗口，查看日志来分析异常。&lt;br /&gt;
&lt;br /&gt;
点击&amp;quot;HideConsole&amp;quot;则隐藏 MedullaConsole 窗口。&amp;lt;blockquote&amp;gt;注意：不要关闭 MedullaConsole 窗口，这会关闭 Medulla 进程。如果要隐藏 MedullaConsole 窗口，应使用&amp;quot;HideConsole&amp;quot;功能。如果要关闭 Medulla，可右键点击在 Windows 任务栏右侧的 Medulla 图标，选择&amp;quot;Exit&amp;quot;菜单退出。&amp;lt;/blockquote&amp;gt;&amp;quot;MessageLogs&amp;quot;功能弹出插件日志对话框，查看通过Medulla.Diagnosis 的 Post 或 Toast 方法输出的日志。Post与 Toast的区别在于后者只显示给定标签的最新消息，适合输出实时刷新的日志，比如 CAN 的调试信息（不会刷屏而挤走其他重要日志）。 &lt;br /&gt;
&lt;br /&gt;
=== 3.1.4 startup.iocmd ===&lt;br /&gt;
位于 Medulla 目录下的 startup.iocmd 是 Medulla 的配置脚本，用于加载驱动，显示 MedullaConsole。L100 模拟器的配置脚本说明如下：&lt;br /&gt;
 # startup.iocmd使用 JavaScript 语法，将&amp;quot;.&amp;quot;替换为空格，方法参数亦然。&lt;br /&gt;
&lt;br /&gt;
 # 比如&amp;quot;frontlidar Start&amp;quot;就是&amp;quot;frontlidar.Start()&amp;quot;，调用 frontlidar 的&lt;br /&gt;
&lt;br /&gt;
 # Start方法，无参数。&lt;br /&gt;
&lt;br /&gt;
 ​&lt;br /&gt;
&lt;br /&gt;
 # 创建车型激活器&lt;br /&gt;
&lt;br /&gt;
 loader = io load plugins/CartActivator.dll&lt;br /&gt;
&lt;br /&gt;
 # 加载 plugins 子目录下的&amp;quot;Medulla 地牛插件库&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 cart = loader load plugins/MedullaPelletTruck.dll&lt;br /&gt;
&lt;br /&gt;
 # 加载 plugins 子目录下的&amp;quot;通用雷达驱动库&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 frontlidar = io load plugins/UniversalLidarDriver.dll&lt;br /&gt;
&lt;br /&gt;
 # frontlidar使用robopal驱动，雷达IP是192.168.3.101，UDP 端口是 4343，角分辨率 0.25°&lt;br /&gt;
&lt;br /&gt;
 frontlidar Setup robopal 192.168.3.101 4343 0.25&lt;br /&gt;
&lt;br /&gt;
 # frontlidar的盲区是10mm，最大测距20,000mm&lt;br /&gt;
&lt;br /&gt;
 frontlidar setMaskDist 10 20000&lt;br /&gt;
&lt;br /&gt;
 # 启动frontlidar&lt;br /&gt;
&lt;br /&gt;
 frontlidar Start&lt;br /&gt;
&lt;br /&gt;
 # 加载WinMedulla库（MedullaConsole 的 WinForm 实现）&lt;br /&gt;
&lt;br /&gt;
 ui=io load plugins\WinMedulla.dll  &lt;br /&gt;
&lt;br /&gt;
 # 显示WinMedulla 监视窗口&lt;br /&gt;
&lt;br /&gt;
 ui Show&lt;br /&gt;
&lt;br /&gt;
=== 3.1.5 监控硬件异常 ===&lt;br /&gt;
移动机器人常见问题是硬件异常，导致不能执行任务。L100的状态机根据上下位信号实时监控硬件异常，当硬件故障或安全异常时，转入故障状态并告警。当L100出现异常时，应观察cart对象的HasFault和HasAlarm信号。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751034226409.png|无框|341x341像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-3 cart对象的故障与警告信号'''&lt;br /&gt;
&lt;br /&gt;
* HasFault：当电气模组出现故障时为True。FaultMessage显示故障硬件名称，如果有多个则以逗号分割。&lt;br /&gt;
* HasAlarm：出现安全隐患时为True。AlarmMessage显示告警源，如果有多个则以逗号分割。&lt;br /&gt;
&lt;br /&gt;
出现HasFault时，应先解决硬件故障。常见硬件故障如下：&lt;br /&gt;
&lt;br /&gt;
* 电机驱动器报警。一般是伴生故障，比如急停时可能引起驱动器过压报警，这种警告无须处理，复位后自动解除。&lt;br /&gt;
* 安全触边报警。应移动地牛，将安全触边脱离障碍物。&lt;br /&gt;
* 货叉探货传感器报警。应移动地牛（或障碍物），使光电传感器前没有障碍物。&lt;br /&gt;
&lt;br /&gt;
出现HasAlarm时，应先判断安全风险，比如行人侵入急停区，则应拍下急停按钮，等行人离开后再松开。&amp;lt;blockquote&amp;gt;注意：L100没有复位按钮，以急停按钮代替。拍下急停按钮，等待 1 秒以上松开，车型插件会创建复位按钮信号，持续 3 秒后消除。&amp;lt;/blockquote&amp;gt;'''当工作模式为手动（Manual）时，L100 也不会执行上位机下发的任务'''。&lt;br /&gt;
&lt;br /&gt;
== 3.2 Detour ==&lt;br /&gt;
关于 Detour 的操作请参考 [[首页|https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5]] 的'''快速开始'''。新手建议使用 L100 地图熟悉定位相关操作，然后进阶学习建图。&amp;lt;blockquote&amp;gt;备注：L100 模拟车的雷达位置是精确的，因此无须标定外参。实物车必须标定外参，Wiki 有详细说明。&amp;lt;/blockquote&amp;gt;开发机一般没有 Detour 授权证书，因此有 '''60 分钟时长限制'''，超时后重启 Detour 即可。&amp;lt;blockquote&amp;gt;备注：Detour 试用超时后，状态栏的位姿不会更新，控制台窗口会持续输出错误提示。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3.3 Clumsy ==&lt;br /&gt;
我们以 L100 地牛来说明 Clumsy 的调试功能。&lt;br /&gt;
&lt;br /&gt;
L100 的调试功能如下：&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;
=== 3.3.1 测试前进行走 ===&lt;br /&gt;
点击 Clumsy 窗口（如果 Clumsy 不是当前活动窗口，点击功能菜单可能无效，要多点一次），点击“测试前进行走”，鼠标左键在左边视图的小车上按下，然后向前进方向拖出一个箭头线，随后松开左键。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250628160443048.png|无框|503x503像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-4 鼠标拖拽出直线路径'''&lt;br /&gt;
&lt;br /&gt;
黄色箭头线段是小车要跟随的轨迹，小车的红色箭头指向车头方向，黄绿色箭头线指向轨迹终点，白色箭头线指向'''预瞄点'''。&lt;br /&gt;
&lt;br /&gt;
Clumsy 的轨迹跟踪算法简要说明如下：&lt;br /&gt;
&lt;br /&gt;
# 预瞄点。计算小车运动中心质点在跟踪路径上的垂足，从垂足延轨迹向前延伸预瞄距离，得到预瞄点。预瞄点作用与我们开车相似，开车时司机看的是前方，而不是车头，车速越快，向前看得越远，如此可以控制加减速以平顺驾驶。&lt;br /&gt;
# 首次转向。小车开始跟踪轨迹时，如果距离轨迹较远，先转向使车头指向轨迹（尽快开到轨迹上），然后向轨迹行走。&lt;br /&gt;
# 跟踪路径。当小车向轨迹行走时，会根据车头指向与直线轨迹的角度差调整车速，夹角越小速度越快。&lt;br /&gt;
# 下一段路径。当小车即将跟踪下一段路径时（测试多段路线），会计算下一段路径与车头指向的夹角，如果是小夹角则速度不减，否则减速。&lt;br /&gt;
&lt;br /&gt;
=== 3.3.2 车辆配置 ===&lt;br /&gt;
运动参数整定是新车型适配的关键任务之一。L100 的运动参数已配好，使用即可。以下是 L100（差速底盘）相关的运动参数说明，供参考。&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;
|vthBias&lt;br /&gt;
|double&lt;br /&gt;
|车体参数：旋转补偿，用于补偿车辆旋转时的偏差&lt;br /&gt;
|-&lt;br /&gt;
|rotSync&lt;br /&gt;
|double&lt;br /&gt;
|车体参数：角度同步阈值，当实际角度与目标角度差小于此值时开始同步&lt;br /&gt;
|-&lt;br /&gt;
|wAcc&lt;br /&gt;
|float&lt;br /&gt;
|车体参数：角度同步加速度，控制角度调整的加速度大小&lt;br /&gt;
|-&lt;br /&gt;
|Stail_l&lt;br /&gt;
|double&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;
|thresAcc&lt;br /&gt;
|double&lt;br /&gt;
|加速阈值，限制车辆加速度大小&lt;br /&gt;
|-&lt;br /&gt;
|thresDeAcc&lt;br /&gt;
|double&lt;br /&gt;
|减速阈值，限制车辆减速度大小&lt;br /&gt;
|-&lt;br /&gt;
|thresRotAcc&lt;br /&gt;
|double&lt;br /&gt;
|转弯加速阈值，限制转弯时的角加速度&lt;br /&gt;
|-&lt;br /&gt;
|maxWSpeed&lt;br /&gt;
|float&lt;br /&gt;
|转弯最大速度，限制车辆旋转的最大角速度&lt;br /&gt;
|-&lt;br /&gt;
|finSpeed&lt;br /&gt;
|double&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;
|distFin&lt;br /&gt;
|int&lt;br /&gt;
|路径结束距离，判断路径是否结束的距离阈值&lt;br /&gt;
|-&lt;br /&gt;
|dthFac&lt;br /&gt;
|float&lt;br /&gt;
|左右差速P，差速转向的比例系数，相当于PID控制中的P参数&lt;br /&gt;
|-&lt;br /&gt;
|lookAhead&lt;br /&gt;
|float&lt;br /&gt;
|点跟踪方法点距，车辆跟踪路径点的前视距离&lt;br /&gt;
|-&lt;br /&gt;
|trackFinDist&lt;br /&gt;
|float&lt;br /&gt;
|判断&amp;quot;已到达终点&amp;quot;的阈值，距离小于此值认为已到达目标点&lt;br /&gt;
|-&lt;br /&gt;
|predict&lt;br /&gt;
|float&lt;br /&gt;
|前进预测量，根据当前速度预测未来位置的时间系数&lt;br /&gt;
|-&lt;br /&gt;
|thScale&lt;br /&gt;
|float&lt;br /&gt;
|转弯预测量，转弯时的预测系数，影响转弯平滑度&lt;br /&gt;
|-&lt;br /&gt;
|nfFac&lt;br /&gt;
|float&lt;br /&gt;
|转弯负反馈量，减少转弯抖动的阻尼系数&lt;br /&gt;
|-&lt;br /&gt;
|stoppingPow&lt;br /&gt;
|double&lt;br /&gt;
|停止幂数，控制车辆接近终点时减速曲线的形状&lt;br /&gt;
|-&lt;br /&gt;
|wayPointFinSpeedFactor&lt;br /&gt;
|float&lt;br /&gt;
|速度越大时，wayPointFinDist 增大的幅度，高速行驶时提前减速的系数&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;
|speedDegThres&lt;br /&gt;
|double&lt;br /&gt;
|角度优先调节的角度范围，当角度偏差大于此值时优先调整角度而非速度&lt;br /&gt;
|-&lt;br /&gt;
|firstThAccuracy&lt;br /&gt;
|float&lt;br /&gt;
|行走指向精度，初始定向时的角度精度要求&lt;br /&gt;
|-&lt;br /&gt;
|stoppingLAFac&lt;br /&gt;
|double&lt;br /&gt;
|接近终点时lookAhead的衰减系数，影响终点附近的路径跟踪平滑度&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3.3.3 SSC ===&lt;br /&gt;
Clumsy 支持导航激光雷达用于避障（使用 Medulla 输出的点云，与 Detour 无关）。避障区域称为 SSC，绘制方法与点位输出型避障雷达相似。避障区间抽象为“行走方向” + “车速” + “带载”的组合，下面以绘制带载高速直行为例说明。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751100609693.png|无框|561x561像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-5 Clumsy 的车体编辑器'''&lt;br /&gt;
&lt;br /&gt;
“车辆配置”标签页，点击“查看/编辑车体布局”打开布局编辑器。车体布局上有一个单线雷达，其名称（name）与 Medulla 的 frontlidar 一致。车体布局上已有 SSC（雷达触边），点选“frontlidarArea”来修改。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751100798306.png|无框|534x534像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-6 SSC 的重绘制功能'''&lt;br /&gt;
&lt;br /&gt;
点选“动作”标签，双击“重绘制”。鼠标左键顺序点击绘制区域的顶点，如下图的红色框。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751100906863.png|无框|535x535像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-7 重新绘制 SSC 轮廓'''&lt;br /&gt;
&lt;br /&gt;
SSC 轮廓是封闭多边形，带载直行时，轮廓宽度应大于托盘，长度应满足高速直行时的减速/停车要求。SSC 的命名风格如下（数据词典语法）：&lt;br /&gt;
&lt;br /&gt;
'''[ fwd | rev | lt | rt ]_[ fast | slow ]_[ empty | loaded ]_[ slowdown | stop | estop ]'''&lt;br /&gt;
&lt;br /&gt;
SSC 名称由 4 部分构成：行驶方向、车速、带载、行为。以下划线连接。&lt;br /&gt;
&lt;br /&gt;
* 行驶方向：fwd（前进），rev（倒走）、lt（左转弯）、rt（右转弯）。&lt;br /&gt;
* 车速：fast（高速），slow（低速）。&lt;br /&gt;
* 带载：empty（空载），loaded（带载）。&lt;br /&gt;
* 行为：slowdown（降速缓行），stop（停车），estop（急停）。&lt;br /&gt;
&lt;br /&gt;
我们正在绘制的 SSC 是带载高速直行的缓行区域，那么 SSC 的 name 就是&amp;quot;fwd_fast_loaded_slowdown&amp;quot;，如下图。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751101787310.png|无框|516x516像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-8 带载高速直行的缓行区间'''&amp;lt;blockquote&amp;gt;SSC 可用布局编辑器菜单的“添加\雷达触边”增加，也可以用菜单删除。新增的雷达触边以“重绘制”功能编辑轮廓。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3.4 Simple ==&lt;br /&gt;
下图显示了 L100 在仿真环境、Detour 和 Simple 地图上的位置。可见 L100 的位置是一致的，这也是激光 SLAM 的目的：使移动机器人使用激光雷达在物理世界中精确定位。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751191333111.png|无框|671x671像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-9 L100 在仿真环境、Detour 和 Simple 地图中的位置'''&lt;br /&gt;
&lt;br /&gt;
Simple的功能以 5 个标签组织：&lt;br /&gt;
&lt;br /&gt;
* 地图。配置激光地图。&lt;br /&gt;
* 进程。配置'''任务插件'''。&lt;br /&gt;
* 车辆。配置'''车队'''。&lt;br /&gt;
* 脚本。查看小车执行的'''任务脚本'''。&lt;br /&gt;
* 场景。配置'''管控地图'''的站点、路径。&lt;br /&gt;
&lt;br /&gt;
=== 3.4.1 地图标签 ===&lt;br /&gt;
[[文件:1751191661158.png|无框|569x569像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-10 地图标签界面'''&lt;br /&gt;
&lt;br /&gt;
导入 Detour 的激光地图文件，作为管控路线配置的依据。&lt;br /&gt;
&lt;br /&gt;
Detour 的激光地图又称为'''稠密地图'''，记录了环境信息，使移动机器人通过激光雷达获得实时位置。稠密地图记录的信息量相当大，这是定位所必须的。Simple 的管控地图也称为'''稀疏地图'''，仅记录由站点和路径构成的路网图，用于规划移动机器人从 A 点到 B 点的路线。&lt;br /&gt;
&lt;br /&gt;
以公交车比喻，司机记忆的地图属于稠密地图，包括路标（医院、学校、超市等有明显特征的地点）、车道宽窄、红绿灯等，这个信息量丰富的地图有助于司机安全驾驶公交车执行客运任务。公交车终点站的调度员使用的地图则是稀疏地图，记录构成线路的站点、发车时刻表，协助调度员合理调度车辆和司机以执行客户计划。&lt;br /&gt;
&lt;br /&gt;
虽然管控程序不会直接使用激光地图，但是激光地图包含的环境轮廓与坐标有助于配置管控路线。所以导入激光地图是 Simple 配置的第一个步骤。&lt;br /&gt;
&lt;br /&gt;
=== 3.4.2 进程标签 ===&lt;br /&gt;
[[文件:1751196976753.png|无框|585x585像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-11 进程标签界面'''&lt;br /&gt;
&lt;br /&gt;
Simple 通过插件机制扩展功能。CDM（链式搬运任务）是标配插件，调度小车执行“取/放”搬运任务。项目的定制功能可通过 Simple 插件实现自定义任务实现。&lt;br /&gt;
&lt;br /&gt;
==== 3.4.2.1 CDM ====&lt;br /&gt;
[[文件:1751197357322.png|无框|571x571像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-12 CDM 的动作列表'''&lt;br /&gt;
&lt;br /&gt;
点选“CDM”，再切换到“动作”标签，可使用 CDM 的功能（以使用频率顺序说明）：&lt;br /&gt;
&lt;br /&gt;
* 初始化所有车辆。Simple 启动后，所有小车处于“未初始化”状态（见图 3-11，小车上有个 X 图标），使用此功能初始化所有小车（详见“车队标签”）。&lt;br /&gt;
* 取放货。双击“取放货”条目，然后鼠标顺序在管控地图上点击“取货”站点、“放货”站点。CDM 自动选择一台就近的空闲小车，然后规划出取放货路径，调度小车执行取放任务。&lt;br /&gt;
* 取货。仅取货。&lt;br /&gt;
* 放货。仅放货（小车上应有货）。&lt;br /&gt;
* 查看任务。弹出任务列表对话框，可取消待执行/执行中的任务，查看已执行的任务。&lt;br /&gt;
* 启动进程 / 关闭进程。启动 / 停止 CDM 任务。&lt;br /&gt;
* 添加 Idle 标签。向小车贴上“空闲”标签（可调度执行任务）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;注意：CDM 要求管控地图上至少有一个“躲避”站点（待命点或库位），当小车挡住另一台小车的任务路线时，CDM 会调度堵路小车去躲避站点。如果没有“躲避”站点，CDM 在规划路线会失败，即便只配置一台小车也是如此。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.4.3 车队标签 ===&lt;br /&gt;
启动仿真环境后，L100在默认位置，Detour 可能会丢定位（Detour 持续记录当前位姿，如果位姿跳变则会丢定位）。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20250629195535720.png|无框|689x689像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-13 仿真环境启动后 L100 丢定位'''&lt;br /&gt;
&lt;br /&gt;
参考上图，自上而下来看：&lt;br /&gt;
&lt;br /&gt;
# Robopal 是 L100 的默认位姿。&lt;br /&gt;
# Detour 显示点云与地图有明显偏差（向右下方偏出）。&lt;br /&gt;
# Simple 上L100 位姿与 Detour 一致（位姿来自于 Detour），小车未初始化，且不在站点上。&lt;br /&gt;
&lt;br /&gt;
在 Robopal 窗口，鼠标左键慢慢拖动 L100 到“待命点”站点。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751198377317.png|无框|698x698像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-14 把 L100 拖动到待命点'''&lt;br /&gt;
&lt;br /&gt;
慢速拖动 L100 是让 Detour 能够修正定位误差（如果拖放后定位有错误，使用 Detour 的“全局重定位”修正），如上图所示，点云（绿色线）与地图轮廓已贴合，且小车附近的一个关键帧（红色实心点，右下方有点云配置分数 0.75）被锁定，说明 Detour 已修正定位偏差。&lt;br /&gt;
&lt;br /&gt;
“地牛 1”的属性说明如下：&lt;br /&gt;
&lt;br /&gt;
* siteID：小车所在站点编号，由于未初始化，因此是-1。&lt;br /&gt;
* speed：小车的默认速度(mm/s)是 0.4m/s（速度属性的数据类型是整数，因此使用 mm/s）。&lt;br /&gt;
* address：小车的 IP 地址（Clumsy 所在主机的 IP）。&lt;br /&gt;
* lstatus：小车的状态。&lt;br /&gt;
* id：流水号。&lt;br /&gt;
* name：小车名称。&lt;br /&gt;
* group：小车所在组。有些场景需要分组执行任务，比如“分拣”与“产品下线”由不同组车队执行任务，不可交叉执行。默认填&amp;quot;default&amp;quot;，用于不分组场景。&lt;br /&gt;
&lt;br /&gt;
移动 L100 到待命点，且定位准确时，双击“动作”标签的“初始化”。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751200524675.png|无框|582x582像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-15 初始化后的 L100'''&lt;br /&gt;
&lt;br /&gt;
L100 的“X”消失，初始化成功。&amp;lt;blockquote&amp;gt;注意：小车在站点上才允许初始化。&amp;lt;/blockquote&amp;gt;切换到“状态”标签，看 L100 的状态。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751200956848.png|无框|581x581像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-16 L100 的状态'''&lt;br /&gt;
&lt;br /&gt;
车辆状态反映了小车当前工况，当小车异常时，比如不执行任务，应根据其状态来分析故障源。&lt;br /&gt;
&lt;br /&gt;
* Clumsy 上传的状态。以“车体_”为前缀，实时更新。例图中的“车体_WorkMode”为“Manual”，表示L100 处于手动模式，不会执行 Simple 下发的任务。&lt;br /&gt;
* 交通管制相关状态：&lt;br /&gt;
** holdingLocks：小车当前所在站点编号。&lt;br /&gt;
** pendingLocks：小车执行任务时，会锁定前进方向的 3 个站点（包含当前站点，3 点定 2 条线段，即当前行走的路线和下一段路线）。如果小车在行驶时停下且无报警，应检查 pendingLocks，如果小车在礼让另一辆有交叉路线的小车，pendingLocks 只有 1 个站点，表示'''锁点失败而停车'''。&lt;br /&gt;
** blockedBy：正在礼让的另一台小车编号。&lt;br /&gt;
** TCStat：交通管制状态。&lt;br /&gt;
&lt;br /&gt;
常用动作说明：&lt;br /&gt;
&lt;br /&gt;
* 立即强制结束。向 Clumsy 发送“强制结束”指令，Clumsy 自动重启并丢弃正在执行的任务，小车停下。&lt;br /&gt;
* 现场检修并小车下线。小车停在路上检修故障，调度认为小车下线，不再调度。（现场检修的时间应短，否则小车会堵路）。&lt;br /&gt;
* 返厂检修。下车下线且被移出管控地图（siteID=-1）。把小车移出车道（比如推到路边不会堵路）检修时使用。&lt;br /&gt;
* 小车上线/下线。“状态”的“标记”是一种标签机制，可理解为向小车贴上便签，应用程序可利用标签实现定制功能。比如 CDM 使用“上下线”标签来标记小车能否使用。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;一般而言，当小车执行任务时出现异常，比如硬件故障，任务不能执行时，可用“现场检修”、“返厂检修”来防止 CDM 向它下新任务，然后用“立即强制结束”清除小车任务，处理完毕后用“初始化”使小车上线。&amp;lt;/blockquote&amp;gt;鼠标左键点选 L100，双击“前往站点”动作，然后左键点击目标站点，Simple 会规划一条路线并下发给 L100。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751202335408.png|无框|612x612像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-17 L100 前往待命点的规划路线'''&lt;br /&gt;
&lt;br /&gt;
彩色的规划路线是 L100 的包络线，表示 L100 在空载行走时需要占用的空间。Simple 的路线规划算法基于包络，当 2 台小车的包络有交叠时，则表示它们存在争用，Simple 会计算出通行顺序，使 2 台车安全通过。&amp;lt;blockquote&amp;gt;备注：“前往站点”的快捷方式是鼠标右键点击目标站点。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.4.4 脚本标签 ===&lt;br /&gt;
Simple 将规划路线编译为任务脚本，下发给 Clumsy，后者将执行结果回传 Simple。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751202625972.png|无框|605x605像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-18 L100 执行的一个任务脚本的例子'''&lt;br /&gt;
&lt;br /&gt;
选择脚本条目，双击“显示脚本”动作，可看到脚本内容。脚本使用 JavaScript 语法，Go 是行驶指令，指令小车跟踪直线轨迹行走。除此以外还有取货、放货、SSC 切换等指令，参见 Clumsy 的动作代码。&lt;br /&gt;
&lt;br /&gt;
=== 3.4.5 场景标签 ===&lt;br /&gt;
场景用于编辑管控地图，主要是站点和路径。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751202889451.png|无框|597x597像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-19 场景标签界面'''&lt;br /&gt;
&lt;br /&gt;
管控地图由站点和路径构成。使用“添加”菜单，逐个或连续将站点放入地图，然后用路径连接。&lt;br /&gt;
&lt;br /&gt;
L100 是差速底盘，无须使用圆弧和贝塞尔路径。&lt;br /&gt;
&lt;br /&gt;
Simple规划出路线后，模拟小车顺序走过规划路线的站点和路径，根据站点和路径的属性编译出相应的动作指令，比如行走、停车、旋转、取货等。&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;
|pdscene&lt;br /&gt;
|string&lt;br /&gt;
|行人检测场景名称&lt;br /&gt;
|-&lt;br /&gt;
|speed&lt;br /&gt;
|int&lt;br /&gt;
|行驶速度(mm/s)，默认400mm/s&lt;br /&gt;
|-&lt;br /&gt;
|reverse&lt;br /&gt;
|bool&lt;br /&gt;
|倒退行走，与revdst配合使用&lt;br /&gt;
|-&lt;br /&gt;
|revdst&lt;br /&gt;
|int&lt;br /&gt;
|倒退行走的目标地标&lt;br /&gt;
|-&lt;br /&gt;
|turndst&lt;br /&gt;
|int&lt;br /&gt;
|指向终点的turn=true时，在终点自旋到dstAngle&lt;br /&gt;
|-&lt;br /&gt;
|dstAngle&lt;br /&gt;
|int&lt;br /&gt;
|终点的自旋角度&lt;br /&gt;
|-&lt;br /&gt;
|typeInfo&lt;br /&gt;
|int&lt;br /&gt;
|与下段路径的关系： - 0 表示小角度转向，无须减速。 - 1表示根据下段路径夹角计算是否减速。 - 2 表示转到下段路径时必须停车。&lt;br /&gt;
|}&lt;br /&gt;
我们以去取货站点的路线配置为例。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751203529929.png|无框|623x623像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-20 取货路线配置'''&lt;br /&gt;
&lt;br /&gt;
我们希望地牛取货时按照规划路线精确行走，以保证货叉正对托盘，不至于跑偏而叉取失败。上图中选中的2条橙色路径是关键，要求地牛向 6 点方向直行到转弯处停下，然后自旋到 180 度，使货叉正对第 2 条路径，然后倒走进入取货库位。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751204090229.png|无框|619x619像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-21 取货路线的第一个路径'''&lt;br /&gt;
&lt;br /&gt;
第一条路径：&lt;br /&gt;
&lt;br /&gt;
* typeInfo=2：到下条路径前停车。&lt;br /&gt;
* speed=400：速度降到 0.4m/s。&lt;br /&gt;
* turndst=28：到编号为 28 的（路径）终点时自旋。&lt;br /&gt;
* dstAngle=180：自旋到 180 度。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751204394062.png|无框|624x624像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-21 取货路线的自旋站点'''&lt;br /&gt;
&lt;br /&gt;
第一段路径的终点：&lt;br /&gt;
&lt;br /&gt;
* id=28：即路径 turndst 指向的自旋站点。&lt;br /&gt;
* turn=true：自旋站点。&lt;br /&gt;
&lt;br /&gt;
[[文件:1751204497640.png|无框|610x610像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-22 取货路线的第二个路径'''&lt;br /&gt;
&lt;br /&gt;
第二条路径：&lt;br /&gt;
&lt;br /&gt;
* speed=200：降速到 0.2m/s。&lt;br /&gt;
* reverse=true：倒走。&lt;br /&gt;
* revdst=962：倒走的终点编号是 962。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;提示：reverse + revdst、turndst + dstAngle 都是配套使用。当地牛从取货站点离开时，是正走，到自旋站点后转向 89 度。&amp;lt;/blockquote&amp;gt;[[文件:1751204840386.png|无框|585x585像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-23 取货路线的取货站点'''&lt;br /&gt;
&lt;br /&gt;
取货站点：&lt;br /&gt;
&lt;br /&gt;
* group=&amp;quot;default&amp;quot;：使用默认分组。取货和放货站点必须有 group 字段，与小车的 group 配套使用。&lt;br /&gt;
* shelf=true：这是库位。（shelf 表示货架）&lt;br /&gt;
* angle=180：停下时的车头指向 180 度。&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751204840386.png&amp;diff=956</id>
		<title>文件:1751204840386.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751204840386.png&amp;diff=956"/>
		<updated>2025-06-30T08:34:27Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751204840386&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751204497640.png&amp;diff=955</id>
		<title>文件:1751204497640.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751204497640.png&amp;diff=955"/>
		<updated>2025-06-30T08:33:56Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751204497640&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751204394062.png&amp;diff=954</id>
		<title>文件:1751204394062.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751204394062.png&amp;diff=954"/>
		<updated>2025-06-30T08:33:25Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751204394062&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751204090229.png&amp;diff=953</id>
		<title>文件:1751204090229.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751204090229.png&amp;diff=953"/>
		<updated>2025-06-30T08:32:51Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751204090229&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751203529929.png&amp;diff=952</id>
		<title>文件:1751203529929.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751203529929.png&amp;diff=952"/>
		<updated>2025-06-30T08:32:19Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751203529929&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751202889451.png&amp;diff=951</id>
		<title>文件:1751202889451.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751202889451.png&amp;diff=951"/>
		<updated>2025-06-30T08:30:32Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751202889451&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751202625972.png&amp;diff=950</id>
		<title>文件:1751202625972.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751202625972.png&amp;diff=950"/>
		<updated>2025-06-30T08:29:51Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751202625972&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751202335408.png&amp;diff=949</id>
		<title>文件:1751202335408.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751202335408.png&amp;diff=949"/>
		<updated>2025-06-30T08:29:21Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751202335408&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751200956848.png&amp;diff=948</id>
		<title>文件:1751200956848.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751200956848.png&amp;diff=948"/>
		<updated>2025-06-30T08:28:42Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751200956848&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751200524675.png&amp;diff=947</id>
		<title>文件:1751200524675.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751200524675.png&amp;diff=947"/>
		<updated>2025-06-30T08:28:11Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751200524675&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751198377317.png&amp;diff=946</id>
		<title>文件:1751198377317.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751198377317.png&amp;diff=946"/>
		<updated>2025-06-30T08:27:37Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751198377317&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250629195535720.png&amp;diff=945</id>
		<title>文件:Image-20250629195535720.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250629195535720.png&amp;diff=945"/>
		<updated>2025-06-30T08:27:04Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image-20250629195535720&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751197357322.png&amp;diff=944</id>
		<title>文件:1751197357322.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751197357322.png&amp;diff=944"/>
		<updated>2025-06-30T08:26:30Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751197357322&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751196976753.png&amp;diff=943</id>
		<title>文件:1751196976753.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751196976753.png&amp;diff=943"/>
		<updated>2025-06-30T08:25:56Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751196976753&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751191661158.png&amp;diff=942</id>
		<title>文件:1751191661158.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751191661158.png&amp;diff=942"/>
		<updated>2025-06-30T08:25:19Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751191661158&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751191333111.png&amp;diff=941</id>
		<title>文件:1751191333111.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751191333111.png&amp;diff=941"/>
		<updated>2025-06-30T08:23:36Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751191333111&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751101787310.png&amp;diff=940</id>
		<title>文件:1751101787310.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751101787310.png&amp;diff=940"/>
		<updated>2025-06-30T08:23:03Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751101787310&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751100906863.png&amp;diff=939</id>
		<title>文件:1751100906863.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751100906863.png&amp;diff=939"/>
		<updated>2025-06-30T08:22:25Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751100906863&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751100798306.png&amp;diff=938</id>
		<title>文件:1751100798306.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751100798306.png&amp;diff=938"/>
		<updated>2025-06-30T08:21:53Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751100798306&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751100609693.png&amp;diff=937</id>
		<title>文件:1751100609693.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751100609693.png&amp;diff=937"/>
		<updated>2025-06-30T08:21:19Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751100609693&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250628160443048.png&amp;diff=936</id>
		<title>文件:Image-20250628160443048.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250628160443048.png&amp;diff=936"/>
		<updated>2025-06-30T08:19:53Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image-20250628160443048&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751034226409.png&amp;diff=935</id>
		<title>文件:1751034226409.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751034226409.png&amp;diff=935"/>
		<updated>2025-06-30T08:19:10Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751034226409&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751031978875.png&amp;diff=934</id>
		<title>文件:1751031978875.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751031978875.png&amp;diff=934"/>
		<updated>2025-06-30T08:18:31Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751031978875&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751031602666.png&amp;diff=933</id>
		<title>文件:1751031602666.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751031602666.png&amp;diff=933"/>
		<updated>2025-06-30T08:16:45Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751031602666&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751035019133.png&amp;diff=932</id>
		<title>文件:1751035019133.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751035019133.png&amp;diff=932"/>
		<updated>2025-06-30T08:15:43Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751035019133&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627161652076.png&amp;diff=931</id>
		<title>文件:Image-20250627161652076.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627161652076.png&amp;diff=931"/>
		<updated>2025-06-30T08:14:56Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image-20250627161652076&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627154436498.png&amp;diff=930</id>
		<title>文件:Image-20250627154436498.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627154436498.png&amp;diff=930"/>
		<updated>2025-06-30T08:14:20Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image-20250627154436498&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627154234078.png&amp;diff=929</id>
		<title>文件:Image-20250627154234078.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627154234078.png&amp;diff=929"/>
		<updated>2025-06-30T08:13:34Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image-20250627154234078&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627154009452.png&amp;diff=928</id>
		<title>文件:Image-20250627154009452.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627154009452.png&amp;diff=928"/>
		<updated>2025-06-30T08:13:01Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image-20250627154009452&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627153735146.png&amp;diff=927</id>
		<title>文件:Image-20250627153735146.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627153735146.png&amp;diff=927"/>
		<updated>2025-06-30T08:12:18Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image-20250627153735146&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627152918543.png&amp;diff=926</id>
		<title>文件:Image-20250627152918543.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627152918543.png&amp;diff=926"/>
		<updated>2025-06-30T08:11:40Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image-20250627152918543&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627152134779.png&amp;diff=925</id>
		<title>文件:Image-20250627152134779.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627152134779.png&amp;diff=925"/>
		<updated>2025-06-30T08:10:54Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image-20250627152134779&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627151731326.png&amp;diff=924</id>
		<title>文件:Image-20250627151731326.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627151731326.png&amp;diff=924"/>
		<updated>2025-06-30T08:10:18Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image-20250627151731326&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627150427180.png&amp;diff=923</id>
		<title>文件:Image-20250627150427180.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627150427180.png&amp;diff=923"/>
		<updated>2025-06-30T08:09:34Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image-20250627150427180&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751190069399.png&amp;diff=922</id>
		<title>文件:1751190069399.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:1751190069399.png&amp;diff=922"/>
		<updated>2025-06-30T08:08:43Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1751190069399&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250628155351989.png&amp;diff=921</id>
		<title>文件:Image-20250628155351989.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250628155351989.png&amp;diff=921"/>
		<updated>2025-06-30T08:07:47Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image-20250628155351989&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250628153846834.png&amp;diff=920</id>
		<title>文件:Image-20250628153846834.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250628153846834.png&amp;diff=920"/>
		<updated>2025-06-30T08:07:03Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image-20250628153846834&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627165034978.png&amp;diff=919</id>
		<title>文件:Image-20250627165034978.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627165034978.png&amp;diff=919"/>
		<updated>2025-06-30T08:06:11Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image-20250627165034978&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627111525131.png&amp;diff=918</id>
		<title>文件:Image-20250627111525131.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Image-20250627111525131.png&amp;diff=918"/>
		<updated>2025-06-30T08:04:43Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Image-20250627111525131&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=917</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=917"/>
		<updated>2025-06-30T08:02:23Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​/* 使用手册 */&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;
[[特殊:我的语言/使用手册 - 定位导航|使用手册 - 定位导航]]&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>Bruce</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=905</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=905"/>
		<updated>2025-04-28T06:31:03Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​/* 2.2.2 3D激光雷达 */&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;
'''&amp;lt;big&amp;gt;2025年4月后的版本优化了二向化雷达算法，新项目应使用最新版Detour（或DetourLite）。&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
二向化雷达的目的是在3D点云中搜索垂直结构，比如墙体、树干、机台等，将垂直结构作为特征点，并将其投影到二维点云，使输出到SLAM算法的点云不仅包含空间特征，且计算复杂度与2D激光雷达相当。想象一只聪明的毛毛虫在3D点云中寻找树干。这只毛毛虫有以下特点：&lt;br /&gt;
&lt;br /&gt;
# '''搜索方式''':  对于一个雷达帧包含的3D点云，毛毛虫以水平角度顺序扫描点云（比如，1度±5区间的点云、2度±5度的点云）  每找到一个点,就尝试向上下方向爬行(垂直结构搜索)  爬行时会左右摇摆一点点,以适应略微倾斜的树干(errorThreshold容差)&lt;br /&gt;
&lt;br /&gt;
# '''过程参数''' (毛毛虫的&amp;quot;能力指标&amp;quot;):  &lt;br /&gt;
#* '''minScans = 6''': 毛毛虫至少要爬6步才能确认这是树干（即垂直方向至少有6个点）  &lt;br /&gt;
#* '''minMustScans = 3''': 不管多高的树,至少要有3步才算数  &lt;br /&gt;
#* '''minVStruct = 500mm''': 树干要有500毫米高才算是完整的树（识别出来的垂直结构高度）  &lt;br /&gt;
#* '''minMustVStruct = 70mm''': 但只要有70毫米高就可以作为参考（高于70mm的有可能是垂直结构）  &lt;br /&gt;
#* '''maxVHole = 2000mm''': 树干中间不能有超过2米的空洞（再如，车间外墙有窗，窗高度1.5m，那么窗口上下高度和超过minVStruct也是垂直结构）  &lt;br /&gt;
#* '''perr = 50mm''': 基础摇摆幅度50毫米（激光雷达在运动中必定存在扫描误差）  &lt;br /&gt;
#* '''perrFac = 0.006''': 距离越远,摇摆幅度适当增加（距离雷达越远的测量点晃动幅度越大）&lt;br /&gt;
&lt;br /&gt;
# '''判断参数''' (毛毛虫的&amp;quot;任务要求&amp;quot;):  &lt;br /&gt;
#* '''selZ = [0]''': 垂直结构的高度过滤器，接近下标高度的垂直结构有效。比如，假设雷达安装高度是50cm，本例是0（米），那么底端靠近0米的垂直结构被选用。如果selZ = [0, 1500, 3000]，minVStruct=1000，那么接近0、1.5、3米的垂直结构被选用。所谓接近，指垂直结构的顶端、底端接近，或者垂直结构跨越这个高度。再举一个例子，假设一根立柱附近有一个机台，机台高1.6米，我们希望用立柱作为定位参考，那么selZ = [1800 ]（机台的1600加上误差不可能达到1800）。  &lt;br /&gt;
#* '''selZRange = 50mm''': 高度过滤器的基准误差，默认是50mm。  &lt;br /&gt;
#* '''selZFac = 0.02''': 在selZRange基础上加上的浮动误差，距离越远，这个&amp;quot;附近&amp;quot;范围适当放宽。  &lt;br /&gt;
#* '''selZSig = 0.1''': 满足高度要求的结构，重要性打个0.1折&lt;br /&gt;
&lt;br /&gt;
工作过程:&lt;br /&gt;
&lt;br /&gt;
# 毛毛虫找到一个点后,先试探性地向上下爬行&lt;br /&gt;
# 每爬一步都要确认:新的点是否在容许的摇摆范围内&lt;br /&gt;
# 只要还能找到合适的点就继续爬,直到爬不动为止&lt;br /&gt;
# 最后检查:爬过的高度、步数是否达标,中间有没有大空洞&lt;br /&gt;
# 如果这根&amp;quot;树干&amp;quot;符合要求,就把它记录下来&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;
| 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>Bruce</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=904</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=904"/>
		<updated>2025-04-28T06:29:33Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​/* 2.2.2 3D激光雷达 */&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;
'''&amp;lt;big&amp;gt;2025年4月后的版本优化了二向化雷达算法，新项目应使用最新版Detour（或DetourLite）。&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
二向化雷达的目的是在3D点云中搜索垂直结构，比如墙体、树干、机台等，将垂直结构作为特征点，并将其投影到二维点云，使输出到SLAM算法的点云不仅包含空间特征，且计算复杂度与2D激光雷达相当。想象一只聪明的毛毛虫在3D点云中寻找树干。这只毛毛虫有以下特点：&lt;br /&gt;
&lt;br /&gt;
# '''搜索方式''':  对于一个雷达帧包含的3D点云，毛毛虫以水平角度顺序扫描点云（比如，1度±5区间的点云、2度±5度的点云）  每找到一个点,就尝试向上下方向爬行(垂直结构搜索)  爬行时会左右摇摆一点点,以适应略微倾斜的树干(errorThreshold容差)&lt;br /&gt;
&lt;br /&gt;
# '''过程参数''' (毛毛虫的&amp;quot;能力指标&amp;quot;):  '''minScans = 6''': 毛毛虫至少要爬6步才能确认这是树干（即垂直方向至少有6个点）  '''minMustScans = 3''': 不管多高的树,至少要有3步才算数  '''minVStruct = 500mm''': 树干要有500毫米高才算是完整的树（识别出来的垂直结构高度）  '''minMustVStruct = 70mm''': 但只要有70毫米高就可以作为参考（高于70mm的有可能是垂直结构）  '''maxVHole = 2000mm''': 树干中间不能有超过2米的空洞（再如，车间外墙有窗，窗高度1.5m，那么窗口上下高度和超过minVStruct也是垂直结构）  '''perr = 50mm''': 基础摇摆幅度50毫米（激光雷达在运动中必定存在扫描误差）  '''perrFac = 0.006''': 距离越远,摇摆幅度适当增加（距离雷达越远的测量点晃动幅度越大）&lt;br /&gt;
&lt;br /&gt;
# '''判断参数''' (毛毛虫的&amp;quot;任务要求&amp;quot;):  '''selZ = [0]''': 垂直结构的高度过滤器，接近下标高度的垂直结构有效。比如，假设雷达安装高度是50cm，本例是0（米），那么底端靠近0米的垂直结构被选用。如果selZ = [0, 1500, 3000]，minVStruct=1000，那么接近0、1.5、3米的垂直结构被选用。所谓接近，指垂直结构的顶端、底端接近，或者垂直结构跨越这个高度。再举一个例子，假设一根立柱附近有一个机台，机台高1.6米，我们希望用立柱作为定位参考，那么selZ = [1800 ]（机台的1600加上误差不可能达到1800）。  '''selZRange = 50mm''': 高度过滤器的基准误差，默认是50mm。  '''selZFac = 0.02''': 在selZRange基础上加上的浮动误差，距离越远，这个&amp;quot;附近&amp;quot;范围适当放宽。  '''selZSig = 0.1''': 满足高度要求的结构，重要性打个0.1折&lt;br /&gt;
&lt;br /&gt;
工作过程:&lt;br /&gt;
&lt;br /&gt;
# 毛毛虫找到一个点后,先试探性地向上下爬行&lt;br /&gt;
# 每爬一步都要确认:新的点是否在容许的摇摆范围内&lt;br /&gt;
# 只要还能找到合适的点就继续爬,直到爬不动为止&lt;br /&gt;
# 最后检查:爬过的高度、步数是否达标,中间有没有大空洞&lt;br /&gt;
# 如果这根&amp;quot;树干&amp;quot;符合要求,就把它记录下来&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;
| 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>Bruce</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%A0%87%E5%AE%9A%E5%8F%8C%E6%BF%80%E5%85%89%E9%9B%B7%E8%BE%BE%E5%A4%96%E5%8F%82&amp;diff=895</id>
		<title>标定双激光雷达外参</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%A0%87%E5%AE%9A%E5%8F%8C%E6%BF%80%E5%85%89%E9%9B%B7%E8%BE%BE%E5%A4%96%E5%8F%82&amp;diff=895"/>
		<updated>2025-03-30T08:17:19Z</updated>

		<summary type="html">&lt;p&gt;Bruce：​/* 3.1 第二个雷达外参标定 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= 一、前言 =&lt;br /&gt;
&lt;br /&gt;
== 1.1 目的 ==&lt;br /&gt;
双激光雷达标定的目的在于确保两台激光雷达在AGV/AMR上的集成能够协同工作，提供一致和准确的环境感知数据。具体来说，标定目的是：&lt;br /&gt;
&lt;br /&gt;
# '''坐标系统对齐'''：确保两台激光雷达的坐标系统对齐，使得它们能够提供一致的空间参照，便于后续的数据处理和环境理解。&lt;br /&gt;
# '''数据融合'''：通过标定，实现两台雷达数据的有效融合，增强机器人对环境的感知能力，提供更全面的视角。&lt;br /&gt;
# '''精确定位'''：提高AMR的定位精度，通过两个雷达的点云数据相互校验，减少单一激光雷达视野不良时可能产生的误差。&lt;br /&gt;
&lt;br /&gt;
== 1.2 范围 ==&lt;br /&gt;
本标定方法专为已经完成单激光雷达标定的AMR/AGV系统设计，用于对系统中的第二个激光雷达进行外参标定。 &lt;br /&gt;
&lt;br /&gt;
标定过程基于第一个激光雷达的已知外参，通过精确调整第二个雷达的外参，实现两个雷达点云数据的精确融合。 &lt;br /&gt;
&lt;br /&gt;
= 二、标定前的准备工作 =&lt;br /&gt;
&lt;br /&gt;
== 2.1 标定环境 ==&lt;br /&gt;
[[文件:双激光雷达标定.png|无框|519x519像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 2-1 双激光雷达标定环境与目的'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
把AGV/AMR开到墙角，使两个激光雷达能够看到墙角轮廓（有共同视野）。图2-1中绿色圆圈是车头雷达，已标定（方法参见【激光外参标定】），因此它的逻辑位置在运动中心（黄色圆圈），在Detour上可见车头雷达观测到的墙角轮廓（图中黄色线段）。&lt;br /&gt;
&lt;br /&gt;
车尾雷达由于未标定，因此它看到的墙角轮廓（图中红色线段）不会和车头雷达点云重合，因此要调整其外参，使两个雷达点云重叠一处。&lt;br /&gt;
&lt;br /&gt;
标定环境应选择墙角（有相互垂直的墙体轮廓）以便对齐点云。墙体长度应大于3米。&lt;br /&gt;
&lt;br /&gt;
== 2.2 设备检查 ==&lt;br /&gt;
双雷达标定一般在车头激光雷达外参标定后执行。&lt;br /&gt;
&lt;br /&gt;
如果第二个雷达是后装，或与第一个雷达标定时间较晚，则应对差速底盘（KIVA）和单线激光雷达进行彻底检查：&lt;br /&gt;
&lt;br /&gt;
* 机械检查：确保所有机械部件正确安装，无松动或损坏。&lt;br /&gt;
* 电气检查：检查所有电气连接是否牢固，无短路或断路现象。移除激光雷达表面的保护膜，利旧激光雷达表面不能有污损或裂缝。&lt;br /&gt;
* 软件检查：确认 Detour 版本为生产版本，授权正确。&lt;br /&gt;
* 外参检查：第一个雷达标定参数正确。&lt;br /&gt;
&lt;br /&gt;
== 2.3 人员培训 ==&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;
== 3.1 第二个雷达外参标定 ==&lt;br /&gt;
根据（图2-1）所示原理，通过调整第二个雷达外参（图3-1），使其点云与第一个雷达点云重合。&lt;br /&gt;
&lt;br /&gt;
由于双雷达要求对称安装，因此第二个雷达的外参与第一个雷达是对称关系，填入（图3-1）后观察其点云，应该在第一个雷达点云附近。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:修改激光雷达外参.png|无框|630x630像素]]&lt;br /&gt;
&lt;br /&gt;
'''图3-1 修改雷达外参'''&amp;lt;blockquote&amp;gt;注意：我们选择墙角作为标定环境，是因为它能够提供干净稳定的环境轮廓。一般而言，有直角轮廓，且没有移动物体和零碎货物的环境都适合标定。良好的标定环境，有利于下一步的自动配准功能。&amp;lt;/blockquote&amp;gt;判定两个雷达点云较近时，在“车体布局编辑器”界面中，选择第二个激光雷达，使用其动作的&amp;quot;相对另一雷达配准&amp;quot;功能。Detour会自动配准点云，并更新第二个雷达的外参。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:相对另一雷达配平.png|无框|640x640像素]]&lt;br /&gt;
&lt;br /&gt;
'''图3-2 相对另一雷达配准'''&amp;lt;blockquote&amp;gt;双激光雷达工作原理：双雷达点云拼接为一个点云。双激光雷达能够有效提高激光视野，当一个雷达视野受限（或环境轮廓不良）时，只要另一个雷达观测到稳定轮廓，就能继续定位。双雷达点云拼接要求两个雷达的安装高度和水平面角度一致。&amp;lt;/blockquote&amp;gt;由于“相对于另一雷达配准”是基于点云配准，当两个雷达点云差异较大时（比如，配准环境不是较干净的墙角，两个雷达观测的环境轮廓差异较大），配准可能失败，因此在操作后，应对比配准雷达的xyth值是否有变化。如果值没有变化，看detour的控制台输出，此时应该有点云注册失败的日志提示。&lt;br /&gt;
&lt;br /&gt;
点云配准分数阈值在detour.json是&amp;quot;guru / Lidar2DAggregateRegistrationThres&amp;quot;，默认值0.3。如果日志输出的配准分数低于阈值，甚至低于0.2，说明环境不适合做自动配准，可使用手动调整方法：&lt;br /&gt;
&lt;br /&gt;
# 在车体编辑器选择待配准的雷达（假设是backlidar），使用“移动”“旋转”菜单来移动或旋转雷达（按下鼠标左键，移动后松开，鼠标移动代表旋转或移动的距离）；或者修改xyth值进行微调。&lt;br /&gt;
# 改变雷达外参后，分辨观察前后雷达点云，看拼接点云是否重合。如果有偏差，则重复第1步。&lt;br /&gt;
&lt;br /&gt;
第二个雷达外参调整完毕后，保存配置文件。&amp;lt;blockquote&amp;gt;注意：如果使用Detour.exe作为客户端来，在&amp;quot;相对另一个雷达&amp;quot;配准后，第二个雷达的外参不会同步到DetourLite的配置文件。请在Detour.exe上分别打开xyth的字段值，然后点击&amp;quot;确定&amp;quot;按钮。我们将在下一版DetourLite优化车体组件操作后的数据同步功能。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3.3 拼接两个激光雷达 ==&lt;br /&gt;
在前后激光雷达标定完毕后，在车体布局编辑器中添加一个“同步多2D雷达拼接”类型的雷达，放在车体中心，命名为&amp;quot;midlidar&amp;quot;，如图3-3所示。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611123123399.png|无框|800x800像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-3 拼接前后激光雷达'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;midlidar&amp;quot;的names字段值为&amp;quot;frontlidar,backlidar&amp;quot;，表示它引用前后雷达数据并实行拼接。&lt;br /&gt;
&lt;br /&gt;
关闭车体布局编辑器，回到主界面，选择“里程计”标签，把“2D激光”引用的雷达改为“midlidar”，如图3-4所示。&lt;br /&gt;
&lt;br /&gt;
[[文件:Image-20240611123346647.png|无框|807x807像素]]&lt;br /&gt;
&lt;br /&gt;
'''图 3-4 使用midlidar作为激光里程计数据源'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
确认“2D激光”里程计状态为“已启动”，就可以使用了。&amp;lt;blockquote&amp;gt;提示：配置完毕后记得保存配置（主界面菜单的&amp;quot;导航配置 / 保存&amp;quot;，配置文件名为detour.json）。&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bruce</name></author>
	</entry>
</feed>