<?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=Huangzhaowei</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=Huangzhaowei"/>
	<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/Huangzhaowei"/>
	<updated>2026-04-15T17:22:55Z</updated>
	<subtitle>用户贡献</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=Detour-API&amp;diff=903</id>
		<title>Detour-API</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=Detour-API&amp;diff=903"/>
		<updated>2025-04-17T13:35:26Z</updated>

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

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

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

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

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

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

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

		<summary type="html">&lt;p&gt;Huangzhaowei：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;11&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=Detour-API&amp;diff=805</id>
		<title>Detour-API</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=Detour-API&amp;diff=805"/>
		<updated>2024-07-20T03:10:47Z</updated>

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

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

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

		<summary type="html">&lt;p&gt;Huangzhaowei：​/* 开启或关闭图优化 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Detour''' ==&lt;br /&gt;
Detour使用HTTP方法提供API。以下为主要API的清单：&lt;br /&gt;
&lt;br /&gt;
=== '''里程计暂停运行''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/pause'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求（案例）：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/pause&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{&amp;quot;success&amp;quot;:true,&amp;quot;id&amp;quot;:0}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''里程计恢复运行''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/resume'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求（案例）：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/resume&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{&amp;quot;success&amp;quot;:true,&amp;quot;id&amp;quot;:0}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 执行Detour内部命令 ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/call'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
参数：cmd，指令。类似于odometry_0.pause()。[主语].([参数列表...]) &lt;br /&gt;
&lt;br /&gt;
'''请求（案例）：'''http://127.0.0.1:4321/call?cmd=odometry_0.pause() 这表示调用odometry_0的pause方法（暂停指定里程计）。具体各个组件有哪些方法参考《[[Detour组件参考手册]]》&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{&amp;quot;result&amp;quot;:&amp;quot;void&amp;quot;}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''获取当前车体在世界坐标系下的位姿''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/getPos'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/getPos&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;byte[] 下载成文件保存到本地&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 切换是否进行地图匹配 ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/switchPosMatch'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：'''&lt;br /&gt;
&lt;br /&gt;
'''disabled：bool，是否关闭地图匹配'''&lt;br /&gt;
&lt;br /&gt;
'''name：string，指定地图名称。不指定该参数则对所有图层生'''&lt;br /&gt;
&lt;br /&gt;
'''请求（案例）：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/switchPosMatch&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{&amp;quot;performed&amp;quot;:true}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''使远端算法核将某指定图层当前的建图结果保存至文件''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/setLocation'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：''' &lt;br /&gt;
&lt;br /&gt;
x：float，x 坐标值&lt;br /&gt;
&lt;br /&gt;
y：float，y 坐标值&lt;br /&gt;
&lt;br /&gt;
th：float：角度值 &lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/setLocation?x=1&amp;amp;y=2&amp;amp;th=3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{&amp;quot;x&amp;quot;:1.0,&amp;quot;y&amp;quot;:2.0,&amp;quot;th&amp;quot;:3.0,&amp;quot;l_step&amp;quot;:9999,&amp;quot;tick&amp;quot;:63832366282729,&amp;quot;error&amp;quot;:&amp;quot;Timeout&amp;quot;}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''获取程序运行状态，包括里程计状态、地图状态等''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/getStat'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/getStat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{&amp;quot;layoutStat&amp;quot;:{&amp;quot;w1&amp;quot;:{},&amp;quot;w2&amp;quot;:{},&amp;quot;frontlidar&amp;quot;:{}},&amp;quot;odoStat&amp;quot;:{},&amp;quot;posStat&amp;quot;:{},&amp;quot;TCStat&amp;quot;:{&amp;quot;fitmethod&amp;quot;:0,&amp;quot;fitsource&amp;quot;:&amp;quot;/&amp;quot;,&amp;quot;poseEstim&amp;quot;:&amp;quot;/&amp;quot;,&amp;quot;TCVar&amp;quot;:0.0},&amp;quot;GOStat&amp;quot;:{&amp;quot;maxTension&amp;quot;:0.0,&amp;quot;edgeN&amp;quot;:0},&amp;quot;licence&amp;quot;:&amp;quot;DID:40B38B8C111BD4EC&amp;quot;,&amp;quot;globalStat&amp;quot;:{&amp;quot;paused&amp;quot;:false,&amp;quot;IsSettingPosition&amp;quot;:false}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''设置激光雷达的无效范围，在一系列点构成的闭包范围内的激光点将被忽略，这些点的坐标为车体坐标系下的值''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/setLidar2DOdometryMask'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''POST'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：'''&lt;br /&gt;
&lt;br /&gt;
'''odometry：string，所设置的里程计名称字符串。'''&lt;br /&gt;
&lt;br /&gt;
'''Body：'''&lt;br /&gt;
&lt;br /&gt;
'''一串 XY 坐标点构成的 json 字符串'''&lt;br /&gt;
&lt;br /&gt;
'''请求（案例）：'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/setLidar2DOdometryMask?odometry=odometry_1&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[{&amp;quot;X&amp;quot;:123,&amp;quot;Y&amp;quot;:456},{&amp;quot;X&amp;quot;:123,&amp;quot;Y&amp;quot;:456},{&amp;quot;X&amp;quot;:123,&amp;quot;Y&amp;quot;:456}]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;设置成功：{success: true}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;设置失败：{error=”No odometry named {指定里程计名称}”}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''将程序设置为debug模式运行，将输出debug日志文件''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/debug'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/debug&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{&amp;quot;success&amp;quot;:true&amp;quot;}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''获取程序的配置参数''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/getConf'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/getConf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{&amp;quot;license&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;initX&amp;quot;:0.0,&amp;quot;initY&amp;quot;:0.0,&amp;quot;initTh&amp;quot;:0.0,&amp;quot;recordLastPos&amp;quot;:false,&amp;quot;layout&amp;quot;:{&amp;quot;chassis&amp;quot;:{&amp;quot;width&amp;quot;:1200.0,&amp;quot;length&amp;quot;:2000.0,&amp;quot;contour&amp;quot;:[-445.0,330.0,445.0,330.0,445.0,-330.0,-445.0,-330.0]},&amp;quot;components&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;wheel,component,haveposition&amp;quot;,&amp;quot;options&amp;quot;:{&amp;quot;platform&amp;quot;:0,&amp;quot;scale&amp;quot;:1.0,&amp;quot;radius&amp;quot;:200.0,&amp;quot;id&amp;quot;:1,&amp;quot;name&amp;quot;:&amp;quot;w1&amp;quot;,&amp;quot;noMove&amp;quot;:false,&amp;quot;time_bias_ms&amp;quot;:0,&amp;quot;x&amp;quot;:0.0,&amp;quot;y&amp;quot;:300.0,&amp;quot;th&amp;quot;:0.0,&amp;quot;z&amp;quot;:0.0,&amp;quot;alt&amp;quot;:0.0,&amp;quot;roll&amp;quot;:0.0}},{&amp;quot;type&amp;quot;:&amp;quot;wheel,component,haveposition&amp;quot;,&amp;quot;options&amp;quot;:{&amp;quot;platform&amp;quot;:6,&amp;quot;scale&amp;quot;:1.0,&amp;quot;radius&amp;quot;:200.0,&amp;quot;id&amp;quot;:2,&amp;quot;name&amp;quot;:&amp;quot;w2&amp;quot;,&amp;quot;noMove&amp;quot;:false,&amp;quot;time_bias_ms&amp;quot;:0,&amp;quot;x&amp;quot;:0.0,&amp;quot;y&amp;quot;:-300.0,&amp;quot;th&amp;quot;:0.0,&amp;quot;z&amp;quot;:0.0,&amp;quot;alt&amp;quot;:0.0,&amp;quot;roll&amp;quot;:0.0}},{&amp;quot;type&amp;quot;:&amp;quot;lidar2d,component,haveposition&amp;quot;,&amp;quot;options&amp;quot;:{&amp;quot;derr&amp;quot;:20.0,&amp;quot;kerr&amp;quot;:0.0,&amp;quot;isCircle&amp;quot;:false,&amp;quot;angleSgn&amp;quot;:1.0,&amp;quot;endAngle&amp;quot;:0.0,&amp;quot;rangeStartAngle&amp;quot;:-180.0,&amp;quot;rangeEndAngle&amp;quot;:180.0,&amp;quot;afterImageFilterOutN&amp;quot;:7,&amp;quot;afterImageFilterOutDeg&amp;quot;:2.0,&amp;quot;ignoreDist&amp;quot;:100.0,&amp;quot;maxDist&amp;quot;:200000.0,&amp;quot;correctionType&amp;quot;:&amp;quot;angle&amp;quot;,&amp;quot;dazzleWindow&amp;quot;:5,&amp;quot;dazzleDist&amp;quot;:80,&amp;quot;useNormalization&amp;quot;:true,&amp;quot;useGridSelection&amp;quot;:true,&amp;quot;gridSelSz&amp;quot;:20.0,&amp;quot;useChassisFilter&amp;quot;:true,&amp;quot;maxpoint&amp;quot;:640,&amp;quot;useBilateralFilter&amp;quot;:true,&amp;quot;useReflex&amp;quot;:false,&amp;quot;removeReflex&amp;quot;:false,&amp;quot;removeReflexDist&amp;quot;:300.0,&amp;quot;minpointsN&amp;quot;:20.0,&amp;quot;reflexThres&amp;quot;:0.4,&amp;quot;reflexDiffThres&amp;quot;:0.3,&amp;quot;reflexChunkThres&amp;quot;:2.5,&amp;quot;reflexMutePadding&amp;quot;:7,&amp;quot;reflexSize&amp;quot;:100,&amp;quot;reflexDistRange&amp;quot;:150.0,&amp;quot;invalidAngArrLen&amp;quot;:128,&amp;quot;stepDebug&amp;quot;:false,&amp;quot;id&amp;quot;:1101520006,&amp;quot;name&amp;quot;:&amp;quot;frontlidar&amp;quot;,&amp;quot;noMove&amp;quot;:false,&amp;quot;time_bias_ms&amp;quot;:0,&amp;quot;x&amp;quot;:350.0,&amp;quot;y&amp;quot;:0.0,&amp;quot;th&amp;quot;:0.0,&amp;quot;z&amp;quot;:0.0,&amp;quot;alt&amp;quot;:0.0,&amp;quot;roll&amp;quot;:0.0}}]},&amp;quot;odometries&amp;quot;:[],&amp;quot;positioning&amp;quot;:[],&amp;quot;autoStart&amp;quot;:false,&amp;quot;debug&amp;quot;:true,&amp;quot;useGPU&amp;quot;:true,&amp;quot;TCtimeWndSz&amp;quot;:150,&amp;quot;TCtimeWndLimit&amp;quot;:700,&amp;quot;useTC&amp;quot;:false,&amp;quot;guru&amp;quot;:{&amp;quot;SpatialIndex2StageCache&amp;quot;:4194304,&amp;quot;SpatialIndex1StageCache&amp;quot;:1048576,&amp;quot;ICPFastIterFac&amp;quot;:0.8,&amp;quot;ICPUseFastMode&amp;quot;:false,&amp;quot;ICP2DMaxIter&amp;quot;:16,&amp;quot;RippleEnableEqualize&amp;quot;:true,&amp;quot;Lidar2dMapMaxIter&amp;quot;:50,&amp;quot;TCAddIterations&amp;quot;:50,&amp;quot;phaseLockLvl&amp;quot;:3,&amp;quot;rotMapProjectionLength&amp;quot;:500.0,&amp;quot;gicp_p2pfac&amp;quot;:0.02,&amp;quot;extractPlaneThresE&amp;quot;:700.0,&amp;quot;lo3dlineWeightScale&amp;quot;:0.3,&amp;quot;inputScale&amp;quot;:1.0,&amp;quot;Lidar2DRippleDistDecay&amp;quot;:15000.0,&amp;quot;Lidar2DRippleScale&amp;quot;:1.0,&amp;quot;SI2DRectSmall&amp;quot;:130,&amp;quot;SI2DRectBig&amp;quot;:600,&amp;quot;TCVarMax&amp;quot;:1600.0,&amp;quot;TCMaxBadEdges&amp;quot;:3,&amp;quot;TCKalmanUseCurrentFac&amp;quot;:0.2,&amp;quot;debugReg2D&amp;quot;:true,&amp;quot;ICP2ddebugSource&amp;quot;:-1,&amp;quot;ICP2dReflexWeight&amp;quot;:3.0,&amp;quot;ICP2dReflexWeightTranslateFac&amp;quot;:3.0,&amp;quot;TCInterconnectType&amp;quot;:0,&amp;quot;TCAutoCaliberation&amp;quot;:false,&amp;quot;dumpCriticalData&amp;quot;:true},&amp;quot;recordPosInterval&amp;quot;:500,&amp;quot;preventErrorLocation&amp;quot;:true,&amp;quot;minimized&amp;quot;:false}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 进行一次全局匹配 ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/relocalize'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/relocalize&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{performed: true}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''使远端算法核加载远端已保存的某个地图''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/loadMap'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：''' &lt;br /&gt;
&lt;br /&gt;
name：string，指定的图层名称，默认为 mainmap&lt;br /&gt;
&lt;br /&gt;
fn：string，指定加载的地图文件名称，默认为 mainmap.2dlm&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/loadMap?name=mainmap&amp;amp;fn=&amp;lt;/nowiki&amp;gt; mainmap.2dlm&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{performed: true}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''使远端算法核将某指定图层当前的建图结果保存至文件''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/saveMap'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：''' &lt;br /&gt;
&lt;br /&gt;
name：string，指定的图层名称，默认为 mainmap&lt;br /&gt;
&lt;br /&gt;
fn：string，指定加载的地图文件名称，默认为 mainmap.2dlm&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/saveMap?name=mainmap&amp;amp;fn=&amp;lt;/nowiki&amp;gt; mainmap.2dlm&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{performed: true}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 以PNG格式返回激光地图 ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/getMapPng?width=800&amp;amp;height=600&amp;amp;centerX=0&amp;amp;centerY=0&amp;amp;scale=0.01'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：''' &lt;br /&gt;
&lt;br /&gt;
width：int，PNG宽度&lt;br /&gt;
&lt;br /&gt;
height：int，PNG高度&lt;br /&gt;
&lt;br /&gt;
centerX &amp;amp; centerY：int，地图中心坐标&lt;br /&gt;
&lt;br /&gt;
scale：float，地图缩放比例&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/getMapPng?width=800&amp;amp;height=600&amp;amp;centerX=0&amp;amp;centerY=0&amp;amp;scale=0.01&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：PNG字节流'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 开启或关闭图优化 ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/set?path=graphoptimizer.Use&amp;amp;val=false'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：''' &lt;br /&gt;
&lt;br /&gt;
'''val'''：bool，开启、关闭&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/set?path=graphoptimizer.Use&amp;amp;val=false&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 获取frame_distance内是否有关键帧 ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/call?cmd=mainmap.haveneighborframes()'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：无'''&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/call?cmd=mainmap.haveneighborframes()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：&amp;lt;code&amp;gt;{&amp;quot;result&amp;quot;:false}&amp;lt;/code&amp;gt;'''&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=Detour-API&amp;diff=543</id>
		<title>Detour-API</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=Detour-API&amp;diff=543"/>
		<updated>2024-04-11T08:41:08Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Detour''' ==&lt;br /&gt;
Detour使用HTTP方法提供API。以下为主要API的清单：&lt;br /&gt;
&lt;br /&gt;
=== '''里程计暂停运行''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/pause'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求（案例）：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/pause&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{&amp;quot;success&amp;quot;:true,&amp;quot;id&amp;quot;:0}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''里程计恢复运行''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/resume'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求（案例）：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/resume&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{&amp;quot;success&amp;quot;:true,&amp;quot;id&amp;quot;:0}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 执行Detour内部命令 ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/call'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
参数：cmd，指令。类似于odometry_0.pause()。[主语].([参数列表...]) &lt;br /&gt;
&lt;br /&gt;
'''请求（案例）：'''http://127.0.0.1:4321/call?cmd=odometry_0.pause() 这表示调用odometry_0的pause方法（暂停指定里程计）。具体各个组件有哪些方法参考《[[Detour组件参考手册]]》&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{&amp;quot;result&amp;quot;:&amp;quot;void&amp;quot;}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''获取当前车体在世界坐标系下的位姿''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/getPos'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/getPos&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;byte[] 下载成文件保存到本地&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 切换是否进行地图匹配 ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/switchPosMatch'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：'''&lt;br /&gt;
&lt;br /&gt;
'''disabled：bool，是否关闭地图匹配'''&lt;br /&gt;
&lt;br /&gt;
'''name：string，指定地图名称。不指定该参数则对所有图层生'''&lt;br /&gt;
&lt;br /&gt;
'''请求（案例）：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/switchPosMatch&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{&amp;quot;performed&amp;quot;:true}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''使远端算法核将某指定图层当前的建图结果保存至文件''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/setLocation'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：''' &lt;br /&gt;
&lt;br /&gt;
x：float，x 坐标值&lt;br /&gt;
&lt;br /&gt;
y：float，y 坐标值&lt;br /&gt;
&lt;br /&gt;
th：float：角度值 &lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/setLocation?x=1&amp;amp;y=2&amp;amp;th=3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{&amp;quot;x&amp;quot;:1.0,&amp;quot;y&amp;quot;:2.0,&amp;quot;th&amp;quot;:3.0,&amp;quot;l_step&amp;quot;:9999,&amp;quot;tick&amp;quot;:63832366282729,&amp;quot;error&amp;quot;:&amp;quot;Timeout&amp;quot;}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''获取程序运行状态，包括里程计状态、地图状态等''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/getStat'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/getStat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{&amp;quot;layoutStat&amp;quot;:{&amp;quot;w1&amp;quot;:{},&amp;quot;w2&amp;quot;:{},&amp;quot;frontlidar&amp;quot;:{}},&amp;quot;odoStat&amp;quot;:{},&amp;quot;posStat&amp;quot;:{},&amp;quot;TCStat&amp;quot;:{&amp;quot;fitmethod&amp;quot;:0,&amp;quot;fitsource&amp;quot;:&amp;quot;/&amp;quot;,&amp;quot;poseEstim&amp;quot;:&amp;quot;/&amp;quot;,&amp;quot;TCVar&amp;quot;:0.0},&amp;quot;GOStat&amp;quot;:{&amp;quot;maxTension&amp;quot;:0.0,&amp;quot;edgeN&amp;quot;:0},&amp;quot;licence&amp;quot;:&amp;quot;DID:40B38B8C111BD4EC&amp;quot;,&amp;quot;globalStat&amp;quot;:{&amp;quot;paused&amp;quot;:false,&amp;quot;IsSettingPosition&amp;quot;:false}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''设置激光雷达的无效范围，在一系列点构成的闭包范围内的激光点将被忽略，这些点的坐标为车体坐标系下的值''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/setLidar2DOdometryMask'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''POST'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：'''&lt;br /&gt;
&lt;br /&gt;
'''odometry：string，所设置的里程计名称字符串。'''&lt;br /&gt;
&lt;br /&gt;
'''Body：'''&lt;br /&gt;
&lt;br /&gt;
'''一串 XY 坐标点构成的 json 字符串'''&lt;br /&gt;
&lt;br /&gt;
'''请求（案例）：'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/setLidar2DOdometryMask?odometry=odometry_1&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[{&amp;quot;X&amp;quot;:123,&amp;quot;Y&amp;quot;:456},{&amp;quot;X&amp;quot;:123,&amp;quot;Y&amp;quot;:456},{&amp;quot;X&amp;quot;:123,&amp;quot;Y&amp;quot;:456}]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;设置成功：{success: true}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;设置失败：{error=”No odometry named {指定里程计名称}”}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''将程序设置为debug模式运行，将输出debug日志文件''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/debug'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/debug&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{&amp;quot;success&amp;quot;:true&amp;quot;}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''获取程序的配置参数''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/getConf'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/getConf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{&amp;quot;license&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;initX&amp;quot;:0.0,&amp;quot;initY&amp;quot;:0.0,&amp;quot;initTh&amp;quot;:0.0,&amp;quot;recordLastPos&amp;quot;:false,&amp;quot;layout&amp;quot;:{&amp;quot;chassis&amp;quot;:{&amp;quot;width&amp;quot;:1200.0,&amp;quot;length&amp;quot;:2000.0,&amp;quot;contour&amp;quot;:[-445.0,330.0,445.0,330.0,445.0,-330.0,-445.0,-330.0]},&amp;quot;components&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;wheel,component,haveposition&amp;quot;,&amp;quot;options&amp;quot;:{&amp;quot;platform&amp;quot;:0,&amp;quot;scale&amp;quot;:1.0,&amp;quot;radius&amp;quot;:200.0,&amp;quot;id&amp;quot;:1,&amp;quot;name&amp;quot;:&amp;quot;w1&amp;quot;,&amp;quot;noMove&amp;quot;:false,&amp;quot;time_bias_ms&amp;quot;:0,&amp;quot;x&amp;quot;:0.0,&amp;quot;y&amp;quot;:300.0,&amp;quot;th&amp;quot;:0.0,&amp;quot;z&amp;quot;:0.0,&amp;quot;alt&amp;quot;:0.0,&amp;quot;roll&amp;quot;:0.0}},{&amp;quot;type&amp;quot;:&amp;quot;wheel,component,haveposition&amp;quot;,&amp;quot;options&amp;quot;:{&amp;quot;platform&amp;quot;:6,&amp;quot;scale&amp;quot;:1.0,&amp;quot;radius&amp;quot;:200.0,&amp;quot;id&amp;quot;:2,&amp;quot;name&amp;quot;:&amp;quot;w2&amp;quot;,&amp;quot;noMove&amp;quot;:false,&amp;quot;time_bias_ms&amp;quot;:0,&amp;quot;x&amp;quot;:0.0,&amp;quot;y&amp;quot;:-300.0,&amp;quot;th&amp;quot;:0.0,&amp;quot;z&amp;quot;:0.0,&amp;quot;alt&amp;quot;:0.0,&amp;quot;roll&amp;quot;:0.0}},{&amp;quot;type&amp;quot;:&amp;quot;lidar2d,component,haveposition&amp;quot;,&amp;quot;options&amp;quot;:{&amp;quot;derr&amp;quot;:20.0,&amp;quot;kerr&amp;quot;:0.0,&amp;quot;isCircle&amp;quot;:false,&amp;quot;angleSgn&amp;quot;:1.0,&amp;quot;endAngle&amp;quot;:0.0,&amp;quot;rangeStartAngle&amp;quot;:-180.0,&amp;quot;rangeEndAngle&amp;quot;:180.0,&amp;quot;afterImageFilterOutN&amp;quot;:7,&amp;quot;afterImageFilterOutDeg&amp;quot;:2.0,&amp;quot;ignoreDist&amp;quot;:100.0,&amp;quot;maxDist&amp;quot;:200000.0,&amp;quot;correctionType&amp;quot;:&amp;quot;angle&amp;quot;,&amp;quot;dazzleWindow&amp;quot;:5,&amp;quot;dazzleDist&amp;quot;:80,&amp;quot;useNormalization&amp;quot;:true,&amp;quot;useGridSelection&amp;quot;:true,&amp;quot;gridSelSz&amp;quot;:20.0,&amp;quot;useChassisFilter&amp;quot;:true,&amp;quot;maxpoint&amp;quot;:640,&amp;quot;useBilateralFilter&amp;quot;:true,&amp;quot;useReflex&amp;quot;:false,&amp;quot;removeReflex&amp;quot;:false,&amp;quot;removeReflexDist&amp;quot;:300.0,&amp;quot;minpointsN&amp;quot;:20.0,&amp;quot;reflexThres&amp;quot;:0.4,&amp;quot;reflexDiffThres&amp;quot;:0.3,&amp;quot;reflexChunkThres&amp;quot;:2.5,&amp;quot;reflexMutePadding&amp;quot;:7,&amp;quot;reflexSize&amp;quot;:100,&amp;quot;reflexDistRange&amp;quot;:150.0,&amp;quot;invalidAngArrLen&amp;quot;:128,&amp;quot;stepDebug&amp;quot;:false,&amp;quot;id&amp;quot;:1101520006,&amp;quot;name&amp;quot;:&amp;quot;frontlidar&amp;quot;,&amp;quot;noMove&amp;quot;:false,&amp;quot;time_bias_ms&amp;quot;:0,&amp;quot;x&amp;quot;:350.0,&amp;quot;y&amp;quot;:0.0,&amp;quot;th&amp;quot;:0.0,&amp;quot;z&amp;quot;:0.0,&amp;quot;alt&amp;quot;:0.0,&amp;quot;roll&amp;quot;:0.0}}]},&amp;quot;odometries&amp;quot;:[],&amp;quot;positioning&amp;quot;:[],&amp;quot;autoStart&amp;quot;:false,&amp;quot;debug&amp;quot;:true,&amp;quot;useGPU&amp;quot;:true,&amp;quot;TCtimeWndSz&amp;quot;:150,&amp;quot;TCtimeWndLimit&amp;quot;:700,&amp;quot;useTC&amp;quot;:false,&amp;quot;guru&amp;quot;:{&amp;quot;SpatialIndex2StageCache&amp;quot;:4194304,&amp;quot;SpatialIndex1StageCache&amp;quot;:1048576,&amp;quot;ICPFastIterFac&amp;quot;:0.8,&amp;quot;ICPUseFastMode&amp;quot;:false,&amp;quot;ICP2DMaxIter&amp;quot;:16,&amp;quot;RippleEnableEqualize&amp;quot;:true,&amp;quot;Lidar2dMapMaxIter&amp;quot;:50,&amp;quot;TCAddIterations&amp;quot;:50,&amp;quot;phaseLockLvl&amp;quot;:3,&amp;quot;rotMapProjectionLength&amp;quot;:500.0,&amp;quot;gicp_p2pfac&amp;quot;:0.02,&amp;quot;extractPlaneThresE&amp;quot;:700.0,&amp;quot;lo3dlineWeightScale&amp;quot;:0.3,&amp;quot;inputScale&amp;quot;:1.0,&amp;quot;Lidar2DRippleDistDecay&amp;quot;:15000.0,&amp;quot;Lidar2DRippleScale&amp;quot;:1.0,&amp;quot;SI2DRectSmall&amp;quot;:130,&amp;quot;SI2DRectBig&amp;quot;:600,&amp;quot;TCVarMax&amp;quot;:1600.0,&amp;quot;TCMaxBadEdges&amp;quot;:3,&amp;quot;TCKalmanUseCurrentFac&amp;quot;:0.2,&amp;quot;debugReg2D&amp;quot;:true,&amp;quot;ICP2ddebugSource&amp;quot;:-1,&amp;quot;ICP2dReflexWeight&amp;quot;:3.0,&amp;quot;ICP2dReflexWeightTranslateFac&amp;quot;:3.0,&amp;quot;TCInterconnectType&amp;quot;:0,&amp;quot;TCAutoCaliberation&amp;quot;:false,&amp;quot;dumpCriticalData&amp;quot;:true},&amp;quot;recordPosInterval&amp;quot;:500,&amp;quot;preventErrorLocation&amp;quot;:true,&amp;quot;minimized&amp;quot;:false}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 进行一次全局匹配 ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/relocalize'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/relocalize&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{performed: true}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''使远端算法核加载远端已保存的某个地图''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/loadMap'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：''' &lt;br /&gt;
&lt;br /&gt;
name：string，指定的图层名称，默认为 mainmap&lt;br /&gt;
&lt;br /&gt;
fn：string，指定加载的地图文件名称，默认为 mainmap.2dlm&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/loadMap?name=mainmap&amp;amp;fn=&amp;lt;/nowiki&amp;gt; mainmap.2dlm&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{performed: true}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''使远端算法核将某指定图层当前的建图结果保存至文件''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/saveMap'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：''' &lt;br /&gt;
&lt;br /&gt;
name：string，指定的图层名称，默认为 mainmap&lt;br /&gt;
&lt;br /&gt;
fn：string，指定加载的地图文件名称，默认为 mainmap.2dlm&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/saveMap?name=mainmap&amp;amp;fn=&amp;lt;/nowiki&amp;gt; mainmap.2dlm&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{performed: true}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 以PNG格式返回激光地图 ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/getMapPng?width=800&amp;amp;height=600&amp;amp;centerX=0&amp;amp;centerY=0&amp;amp;scale=0.01'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：''' &lt;br /&gt;
&lt;br /&gt;
width：int，PNG宽度&lt;br /&gt;
&lt;br /&gt;
height：int，PNG高度&lt;br /&gt;
&lt;br /&gt;
centerX &amp;amp; centerY：int，地图中心坐标&lt;br /&gt;
&lt;br /&gt;
scale：float，地图缩放比例&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/getMapPng?width=800&amp;amp;height=600&amp;amp;centerX=0&amp;amp;centerY=0&amp;amp;scale=0.01&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：PNG字节流'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 开启或关闭图优化 ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/set?path=graphoptimizer.Use&amp;amp;val=false'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：''' &lt;br /&gt;
&lt;br /&gt;
'''val'''：bool，开启、关闭&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/set?path=graphoptimizer.Use&amp;amp;val=false&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;/blockquote&amp;gt;开启或关闭图优化&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/call?cmd=mainmap.haveneighborframes()'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：无'''&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/call?cmd=mainmap.haveneighborframes()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：&amp;lt;code&amp;gt;{&amp;quot;result&amp;quot;:false}&amp;lt;/code&amp;gt;'''&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=Detour-API&amp;diff=542</id>
		<title>Detour-API</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=Detour-API&amp;diff=542"/>
		<updated>2024-04-11T08:38:26Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Detour''' ==&lt;br /&gt;
Detour使用HTTP方法提供API。以下为主要API的清单：&lt;br /&gt;
&lt;br /&gt;
=== '''里程计暂停运行''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/pause'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求（案例）：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/pause&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{&amp;quot;success&amp;quot;:true,&amp;quot;id&amp;quot;:0}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''里程计恢复运行''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/resume'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求（案例）：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/resume&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{&amp;quot;success&amp;quot;:true,&amp;quot;id&amp;quot;:0}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 执行Detour内部命令 ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/call'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
参数：cmd，指令。类似于odometry_0.pause()。[主语].([参数列表...]) &lt;br /&gt;
&lt;br /&gt;
'''请求（案例）：'''http://127.0.0.1:4321/call?cmd=odometry_0.pause() 这表示调用odometry_0的pause方法（暂停指定里程计）。具体各个组件有哪些方法参考《[[Detour组件参考手册]]》&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{&amp;quot;result&amp;quot;:&amp;quot;void&amp;quot;}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''获取当前车体在世界坐标系下的位姿''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/getPos'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/getPos&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;byte[] 下载成文件保存到本地&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 切换是否进行地图匹配 ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/switchPosMatch'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：'''&lt;br /&gt;
&lt;br /&gt;
'''disabled：bool，是否关闭地图匹配'''&lt;br /&gt;
&lt;br /&gt;
'''name：string，指定地图名称。不指定该参数则对所有图层生'''&lt;br /&gt;
&lt;br /&gt;
'''请求（案例）：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/switchPosMatch&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{&amp;quot;performed&amp;quot;:true}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''使远端算法核将某指定图层当前的建图结果保存至文件''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/setLocation'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：''' &lt;br /&gt;
&lt;br /&gt;
x：float，x 坐标值&lt;br /&gt;
&lt;br /&gt;
y：float，y 坐标值&lt;br /&gt;
&lt;br /&gt;
th：float：角度值 &lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/setLocation?x=1&amp;amp;y=2&amp;amp;th=3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{&amp;quot;x&amp;quot;:1.0,&amp;quot;y&amp;quot;:2.0,&amp;quot;th&amp;quot;:3.0,&amp;quot;l_step&amp;quot;:9999,&amp;quot;tick&amp;quot;:63832366282729,&amp;quot;error&amp;quot;:&amp;quot;Timeout&amp;quot;}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''获取程序运行状态，包括里程计状态、地图状态等''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/getStat'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/getStat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{&amp;quot;layoutStat&amp;quot;:{&amp;quot;w1&amp;quot;:{},&amp;quot;w2&amp;quot;:{},&amp;quot;frontlidar&amp;quot;:{}},&amp;quot;odoStat&amp;quot;:{},&amp;quot;posStat&amp;quot;:{},&amp;quot;TCStat&amp;quot;:{&amp;quot;fitmethod&amp;quot;:0,&amp;quot;fitsource&amp;quot;:&amp;quot;/&amp;quot;,&amp;quot;poseEstim&amp;quot;:&amp;quot;/&amp;quot;,&amp;quot;TCVar&amp;quot;:0.0},&amp;quot;GOStat&amp;quot;:{&amp;quot;maxTension&amp;quot;:0.0,&amp;quot;edgeN&amp;quot;:0},&amp;quot;licence&amp;quot;:&amp;quot;DID:40B38B8C111BD4EC&amp;quot;,&amp;quot;globalStat&amp;quot;:{&amp;quot;paused&amp;quot;:false,&amp;quot;IsSettingPosition&amp;quot;:false}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''设置激光雷达的无效范围，在一系列点构成的闭包范围内的激光点将被忽略，这些点的坐标为车体坐标系下的值''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/setLidar2DOdometryMask'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''POST'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：'''&lt;br /&gt;
&lt;br /&gt;
'''odometry：string，所设置的里程计名称字符串。'''&lt;br /&gt;
&lt;br /&gt;
'''Body：'''&lt;br /&gt;
&lt;br /&gt;
'''一串 XY 坐标点构成的 json 字符串'''&lt;br /&gt;
&lt;br /&gt;
'''请求（案例）：'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/setLidar2DOdometryMask?odometry=odometry_1&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[{&amp;quot;X&amp;quot;:123,&amp;quot;Y&amp;quot;:456},{&amp;quot;X&amp;quot;:123,&amp;quot;Y&amp;quot;:456},{&amp;quot;X&amp;quot;:123,&amp;quot;Y&amp;quot;:456}]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;设置成功：{success: true}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;设置失败：{error=”No odometry named {指定里程计名称}”}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''将程序设置为debug模式运行，将输出debug日志文件''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/debug'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/debug&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{&amp;quot;success&amp;quot;:true&amp;quot;}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''获取程序的配置参数''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/getConf'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/getConf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{&amp;quot;license&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;initX&amp;quot;:0.0,&amp;quot;initY&amp;quot;:0.0,&amp;quot;initTh&amp;quot;:0.0,&amp;quot;recordLastPos&amp;quot;:false,&amp;quot;layout&amp;quot;:{&amp;quot;chassis&amp;quot;:{&amp;quot;width&amp;quot;:1200.0,&amp;quot;length&amp;quot;:2000.0,&amp;quot;contour&amp;quot;:[-445.0,330.0,445.0,330.0,445.0,-330.0,-445.0,-330.0]},&amp;quot;components&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;wheel,component,haveposition&amp;quot;,&amp;quot;options&amp;quot;:{&amp;quot;platform&amp;quot;:0,&amp;quot;scale&amp;quot;:1.0,&amp;quot;radius&amp;quot;:200.0,&amp;quot;id&amp;quot;:1,&amp;quot;name&amp;quot;:&amp;quot;w1&amp;quot;,&amp;quot;noMove&amp;quot;:false,&amp;quot;time_bias_ms&amp;quot;:0,&amp;quot;x&amp;quot;:0.0,&amp;quot;y&amp;quot;:300.0,&amp;quot;th&amp;quot;:0.0,&amp;quot;z&amp;quot;:0.0,&amp;quot;alt&amp;quot;:0.0,&amp;quot;roll&amp;quot;:0.0}},{&amp;quot;type&amp;quot;:&amp;quot;wheel,component,haveposition&amp;quot;,&amp;quot;options&amp;quot;:{&amp;quot;platform&amp;quot;:6,&amp;quot;scale&amp;quot;:1.0,&amp;quot;radius&amp;quot;:200.0,&amp;quot;id&amp;quot;:2,&amp;quot;name&amp;quot;:&amp;quot;w2&amp;quot;,&amp;quot;noMove&amp;quot;:false,&amp;quot;time_bias_ms&amp;quot;:0,&amp;quot;x&amp;quot;:0.0,&amp;quot;y&amp;quot;:-300.0,&amp;quot;th&amp;quot;:0.0,&amp;quot;z&amp;quot;:0.0,&amp;quot;alt&amp;quot;:0.0,&amp;quot;roll&amp;quot;:0.0}},{&amp;quot;type&amp;quot;:&amp;quot;lidar2d,component,haveposition&amp;quot;,&amp;quot;options&amp;quot;:{&amp;quot;derr&amp;quot;:20.0,&amp;quot;kerr&amp;quot;:0.0,&amp;quot;isCircle&amp;quot;:false,&amp;quot;angleSgn&amp;quot;:1.0,&amp;quot;endAngle&amp;quot;:0.0,&amp;quot;rangeStartAngle&amp;quot;:-180.0,&amp;quot;rangeEndAngle&amp;quot;:180.0,&amp;quot;afterImageFilterOutN&amp;quot;:7,&amp;quot;afterImageFilterOutDeg&amp;quot;:2.0,&amp;quot;ignoreDist&amp;quot;:100.0,&amp;quot;maxDist&amp;quot;:200000.0,&amp;quot;correctionType&amp;quot;:&amp;quot;angle&amp;quot;,&amp;quot;dazzleWindow&amp;quot;:5,&amp;quot;dazzleDist&amp;quot;:80,&amp;quot;useNormalization&amp;quot;:true,&amp;quot;useGridSelection&amp;quot;:true,&amp;quot;gridSelSz&amp;quot;:20.0,&amp;quot;useChassisFilter&amp;quot;:true,&amp;quot;maxpoint&amp;quot;:640,&amp;quot;useBilateralFilter&amp;quot;:true,&amp;quot;useReflex&amp;quot;:false,&amp;quot;removeReflex&amp;quot;:false,&amp;quot;removeReflexDist&amp;quot;:300.0,&amp;quot;minpointsN&amp;quot;:20.0,&amp;quot;reflexThres&amp;quot;:0.4,&amp;quot;reflexDiffThres&amp;quot;:0.3,&amp;quot;reflexChunkThres&amp;quot;:2.5,&amp;quot;reflexMutePadding&amp;quot;:7,&amp;quot;reflexSize&amp;quot;:100,&amp;quot;reflexDistRange&amp;quot;:150.0,&amp;quot;invalidAngArrLen&amp;quot;:128,&amp;quot;stepDebug&amp;quot;:false,&amp;quot;id&amp;quot;:1101520006,&amp;quot;name&amp;quot;:&amp;quot;frontlidar&amp;quot;,&amp;quot;noMove&amp;quot;:false,&amp;quot;time_bias_ms&amp;quot;:0,&amp;quot;x&amp;quot;:350.0,&amp;quot;y&amp;quot;:0.0,&amp;quot;th&amp;quot;:0.0,&amp;quot;z&amp;quot;:0.0,&amp;quot;alt&amp;quot;:0.0,&amp;quot;roll&amp;quot;:0.0}}]},&amp;quot;odometries&amp;quot;:[],&amp;quot;positioning&amp;quot;:[],&amp;quot;autoStart&amp;quot;:false,&amp;quot;debug&amp;quot;:true,&amp;quot;useGPU&amp;quot;:true,&amp;quot;TCtimeWndSz&amp;quot;:150,&amp;quot;TCtimeWndLimit&amp;quot;:700,&amp;quot;useTC&amp;quot;:false,&amp;quot;guru&amp;quot;:{&amp;quot;SpatialIndex2StageCache&amp;quot;:4194304,&amp;quot;SpatialIndex1StageCache&amp;quot;:1048576,&amp;quot;ICPFastIterFac&amp;quot;:0.8,&amp;quot;ICPUseFastMode&amp;quot;:false,&amp;quot;ICP2DMaxIter&amp;quot;:16,&amp;quot;RippleEnableEqualize&amp;quot;:true,&amp;quot;Lidar2dMapMaxIter&amp;quot;:50,&amp;quot;TCAddIterations&amp;quot;:50,&amp;quot;phaseLockLvl&amp;quot;:3,&amp;quot;rotMapProjectionLength&amp;quot;:500.0,&amp;quot;gicp_p2pfac&amp;quot;:0.02,&amp;quot;extractPlaneThresE&amp;quot;:700.0,&amp;quot;lo3dlineWeightScale&amp;quot;:0.3,&amp;quot;inputScale&amp;quot;:1.0,&amp;quot;Lidar2DRippleDistDecay&amp;quot;:15000.0,&amp;quot;Lidar2DRippleScale&amp;quot;:1.0,&amp;quot;SI2DRectSmall&amp;quot;:130,&amp;quot;SI2DRectBig&amp;quot;:600,&amp;quot;TCVarMax&amp;quot;:1600.0,&amp;quot;TCMaxBadEdges&amp;quot;:3,&amp;quot;TCKalmanUseCurrentFac&amp;quot;:0.2,&amp;quot;debugReg2D&amp;quot;:true,&amp;quot;ICP2ddebugSource&amp;quot;:-1,&amp;quot;ICP2dReflexWeight&amp;quot;:3.0,&amp;quot;ICP2dReflexWeightTranslateFac&amp;quot;:3.0,&amp;quot;TCInterconnectType&amp;quot;:0,&amp;quot;TCAutoCaliberation&amp;quot;:false,&amp;quot;dumpCriticalData&amp;quot;:true},&amp;quot;recordPosInterval&amp;quot;:500,&amp;quot;preventErrorLocation&amp;quot;:true,&amp;quot;minimized&amp;quot;:false}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 进行一次全局匹配 ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/relocalize'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/relocalize&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{performed: true}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''使远端算法核加载远端已保存的某个地图''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/loadMap'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：''' &lt;br /&gt;
&lt;br /&gt;
name：string，指定的图层名称，默认为 mainmap&lt;br /&gt;
&lt;br /&gt;
fn：string，指定加载的地图文件名称，默认为 mainmap.2dlm&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/loadMap?name=mainmap&amp;amp;fn=&amp;lt;/nowiki&amp;gt; mainmap.2dlm&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{performed: true}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''使远端算法核将某指定图层当前的建图结果保存至文件''' ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/saveMap'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：''' &lt;br /&gt;
&lt;br /&gt;
name：string，指定的图层名称，默认为 mainmap&lt;br /&gt;
&lt;br /&gt;
fn：string，指定加载的地图文件名称，默认为 mainmap.2dlm&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/saveMap?name=mainmap&amp;amp;fn=&amp;lt;/nowiki&amp;gt; mainmap.2dlm&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;code&amp;gt;{performed: true}&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 以PNG格式返回激光地图 ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/getMapPng?width=800&amp;amp;height=600&amp;amp;centerX=0&amp;amp;centerY=0&amp;amp;scale=0.01'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：''' &lt;br /&gt;
&lt;br /&gt;
width：int，PNG宽度&lt;br /&gt;
&lt;br /&gt;
height：int，PNG高度&lt;br /&gt;
&lt;br /&gt;
centerX &amp;amp; centerY：int，地图中心坐标&lt;br /&gt;
&lt;br /&gt;
scale：float，地图缩放比例&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/getMapPng?width=800&amp;amp;height=600&amp;amp;centerX=0&amp;amp;centerY=0&amp;amp;scale=0.01&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：PNG字节流'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 开启或关闭图优化 ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Path：{ip}:4321/set?path=graphoptimizer.Use&amp;amp;val=false'''&lt;br /&gt;
&lt;br /&gt;
'''Method：''' '''GET'''&lt;br /&gt;
&lt;br /&gt;
'''接口描述：'''&lt;br /&gt;
&lt;br /&gt;
'''参数：''' &lt;br /&gt;
&lt;br /&gt;
'''val'''：bool，开启、关闭&lt;br /&gt;
&lt;br /&gt;
'''请求：'''&amp;lt;nowiki&amp;gt;http://127.0.0.1:4321/set?path=graphoptimizer.Use&amp;amp;val=false&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''返回（案例）：'''&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=539</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=539"/>
		<updated>2024-04-09T07:16:52Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​/* 使用手册 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[文件:MDCS-2023.png|缩略图|159x159像素|MDCS logo 2023]]&lt;br /&gt;
MDCS is a robot fleet developing platform, including the following components:&lt;br /&gt;
&lt;br /&gt;
[[Medulla]]: Efficient hardware communication and control platform.&lt;br /&gt;
&lt;br /&gt;
Detour: Positioning system, built-in Lidar and Visual SLAM&lt;br /&gt;
&lt;br /&gt;
Clumsy: Robot movement instruction platform, built-in typical movements for AGV/AMR.&lt;br /&gt;
&lt;br /&gt;
Simple: Robot fleet management including traffic control system.&lt;br /&gt;
&lt;br /&gt;
CycleGUI: Cycle based GUI framework, use co-routine to host GUI in an immediate-mode fashion. the co-routine is invoked only when a GUI refresh is needed.&lt;br /&gt;
&lt;br /&gt;
== 基本概念介绍 ==&lt;br /&gt;
定位：AGV的定位是由独立模块【Detour】完成。Detour支持激光雷达和视觉的各类SLAM算法，包括[[具有高鲁棒性的激光SLAM算法|具有高鲁棒性的2D激光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任务运行逻辑]] 。MDCS提供一个简单的壳层称为SimpleComposer，其提供UI和基础的车辆通信定义，在此之上还支持插件进一步定义车辆具体细节和业务逻辑。&lt;br /&gt;
&lt;br /&gt;
== 快速开始 ==&lt;br /&gt;
[[下载并部署Detour]]&lt;br /&gt;
&lt;br /&gt;
== 使用手册 ==&lt;br /&gt;
[[MDCS-Walkthrough]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - MDCS简介]]&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;
[[使用手册 - Medulla:相机使用方法 Camera Data Access Guide]]&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;
&lt;br /&gt;
[[使用手册 - Simple软件文件管理标准化作业]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - MDCS适配流程说明]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - MDCS适配详细说明]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - 有反+SLAM建图手册|使用手册 - 有反SLAM建图手册]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Linux MDCS部署&amp;amp;配置&amp;amp;操作说明]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - 数据录制与回放手册]]&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;
[[如何查看工控机性能以及功耗墙]]&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;
[[FAQ]] &amp;amp; Cheat sheet&lt;br /&gt;
&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;
[[通用约定|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;
* [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;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=537</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=537"/>
		<updated>2024-04-09T07:16:26Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​/* 使用手册 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[文件:MDCS-2023.png|缩略图|159x159像素|MDCS logo 2023]]&lt;br /&gt;
MDCS is a robot fleet developing platform, including the following components:&lt;br /&gt;
&lt;br /&gt;
[[Medulla]]: Efficient hardware communication and control platform.&lt;br /&gt;
&lt;br /&gt;
Detour: Positioning system, built-in Lidar and Visual SLAM&lt;br /&gt;
&lt;br /&gt;
Clumsy: Robot movement instruction platform, built-in typical movements for AGV/AMR.&lt;br /&gt;
&lt;br /&gt;
Simple: Robot fleet management including traffic control system.&lt;br /&gt;
&lt;br /&gt;
CycleGUI: Cycle based GUI framework, use co-routine to host GUI in an immediate-mode fashion. the co-routine is invoked only when a GUI refresh is needed.&lt;br /&gt;
&lt;br /&gt;
== 基本概念介绍 ==&lt;br /&gt;
定位：AGV的定位是由独立模块【Detour】完成。Detour支持激光雷达和视觉的各类SLAM算法，包括[[具有高鲁棒性的激光SLAM算法|具有高鲁棒性的2D激光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任务运行逻辑]] 。MDCS提供一个简单的壳层称为SimpleComposer，其提供UI和基础的车辆通信定义，在此之上还支持插件进一步定义车辆具体细节和业务逻辑。&lt;br /&gt;
&lt;br /&gt;
== 快速开始 ==&lt;br /&gt;
[[下载并部署Detour]]&lt;br /&gt;
&lt;br /&gt;
== 使用手册 ==&lt;br /&gt;
[[MDCS-Walkthrough]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - MDCS简介]]&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;
[[使用手册 - Medulla:相机使用方法 Camera Data Access Guide]]&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;
&lt;br /&gt;
[[使用手册 - Simple软件文件管理标准化作业]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - MDCS适配流程说明]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - MDCS适配详细说明]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - 有反 SLAM建图手册|使用手册 - 有反SLAM建图手册]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Linux MDCS部署&amp;amp;配置&amp;amp;操作说明]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - 数据录制与回放手册]]&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;
[[如何查看工控机性能以及功耗墙]]&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;
[[FAQ]] &amp;amp; Cheat sheet&lt;br /&gt;
&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;
[[通用约定|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;
* [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;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=536</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=536"/>
		<updated>2024-04-09T07:15:39Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[文件:MDCS-2023.png|缩略图|159x159像素|MDCS logo 2023]]&lt;br /&gt;
MDCS is a robot fleet developing platform, including the following components:&lt;br /&gt;
&lt;br /&gt;
[[Medulla]]: Efficient hardware communication and control platform.&lt;br /&gt;
&lt;br /&gt;
Detour: Positioning system, built-in Lidar and Visual SLAM&lt;br /&gt;
&lt;br /&gt;
Clumsy: Robot movement instruction platform, built-in typical movements for AGV/AMR.&lt;br /&gt;
&lt;br /&gt;
Simple: Robot fleet management including traffic control system.&lt;br /&gt;
&lt;br /&gt;
CycleGUI: Cycle based GUI framework, use co-routine to host GUI in an immediate-mode fashion. the co-routine is invoked only when a GUI refresh is needed.&lt;br /&gt;
&lt;br /&gt;
== 基本概念介绍 ==&lt;br /&gt;
定位：AGV的定位是由独立模块【Detour】完成。Detour支持激光雷达和视觉的各类SLAM算法，包括[[具有高鲁棒性的激光SLAM算法|具有高鲁棒性的2D激光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任务运行逻辑]] 。MDCS提供一个简单的壳层称为SimpleComposer，其提供UI和基础的车辆通信定义，在此之上还支持插件进一步定义车辆具体细节和业务逻辑。&lt;br /&gt;
&lt;br /&gt;
== 快速开始 ==&lt;br /&gt;
[[下载并部署Detour]]&lt;br /&gt;
&lt;br /&gt;
== 使用手册 ==&lt;br /&gt;
[[MDCS-Walkthrough]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - MDCS简介]]&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;
[[使用手册 - Medulla:相机使用方法 Camera Data Access Guide]]&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;
&lt;br /&gt;
[[使用手册 - Simple软件文件管理标准化作业]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - MDCS适配流程说明]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - MDCS适配详细说明]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - 有反+SLAM建图手册]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Linux MDCS部署&amp;amp;配置&amp;amp;操作说明]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - 数据录制与回放手册]]&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;
[[如何查看工控机性能以及功耗墙]]&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;
[[FAQ]] &amp;amp; Cheat sheet&lt;br /&gt;
&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;
[[通用约定|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;
* [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;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=520</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=520"/>
		<updated>2024-03-12T11:55:08Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​/* 使用手册 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[文件:MDCS-2023.png|缩略图|159x159像素|MDCS logo 2023]]&lt;br /&gt;
MDCS is a robot fleet developing platform, including the following components:&lt;br /&gt;
&lt;br /&gt;
[[Medulla]]: Efficient hardware communication and control platform.&lt;br /&gt;
&lt;br /&gt;
Detour: Positioning system, built-in Lidar and Visual SLAM&lt;br /&gt;
&lt;br /&gt;
Clumsy: Robot movement instruction platform, built-in typical movements for AGV/AMR.&lt;br /&gt;
&lt;br /&gt;
Simple: Robot fleet management including traffic control system.&lt;br /&gt;
&lt;br /&gt;
CycleGUI: Cycle based GUI framework, use co-routine to host GUI in an immediate-mode fashion. the co-routine is invoked only when a GUI refresh is needed.&lt;br /&gt;
&lt;br /&gt;
== 基本概念介绍 ==&lt;br /&gt;
定位：AGV的定位是由独立模块【Detour】完成。Detour支持激光雷达和视觉的各类SLAM算法，包括[[具有高鲁棒性的激光SLAM算法|具有高鲁棒性的2D激光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任务运行逻辑]] 。MDCS提供一个简单的壳层称为SimpleComposer，其提供UI和基础的车辆通信定义，在此之上还支持插件进一步定义车辆具体细节和业务逻辑。&lt;br /&gt;
&lt;br /&gt;
== 使用手册 ==&lt;br /&gt;
[[MDCS-Walkthrough]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - MDCS简介]]&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;
[[使用手册 - Medulla:相机使用方法 Camera Data Access Guide]]&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;
&lt;br /&gt;
[[使用手册 - Simple软件文件管理标准化作业]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - MDCS适配流程说明]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - MDCS适配详细说明]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - 有反 SLAM建图手册|使用手册 - 有反+SLAM建图手册]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - Linux MDCS部署&amp;amp;配置&amp;amp;操作说明]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - 数据录制与回放手册]]&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;
== 开发手册 ==&lt;br /&gt;
[[开发手册 - 轨迹跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[开发手册 - 目标跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[FAQ]] &amp;amp; Cheat sheet&lt;br /&gt;
&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;
[[通用约定|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;
* [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;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=353</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=353"/>
		<updated>2023-12-02T08:28:26Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​/* 使用手册 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[文件:MDCS-2023.png|缩略图|159x159像素|MDCS logo 2023]]&lt;br /&gt;
MDCS is a robot fleet developing platform, including the following components:&lt;br /&gt;
&lt;br /&gt;
[[Medulla]]: Efficient hardware communication and control platform.&lt;br /&gt;
&lt;br /&gt;
Detour: Positioning system, built-in Lidar and Visual SLAM&lt;br /&gt;
&lt;br /&gt;
Clumsy: Robot movement instruction platform, built-in typical movements for AGV/AMR.&lt;br /&gt;
&lt;br /&gt;
Simple: Robot fleet management including traffic control system.&lt;br /&gt;
&lt;br /&gt;
CycleGUI: Cycle based GUI framework, use co-routine to host GUI in an immediate-mode fashion. the co-routine is invoked only when a GUI refresh is needed.&lt;br /&gt;
&lt;br /&gt;
== 使用手册 ==&lt;br /&gt;
[[MDCS-Walkthrough]]&lt;br /&gt;
&lt;br /&gt;
[[使用手册 - MDCS简介]]&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字段：设置车辆必经点（必不经点）逻辑]]  &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;
[[使用手册 - Medulla:相机使用方法 Camera Data Access Guide]]&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;
== 开发手册 ==&lt;br /&gt;
[[开发手册 - 轨迹跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[开发手册 - 目标跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[FAQ]] &amp;amp; Cheat sheet&lt;br /&gt;
&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;
[[通用约定|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;
* [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;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=299</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=299"/>
		<updated>2023-11-21T08:47:19Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​已保护“首页”（[编辑=仅允许管理员]（无限期）[移动=仅允许管理员]（无限期））&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[文件:MDCS-2023.png|缩略图|159x159像素|MDCS logo 2023]]&lt;br /&gt;
MDCS is a robot fleet developing platform, including the following components:&lt;br /&gt;
&lt;br /&gt;
[[Medulla]]: Efficient hardware communication and control platform.&lt;br /&gt;
&lt;br /&gt;
Detour: Positioning system, built-in Lidar and Visual SLAM&lt;br /&gt;
&lt;br /&gt;
Clumsy: Robot movement instruction platform, built-in typical movements for AGV/AMR.&lt;br /&gt;
&lt;br /&gt;
Simple: Robot fleet management including traffic control system.&lt;br /&gt;
&lt;br /&gt;
CycleGUI: Cycle based GUI framework, use co-routine to host GUI in an immediate-mode fashion. the co-routine is invoked only when a GUI refresh is needed.&lt;br /&gt;
&lt;br /&gt;
== 使用手册 ==&lt;br /&gt;
[[使用手册 - MDCS简介]]&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字段：设置车辆必经点（必不经点）逻辑]]  &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;
[[使用手册 - Medulla:相机使用方法 Camera Data Access Guide]]&lt;br /&gt;
&lt;br /&gt;
== 开发手册 ==&lt;br /&gt;
[[开发手册 - 轨迹跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[开发手册 - 目标跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[FAQ]] &amp;amp; Cheat sheet&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;
[[通用约定|MDCS开发通用约定]]&lt;br /&gt;
&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;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=298</id>
		<title>使用手册 - 激光＋纹理导航</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=298"/>
		<updated>2023-11-21T08:47:03Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​已保护“使用手册 - 激光+纹理导航”（[编辑=仅允许管理员]（无限期）[移动=仅允许管理员]（无限期））&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1.什么是纹理导航？ =&lt;br /&gt;
一种基于地面图像纹理的视觉导航方法。硬件上由下视摄像头，补光灯(对光线有一定要求)等组成。纹理导航利用地面丰富的纹理信息，基于相位相关法和极坐标转换来计算出两图间的位移和旋转，对比地图已知的绝对坐标获取当前位置。&lt;br /&gt;
&lt;br /&gt;
不需对地面进行额外处理，无需安装反射板、磁条等，确保灵活性及扩展性。该方案性价比高、无需改造现场环境、施工周期短、能适应复杂应用场景。&lt;br /&gt;
&lt;br /&gt;
= 2.纹理导航适用的场景 =&lt;br /&gt;
纹理导航适用于一些特定的环境场景，其中地面或环境中存在明显的纹理特征，如金刚砂硬化地坪，普通水泥地坪，瓷砖地坪，车间铺设重复纹理的地板，且地板纹理重复度大于相机视野即可，&amp;lt;u&amp;gt;且多灰尘，油污等，地面纹理极少，且经常变化&amp;lt;/u&amp;gt;，不适合使用纹理导航&lt;br /&gt;
&lt;br /&gt;
1，金刚砂硬化地坪，有反光但纹理清晰。需要注意补光[[文件:金刚砂.jpg|某现场金刚砂地面环境|缩略图|542x542像素|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:金刚砂地面.png|常规的金刚砂地面 |无|有框]]2，瓷砖地面，有反光，纹理清晰。亮色系，补光容易。要求瓷砖尺寸&amp;gt;视觉相机视野（15*15cm）[[文件:瓷砖地面.png|某酒店地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地面-总.png|常见的瓷砖地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地纹.png|瓷砖地面纹理地图|有框|无]]3，普通水泥，补光容易，纹理清晰[[文件:水泥地面.png|普通水泥|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 3.纹理导航不适用的场景 =&lt;br /&gt;
不适用地面：地面反光且无纹理或纹理特征不明显的场地，不适用。&lt;br /&gt;
&lt;br /&gt;
A. 纹理没有或者极少，相机获取不到纹理特征，理论上无法实现。&lt;br /&gt;
&lt;br /&gt;
B. 打光困难，地面反光获取特征不是地面的真实情况，算法无法消除。&lt;br /&gt;
&lt;br /&gt;
C. 地面磨损，纹理极容易被损坏。&lt;br /&gt;
&lt;br /&gt;
D. 灰尘油污大的场地，地面纹理特征不稳定，经常变化，如室外泥泞环境。需要增加外部可靠纹理，保证导航稳定性能。&lt;br /&gt;
&lt;br /&gt;
E. 少纹理或者重复小纹理地面，例如载货电梯内部地面。需要增加外部标识，使纹理特征大于相机视野（15*15cm）&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
1，环氧地坪，补光困难，初期缺少视觉纹理导航必须的地面纹理。地面容易划伤，纹理不稳定。[[文件:环氧地坪.png|环氧地坪图片|有框|无]]2，重复小纹理地面，纹理特征不明显[[文件:扶梯地面.png|扶梯地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 4.纹理导航相比较SLAM的优缺点 =&lt;br /&gt;
纹理导航和SLAM是两种不同的导航方法，各自具有优缺点，适用于不同的应用场景&lt;br /&gt;
&lt;br /&gt;
'''优点'''&lt;br /&gt;
* 简单实时性：纹理导航实现简单，通常具有较好的实时性，适用于对实时性要求较高的应用。&lt;br /&gt;
* 成本较低：相对于SLAM需要的昂贵传感器，纹理导航通常可以通过普通的相机或传感器实现，降低了系统成本。&lt;br /&gt;
* 适用广泛：适用于各类有明显地面纹理的场所。&lt;br /&gt;
* 相比较SLAM精度更稳定,精度可稳定在正负5mm以内&lt;br /&gt;
'''缺点'''&lt;br /&gt;
* 局部信息：纹理导航一般只能提供相对局部的信息，不能构建全局一致的地图，因此适用于需要全局感知的场景有限。&lt;br /&gt;
* 对地面特征依赖性强：纹理导航依赖于地面的特征，如果地面特征变化或受到遮挡，可能会影响导航的准确性。&lt;br /&gt;
* 大场景建图耗时，需要地面弹线，修图，相比较slam实施较为耗时，麻烦。&lt;br /&gt;
&lt;br /&gt;
= 5.纹理相机设计安装要求 =&lt;br /&gt;
1，相机安装务必设计在车体运动中心-（越偏心安装会降低稳定性，导致车体晃动时可能造成脱轨，纹理相机视野15cm*15cm较小）&lt;br /&gt;
&lt;br /&gt;
2，有可高度的活动支架&lt;br /&gt;
&lt;br /&gt;
3，有较好的补光机构&lt;br /&gt;
&lt;br /&gt;
= 6.使用纹理导航前的准备工作 =&lt;br /&gt;
&lt;br /&gt;
==== 1．'''准备工作''' ====&lt;br /&gt;
1. 配置Medulla startup保证可以读取到相机图像数据，加载MVCamera.dll，如下方式&lt;br /&gt;
&lt;br /&gt;
mv=io load plugins/MVCamera.dll&lt;br /&gt;
&lt;br /&gt;
maincam=mv initMono MG010  //MG010为该相机型号&lt;br /&gt;
&lt;br /&gt;
打开Medulla.exe后就可以看到图像此准备工作完成&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image1.png|无框|658x658像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour根目录下需要有regcore_cuda和cufft64库文件&lt;br /&gt;
&lt;br /&gt;
2. 修改相机曝光参数，此处我们以海康相机为例，打开相机MVS软件，选择对应网卡的相机，双击，启动相机，就可以看到画面了，然后再右侧栏目中，调节相机的亮度和曝光即可，保证能够清晰的看到地面纹理即可,&lt;br /&gt;
[[文件:Cas.png|无|缩略图|656x656像素|海康MVS软件]]&lt;br /&gt;
在这个过程中我们需要保证补光均匀，需要设计一个合理的补光结构，如下图。调整补光机构，直至地面没有明显的反光点或暗部。然后可在平整的地面上贴一张白纸，可以清楚的看出反光情况，将用于纹理匹配的15*15cm区域截图，使用相机补光测试工具，可以计算出方差，一般方差在20以内可认为补光均匀，相机补光测试工具：https://e.gitee.com/Fairyland_1/projects/511612/repos/Fairyland_1/the-testofimageuniformity/sources&amp;lt;nowiki/&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
[[文件:纹理.png|无框|661x661像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. 标定相机&lt;br /&gt;
&lt;br /&gt;
（1）. 准备15cm*15cm的标定纸（见下图），贴在平整的地面上，相机必须能够完全看到标定纸中的方格，为消除畸变对相机的影响，在使用前需要相对相机进行标定，由于相机的透镜影响，以及相机在机械组装过程中的误差会使得光线穿过透镜投影到成像面时位置会发生变化。由透镜引起的畸变称之为“径向畸变”。在实际拍摄中径向畸变会使得一条直线在图片中变为曲线。通常分为桶形畸变和枕形畸变，目前标定摄像头主要为消除桶形畸变，如下图，左侧是标定后，右侧是未标定过的。&lt;br /&gt;
[[文件:标定纸.png|无|有框|15*15标定纸]][[文件:标定.png|836x836像素]]&lt;br /&gt;
&lt;br /&gt;
（2）. 打开Detour.exe，打开车体编辑器，添加下视摄像头，选择该组件，名称改成”maincam”和medulla加载的名称一致即可，修改相机和雷达的位置，使其和机械设计的真实位置一致&lt;br /&gt;
[[文件:Detour参数.png|无框|941x941像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（3）. 点击动作-双击捕捉即可看到相机画面，再双击校准，我们进行标定工作，这块需要很有耐心。&lt;br /&gt;
[[文件:标定1.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（4）打开校准的界面后，我们可以看到相机画面以及标定线，点击修改校准点，然后，鼠标依次对着标定值黑色的方框点，从左到右把点标记，如下图&lt;br /&gt;
[[文件:标定-2.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''一定要耐心，5分钟内就可以标定好，标定完成后会提示准备就绪，可以观察右下角的提示，可以知道目前正在标定哪一个点。标定完成后，左下角会有“就绪”的提示。''&lt;br /&gt;
[[文件:标定3.png|无|缩略图|513x513像素]]&lt;br /&gt;
（5）标定好后，我们选择摄像头，选择”保存校准数据”，然后再点击”校准数据另存为”保存到Detour目录下即可，然后保存下导航配置&lt;br /&gt;
[[文件:标定保存.png|无|有框]]''&amp;lt;big&amp;gt;'''注意：如果涉及到多个车，需要用同一个位置的地纹标定纸来进行标定'''&amp;lt;/big&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
= 7.地纹地图录制 =&lt;br /&gt;
&lt;br /&gt;
==== 1，建图方式 ====&lt;br /&gt;
&lt;br /&gt;
* 纯地纹建图--------大场景施工繁琐，耗时耗力&lt;br /&gt;
* 激光+地纹建图----施工方便&lt;br /&gt;
&lt;br /&gt;
(1)纯地纹建图，需要地面做标记，可以墨斗弹线/铺设标定线，目的是为了修图，因为纹理录的过程中会有误差，所以通过标定线来有目标性的进行图优化，可以看图6.1.1以及图6.1.2通过优化可以保证所有帧中的标定线处于同一水平，&lt;br /&gt;
[[文件:地纹地面弹线.png|无|有框|地面5mm标定线]]&lt;br /&gt;
[[文件:地纹纹理11.png|无|有框|6.1.1 连续录制的地面纹理地图-未修图]]&lt;br /&gt;
[[文件:E124eba91f7b7a4c8a707a412cf6ddb.png|无|缩略图|965x965像素|6.1.2 连续录制的地面纹理地图-修图后]]&lt;br /&gt;
（2）激光+地纹，是指在提前录制好激光地图的基础上，录制地纹，这个情况可以不需要标定线，但是有标定线也可以更方便的辅助修图。&lt;br /&gt;
[[文件:激光+地纹.png|无|有框|链接=文件:激光_地纹.png]]&lt;br /&gt;
&lt;br /&gt;
==== 2,开始建图 ====&lt;br /&gt;
1. 打开Detour.exe，选择里程计-添加里程计-地面纹理导航&lt;br /&gt;
[[文件:Detour-添加地纹里程计.png|无|缩略图|547x547像素]]&lt;br /&gt;
2. 点击地面纹理导航，添加图层，默认ground名称即可，这步结束后，保存下导航配置&lt;br /&gt;
[[文件:地纹里程计2.png|无|缩略图|547x547像素]]&lt;br /&gt;
3. 保存导航配置后，关闭detour，若使用多个传感器，如“激光+地纹”，需打开detour.json，找到useTC，设置为true。重启下detour,这时候就可以看到小车下有地面的图像了&lt;br /&gt;
[[文件:地纹里程计3.png|无|有框]]&lt;br /&gt;
4. 点击自动更新图层即可开启建图模式，对于纯纹理导航，需要按照标线遥控小车，把对应位置纹理录进去，对于激光+地纹，可以直接下发激光路径，在走激光的时候录制地纹地图。&lt;br /&gt;
[[文件:更新.png|无|有框]]&lt;br /&gt;
注意：激光+地纹录制的时候，我们需要注意按照以下步骤&lt;br /&gt;
&lt;br /&gt;
（1）保证AGV行驶激光路径精度正常，比如一条10米直线，AGV行驶过程整体行驶姿态误差都较为稳定&lt;br /&gt;
&lt;br /&gt;
（2）关闭图优化，取消勾选，会使得地纹关键帧停留在原始位置上不动&lt;br /&gt;
[[文件:9906be627cab3cbfb3d49d0f6a38747.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
（3）Simple下发一段路径，同时开启地纹自动更新图层，即可开启纹理录制了&lt;br /&gt;
&lt;br /&gt;
（4）每隔一段距离，锁一下最后一个关键帧，再开启图优化，就会把之前建的纹理图给优化好。然后再关闭，再走，走完后再锁一个关键帧.......以此类推。&lt;br /&gt;
&lt;br /&gt;
（5）录好后锁定图层，然后另存图层，保存导航配置即可，这样下次打开detour会自动加载地纹图层&lt;br /&gt;
&lt;br /&gt;
= 8.注意点 =&lt;br /&gt;
1，若使用激光+地纹方案，Detour中激光以及纹理相机的xyth需要按照实际物理位置填写，车体运动中心为坐标原点，前进方向为x正，前进方向左侧y正&lt;br /&gt;
&lt;br /&gt;
2，由于地纹相机实时性比较高因此，不同雷达配合地纹使用需要修改time_bias_ms，镭神3d激光相比较相机大概延迟100ms左右，因此我们需要把相机的time_bias_ms改成-100&lt;br /&gt;
&lt;br /&gt;
[[文件:Maincam.png|无框]]&lt;br /&gt;
&lt;br /&gt;
3，fitTCfactor参数可以配置多传感器耦合的权重，越低则代表该传感器越不重要&lt;br /&gt;
&lt;br /&gt;
4，实际使用中，可能需要用到相机校准中的“反转和旋转功能”，在进行建图时，若出现车辆在地图中的移动情况与实际情况不一致，需使用“反转和旋转功能”使运动与建图情况一致。例如车往x正方向走，地纹图层应与车辆运动轨迹一致，若出现地纹图层以车为原点向x正方向延申，表示此时地纹里程计方向错误，需要点击“反转和旋转”中的横向翻转。&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=297</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=297"/>
		<updated>2023-11-21T08:46:31Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​/* 使用手册 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[文件:MDCS-2023.png|缩略图|159x159像素|MDCS logo 2023]]&lt;br /&gt;
MDCS is a robot fleet developing platform, including the following components:&lt;br /&gt;
&lt;br /&gt;
[[Medulla]]: Efficient hardware communication and control platform.&lt;br /&gt;
&lt;br /&gt;
Detour: Positioning system, built-in Lidar and Visual SLAM&lt;br /&gt;
&lt;br /&gt;
Clumsy: Robot movement instruction platform, built-in typical movements for AGV/AMR.&lt;br /&gt;
&lt;br /&gt;
Simple: Robot fleet management including traffic control system.&lt;br /&gt;
&lt;br /&gt;
CycleGUI: Cycle based GUI framework, use co-routine to host GUI in an immediate-mode fashion. the co-routine is invoked only when a GUI refresh is needed.&lt;br /&gt;
&lt;br /&gt;
== 使用手册 ==&lt;br /&gt;
[[使用手册 - MDCS简介]]&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字段：设置车辆必经点（必不经点）逻辑]]  &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;
[[使用手册 - Medulla:相机使用方法 Camera Data Access Guide]]&lt;br /&gt;
&lt;br /&gt;
== 开发手册 ==&lt;br /&gt;
[[开发手册 - 轨迹跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[开发手册 - 目标跟踪]]&lt;br /&gt;
&lt;br /&gt;
[[FAQ]] &amp;amp; Cheat sheet&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;
[[通用约定|MDCS开发通用约定]]&lt;br /&gt;
&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;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=Simple-API&amp;diff=261</id>
		<title>Simple-API</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=Simple-API&amp;diff=261"/>
		<updated>2023-11-09T08:06:18Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​创建空白页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=259</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=259"/>
		<updated>2023-11-05T02:02:21Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[文件:MDCS-2023.png|缩略图|159x159像素|MDCS logo 2023]]&lt;br /&gt;
MDCS is a robot fleet developing platform, including the following components:&lt;br /&gt;
&lt;br /&gt;
[[Medulla]]: Efficient hardware communication and control platform.&lt;br /&gt;
&lt;br /&gt;
Detour: Positioning system, built-in Lidar and Visual SLAM&lt;br /&gt;
&lt;br /&gt;
Clumsy: Robot movement instruction platform, built-in typical movements for AGV/AMR.&lt;br /&gt;
&lt;br /&gt;
Simple: Robot fleet management including traffic control system.&lt;br /&gt;
&lt;br /&gt;
CycleGUI: Cycle based GUI framework, use co-routine to host GUI in an immediate-mode fashion. the co-routine is invoked only when a GUI refresh is needed.&lt;br /&gt;
&lt;br /&gt;
== 使用手册 ==&lt;br /&gt;
[[使用手册 - MDCS简介]]&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字段：设置车辆必经点（必不经点）逻辑]]  &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;
== 接口 ==&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;
&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;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_Simple:coder%EF%BC%88%E8%B7%AF%E5%BE%84%E7%BC%96%E8%AF%91%E5%99%A8%EF%BC%89%E6%9C%BA%E5%88%B6%E8%AF%A6%E8%A7%A3&amp;diff=258</id>
		<title>使用手册 - Simple:coder（路径编译器）机制详解</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_Simple:coder%EF%BC%88%E8%B7%AF%E5%BE%84%E7%BC%96%E8%AF%91%E5%99%A8%EF%BC%89%E6%9C%BA%E5%88%B6%E8%AF%A6%E8%A7%A3&amp;diff=258"/>
		<updated>2023-11-04T04:40:02Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1.概念 ==&lt;br /&gt;
路径编译是MDCS架构中一个重要概念，它是上位调度系统与下位车端系统之间的桥梁。路径编译发生在寻路完成之后，路径编译的操作对象是由“站点、路径、站点、路径......”构成的序列，路径编译的结果是一串AGV可以执行的命令脚本，该脚本对应车端SimpleAGVInterface里面定义的接口。&lt;br /&gt;
&lt;br /&gt;
== 2.机制介绍 ==&lt;br /&gt;
我们将编译器称为“coder”，实际业务中，整个编译逻辑是由若干的coder构成的。也就是说，coder在同一个站点或者可以叠加使用。处理路径的，称为trackCoder；处理站点的，称为siteCoder。定义好某个车型的所有coder，就完成了该车型的业务层面的所有行为定义（即，在什么路径/站点上触发什么样的行为）。下面用一个具体的例子详细解释coder运行的机制。&lt;br /&gt;
&lt;br /&gt;
[[文件:B3fa65c75ecd770e5882c459a9b232e.png|无框|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
我们将“小车从A到B”的过程称为一个“plan”。如上图所示，假设已经生成了`模拟车1`的一段plan。该plan包含6个site（站点）、5段track（路径），共11个segment。编译路径时，依据通行顺序检查所有segment。对于每一个segment，若它是站点，则检查所有的siteCoder；若它是路径，则检查所有的路径trackCoder。对于每一个被检查的coder，依次判断其是否能够触发，触发后生成AGV脚本，并判断是否继续检查剩余的coder。如下图所示，为车辆执行的脚本。&lt;br /&gt;
&lt;br /&gt;
[[文件:2ff3859cb01c4c06dfdd71120a5e910.png|无框|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
== 3.TemplateCoderSettings使用方法 ==&lt;br /&gt;
&lt;br /&gt;
=== 3.1 CoderSettings中字段含义 ===&lt;br /&gt;
&amp;lt;code&amp;gt;TemplateTrackCoderSettings&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;TemplateSiteCoderSittings&amp;lt;/code&amp;gt;是分别实现trackCoder和SiteCoder的[https://learn.microsoft.com/zh-cn/dotnet/csharp/advanced-topics/reflection-and-attributes/attribute-tutorial Attribute]，通过在Simple工程中xxxCar.cs中小车类之前添加&amp;lt;code&amp;gt;TemplateTrackCoderSettings&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;TemplateSiteCoderSittings&amp;lt;/code&amp;gt;定义站点编译器。下方DummyCar的示例，无条件地将所有路径编译为agv.Go()这一动作：&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
class DummyCarTrackField&lt;br /&gt;
{&lt;br /&gt;
    public int speed = -1;&lt;br /&gt;
    public bool reverse = false;&lt;br /&gt;
    public int reverseDst = -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
[TemplateTrackCoderSettings(&lt;br /&gt;
    templateString = &amp;quot;agv.Go(${src.x},${src.y},${src.id},${dst.x},${dst.y},${dst.id},${track.id},${track.speed},${track.reverse || track.reverseDst == dst.id});&amp;quot;,&lt;br /&gt;
    priority = 0,&lt;br /&gt;
    trackFields = typeof(DummyCarTrackField),&lt;br /&gt;
    useVerb = &amp;quot;true&amp;quot;,&lt;br /&gt;
    blck)]&lt;br /&gt;
&lt;br /&gt;
[CarType(&amp;quot;模拟车&amp;quot;)]&lt;br /&gt;
public class DummyCar : Car&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;CoderSitting中包含以下字段：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!字段&lt;br /&gt;
!类型&lt;br /&gt;
!含义&lt;br /&gt;
|-&lt;br /&gt;
|templateString&lt;br /&gt;
|string&lt;br /&gt;
|编译后执行的命令&lt;br /&gt;
|-&lt;br /&gt;
|priority&lt;br /&gt;
|int&lt;br /&gt;
|优先级，数值越大越先被检查&lt;br /&gt;
|-&lt;br /&gt;
|siteFields&lt;br /&gt;
|Type&lt;br /&gt;
|定义站点字段的类的Type&lt;br /&gt;
|-&lt;br /&gt;
|trackFields&lt;br /&gt;
|Type&lt;br /&gt;
|定义路径字段的类的Type&lt;br /&gt;
|-&lt;br /&gt;
|planFields&lt;br /&gt;
|Type&lt;br /&gt;
|定义车辆字段的类的Type&lt;br /&gt;
|-&lt;br /&gt;
|useVerb&lt;br /&gt;
|string&lt;br /&gt;
|触发条件。默认为&amp;quot;true&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|blockVerb&lt;br /&gt;
|string&lt;br /&gt;
|触发后，若blockVerb为&amp;quot;true&amp;quot;，则不再检查其他优先级更低的coder；若为&amp;quot;false&amp;quot;，则继续检查剩余优先级更低的coder。默认为&amp;quot;false&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
其中，&amp;lt;code&amp;gt;templateString&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;useVerb&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;blockVerb&amp;lt;/code&amp;gt;都是字符串，通过[https://github.com/sebastienros/jint Jint]将字符串视为JavaScript代码，进行解析执行。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;templateString&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;useVerb&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;blockVerb&amp;lt;/code&amp;gt;中可以使用如下定义好的对象。'''注意，&amp;lt;code&amp;gt;TemplateSiteCoderSittings&amp;lt;/code&amp;gt;中不可使用&amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;这一字段，&amp;lt;code&amp;gt;dst&amp;lt;/code&amp;gt;代表当前站点。'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!对象&lt;br /&gt;
!含义&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; |包含字段&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |car&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |当前plan所使用的小车&lt;br /&gt;
|car.id&lt;br /&gt;
|小车id&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |carFields中定义的其他字段&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |src&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |路径起点&lt;br /&gt;
|src.id&lt;br /&gt;
|起点的id&lt;br /&gt;
|-&lt;br /&gt;
|src.x&lt;br /&gt;
|起点的x坐标&lt;br /&gt;
|-&lt;br /&gt;
|src.y&lt;br /&gt;
|起点的y坐标&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |siteFields中定义的其他字段&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |dst&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |路径终点&lt;br /&gt;
|dst.id&lt;br /&gt;
|终点的id&lt;br /&gt;
|-&lt;br /&gt;
|dst.x&lt;br /&gt;
|终点的x坐标&lt;br /&gt;
|-&lt;br /&gt;
|dst.y&lt;br /&gt;
|终点的y坐标&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |siteFields中定义的其他字段&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |plan&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |当前任务&lt;br /&gt;
|segN&lt;br /&gt;
|任务总元素数&lt;br /&gt;
|-&lt;br /&gt;
|curSeg&lt;br /&gt;
|当前元素下标&lt;br /&gt;
|-&lt;br /&gt;
|src&lt;br /&gt;
|任务起点&lt;br /&gt;
|-&lt;br /&gt;
|dst&lt;br /&gt;
|任务终点&lt;br /&gt;
|-&lt;br /&gt;
|prev&lt;br /&gt;
|前一个segment，若无返回null&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|next&lt;br /&gt;
|后一个segment，若无返回null&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;code&amp;gt;templateString&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;useVerb&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;blockVerb&amp;lt;/code&amp;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;
|getSite&lt;br /&gt;
|返回指定id的站点&lt;br /&gt;
|-&lt;br /&gt;
|getTrack&lt;br /&gt;
|返回指定id的路径&lt;br /&gt;
|-&lt;br /&gt;
|getCar&lt;br /&gt;
|返回指定id的小车&lt;br /&gt;
|-&lt;br /&gt;
|getSegment&lt;br /&gt;
|返回指定下标的segment&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3.2 编写自己的coderSitting ===&lt;br /&gt;
以最常见的取放货为例，首席需要将使用的字段定义在类中，站点字段定义在SiteFields类中，路径字段定义在TrackFields类中。&lt;br /&gt;
&lt;br /&gt;
下述coder的执行条件为&amp;lt;code&amp;gt;plan.action=='put'&amp;amp;&amp;amp; dst.shelf&amp;lt;/code&amp;gt;，即站点上标记了&amp;lt;code&amp;gt;shelf = true&amp;lt;/code&amp;gt;字段，并且这是放货plan时，才会下发&amp;lt;code&amp;gt;templateString&amp;lt;/code&amp;gt;中的脚本，并且站点及路径上标记的响应字段的值也会跟随脚本下发。&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
class SiteFields&lt;br /&gt;
    {&lt;br /&gt;
        public bool shelf = false;&lt;br /&gt;
        public int obArea = -1;&lt;br /&gt;
        public int ASNub = -1;&lt;br /&gt;
        public float angle = 0;&lt;br /&gt;
        public float shelfWidth = 1030;&lt;br /&gt;
        public float distance = 500; &lt;br /&gt;
    }&lt;br /&gt;
 [TemplateTrackCoderSettings(&lt;br /&gt;
        priority = 5,&lt;br /&gt;
        useVerb = &amp;quot;plan.action=='put' &amp;amp;&amp;amp; dst.shelf &amp;quot;,&lt;br /&gt;
        templateString = &amp;quot;agv.Wait();agv.Put(${dst.ASNub},${dst.shelfWidth},${dst.obArea},${src.x},${src.y},${src.id},${dst.x},${dst.y},${dst.id},${track.id},${track.speed},${dst.reverse},${dst.xbias},${dst.ybias},${dst.angle},${dst.distance});agv.Wait();&amp;quot;,&lt;br /&gt;
        blockVerb = &amp;quot;true&amp;quot;,&lt;br /&gt;
        siteFields = typeof(SiteFields),&lt;br /&gt;
        trackFields = typeof(TrackFields),&lt;br /&gt;
        planFields = typeof(PlanField))]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.3 simple内置的coder ===&lt;br /&gt;
所有的小车类均继承了车体抽象类&amp;lt;code&amp;gt;AbstractCar&amp;lt;/code&amp;gt;，抽象类中定义了如下几个coder：&lt;br /&gt;
&lt;br /&gt;
队列动作。在站点的codeQueue字段上定义脚本，在该站点发生路径切换时执行。&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[TemplateSiteCoderSettings(priority = 100,&lt;br /&gt;
    useVerb = &amp;quot;dst.codeQueue!=null&amp;quot;,&lt;br /&gt;
    templateString = &amp;quot;agv.Queue(()=&amp;gt;{},()=&amp;gt;{${dst.codeQueue}});&amp;quot;,&lt;br /&gt;
    blockVerb = &amp;quot;true&amp;quot;,&lt;br /&gt;
    siteFields = typeof(StandardSiteFields))]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;到达动作。在站点的codeArrive字段上定义AGV脚本，在AGV达到该站点发时（完全停车后）执行。&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[TemplateSiteCoderSettings(priority = 100,&lt;br /&gt;
    useVerb = &amp;quot;dst.codeArrive!=null &amp;amp;&amp;amp; plan.curSeg!=0&amp;quot;,&lt;br /&gt;
    templateString = &amp;quot;agv.Wait(); ${dst.codeArrive};&amp;quot;,&lt;br /&gt;
    siteFields = typeof(StandardSiteFields))]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;离开动作。在站点的codeLeave字段上定义AGV脚本，在AGV从该站点离开之前执行。&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[TemplateSiteCoderSettings(priority = 100, &lt;br /&gt;
    useVerb = &amp;quot;dst.codeLeave!=null &amp;amp;&amp;amp; plan.curSeg!=plan.segN-1&amp;quot;,&lt;br /&gt;
    templateString = &amp;quot;agv.Wait(); ${dst.codeLeave};&amp;quot;,&lt;br /&gt;
    siteFields = typeof(StandardSiteFields))]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;空路径。即指定某段路径不执行具体动作（相当于直接跳过）。&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[TemplateTrackCoderSettings(&lt;br /&gt;
    priority = 100,&lt;br /&gt;
    siteFields = typeof(StandardSiteFields),&lt;br /&gt;
    useVerb = &amp;quot;track.nop &amp;amp;&amp;amp; (track.nopDst==-1 || track.nopDst==dst.id)&amp;quot;,&lt;br /&gt;
    blockVerb = &amp;quot;true&amp;quot;,&lt;br /&gt;
    templateString = &amp;quot;agv.Nop(${src.id},${dst.id},${track.id});&amp;quot;,&lt;br /&gt;
    trackFields = typeof(StandardTrackFields))]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;切换动作。在站点的switchString字段上定义脚本，在该站点发生路径切换时执行。一般用于进行障碍物切换。&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[TemplateTrackCoderSettings(&lt;br /&gt;
    priority = 20,&lt;br /&gt;
    useVerb = &amp;quot;track.switcher&amp;quot;,&lt;br /&gt;
    templateString = &amp;quot;agv.Queue(()=&amp;gt;{}, ()=&amp;gt;{${dst.switchString};});&amp;quot;,&lt;br /&gt;
    siteFields = typeof(StandardSiteFields),&lt;br /&gt;
    trackFields = typeof(StandardTrackFields))]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4.ProgramCoderSettings使用方法 ==&lt;br /&gt;
&lt;br /&gt;
=== 4.1 使用方法 ===&lt;br /&gt;
比起TemplateCoderSettings，ProgramCoderSettings提供了更大的编译自由度。使用TemplateCoderSettings，只能访问到上一小节中提供的字段和方法，并且想要构建两个segment之间的上下文关系，是比较困难的。例如，考虑二维码导航的情况：小车在行进之前，需要根据当前朝向和目标行走方向的偏差，进行旋转。这条旋转指令用到了segment之间的上下文关系，且编译过程需要用到小车朝向、路径朝向的信息。&lt;br /&gt;
&lt;br /&gt;
对于站点和路径，分别有&amp;lt;code&amp;gt;ProgramTrackCoderSettings&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;ProgramSiteCoderSettings&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|priority&lt;br /&gt;
|int&lt;br /&gt;
|优先级，数值越大越先被检查&lt;br /&gt;
|-&lt;br /&gt;
|program&lt;br /&gt;
|Type&lt;br /&gt;
|定义coder逻辑的类&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;code&amp;gt;ProgramTrackCoderSettings&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;ProgramSiteCoderSettings&amp;lt;/code&amp;gt;的&amp;lt;code&amp;gt;program&amp;lt;/code&amp;gt;需赋值为&amp;lt;code&amp;gt;ITrackCoder&amp;lt;/code&amp;gt;或&amp;lt;code&amp;gt;ISiteCoder&amp;lt;/code&amp;gt;的派生类。这两个Interface定义了coder类的实现方法：&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public interface ISiteCoder&lt;br /&gt;
{&lt;br /&gt;
    bool toBlock();&lt;br /&gt;
    bool Code(SegmentPlan plan, Site site, int i);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public interface ITrackCoder&lt;br /&gt;
{&lt;br /&gt;
    bool toBlock();&lt;br /&gt;
    bool Code(SegmentPlan plan, Track track, Site src, Site dst, int i);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;其中的&amp;lt;code&amp;gt;toBlock()&amp;lt;/code&amp;gt;函数的返回值决定是否屏蔽余下优先级更低的coder（与&amp;lt;code&amp;gt;TemplateCoderSettings&amp;lt;/code&amp;gt;中的&amp;quot;blockVerb&amp;quot;类似，但&amp;lt;code&amp;gt;toBlock()&amp;lt;/code&amp;gt;函数中开发者显然可以根据业务需求编写更复杂的逻辑）；&amp;lt;code&amp;gt;Code()&amp;lt;/code&amp;gt;函数的作用是生成当前segment对应的脚本字符串，其输入参数&amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;对应当前segment的下标。生成的命令赋值给&amp;lt;code&amp;gt;plan.codeArr&amp;lt;/code&amp;gt;中相应下标的元素，即得到整个执行脚本。&lt;br /&gt;
&lt;br /&gt;
=== 4.2 用例 ===&lt;br /&gt;
示例如下，是二维码导航的trackCoder实现：&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
class QRTrackFields&lt;br /&gt;
{&lt;br /&gt;
    public int speed = -1;&lt;br /&gt;
    public bool reverse = false;&lt;br /&gt;
    public int reverseDst = -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class QRGoCoder : ITrackCoder&lt;br /&gt;
{&lt;br /&gt;
    public bool toBlock()&lt;br /&gt;
    {&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public bool Code(SegmentPlan plan, Track track, Site src, Site dst, int i)&lt;br /&gt;
    {&lt;br /&gt;
        var trackInfo = StringDictConvert&amp;lt;QRTrackFields&amp;gt;.Convert(track.fields);&lt;br /&gt;
        var curPathDir = Math.Atan2(dst.y - src.y, dst.x - src.x) / Math.PI * 180;&lt;br /&gt;
        curPathDir = Math.Round(curPathDir / 90) * 90;&lt;br /&gt;
&lt;br /&gt;
        var speed = trackInfo.speed;&lt;br /&gt;
        var reverse = trackInfo.reverse;&lt;br /&gt;
        if (trackInfo.reverseDst != -1 &amp;amp;&amp;amp; trackInfo.reverseDst == dst.id) reverse = true;&lt;br /&gt;
&lt;br /&gt;
        plan.codeArr[i] =&lt;br /&gt;
            $&amp;quot;agv.QRGo({curPathDir},{reverse.ToString().ToLower()},{src.id},{dst.id},{track.id},{speed});&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=257</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=257"/>
		<updated>2023-11-02T11:51:21Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​/* 使用手册 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[文件:MDCS-2023.png|缩略图|159x159像素|MDCS logo 2023]]&lt;br /&gt;
MDCS is a robot fleet developing platform, including the following components:&lt;br /&gt;
&lt;br /&gt;
[[Medulla]]: Efficient hardware communication and control platform.&lt;br /&gt;
&lt;br /&gt;
Detour: Positioning system, built-in Lidar and Visual SLAM&lt;br /&gt;
&lt;br /&gt;
Clumsy: Robot movement instruction platform, built-in typical movements for AGV/AMR.&lt;br /&gt;
&lt;br /&gt;
Simple: Robot fleet management including traffic control system.&lt;br /&gt;
&lt;br /&gt;
CycleGUI: Cycle based GUI framework, use co-routine to host GUI in an immediate-mode fashion. the co-routine is invoked only when a GUI refresh is needed.&lt;br /&gt;
&lt;br /&gt;
== 使用手册 ==&lt;br /&gt;
[[使用手册 - MDCS简介]]&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字段：设置车辆必经点（必不经点）逻辑]]  &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;
== 接口 ==&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;
&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;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=203</id>
		<title>使用手册 - 激光＋纹理导航</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=203"/>
		<updated>2023-10-17T10:16:50Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​/* 4.纹理导航相比较SLAM的优缺点 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1.什么是纹理导航？ =&lt;br /&gt;
一种基于地面图像纹理的视觉导航方法。硬件上由下视摄像头，补光灯(对光线有一定要求)等组成。纹理导航利用地面丰富的纹理信息，基于相位相关法和极坐标转换来计算出两图间的位移和旋转，对比地图已知的绝对坐标获取当前位置。&lt;br /&gt;
&lt;br /&gt;
不需对地面进行额外处理，无需安装反射板、磁条等，确保灵活性及扩展性。该方案性价比高、无需改造现场环境、施工周期短、能适应复杂应用场景。&lt;br /&gt;
&lt;br /&gt;
= 2.纹理导航适用的场景 =&lt;br /&gt;
纹理导航适用于一些特定的环境场景，其中地面或环境中存在明显的纹理特征，如金刚砂硬化地坪，普通水泥地坪，瓷砖地坪，车间铺设重复纹理的地板，且地板纹理重复度大于相机视野即可，&amp;lt;u&amp;gt;且多灰尘，油污等，地面纹理极少，且经常变化&amp;lt;/u&amp;gt;，不适合使用纹理导航&lt;br /&gt;
&lt;br /&gt;
1，金刚砂硬化地坪，有反光但纹理清晰。需要注意补光[[文件:金刚砂.jpg|某现场金刚砂地面环境|缩略图|542x542像素|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:金刚砂地面.png|常规的金刚砂地面 |无|有框]]2，瓷砖地面，有反光，纹理清晰。亮色系，补光容易。要求瓷砖尺寸&amp;gt;视觉相机视野（15*15cm）[[文件:瓷砖地面.png|某酒店地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地面-总.png|常见的瓷砖地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地纹.png|瓷砖地面纹理地图|有框|无]]3，普通水泥，补光容易，纹理清晰[[文件:水泥地面.png|普通水泥|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 3.纹理导航不适用的场景 =&lt;br /&gt;
不适用地面：地面反光且无纹理或纹理特征不明显的场地，不适用。&lt;br /&gt;
&lt;br /&gt;
A. 纹理没有或者极少，相机获取不到纹理特征，理论上无法实现。&lt;br /&gt;
&lt;br /&gt;
B. 打光困难，地面反光获取特征不是地面的真实情况，算法无法消除。&lt;br /&gt;
&lt;br /&gt;
C. 地面磨损，纹理极容易被损坏。&lt;br /&gt;
&lt;br /&gt;
D. 灰尘油污大的场地，地面纹理特征不稳定，经常变化，如室外泥泞环境。需要增加外部可靠纹理，保证导航稳定性能。&lt;br /&gt;
&lt;br /&gt;
E. 少纹理或者重复小纹理地面，例如载货电梯内部地面。需要增加外部标识，使纹理特征大于相机视野（15*15cm）&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
1，环氧地坪，补光困难，初期缺少视觉纹理导航必须的地面纹理。地面容易划伤，纹理不稳定。[[文件:环氧地坪.png|环氧地坪图片|有框|无]]2，重复小纹理地面，纹理特征不明显[[文件:扶梯地面.png|扶梯地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 4.纹理导航相比较SLAM的优缺点 =&lt;br /&gt;
纹理导航和SLAM是两种不同的导航方法，各自具有优缺点，适用于不同的应用场景&lt;br /&gt;
&lt;br /&gt;
'''优点'''&lt;br /&gt;
* 简单实时性：纹理导航实现简单，通常具有较好的实时性，适用于对实时性要求较高的应用。&lt;br /&gt;
* 成本较低：相对于SLAM需要的昂贵传感器，纹理导航通常可以通过普通的相机或传感器实现，降低了系统成本。&lt;br /&gt;
* 适用广泛：适用于各类有明显地面纹理的场所。&lt;br /&gt;
* 相比较SLAM精度更稳定,精度可稳定在正负5mm以内&lt;br /&gt;
'''缺点'''&lt;br /&gt;
* 局部信息：纹理导航一般只能提供相对局部的信息，不能构建全局一致的地图，因此适用于需要全局感知的场景有限。&lt;br /&gt;
* 对地面特征依赖性强：纹理导航依赖于地面的特征，如果地面特征变化或受到遮挡，可能会影响导航的准确性。&lt;br /&gt;
* 大场景建图耗时，需要地面弹线，修图，相比较slam实施较为耗时，麻烦。&lt;br /&gt;
&lt;br /&gt;
= 5.纹理相机设计安装要求 =&lt;br /&gt;
1，相机安装务必设计在车体运动中心-（越偏心安装会降低稳定性，导致车体晃动时可能造成脱轨，纹理相机视野15cm*15cm较小）&lt;br /&gt;
&lt;br /&gt;
2，有可高度的活动支架&lt;br /&gt;
&lt;br /&gt;
3，有较好的补光机构&lt;br /&gt;
&lt;br /&gt;
= 6.使用纹理导航前的准备工作 =&lt;br /&gt;
&lt;br /&gt;
==== 1．'''准备工作''' ====&lt;br /&gt;
1. 配置Medulla startup保证可以读取到相机图像数据，加载MVCamera.dll，如下方式&lt;br /&gt;
&lt;br /&gt;
mv=io load plugins/MVCamera.dll&lt;br /&gt;
&lt;br /&gt;
maincam=mv initMono MG010  //MG010为该相机型号&lt;br /&gt;
&lt;br /&gt;
打开Medulla.exe后就可以看到图像此准备工作完成&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image1.png|无框|658x658像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour根目录下需要有regcore_cuda和cufft64库文件&lt;br /&gt;
&lt;br /&gt;
2. 修改相机曝光参数，此处我们以海康相机为例，打开相机MVS软件，选择对应网卡的相机，双击，启动相机，就可以看到画面了，然后再右侧栏目中，调节相机的亮度和曝光即可，保证能够清晰的看到地面纹理即可,&lt;br /&gt;
[[文件:Cas.png|无|缩略图|656x656像素|海康MVS软件]]&lt;br /&gt;
在这个过程中我们需要保证补光均匀，需要设计一个合理的补光结构，如下图。调整补光机构，直至地面没有明显的反光点或暗部。然后可在平整的地面上贴一张白纸，可以清楚的看出反光情况，将用于纹理匹配的15*15cm区域截图，使用相机补光测试工具，可以计算出方差，一般方差在20以内可认为补光均匀，相机补光测试工具：https://e.gitee.com/Fairyland_1/projects/511612/repos/Fairyland_1/the-testofimageuniformity/sources&amp;lt;nowiki/&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
[[文件:纹理.png|无框|661x661像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. 标定相机&lt;br /&gt;
&lt;br /&gt;
（1）. 准备15cm*15cm的标定纸（见下图），贴在平整的地面上，相机必须能够完全看到标定纸中的方格，为消除畸变对相机的影响，在使用前需要相对相机进行标定，由于相机的透镜影响，以及相机在机械组装过程中的误差会使得光线穿过透镜投影到成像面时位置会发生变化。由透镜引起的畸变称之为“径向畸变”。在实际拍摄中径向畸变会使得一条直线在图片中变为曲线。通常分为桶形畸变和枕形畸变，目前标定摄像头主要为消除桶形畸变，如下图，左侧是标定后，右侧是未标定过的。&lt;br /&gt;
[[文件:标定纸.png|无|有框|15*15标定纸]][[文件:标定.png|836x836像素]]&lt;br /&gt;
&lt;br /&gt;
（2）. 打开Detour.exe，打开车体编辑器，添加下视摄像头，选择该组件，名称改成”maincam”和medulla加载的名称一致即可，修改相机和雷达的位置，使其和机械设计的真实位置一致&lt;br /&gt;
[[文件:Detour参数.png|无框|941x941像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（3）. 点击动作-双击捕捉即可看到相机画面，再双击校准，我们进行标定工作，这块需要很有耐心。&lt;br /&gt;
[[文件:标定1.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（4）打开校准的界面后，我们可以看到相机画面以及标定线，点击修改校准点，然后，鼠标依次对着标定值黑色的方框点，从左到右把点标记，如下图&lt;br /&gt;
[[文件:标定-2.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''一定要耐心，5分钟内就可以标定好，标定完成后会提示准备就绪，可以观察右下角的提示，可以知道目前正在标定哪一个点。标定完成后，左下角会有“就绪”的提示。''&lt;br /&gt;
[[文件:标定3.png|无|缩略图|513x513像素]]&lt;br /&gt;
（5）标定好后，我们选择摄像头，选择”保存校准数据”，然后再点击”校准数据另存为”保存到Detour目录下即可，然后保存下导航配置&lt;br /&gt;
[[文件:标定保存.png|无|有框]]''&amp;lt;big&amp;gt;'''注意：如果涉及到多个车，需要用同一个位置的地纹标定纸来进行标定'''&amp;lt;/big&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
= 7.地纹地图录制 =&lt;br /&gt;
&lt;br /&gt;
==== 1，建图方式 ====&lt;br /&gt;
&lt;br /&gt;
* 纯地纹建图--------大场景施工繁琐，耗时耗力&lt;br /&gt;
* 激光+地纹建图----施工方便&lt;br /&gt;
&lt;br /&gt;
(1)纯地纹建图，需要地面做标记，可以墨斗弹线/铺设标定线，目的是为了修图，因为纹理录的过程中会有误差，所以通过标定线来有目标性的进行图优化，可以看图6.1.1以及图6.1.2通过优化可以保证所有帧中的标定线处于同一水平，&lt;br /&gt;
[[文件:地纹地面弹线.png|无|有框|地面5mm标定线]]&lt;br /&gt;
[[文件:地纹纹理11.png|无|有框|6.1.1 连续录制的地面纹理地图-未修图]]&lt;br /&gt;
[[文件:E124eba91f7b7a4c8a707a412cf6ddb.png|无|缩略图|965x965像素|6.1.2 连续录制的地面纹理地图-修图后]]&lt;br /&gt;
（2）激光+地纹，是指在提前录制好激光地图的基础上，录制地纹，这个情况可以不需要标定线，但是有标定线也可以更方便的辅助修图。&lt;br /&gt;
[[文件:激光+地纹.png|无|有框|链接=文件:激光_地纹.png]]&lt;br /&gt;
&lt;br /&gt;
==== 2,开始建图 ====&lt;br /&gt;
1. 打开Detour.exe，选择里程计-添加里程计-地面纹理导航&lt;br /&gt;
[[文件:Detour-添加地纹里程计.png|无|缩略图|547x547像素]]&lt;br /&gt;
2. 点击地面纹理导航，添加图层，默认ground名称即可，这步结束后，保存下导航配置&lt;br /&gt;
[[文件:地纹里程计2.png|无|缩略图|547x547像素]]&lt;br /&gt;
3. 保存导航配置后，关闭detour，若使用多个传感器，如“激光+地纹”，需打开detour.json，找到useTC，设置为true。重启下detour,这时候就可以看到小车下有地面的图像了&lt;br /&gt;
[[文件:地纹里程计3.png|无|有框]]&lt;br /&gt;
4. 点击自动更新图层即可开启建图模式，对于纯纹理导航，需要按照标线遥控小车，把对应位置纹理录进去，对于激光+地纹，可以直接下发激光路径，在走激光的时候录制地纹地图。&lt;br /&gt;
[[文件:更新.png|无|有框]]&lt;br /&gt;
注意：激光+地纹录制的时候，我们需要注意按照以下步骤&lt;br /&gt;
&lt;br /&gt;
（1）保证AGV行驶激光路径精度正常，比如一条10米直线，AGV行驶过程整体行驶姿态误差都较为稳定&lt;br /&gt;
&lt;br /&gt;
（2）关闭图优化，取消勾选，会使得地纹关键帧停留在原始位置上不动&lt;br /&gt;
[[文件:9906be627cab3cbfb3d49d0f6a38747.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
（3）Simple下发一段路径，同时开启地纹自动更新图层，即可开启纹理录制了&lt;br /&gt;
&lt;br /&gt;
（4）每隔一段距离，锁一下最后一个关键帧，再开启图优化，就会把之前建的纹理图给优化好。然后再关闭，再走，走完后再锁一个关键帧.......以此类推。&lt;br /&gt;
&lt;br /&gt;
（5）录好后锁定图层，然后另存图层，保存导航配置即可，这样下次打开detour会自动加载地纹图层&lt;br /&gt;
&lt;br /&gt;
= 8.注意点 =&lt;br /&gt;
1，若使用激光+地纹方案，Detour中激光以及纹理相机的xyth需要按照实际物理位置填写，车体运动中心为坐标原点，前进方向为x正，前进方向左侧y正&lt;br /&gt;
&lt;br /&gt;
2，由于地纹相机实时性比较高因此，不同雷达配合地纹使用需要修改time_bias_ms，镭神3d激光相比较相机大概延迟100ms左右，因此我们需要把相机的time_bias_ms改成-100&lt;br /&gt;
&lt;br /&gt;
[[文件:Maincam.png|无框]]&lt;br /&gt;
&lt;br /&gt;
3，fitTCfactor参数可以配置多传感器耦合的权重，越低则代表该传感器越不重要&lt;br /&gt;
&lt;br /&gt;
4，实际使用中，可能需要用到相机校准中的“反转和旋转功能”，在进行建图时，若出现车辆在地图中的移动情况与实际情况不一致，需使用“反转和旋转功能”使运动与建图情况一致。例如车往x正方向走，地纹图层应与车辆运动轨迹一致，若出现地纹图层以车为原点向x正方向延申，表示此时地纹里程计方向错误，需要点击“反转和旋转”中的横向翻转。&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=157</id>
		<title>使用手册 - 激光＋纹理导航</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=157"/>
		<updated>2023-10-13T06:44:38Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1.什么是纹理导航？ =&lt;br /&gt;
一种基于地面图像纹理的视觉导航方法。硬件上由下视摄像头，补光灯(对光线有一定要求)等组成。纹理导航利用地面丰富的纹理信息，基于相位相关法和极坐标转换来计算出两图间的位移和旋转，对比地图已知的绝对坐标获取当前位置。&lt;br /&gt;
&lt;br /&gt;
不需对地面进行额外处理，无需安装反射板、磁条等，确保灵活性及扩展性。该方案性价比高、无需改造现场环境、施工周期短、能适应复杂应用场景。&lt;br /&gt;
&lt;br /&gt;
= 2.纹理导航适用的场景 =&lt;br /&gt;
纹理导航适用于一些特定的环境场景，其中地面或环境中存在明显的纹理特征，如金刚砂硬化地坪，普通水泥地坪，瓷砖地坪，车间铺设重复纹理的地板，且地板纹理重复度大于相机视野即可，&amp;lt;u&amp;gt;且多灰尘，油污等，地面纹理极少，且经常变化&amp;lt;/u&amp;gt;，不适合使用纹理导航&lt;br /&gt;
&lt;br /&gt;
1，金刚砂硬化地坪，有反光但纹理清晰。需要注意补光[[文件:金刚砂.jpg|某现场金刚砂地面环境|缩略图|542x542像素|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:金刚砂地面.png|常规的金刚砂地面 |无|有框]]2，瓷砖地面，有反光，纹理清晰。亮色系，补光容易。要求瓷砖尺寸&amp;gt;视觉相机视野（15*15cm）[[文件:瓷砖地面.png|某酒店地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地面-总.png|常见的瓷砖地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地纹.png|瓷砖地面纹理地图|有框|无]]3，普通水泥，补光容易，纹理清晰[[文件:水泥地面.png|普通水泥|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 3.纹理导航不适用的场景 =&lt;br /&gt;
不适用地面：地面反光且无纹理或纹理特征不明显的场地，不适用。&lt;br /&gt;
&lt;br /&gt;
A. 纹理没有或者极少，相机获取不到纹理特征，理论上无法实现。&lt;br /&gt;
&lt;br /&gt;
B. 打光困难，地面反光获取特征不是地面的真实情况，算法无法消除。&lt;br /&gt;
&lt;br /&gt;
C. 地面磨损，纹理极容易被损坏。&lt;br /&gt;
&lt;br /&gt;
D. 灰尘油污大的场地，地面纹理特征不稳定，经常变化，如室外泥泞环境。需要增加外部可靠纹理，保证导航稳定性能。&lt;br /&gt;
&lt;br /&gt;
E. 少纹理或者重复小纹理地面，例如载货电梯内部地面。需要增加外部标识，使纹理特征大于相机视野（15*15cm）&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
1，环氧地坪，补光困难，初期缺少视觉纹理导航必须的地面纹理。地面容易划伤，纹理不稳定。[[文件:环氧地坪.png|环氧地坪图片|有框|无]]2，重复小纹理地面，纹理特征不明显[[文件:扶梯地面.png|扶梯地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 4.纹理导航相比较SLAM的优缺点 =&lt;br /&gt;
纹理导航和SLAM是两种不同的导航方法，各自具有优缺点，适用于不同的应用场景&lt;br /&gt;
&lt;br /&gt;
'''优点'''&lt;br /&gt;
* 简单实时性：纹理导航实现简单，通常具有较好的实时性，适用于对实时性要求较高的应用。&lt;br /&gt;
* 成本较低：相对于SLAM需要的昂贵传感器，纹理导航通常可以通过普通的相机或传感器实现，降低了系统成本。&lt;br /&gt;
* 适用广泛：适用于各类有明显地面纹理的场所。&lt;br /&gt;
* 相比较SLAM精度更稳定&lt;br /&gt;
'''缺点'''&lt;br /&gt;
* 局部信息：纹理导航一般只能提供相对局部的信息，不能构建全局一致的地图，因此适用于需要全局感知的场景有限。&lt;br /&gt;
* 对地面特征依赖性强：纹理导航依赖于地面的特征，如果地面特征变化或受到遮挡，可能会影响导航的准确性。&lt;br /&gt;
* 大场景建图耗时，需要地面弹线，修图，相比较slam实施较为耗时，麻烦。&lt;br /&gt;
&lt;br /&gt;
= 5.纹理相机设计安装要求 =&lt;br /&gt;
1，相机安装务必设计在车体运动中心-（越偏心安装会降低稳定性，导致车体晃动时可能造成脱轨，纹理相机视野15cm*15cm较小）&lt;br /&gt;
&lt;br /&gt;
2，有可高度的活动支架&lt;br /&gt;
&lt;br /&gt;
3，有较好的补光机构&lt;br /&gt;
&lt;br /&gt;
= 6.使用纹理导航前的准备工作 =&lt;br /&gt;
&lt;br /&gt;
==== 1．'''准备工作''' ====&lt;br /&gt;
1. 配置Medulla startup保证可以读取到相机图像数据，加载MVCamera.dll，如下方式&lt;br /&gt;
&lt;br /&gt;
mv=io load plugins/MVCamera.dll&lt;br /&gt;
&lt;br /&gt;
maincam=mv initMono MG010  //MG010为该相机型号&lt;br /&gt;
&lt;br /&gt;
打开Medulla.exe后就可以看到图像此准备工作完成&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image1.png|无框|658x658像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour根目录下需要有regcore_cuda和cufft64库文件&lt;br /&gt;
&lt;br /&gt;
2. 修改相机曝光参数，此处我们以海康相机为例，打开相机MVS软件，选择对应网卡的相机，双击，启动相机，就可以看到画面了，然后再右侧栏目中，调节相机的亮度和曝光即可，保证能够清晰的看到地面纹理即可,&lt;br /&gt;
[[文件:Cas.png|无|缩略图|656x656像素|海康MVS软件]]&lt;br /&gt;
在这个过程中我们需要保证曝光均匀，需要设计一个合理的曝光结构，如下图&lt;br /&gt;
&lt;br /&gt;
[[文件:纹理.png|无框|661x661像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. 标定相机&lt;br /&gt;
&lt;br /&gt;
（1）. 准备15cm*15cm的标定纸（见下图），贴在平整的地面上，相机必须能够完全看到标定纸中的方格，为消除畸变对相机的影响，在使用前需要相对相机进行标定，由于相机的透镜影响，以及相机在机械组装过程中的误差会使得光线穿过透镜投影到成像面时位置会发生变化。由透镜引起的畸变称之为“径向畸变”。在实际拍摄中径向畸变会使得一条直线在图片中变为曲线。通常分为桶形畸变和枕形畸变，目前标定摄像头主要为消除桶形畸变，如下图，左侧是标定后，右侧是未标定过的。&lt;br /&gt;
[[文件:标定纸.png|无|有框|15*15标定纸]][[文件:标定.png|836x836像素]]&lt;br /&gt;
&lt;br /&gt;
（2）. 打开Detour.exe，打开车体编辑器，添加下视摄像头，选择该组件，名称改成”maincam”和medulla加载的名称一致即可，修改相机和雷达的位置，使其和机械设计的真实位置一致&lt;br /&gt;
[[文件:Detour参数.png|无框|941x941像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（3）. 点击动作-双击捕捉即可看到相机画面，再双击校准，我们进行标定工作，这块需要很有耐心。&lt;br /&gt;
[[文件:标定1.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（4）打开校准的界面后，我们可以看到相机画面以及标定线，点击修改校准点，然后，鼠标依次对着标定值黑色的方框点，从左到右把点标记，如下图&lt;br /&gt;
[[文件:标定-2.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''一定要耐心，5分钟内就可以标定好，标定完成后会提示准备就绪，可以观察右下角的提示，可以知道目前正在标定哪一个点''&lt;br /&gt;
[[文件:标定3.png|无|缩略图|513x513像素]]&lt;br /&gt;
（5）标定好后，我们选择摄像头，选择”保存校准数据”，然后再点击”校准数据另存为”保存到Detour目录下即可，然后保存下导航配置&lt;br /&gt;
[[文件:标定保存.png|无|有框]]''&amp;lt;big&amp;gt;'''注意：如果涉及到多个车，需要用同一个位置的地纹标定纸来进行标定'''&amp;lt;/big&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
= 7.地纹地图录制 =&lt;br /&gt;
&lt;br /&gt;
==== 1，建图方式 ====&lt;br /&gt;
&lt;br /&gt;
* 纯地纹建图--------大场景施工繁琐，耗时耗力&lt;br /&gt;
* 激光+地纹建图----施工方便&lt;br /&gt;
&lt;br /&gt;
(1)纯地纹建图，需要地面做标记，可以墨斗弹线/铺设标定线，目的是为了修图，因为纹理录的过程中会有误差，所以通过标定线来有目标性的进行图优化，可以看图6.1.1以及图6.1.2通过优化可以保证所有帧中的标定线处于同一水平，&lt;br /&gt;
[[文件:地纹地面弹线.png|无|有框|地面5mm标定线]]&lt;br /&gt;
[[文件:地纹纹理11.png|无|有框|6.1.1 连续录制的地面纹理地图-未修图]]&lt;br /&gt;
[[文件:E124eba91f7b7a4c8a707a412cf6ddb.png|无|缩略图|965x965像素|6.1.2 连续录制的地面纹理地图-修图后]]&lt;br /&gt;
（2）激光+地纹，是指在提前录制好激光地图的基础上，录制地纹，这个情况可以不需要标定线，但是有标定线也可以更方便的辅助修图。&lt;br /&gt;
[[文件:激光+地纹.png|无|有框|链接=文件:激光_地纹.png]]&lt;br /&gt;
&lt;br /&gt;
==== 2,开始建图 ====&lt;br /&gt;
1. 打开Detour.exe，选择里程计-添加里程计-地面纹理导航&lt;br /&gt;
[[文件:Detour-添加地纹里程计.png|无|缩略图|547x547像素]]&lt;br /&gt;
2. 点击地面纹理导航，添加图层，默认ground名称即可，这步结束后，保存下导航配置&lt;br /&gt;
[[文件:地纹里程计2.png|无|缩略图|547x547像素]]&lt;br /&gt;
3. 保存导航配置后，重启下detour,这时候就可以看到小车下有地面的图像了&lt;br /&gt;
[[文件:地纹里程计3.png|无|有框]]&lt;br /&gt;
4. 点击自动更新图层即可开启建图模式，对于纯纹理导航，需要按照标线遥控小车，把对应位置纹理录进去，对于激光+地纹，可以直接下发激光路径，在走激光的时候录制地纹地图。&lt;br /&gt;
[[文件:更新.png|无|有框]]&lt;br /&gt;
注意：激光+地纹录制的时候，我们需要注意按照以下步骤&lt;br /&gt;
&lt;br /&gt;
（1）保证AGV行驶激光路径精度正常，比如一条10米直线，AGV行驶过程整体行驶姿态误差都较为稳定&lt;br /&gt;
&lt;br /&gt;
（2）关闭图优化，取消勾选，会使得地纹关键帧停留在原始位置上不动&lt;br /&gt;
[[文件:9906be627cab3cbfb3d49d0f6a38747.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
（3）Simple下发一段路径，同时开启地纹自动更新图层，即可开启纹理录制了&lt;br /&gt;
&lt;br /&gt;
（4）每隔一段距离，锁一下最后一个关键帧，再开启图优化，就会把之前建的纹理图给优化好。然后再关闭，再走，走完后再锁一个关键帧.......以此类推。&lt;br /&gt;
&lt;br /&gt;
（5）录好后锁定图层，然后另存图层，保存导航配置即可，这样下次打开detour会自动加载地纹图层&lt;br /&gt;
&lt;br /&gt;
= 8.注意点 =&lt;br /&gt;
1，若使用激光+地纹方案，Detour中激光以及纹理相机的xyth需要按照实际物理位置填写，车体运动中心为坐标原点，前进方向为x正，前进方向左侧y正&lt;br /&gt;
&lt;br /&gt;
2，由于地纹相机实时性比较高因此，不同雷达配合地纹使用需要修改time_bias_ms，镭神3d激光相比较相机大概延迟100ms左右，因此我们需要把相机的time_bias_ms改成-100&lt;br /&gt;
&lt;br /&gt;
[[文件:Maincam.png|无框]]&lt;br /&gt;
&lt;br /&gt;
3，fitTCfactor参数可以配置多传感器耦合的权重，越低则代表该传感器越不重要&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=156</id>
		<title>使用手册 - 激光＋纹理导航</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=156"/>
		<updated>2023-10-13T06:38:16Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​/* 6.使用纹理导航前的准备工作 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1.什么是纹理导航？ =&lt;br /&gt;
一种基于地面图像纹理的视觉导航方法。硬件上由下视摄像头，补光灯(对光线有一定要求)等组成。纹理导航利用地面丰富的纹理信息，基于相位相关法和极坐标转换来计算出两图间的位移和旋转，对比地图已知的绝对坐标获取当前位置。&lt;br /&gt;
&lt;br /&gt;
不需对地面进行额外处理，无需安装反射板、磁条等，确保灵活性及扩展性。该方案性价比高、无需改造现场环境、施工周期短、能适应复杂应用场景。&lt;br /&gt;
&lt;br /&gt;
= 2.纹理导航适用的场景 =&lt;br /&gt;
纹理导航适用于一些特定的环境场景，其中地面或环境中存在明显的纹理特征，如金刚砂硬化地坪，普通水泥地坪，瓷砖地坪，车间铺设重复纹理的地板，且地板纹理重复度大于相机视野即可，&amp;lt;u&amp;gt;且多灰尘，油污等，地面纹理极少，且经常变化&amp;lt;/u&amp;gt;，不适合使用纹理导航&lt;br /&gt;
&lt;br /&gt;
1，金刚砂硬化地坪，有反光但纹理清晰。需要注意补光[[文件:金刚砂.jpg|某现场金刚砂地面环境|缩略图|542x542像素|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:金刚砂地面.png|常规的金刚砂地面 |无|有框]]2，瓷砖地面，有反光，纹理清晰。亮色系，补光容易。要求瓷砖尺寸&amp;gt;视觉相机视野（15*15cm）[[文件:瓷砖地面.png|某酒店地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地面-总.png|常见的瓷砖地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地纹.png|瓷砖地面纹理地图|有框|无]]3，普通水泥，补光容易，纹理清晰[[文件:水泥地面.png|普通水泥|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 3.纹理导航不适用的场景 =&lt;br /&gt;
不适用地面：地面反光且无纹理或纹理特征不明显的场地，不适用。&lt;br /&gt;
&lt;br /&gt;
A. 纹理没有或者极少，相机获取不到纹理特征，理论上无法实现。&lt;br /&gt;
&lt;br /&gt;
B. 打光困难，地面反光获取特征不是地面的真实情况，算法无法消除。&lt;br /&gt;
&lt;br /&gt;
C. 地面磨损，纹理极容易被损坏。&lt;br /&gt;
&lt;br /&gt;
D. 灰尘油污大的场地，地面纹理特征不稳定，经常变化，如室外泥泞环境。需要增加外部可靠纹理，保证导航稳定性能。&lt;br /&gt;
&lt;br /&gt;
E. 少纹理或者重复小纹理地面，例如载货电梯内部地面。需要增加外部标识，使纹理特征大于相机视野（15*15cm）&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
1，环氧地坪，补光困难，初期缺少视觉纹理导航必须的地面纹理。地面容易划伤，纹理不稳定。[[文件:环氧地坪.png|环氧地坪图片|有框|无]]2，重复小纹理地面，纹理特征不明显[[文件:扶梯地面.png|扶梯地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 4.纹理导航相比较SLAM的优缺点 =&lt;br /&gt;
纹理导航和SLAM是两种不同的导航方法，各自具有优缺点，适用于不同的应用场景&lt;br /&gt;
&lt;br /&gt;
'''优点'''&lt;br /&gt;
* 简单实时性：纹理导航实现简单，通常具有较好的实时性，适用于对实时性要求较高的应用。&lt;br /&gt;
* 成本较低：相对于SLAM需要的昂贵传感器，纹理导航通常可以通过普通的相机或传感器实现，降低了系统成本。&lt;br /&gt;
* 适用广泛：适用于各类有明显地面纹理的场所。&lt;br /&gt;
* 相比较SLAM精度更稳定&lt;br /&gt;
'''缺点'''&lt;br /&gt;
* 局部信息：纹理导航一般只能提供相对局部的信息，不能构建全局一致的地图，因此适用于需要全局感知的场景有限。&lt;br /&gt;
* 对地面特征依赖性强：纹理导航依赖于地面的特征，如果地面特征变化或受到遮挡，可能会影响导航的准确性。&lt;br /&gt;
* 大场景建图耗时，需要地面弹线，修图，相比较slam实施较为耗时，麻烦。&lt;br /&gt;
&lt;br /&gt;
= 5.纹理相机设计安装要求 =&lt;br /&gt;
1，相机安装务必设计在车体运动中心-（越偏心安装会降低稳定性，导致车体晃动时可能造成脱轨，纹理相机视野15cm*15cm较小）&lt;br /&gt;
&lt;br /&gt;
2，有可高度的活动支架&lt;br /&gt;
&lt;br /&gt;
3，有较好的补光机构&lt;br /&gt;
&lt;br /&gt;
= 6.使用纹理导航前的准备工作 =&lt;br /&gt;
&lt;br /&gt;
==== 1．'''准备工作''' ====&lt;br /&gt;
1. 配置Medulla startup保证可以读取到相机图像数据，加载MVCamera.dll，如下方式&lt;br /&gt;
&lt;br /&gt;
mv=io load plugins/MVCamera.dll&lt;br /&gt;
&lt;br /&gt;
maincam=mv initMono MG010  //MG010为该相机型号&lt;br /&gt;
&lt;br /&gt;
打开Medulla.exe后就可以看到图像此准备工作完成&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image1.png|无框|658x658像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour根目录下需要有regcore_cuda和cufft64库文件&lt;br /&gt;
&lt;br /&gt;
2. 修改相机曝光参数，此处我们以海康相机为例，打开相机MVS软件，选择对应网卡的相机，双击，启动相机，就可以看到画面了，然后再右侧栏目中，调节相机的亮度和曝光即可，保证能够清晰的看到地面纹理即可,&lt;br /&gt;
[[文件:Cas.png|无|缩略图|656x656像素|海康MVS软件]]&lt;br /&gt;
在这个过程中我们需要保证曝光均匀，需要设计一个合理的曝光结构，如下图&lt;br /&gt;
&lt;br /&gt;
[[文件:纹理.png|无框|661x661像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. 标定相机&lt;br /&gt;
&lt;br /&gt;
（1）. 准备15cm*15cm的标定纸（见下图），贴在平整的地面上，相机必须能够完全看到标定纸中的方格，为消除畸变对相机的影响，在使用前需要相对相机进行标定，由于相机的透镜影响，以及相机在机械组装过程中的误差会使得光线穿过透镜投影到成像面时位置会发生变化。由透镜引起的畸变称之为“径向畸变”。在实际拍摄中径向畸变会使得一条直线在图片中变为曲线。通常分为桶形畸变和枕形畸变，目前标定摄像头主要为消除桶形畸变，如下图，左侧是标定后，右侧是未标定过的。&lt;br /&gt;
[[文件:标定纸.png|无|有框|15*15标定纸]][[文件:标定.png|836x836像素]]&lt;br /&gt;
&lt;br /&gt;
（2）. 打开Detour.exe，打开车体编辑器，添加下视摄像头，选择该组件，名称改成”maincam”和medulla加载的名称一致即可，修改相机和雷达的位置，使其和机械设计的真实位置一致&lt;br /&gt;
[[文件:Detour参数.png|无框|941x941像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（3）. 点击动作-双击捕捉即可看到相机画面，再双击校准，我们进行标定工作，这块需要很有耐心。&lt;br /&gt;
[[文件:标定1.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（4）打开校准的界面后，我们可以看到相机画面以及标定线，点击修改校准点，然后，鼠标依次对着标定值黑色的方框点，从左到右把点标记，如下图&lt;br /&gt;
[[文件:标定-2.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''一定要耐心，5分钟内就可以标定好，标定完成后会提示准备就绪，可以观察右下角的提示，可以知道目前正在标定哪一个点''&lt;br /&gt;
[[文件:标定3.png|无|缩略图|513x513像素]]&lt;br /&gt;
（5）标定好后，我们选择摄像头，选择”保存校准数据”，然后再点击”校准数据另存为”保存到Detour目录下即可，然后保存下导航配置&lt;br /&gt;
[[文件:标定保存.png|无|有框]]''&amp;lt;big&amp;gt;'''注意：如果涉及到多个车，需要用同一个位置的地纹标定纸来进行标定'''&amp;lt;/big&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
= 7.地纹地图录制 =&lt;br /&gt;
&lt;br /&gt;
==== 1，建图方式 ====&lt;br /&gt;
&lt;br /&gt;
* 纯地纹建图--------大场景施工繁琐，耗时耗力&lt;br /&gt;
* 激光+地纹建图----施工方便&lt;br /&gt;
&lt;br /&gt;
(1)纯地纹建图，需要地面做标记，可以墨斗弹线/铺设标定线，目的是为了修图，因为纹理录的过程中会有误差，所以通过标定线来有目标性的进行图优化，可以看图6.1.1以及图6.1.2通过优化可以保证所有帧中的标定线处于同一水平，&lt;br /&gt;
[[文件:地纹地面弹线.png|无|有框|地面5mm标定线]]&lt;br /&gt;
[[文件:地纹纹理11.png|无|有框|6.1.1 连续录制的地面纹理地图-未修图]]&lt;br /&gt;
[[文件:E124eba91f7b7a4c8a707a412cf6ddb.png|无|缩略图|965x965像素|6.1.2 连续录制的地面纹理地图-修图后]]&lt;br /&gt;
（2）激光+地纹，是指在提前录制好激光地图的基础上，录制地纹，这个情况可以不需要标定线，但是有标定线也可以更方便的辅助修图。&lt;br /&gt;
[[文件:激光+地纹.png|无|有框|链接=文件:激光_地纹.png]]&lt;br /&gt;
&lt;br /&gt;
==== 2,开始建图 ====&lt;br /&gt;
1. 打开Detour.exe，选择里程计-添加里程计-地面纹理导航&lt;br /&gt;
[[文件:Detour-添加地纹里程计.png|无|缩略图|547x547像素]]&lt;br /&gt;
2. 点击地面纹理导航，添加图层，默认ground名称即可，这步结束后，保存下导航配置&lt;br /&gt;
[[文件:地纹里程计2.png|无|缩略图|547x547像素]]&lt;br /&gt;
3. 保存导航配置后，重启下detour,这时候就可以看到小车下有地面的图像了&lt;br /&gt;
[[文件:地纹里程计3.png|无|有框]]&lt;br /&gt;
4. 点击自动更新图层即可开启建图模式，对于纯纹理导航，需要按照标线遥控小车，把对应位置纹理录进去，对于激光+地纹，可以直接下发激光路径，在走激光的时候录制地纹地图。&lt;br /&gt;
[[文件:更新.png|无|有框]]&lt;br /&gt;
注意：激光+地纹录制的时候，我们需要注意按照以下步骤&lt;br /&gt;
&lt;br /&gt;
（1）保证AGV行驶激光路径精度正常，比如一条10米直线，AGV行驶过程整体行驶姿态误差都较为稳定&lt;br /&gt;
&lt;br /&gt;
（2）关闭图优化，取消勾选，会使得地纹关键帧停留在原始位置上不动&lt;br /&gt;
[[文件:9906be627cab3cbfb3d49d0f6a38747.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（3）每隔一段距离，锁一下最后一个关键帧，再开启图优化，就会把之前建的纹理图给优化好。然后再关闭，再走，走完后再锁一个关键帧.......以此类推。&lt;br /&gt;
&lt;br /&gt;
（4）录好后锁定图层，然后另存图层，保存导航配置即可，这样下次打开detour会自动加载地纹图层&lt;br /&gt;
&lt;br /&gt;
= 8.注意点 =&lt;br /&gt;
1，若使用激光+地纹方案，Detour中激光以及纹理相机的xyth需要按照实际物理位置填写，车体运动中心为坐标原点，前进方向为x正，前进方向左侧y正&lt;br /&gt;
&lt;br /&gt;
2，由于地纹相机实时性比较高因此，不同雷达配合地纹使用需要修改time_bias_ms，镭神3d激光相比较相机大概延迟100ms左右，因此我们需要把相机的time_bias_ms改成-100&lt;br /&gt;
&lt;br /&gt;
[[文件:Maincam.png|无框]]&lt;br /&gt;
&lt;br /&gt;
3，fitTCfactor参数可以配置多传感器耦合的权重，越低则代表该传感器越不重要&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=155</id>
		<title>使用手册 - 激光＋纹理导航</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=155"/>
		<updated>2023-10-13T06:28:06Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1.什么是纹理导航？ =&lt;br /&gt;
一种基于地面图像纹理的视觉导航方法。硬件上由下视摄像头，补光灯(对光线有一定要求)等组成。纹理导航利用地面丰富的纹理信息，基于相位相关法和极坐标转换来计算出两图间的位移和旋转，对比地图已知的绝对坐标获取当前位置。&lt;br /&gt;
&lt;br /&gt;
不需对地面进行额外处理，无需安装反射板、磁条等，确保灵活性及扩展性。该方案性价比高、无需改造现场环境、施工周期短、能适应复杂应用场景。&lt;br /&gt;
&lt;br /&gt;
= 2.纹理导航适用的场景 =&lt;br /&gt;
纹理导航适用于一些特定的环境场景，其中地面或环境中存在明显的纹理特征，如金刚砂硬化地坪，普通水泥地坪，瓷砖地坪，车间铺设重复纹理的地板，且地板纹理重复度大于相机视野即可，&amp;lt;u&amp;gt;且多灰尘，油污等，地面纹理极少，且经常变化&amp;lt;/u&amp;gt;，不适合使用纹理导航&lt;br /&gt;
&lt;br /&gt;
1，金刚砂硬化地坪，有反光但纹理清晰。需要注意补光[[文件:金刚砂.jpg|某现场金刚砂地面环境|缩略图|542x542像素|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:金刚砂地面.png|常规的金刚砂地面 |无|有框]]2，瓷砖地面，有反光，纹理清晰。亮色系，补光容易。要求瓷砖尺寸&amp;gt;视觉相机视野（15*15cm）[[文件:瓷砖地面.png|某酒店地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地面-总.png|常见的瓷砖地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地纹.png|瓷砖地面纹理地图|有框|无]]3，普通水泥，补光容易，纹理清晰[[文件:水泥地面.png|普通水泥|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 3.纹理导航不适用的场景 =&lt;br /&gt;
不适用地面：地面反光且无纹理或纹理特征不明显的场地，不适用。&lt;br /&gt;
&lt;br /&gt;
A. 纹理没有或者极少，相机获取不到纹理特征，理论上无法实现。&lt;br /&gt;
&lt;br /&gt;
B. 打光困难，地面反光获取特征不是地面的真实情况，算法无法消除。&lt;br /&gt;
&lt;br /&gt;
C. 地面磨损，纹理极容易被损坏。&lt;br /&gt;
&lt;br /&gt;
D. 灰尘油污大的场地，地面纹理特征不稳定，经常变化，如室外泥泞环境。需要增加外部可靠纹理，保证导航稳定性能。&lt;br /&gt;
&lt;br /&gt;
E. 少纹理或者重复小纹理地面，例如载货电梯内部地面。需要增加外部标识，使纹理特征大于相机视野（15*15cm）&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
1，环氧地坪，补光困难，初期缺少视觉纹理导航必须的地面纹理。地面容易划伤，纹理不稳定。[[文件:环氧地坪.png|环氧地坪图片|有框|无]]2，重复小纹理地面，纹理特征不明显[[文件:扶梯地面.png|扶梯地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 4.纹理导航相比较SLAM的优缺点 =&lt;br /&gt;
纹理导航和SLAM是两种不同的导航方法，各自具有优缺点，适用于不同的应用场景&lt;br /&gt;
&lt;br /&gt;
'''优点'''&lt;br /&gt;
* 简单实时性：纹理导航实现简单，通常具有较好的实时性，适用于对实时性要求较高的应用。&lt;br /&gt;
* 成本较低：相对于SLAM需要的昂贵传感器，纹理导航通常可以通过普通的相机或传感器实现，降低了系统成本。&lt;br /&gt;
* 适用广泛：适用于各类有明显地面纹理的场所。&lt;br /&gt;
* 相比较SLAM精度更稳定&lt;br /&gt;
'''缺点'''&lt;br /&gt;
* 局部信息：纹理导航一般只能提供相对局部的信息，不能构建全局一致的地图，因此适用于需要全局感知的场景有限。&lt;br /&gt;
* 对地面特征依赖性强：纹理导航依赖于地面的特征，如果地面特征变化或受到遮挡，可能会影响导航的准确性。&lt;br /&gt;
* 大场景建图耗时，需要地面弹线，修图，相比较slam实施较为耗时，麻烦。&lt;br /&gt;
&lt;br /&gt;
= 5.纹理相机设计安装要求 =&lt;br /&gt;
1，相机安装务必设计在车体运动中心-（越偏心安装会降低稳定性，导致车体晃动时可能造成脱轨，纹理相机视野15cm*15cm较小）&lt;br /&gt;
&lt;br /&gt;
2，有可高度的活动支架&lt;br /&gt;
&lt;br /&gt;
3，有较好的补光机构&lt;br /&gt;
&lt;br /&gt;
= 6.使用纹理导航前的准备工作 =&lt;br /&gt;
&lt;br /&gt;
==== 1．'''准备工作''' ====&lt;br /&gt;
1. 配置Medulla startup保证可以读取到相机图像数据，加载MVCamera.dll，如下方式&lt;br /&gt;
&lt;br /&gt;
mv=io load plugins/MVCamera.dll&lt;br /&gt;
&lt;br /&gt;
maincam=mv initMono MG010  //MG010为该相机型号&lt;br /&gt;
&lt;br /&gt;
打开Medulla.exe后就可以看到图像此准备工作完成&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image1.png|无框|658x658像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour根目录下需要有regcore_cuda和cufft64库文件&lt;br /&gt;
&lt;br /&gt;
2. 修改相机曝光参数，此处我们以海康相机为例，打开相机MVS软件，选择对应网卡的相机，双击，启动相机，就可以看到画面了，然后再右侧栏目中，调节相机的亮度和曝光即可，保证能够清晰的看到地面纹理即可,&lt;br /&gt;
[[文件:Cas.png|无|缩略图|656x656像素|海康MVS软件]]&lt;br /&gt;
在这个过程中我们需要保证曝光均匀，需要设计一个合理的曝光结构，如下图&lt;br /&gt;
&lt;br /&gt;
[[文件:纹理.png|无框|661x661像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. 标定相机&lt;br /&gt;
&lt;br /&gt;
（1）. 准备15cm*15cm的标定纸（见下图），贴在平整的地面上，相机必须能够完全看到标定纸中的方格，为消除畸变对相机的影响，在使用前需要相对相机进行标定，由于相机的透镜影响，以及相机在机械组装过程中的误差会使得光线穿过透镜投影到成像面时位置会发生变化。由透镜引起的畸变称之为“径向畸变”。在实际拍摄中径向畸变会使得一条直线在图片中变为曲线。通常分为桶形畸变和枕形畸变，目前标定摄像头主要为消除桶形畸变，如下图，左侧是标定后，右侧是未标定过的。&lt;br /&gt;
[[文件:标定纸.png|无|有框|15*15标定纸]][[文件:标定.png|836x836像素]]&lt;br /&gt;
&lt;br /&gt;
（2）. 打开Detour.exe，打开车体编辑器，添加下视摄像头，选择该组件，名称改成”maincam”和medulla加载的名称一致即可，修改相机和雷达的位置，使其和机械设计的真实位置一致&lt;br /&gt;
[[文件:Detour参数.png|无框|941x941像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（3）. 点击动作-双击捕捉即可看到相机画面，再双击校准，我们进行标定工作，这块需要很有耐心。&lt;br /&gt;
[[文件:标定1.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（4）打开校准的界面后，我们可以看到相机画面以及标定线，点击修改校准点，然后，鼠标依次对着标定值黑色的方框点，从左到右把点标记，如下图&lt;br /&gt;
[[文件:标定-2.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''一定要耐心，5分钟内就可以标定好，标定完成后会提示准备就绪，可以观察右下角的提示，可以知道目前正在标定哪一个点''&lt;br /&gt;
[[文件:标定3.png|无|缩略图|513x513像素]]&lt;br /&gt;
（5）标定好后，我们选择摄像头，选择”保存校准数据”，然后再点击”校准数据另存为”保存到Detour目录下即可，然后保存下导航配置&lt;br /&gt;
[[文件:标定保存.png|无|有框]]''&amp;lt;big&amp;gt;'''注意：如果涉及到多个车，需要用同一个位置的地纹标定纸来进行标定'''&amp;lt;/big&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
= 7.地纹地图录制 =&lt;br /&gt;
&lt;br /&gt;
==== 1，建图方式 ====&lt;br /&gt;
&lt;br /&gt;
* 纯地纹建图--------大场景施工繁琐，耗时耗力&lt;br /&gt;
* 激光+地纹建图----施工方便&lt;br /&gt;
&lt;br /&gt;
(1)纯地纹建图，需要地面做标记，可以墨斗弹线/铺设标定线，目的是为了修图，因为纹理录的过程中会有误差，所以通过标定线来有目标性的进行图优化，可以看图6.1.1以及图6.1.2通过优化可以保证所有帧中的标定线处于同一水平，&lt;br /&gt;
[[文件:地纹地面弹线.png|无|有框|地面5mm标定线]]&lt;br /&gt;
[[文件:地纹纹理11.png|无|有框|6.1.1 连续录制的地面纹理地图-未修图]]&lt;br /&gt;
[[文件:E124eba91f7b7a4c8a707a412cf6ddb.png|无|缩略图|965x965像素|6.1.2 连续录制的地面纹理地图-修图后]]&lt;br /&gt;
（2）激光+地纹，是指在提前录制好激光地图的基础上，录制地纹，这个情况可以不需要标定线，但是有标定线也可以更方便的辅助修图。&lt;br /&gt;
[[文件:激光+地纹.png|无|有框|链接=文件:激光_地纹.png]]&lt;br /&gt;
&lt;br /&gt;
==== 2,开始建图 ====&lt;br /&gt;
1. 打开Detour.exe，选择里程计-添加里程计-地面纹理导航&lt;br /&gt;
[[文件:Detour-添加地纹里程计.png|无|缩略图|547x547像素]]&lt;br /&gt;
2. 点击地面纹理导航，添加图层，默认ground名称即可，这步结束后，保存下导航配置&lt;br /&gt;
[[文件:地纹里程计2.png|无|缩略图|547x547像素]]&lt;br /&gt;
3. 保存导航配置后，重启下detour,这时候就可以看到小车下有地面的图像了&lt;br /&gt;
[[文件:地纹里程计3.png|无|有框]]&lt;br /&gt;
4. 点击自动更新图层即可开启建图模式，对于纯纹理导航，需要按照标线遥控小车，把对应位置纹理录进去，对于激光+地纹，可以直接下发激光路径，在走激光的时候录制地纹地图。&lt;br /&gt;
[[文件:更新.png|无|有框]]&lt;br /&gt;
注意：激光+地纹录制的时候，我们需要注意按照以下步骤&lt;br /&gt;
&lt;br /&gt;
（1）保证AGV行驶激光路径精度正常，比如一条10米直线，AGV行驶过程整体行驶姿态误差都较为稳定&lt;br /&gt;
&lt;br /&gt;
（2）关闭图优化，取消勾选，会使得地纹关键帧停留在原始位置上不动&lt;br /&gt;
[[index.php?title=文件:9906be627cab3cbfb3d49d0f6a38747.png|链接=文件:9906be627cab3cbfb3d49d0f6a38747.png|无|有框]]&lt;br /&gt;
（3）每隔一段距离，锁一下最后一个关键帧，再开启图优化，就会把之前建的纹理图给优化好。然后再关闭，再走，走完后再锁一个关键帧.......以此类推。&lt;br /&gt;
&lt;br /&gt;
（4）录好后锁定图层，然后另存图层，保存导航配置即可，这样下次打开detour会自动加载地纹图层&lt;br /&gt;
&lt;br /&gt;
= 8.注意点 =&lt;br /&gt;
1，若使用激光+地纹方案，Detour中激光以及纹理相机的xyth需要按照实际物理位置填写，车体运动中心为坐标原点，前进方向为x正，前进方向左侧y正&lt;br /&gt;
&lt;br /&gt;
2，由于地纹相机实时性比较高因此，不同雷达配合地纹使用需要修改time_bias_ms，镭神3d激光相比较相机大概延迟100ms左右，因此我们需要把相机的time_bias_ms改成-100&lt;br /&gt;
&lt;br /&gt;
[[文件:Maincam.png|无框]]&lt;br /&gt;
&lt;br /&gt;
3，fitTCfactor参数可以配置多传感器耦合的权重，越低则代表该传感器越不重要&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=154</id>
		<title>使用手册 - 激光＋纹理导航</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=154"/>
		<updated>2023-10-13T06:24:49Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​/* 1．准备工作 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1.什么是纹理导航？ =&lt;br /&gt;
一种基于地面图像纹理的视觉导航方法。硬件上由下视摄像头，补光灯(对光线有一定要求)等组成。纹理导航利用地面丰富的纹理信息，基于相位相关法和极坐标转换来计算出两图间的位移和旋转，对比地图已知的绝对坐标获取当前位置。&lt;br /&gt;
&lt;br /&gt;
不需对地面进行额外处理，无需安装反射板、磁条等，确保灵活性及扩展性。该方案性价比高、无需改造现场环境、施工周期短、能适应复杂应用场景。&lt;br /&gt;
&lt;br /&gt;
= 2.纹理导航适用的场景 =&lt;br /&gt;
纹理导航适用于一些特定的环境场景，其中地面或环境中存在明显的纹理特征，如金刚砂硬化地坪，普通水泥地坪，瓷砖地坪，车间铺设重复纹理的地板，且地板纹理重复度大于相机视野即可，&amp;lt;u&amp;gt;且多灰尘，油污等，地面纹理极少，且经常变化&amp;lt;/u&amp;gt;，不适合使用纹理导航&lt;br /&gt;
&lt;br /&gt;
1，金刚砂硬化地坪，有反光但纹理清晰。需要注意补光[[文件:金刚砂.jpg|某现场金刚砂地面环境|缩略图|542x542像素|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:金刚砂地面.png|常规的金刚砂地面 |无|有框]]2，瓷砖地面，有反光，纹理清晰。亮色系，补光容易。要求瓷砖尺寸&amp;gt;视觉相机视野（15*15cm）[[文件:瓷砖地面.png|某酒店地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地面-总.png|常见的瓷砖地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地纹.png|瓷砖地面纹理地图|有框|无]]3，普通水泥，补光容易，纹理清晰[[文件:水泥地面.png|普通水泥|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 3.纹理导航不适用的场景 =&lt;br /&gt;
不适用地面：地面反光且无纹理或纹理特征不明显的场地，不适用。&lt;br /&gt;
&lt;br /&gt;
A. 纹理没有或者极少，相机获取不到纹理特征，理论上无法实现。&lt;br /&gt;
&lt;br /&gt;
B. 打光困难，地面反光获取特征不是地面的真实情况，算法无法消除。&lt;br /&gt;
&lt;br /&gt;
C. 地面磨损，纹理极容易被损坏。&lt;br /&gt;
&lt;br /&gt;
D. 灰尘油污大的场地，地面纹理特征不稳定，经常变化，如室外泥泞环境。需要增加外部可靠纹理，保证导航稳定性能。&lt;br /&gt;
&lt;br /&gt;
E. 少纹理或者重复小纹理地面，例如载货电梯内部地面。需要增加外部标识，使纹理特征大于相机视野（15*15cm）&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
1，环氧地坪，补光困难，初期缺少视觉纹理导航必须的地面纹理。地面容易划伤，纹理不稳定。[[文件:环氧地坪.png|环氧地坪图片|有框|无]]2，重复小纹理地面，纹理特征不明显[[文件:扶梯地面.png|扶梯地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 4.纹理导航相比较SLAM的优缺点 =&lt;br /&gt;
纹理导航和SLAM是两种不同的导航方法，各自具有优缺点，适用于不同的应用场景&lt;br /&gt;
&lt;br /&gt;
'''优点'''&lt;br /&gt;
* 简单实时性：纹理导航实现简单，通常具有较好的实时性，适用于对实时性要求较高的应用。&lt;br /&gt;
* 成本较低：相对于SLAM需要的昂贵传感器，纹理导航通常可以通过普通的相机或传感器实现，降低了系统成本。&lt;br /&gt;
* 适用广泛：适用于各类有明显地面纹理的场所。&lt;br /&gt;
* 相比较SLAM精度更稳定&lt;br /&gt;
'''缺点'''&lt;br /&gt;
* 局部信息：纹理导航一般只能提供相对局部的信息，不能构建全局一致的地图，因此适用于需要全局感知的场景有限。&lt;br /&gt;
* 对地面特征依赖性强：纹理导航依赖于地面的特征，如果地面特征变化或受到遮挡，可能会影响导航的准确性。&lt;br /&gt;
* 大场景建图耗时，需要地面弹线，修图，相比较slam实施较为耗时，麻烦。&lt;br /&gt;
&lt;br /&gt;
= 5.纹理相机设计安装要求 =&lt;br /&gt;
1，相机安装务必设计在车体运动中心-（越偏心安装会降低稳定性，导致车体晃动时可能造成脱轨，纹理相机视野15cm*15cm较小）&lt;br /&gt;
&lt;br /&gt;
2，有可高度的活动支架&lt;br /&gt;
&lt;br /&gt;
3，有较好的补光机构&lt;br /&gt;
&lt;br /&gt;
= 6.使用纹理导航前的准备工作 =&lt;br /&gt;
&lt;br /&gt;
==== 1．'''准备工作''' ====&lt;br /&gt;
1. 配置Medulla startup保证可以读取到相机图像数据，加载MVCamera.dll，如下方式&lt;br /&gt;
&lt;br /&gt;
mv=io load plugins/MVCamera.dll&lt;br /&gt;
&lt;br /&gt;
maincam=mv initMono MG010  //MG010为该相机型号&lt;br /&gt;
&lt;br /&gt;
打开Medulla.exe后就可以看到图像此准备工作完成&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image1.png|无框|658x658像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour根目录下需要有regcore_cuda和cufft64库文件&lt;br /&gt;
&lt;br /&gt;
2. 修改相机曝光参数，此处我们以海康相机为例，打开相机MVS软件，选择对应网卡的相机，双击，启动相机，就可以看到画面了，然后再右侧栏目中，调节相机的亮度和曝光即可，保证能够清晰的看到地面纹理即可,&lt;br /&gt;
[[文件:Cas.png|无|缩略图|656x656像素|海康MVS软件]]&lt;br /&gt;
在这个过程中我们需要保证曝光均匀，需要设计一个合理的曝光结构，如下图&lt;br /&gt;
&lt;br /&gt;
[[文件:纹理.png|无框|661x661像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. 标定相机&lt;br /&gt;
&lt;br /&gt;
（1）. 准备15cm*15cm的标定纸（见下图），贴在平整的地面上，相机必须能够完全看到标定纸中的方格，为消除畸变对相机的影响，在使用前需要相对相机进行标定，由于相机的透镜影响，以及相机在机械组装过程中的误差会使得光线穿过透镜投影到成像面时位置会发生变化。由透镜引起的畸变称之为“径向畸变”。在实际拍摄中径向畸变会使得一条直线在图片中变为曲线。通常分为桶形畸变和枕形畸变，目前标定摄像头主要为消除桶形畸变，如下图，左侧是标定后，右侧是未标定过的。&lt;br /&gt;
[[文件:标定纸.png|无|有框|15*15标定纸]][[文件:标定.png|836x836像素]]&lt;br /&gt;
&lt;br /&gt;
（2）. 打开Detour.exe，打开车体编辑器，添加下视摄像头，选择该组件，名称改成”maincam”和medulla加载的名称一致即可，修改相机和雷达的位置，使其和机械设计的真实位置一致&lt;br /&gt;
[[文件:Detour参数.png|无框|941x941像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（3）. 点击动作-双击捕捉即可看到相机画面，再双击校准，我们进行标定工作，这块需要很有耐心。&lt;br /&gt;
[[文件:标定1.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（4）打开校准的界面后，我们可以看到相机画面以及标定线，点击修改校准点，然后，鼠标依次对着标定值黑色的方框点，从左到右把点标记，如下图&lt;br /&gt;
[[文件:标定-2.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''一定要耐心，5分钟内就可以标定好，标定完成后会提示准备就绪，可以观察右下角的提示，可以知道目前正在标定哪一个点''&lt;br /&gt;
[[文件:标定3.png|无|缩略图|513x513像素]]&lt;br /&gt;
（5）标定好后，我们选择摄像头，选择”保存校准数据”，然后再点击”校准数据另存为”保存到Detour目录下即可，然后保存下导航配置&lt;br /&gt;
[[文件:标定保存.png|无|有框]]''&amp;lt;big&amp;gt;'''注意：如果涉及到多个车，需要用同一个位置的地纹标定纸来进行标定'''&amp;lt;/big&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
= 7.地纹地图录制 =&lt;br /&gt;
&lt;br /&gt;
==== 1，建图方式 ====&lt;br /&gt;
&lt;br /&gt;
* 纯地纹建图--------大场景施工繁琐，耗时耗力&lt;br /&gt;
* 激光+地纹建图----施工方便&lt;br /&gt;
&lt;br /&gt;
(1)纯地纹建图，需要地面做标记，可以墨斗弹线/铺设标定线，目的是为了修图，因为纹理录的过程中会有误差，所以通过标定线来有目标性的进行图优化，可以看图6.1.1以及图6.1.2通过优化可以保证所有帧中的标定线处于同一水平，&lt;br /&gt;
[[文件:地纹地面弹线.png|无|有框|地面5mm标定线]]&lt;br /&gt;
[[文件:地纹纹理11.png|无|有框|6.1.1 连续录制的地面纹理地图-未修图]]&lt;br /&gt;
[[文件:E124eba91f7b7a4c8a707a412cf6ddb.png|无|缩略图|965x965像素|6.1.2 连续录制的地面纹理地图-修图后]]&lt;br /&gt;
（2）激光+地纹，是指在提前录制好激光地图的基础上，录制地纹，这个情况可以不需要标定线，但是有标定线也可以更方便的辅助修图。&lt;br /&gt;
[[文件:激光+地纹.png|无|有框|链接=文件:激光_地纹.png]]&lt;br /&gt;
&lt;br /&gt;
==== 2,开始建图 ====&lt;br /&gt;
1. 打开Detour.exe，选择里程计-添加里程计-地面纹理导航&lt;br /&gt;
[[文件:Detour-添加地纹里程计.png|无|缩略图|547x547像素]]&lt;br /&gt;
2. 点击地面纹理导航，添加图层，默认ground名称即可，这步结束后，保存下导航配置&lt;br /&gt;
[[文件:地纹里程计2.png|无|缩略图|547x547像素]]&lt;br /&gt;
3. 保存导航配置后，重启下detour,这时候就可以看到小车下有地面的图像了&lt;br /&gt;
[[文件:地纹里程计3.png|无|有框]]&lt;br /&gt;
4. 点击自动更新图层即可开启建图模式，对于纯纹理导航，需要按照标线遥控小车，把对应位置纹理录进去，对于激光+地纹，可以直接下发激光路径，在走激光的时候录制地纹地图。&lt;br /&gt;
[[文件:更新.png|无|有框]]&lt;br /&gt;
注意：激光+地纹录制的时候，我们需要注意按照以下步骤&lt;br /&gt;
&lt;br /&gt;
（1）保证AGV行驶激光路径精度正常，比如一条10米直线，AGV行驶过程整体行驶姿态误差都较为稳定&lt;br /&gt;
&lt;br /&gt;
（2）关闭图优化，取消勾选，会使得地纹关键帧停留在原始位置上不动&lt;br /&gt;
&lt;br /&gt;
[[文件:9906be627cab3cbfb3d49d0f6a38747.png|无框]]（3）每隔一段距离，锁一下最后一个关键帧，再开启图优化，就会把之前建的纹理图给优化好。然后再关闭，再走，走完后再锁一个关键帧.......以此类推。&lt;br /&gt;
&lt;br /&gt;
（4）录好后锁定图层，然后另存图层，保存导航配置即可，这样下次打开detour会自动加载地纹图层&lt;br /&gt;
&lt;br /&gt;
= 8.注意点 =&lt;br /&gt;
1，若使用激光+地纹方案，Detour中激光以及纹理相机的xyth需要按照实际物理位置填写，车体运动中心为坐标原点，前进方向为x正，前进方向左侧y正&lt;br /&gt;
&lt;br /&gt;
2，由于地纹相机实时性比较高因此，不同雷达配合地纹使用需要修改time_bias_ms，镭神3d激光相比较相机大概延迟100ms左右，因此我们需要把相机的time_bias_ms改成-100&lt;br /&gt;
&lt;br /&gt;
[[文件:Maincam.png|无框]]&lt;br /&gt;
&lt;br /&gt;
3，fitTCfactor参数可以配置多传感器耦合的权重，越低则代表该传感器越不重要&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=153</id>
		<title>使用手册 - 激光＋纹理导航</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=153"/>
		<updated>2023-10-13T06:23:55Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​/* 2，瓷砖地面，有反光，纹理清晰。亮色系，补光容易。要求瓷砖尺寸&amp;gt;视觉相机视野（15*15cm） */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1.什么是纹理导航？ =&lt;br /&gt;
一种基于地面图像纹理的视觉导航方法。硬件上由下视摄像头，补光灯(对光线有一定要求)等组成。纹理导航利用地面丰富的纹理信息，基于相位相关法和极坐标转换来计算出两图间的位移和旋转，对比地图已知的绝对坐标获取当前位置。&lt;br /&gt;
&lt;br /&gt;
不需对地面进行额外处理，无需安装反射板、磁条等，确保灵活性及扩展性。该方案性价比高、无需改造现场环境、施工周期短、能适应复杂应用场景。&lt;br /&gt;
&lt;br /&gt;
= 2.纹理导航适用的场景 =&lt;br /&gt;
纹理导航适用于一些特定的环境场景，其中地面或环境中存在明显的纹理特征，如金刚砂硬化地坪，普通水泥地坪，瓷砖地坪，车间铺设重复纹理的地板，且地板纹理重复度大于相机视野即可，&amp;lt;u&amp;gt;且多灰尘，油污等，地面纹理极少，且经常变化&amp;lt;/u&amp;gt;，不适合使用纹理导航&lt;br /&gt;
&lt;br /&gt;
1，金刚砂硬化地坪，有反光但纹理清晰。需要注意补光[[文件:金刚砂.jpg|某现场金刚砂地面环境|缩略图|542x542像素|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:金刚砂地面.png|常规的金刚砂地面 |无|有框]]2，瓷砖地面，有反光，纹理清晰。亮色系，补光容易。要求瓷砖尺寸&amp;gt;视觉相机视野（15*15cm）[[文件:瓷砖地面.png|某酒店地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地面-总.png|常见的瓷砖地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地纹.png|瓷砖地面纹理地图|有框|无]]3，普通水泥，补光容易，纹理清晰[[文件:水泥地面.png|普通水泥|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 3.纹理导航不适用的场景 =&lt;br /&gt;
不适用地面：地面反光且无纹理或纹理特征不明显的场地，不适用。&lt;br /&gt;
&lt;br /&gt;
A. 纹理没有或者极少，相机获取不到纹理特征，理论上无法实现。&lt;br /&gt;
&lt;br /&gt;
B. 打光困难，地面反光获取特征不是地面的真实情况，算法无法消除。&lt;br /&gt;
&lt;br /&gt;
C. 地面磨损，纹理极容易被损坏。&lt;br /&gt;
&lt;br /&gt;
D. 灰尘油污大的场地，地面纹理特征不稳定，经常变化，如室外泥泞环境。需要增加外部可靠纹理，保证导航稳定性能。&lt;br /&gt;
&lt;br /&gt;
E. 少纹理或者重复小纹理地面，例如载货电梯内部地面。需要增加外部标识，使纹理特征大于相机视野（15*15cm）&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
1，环氧地坪，补光困难，初期缺少视觉纹理导航必须的地面纹理。地面容易划伤，纹理不稳定。[[文件:环氧地坪.png|环氧地坪图片|有框|无]]2，重复小纹理地面，纹理特征不明显[[文件:扶梯地面.png|扶梯地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 4.纹理导航相比较SLAM的优缺点 =&lt;br /&gt;
纹理导航和SLAM是两种不同的导航方法，各自具有优缺点，适用于不同的应用场景&lt;br /&gt;
&lt;br /&gt;
'''优点'''&lt;br /&gt;
* 简单实时性：纹理导航实现简单，通常具有较好的实时性，适用于对实时性要求较高的应用。&lt;br /&gt;
* 成本较低：相对于SLAM需要的昂贵传感器，纹理导航通常可以通过普通的相机或传感器实现，降低了系统成本。&lt;br /&gt;
* 适用广泛：适用于各类有明显地面纹理的场所。&lt;br /&gt;
* 相比较SLAM精度更稳定&lt;br /&gt;
'''缺点'''&lt;br /&gt;
* 局部信息：纹理导航一般只能提供相对局部的信息，不能构建全局一致的地图，因此适用于需要全局感知的场景有限。&lt;br /&gt;
* 对地面特征依赖性强：纹理导航依赖于地面的特征，如果地面特征变化或受到遮挡，可能会影响导航的准确性。&lt;br /&gt;
* 大场景建图耗时，需要地面弹线，修图，相比较slam实施较为耗时，麻烦。&lt;br /&gt;
&lt;br /&gt;
= 5.纹理相机设计安装要求 =&lt;br /&gt;
1，相机安装务必设计在车体运动中心-（越偏心安装会降低稳定性，导致车体晃动时可能造成脱轨，纹理相机视野15cm*15cm较小）&lt;br /&gt;
&lt;br /&gt;
2，有可高度的活动支架&lt;br /&gt;
&lt;br /&gt;
3，有较好的补光机构&lt;br /&gt;
&lt;br /&gt;
= 6.MDCS系统如何使用纹理导航 =&lt;br /&gt;
&lt;br /&gt;
==== 1．'''准备工作''' ====&lt;br /&gt;
1. 配置Medulla startup保证可以读取到相机图像数据，加载MVCamera.dll，如下方式&lt;br /&gt;
&lt;br /&gt;
mv=io load plugins/MVCamera.dll&lt;br /&gt;
&lt;br /&gt;
maincam=mv initMono MG010  //MG010为该相机型号&lt;br /&gt;
&lt;br /&gt;
打开Medulla.exe后就可以看到图像此准备工作完成&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image1.png|无框|658x658像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour根目录下需要有regcore_cuda和cufft64库文件&lt;br /&gt;
&lt;br /&gt;
2. 修改相机曝光参数，此处我们以海康相机为例，打开相机MVS软件，选择对应网卡的相机，双击，启动相机，就可以看到画面了，然后再右侧栏目中，调节相机的亮度和曝光即可，保证能够清晰的看到地面纹理即可,&lt;br /&gt;
[[文件:Cas.png|无|缩略图|656x656像素|海康MVS软件]]&lt;br /&gt;
在这个过程中我们需要保证曝光均匀，需要设计一个合理的曝光结构，如下图&lt;br /&gt;
&lt;br /&gt;
[[文件:纹理.png|无框|661x661像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. 标定相机&lt;br /&gt;
&lt;br /&gt;
（1）. 准备15cm*15cm的标定纸（见下图），贴在平整的地面上，相机必须能够完全看到标定纸中的方格，为消除畸变对相机的影响，在使用前需要相对相机进行标定，由于相机的透镜影响，以及相机在机械组装过程中的误差会使得光线穿过透镜投影到成像面时位置会发生变化。由透镜引起的畸变称之为“径向畸变”。在实际拍摄中径向畸变会使得一条直线在图片中变为曲线。通常分为桶形畸变和枕形畸变，目前标定摄像头主要为消除桶形畸变，如下图，左侧是标定后，右侧是未标定过的。&lt;br /&gt;
[[文件:标定纸.png|无|有框|15*15标定纸]][[文件:标定.png|836x836像素]]&lt;br /&gt;
&lt;br /&gt;
（2）. 打开Detour.exe，打开车体编辑器，添加下视摄像头，选择该组件，名称改成”maincam”和medulla加载的名称一致即可，修改相机和雷达的位置，使其和机械设计的真实位置一致&lt;br /&gt;
[[文件:Detour参数.png|无框|941x941像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（3）. 点击动作-双击捕捉即可看到相机画面，再双击校准，我们进行标定工作，这块需要很有耐心。&lt;br /&gt;
[[文件:标定1.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（4）打开校准的界面后，我们可以看到相机画面以及标定线，点击修改校准点，然后，鼠标依次对着标定值黑色的方框点，从左到右把点标记，如下图&lt;br /&gt;
[[文件:标定-2.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''一定要耐心，5分钟内就可以标定好，标定完成后会提示准备就绪，可以观察右下角的提示，可以知道目前正在标定哪一个点''&lt;br /&gt;
[[文件:标定3.png|无|缩略图|513x513像素]]&lt;br /&gt;
（5）标定好后，我们选择摄像头，选择”保存校准数据”，然后再点击”校准数据另存为”保存到Detour目录下即可，然后保存下导航配置&lt;br /&gt;
[[文件:标定保存.png|无|有框]]''&amp;lt;big&amp;gt;'''注意：如果涉及到多个车，需要用同一个位置的地纹标定纸来进行标定'''&amp;lt;/big&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
= 7.地纹地图录制 =&lt;br /&gt;
&lt;br /&gt;
==== 1，建图方式 ====&lt;br /&gt;
&lt;br /&gt;
* 纯地纹建图--------大场景施工繁琐，耗时耗力&lt;br /&gt;
* 激光+地纹建图----施工方便&lt;br /&gt;
&lt;br /&gt;
(1)纯地纹建图，需要地面做标记，可以墨斗弹线/铺设标定线，目的是为了修图，因为纹理录的过程中会有误差，所以通过标定线来有目标性的进行图优化，可以看图6.1.1以及图6.1.2通过优化可以保证所有帧中的标定线处于同一水平，&lt;br /&gt;
[[文件:地纹地面弹线.png|无|有框|地面5mm标定线]]&lt;br /&gt;
[[文件:地纹纹理11.png|无|有框|6.1.1 连续录制的地面纹理地图-未修图]]&lt;br /&gt;
[[文件:E124eba91f7b7a4c8a707a412cf6ddb.png|无|缩略图|965x965像素|6.1.2 连续录制的地面纹理地图-修图后]]&lt;br /&gt;
（2）激光+地纹，是指在提前录制好激光地图的基础上，录制地纹，这个情况可以不需要标定线，但是有标定线也可以更方便的辅助修图。&lt;br /&gt;
[[文件:激光+地纹.png|无|有框|链接=文件:激光_地纹.png]]&lt;br /&gt;
&lt;br /&gt;
==== 2,开始建图 ====&lt;br /&gt;
1. 打开Detour.exe，选择里程计-添加里程计-地面纹理导航&lt;br /&gt;
[[文件:Detour-添加地纹里程计.png|无|缩略图|547x547像素]]&lt;br /&gt;
2. 点击地面纹理导航，添加图层，默认ground名称即可，这步结束后，保存下导航配置&lt;br /&gt;
[[文件:地纹里程计2.png|无|缩略图|547x547像素]]&lt;br /&gt;
3. 保存导航配置后，重启下detour,这时候就可以看到小车下有地面的图像了&lt;br /&gt;
[[文件:地纹里程计3.png|无|有框]]&lt;br /&gt;
4. 点击自动更新图层即可开启建图模式，对于纯纹理导航，需要按照标线遥控小车，把对应位置纹理录进去，对于激光+地纹，可以直接下发激光路径，在走激光的时候录制地纹地图。&lt;br /&gt;
[[文件:更新.png|无|有框]]&lt;br /&gt;
注意：激光+地纹录制的时候，我们需要注意按照以下步骤&lt;br /&gt;
&lt;br /&gt;
（1）保证AGV行驶激光路径精度正常，比如一条10米直线，AGV行驶过程整体行驶姿态误差都较为稳定&lt;br /&gt;
&lt;br /&gt;
（2）关闭图优化，取消勾选，会使得地纹关键帧停留在原始位置上不动&lt;br /&gt;
&lt;br /&gt;
[[文件:9906be627cab3cbfb3d49d0f6a38747.png|无框]]（3）每隔一段距离，锁一下最后一个关键帧，再开启图优化，就会把之前建的纹理图给优化好。然后再关闭，再走，走完后再锁一个关键帧.......以此类推。&lt;br /&gt;
&lt;br /&gt;
（4）录好后锁定图层，然后另存图层，保存导航配置即可，这样下次打开detour会自动加载地纹图层&lt;br /&gt;
&lt;br /&gt;
= 8.注意点 =&lt;br /&gt;
1，若使用激光+地纹方案，Detour中激光以及纹理相机的xyth需要按照实际物理位置填写，车体运动中心为坐标原点，前进方向为x正，前进方向左侧y正&lt;br /&gt;
&lt;br /&gt;
2，由于地纹相机实时性比较高因此，不同雷达配合地纹使用需要修改time_bias_ms，镭神3d激光相比较相机大概延迟100ms左右，因此我们需要把相机的time_bias_ms改成-100&lt;br /&gt;
&lt;br /&gt;
[[文件:Maincam.png|无框]]&lt;br /&gt;
&lt;br /&gt;
3，fitTCfactor参数可以配置多传感器耦合的权重，越低则代表该传感器越不重要&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=152</id>
		<title>使用手册 - 激光＋纹理导航</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=152"/>
		<updated>2023-10-13T06:21:14Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​/* 5.MDCS系统如何适用纹理导航 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1.什么是纹理导航？ =&lt;br /&gt;
一种基于地面图像纹理的视觉导航方法。硬件上由下视摄像头，补光灯(对光线有一定要求)等组成。纹理导航利用地面丰富的纹理信息，基于相位相关法和极坐标转换来计算出两图间的位移和旋转，对比地图已知的绝对坐标获取当前位置。&lt;br /&gt;
&lt;br /&gt;
不需对地面进行额外处理，无需安装反射板、磁条等，确保灵活性及扩展性。该方案性价比高、无需改造现场环境、施工周期短、能适应复杂应用场景。&lt;br /&gt;
&lt;br /&gt;
= 2.纹理导航适用的场景 =&lt;br /&gt;
纹理导航适用于一些特定的环境场景，其中地面或环境中存在明显的纹理特征，如金刚砂硬化地坪，普通水泥地坪，瓷砖地坪，车间铺设重复纹理的地板，且地板纹理重复度大于相机视野即可，&amp;lt;u&amp;gt;且多灰尘，油污等，地面纹理极少，且经常变化&amp;lt;/u&amp;gt;，不适合使用纹理导航&lt;br /&gt;
&lt;br /&gt;
==== 1，金刚砂硬化地坪，有反光但纹理清晰。需要注意补光 ====&lt;br /&gt;
[[文件:金刚砂.jpg|某现场金刚砂地面环境|缩略图|542x542像素|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:金刚砂地面.png|常规的金刚砂地面 |无|有框]]&lt;br /&gt;
&lt;br /&gt;
==== 2，瓷砖地面，有反光，纹理清晰。亮色系，补光容易。要求瓷砖尺寸&amp;gt;视觉相机视野（15*15cm） ====&lt;br /&gt;
[[文件:瓷砖地面.png|某酒店地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地面-总.png|常见的瓷砖地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地纹.png|瓷砖地面纹理地图|有框|无]]&lt;br /&gt;
&lt;br /&gt;
==== 3，普通水泥，补光容易，纹理清晰 ====&lt;br /&gt;
[[文件:水泥地面.png|普通水泥|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 3.纹理导航不适用的场景 =&lt;br /&gt;
不适用地面：地面反光且无纹理或纹理特征不明显的场地，不适用。&lt;br /&gt;
&lt;br /&gt;
A. 纹理没有或者极少，相机获取不到纹理特征，理论上无法实现。&lt;br /&gt;
&lt;br /&gt;
B. 打光困难，地面反光获取特征不是地面的真实情况，算法无法消除。&lt;br /&gt;
&lt;br /&gt;
C. 地面磨损，纹理极容易被损坏。&lt;br /&gt;
&lt;br /&gt;
D. 灰尘油污大的场地，地面纹理特征不稳定，经常变化，如室外泥泞环境。需要增加外部可靠纹理，保证导航稳定性能。&lt;br /&gt;
&lt;br /&gt;
E. 少纹理或者重复小纹理地面，例如载货电梯内部地面。需要增加外部标识，使纹理特征大于相机视野（15*15cm）&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
==== 1，环氧地坪，补光困难，初期缺少视觉纹理导航必须的地面纹理。地面容易划伤，纹理不稳定。 ====&lt;br /&gt;
[[文件:环氧地坪.png|环氧地坪图片|有框|无]]&lt;br /&gt;
&lt;br /&gt;
==== 2，重复小纹理地面，纹理特征不明显 ====&lt;br /&gt;
[[文件:扶梯地面.png|扶梯地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 4.纹理导航相比较SLAM的优缺点 =&lt;br /&gt;
纹理导航和SLAM是两种不同的导航方法，各自具有优缺点，适用于不同的应用场景&lt;br /&gt;
&lt;br /&gt;
===== 优点 =====&lt;br /&gt;
&lt;br /&gt;
* 简单实时性：纹理导航实现简单，通常具有较好的实时性，适用于对实时性要求较高的应用。&lt;br /&gt;
* 成本较低：相对于SLAM需要的昂贵传感器，纹理导航通常可以通过普通的相机或传感器实现，降低了系统成本。&lt;br /&gt;
* 适用广泛：适用于各类有明显地面纹理的场所。&lt;br /&gt;
* 相比较SLAM精度更稳定&lt;br /&gt;
&lt;br /&gt;
===== 缺点 =====&lt;br /&gt;
&lt;br /&gt;
* 局部信息：纹理导航一般只能提供相对局部的信息，不能构建全局一致的地图，因此适用于需要全局感知的场景有限。&lt;br /&gt;
* 对地面特征依赖性强：纹理导航依赖于地面的特征，如果地面特征变化或受到遮挡，可能会影响导航的准确性。&lt;br /&gt;
* 大场景建图耗时，需要地面弹线，修图，相比较slam实施较为耗时，麻烦。&lt;br /&gt;
&lt;br /&gt;
= 5.纹理相机设计安装要求 =&lt;br /&gt;
1，相机安装务必设计在车体运动中心-（越偏心安装会降低稳定性，导致车体晃动时可能造成脱轨，纹理相机视野15cm*15cm较小）&lt;br /&gt;
&lt;br /&gt;
2，有可高度的活动支架&lt;br /&gt;
&lt;br /&gt;
3，有较好的补光机构&lt;br /&gt;
&lt;br /&gt;
= 6.MDCS系统如何使用纹理导航 =&lt;br /&gt;
&lt;br /&gt;
==== 1．'''准备工作''' ====&lt;br /&gt;
1. 配置Medulla startup保证可以读取到相机图像数据，加载MVCamera.dll，如下方式&lt;br /&gt;
&lt;br /&gt;
mv=io load plugins/MVCamera.dll&lt;br /&gt;
&lt;br /&gt;
maincam=mv initMono MG010  //MG010为该相机型号&lt;br /&gt;
&lt;br /&gt;
打开Medulla.exe后就可以看到图像此准备工作完成&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image1.png|无框|658x658像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour根目录下需要有regcore_cuda和cufft64库文件&lt;br /&gt;
&lt;br /&gt;
2. 修改相机曝光参数，此处我们以海康相机为例，打开相机MVS软件，选择对应网卡的相机，双击，启动相机，就可以看到画面了，然后再右侧栏目中，调节相机的亮度和曝光即可，保证能够清晰的看到地面纹理即可,&lt;br /&gt;
[[文件:Cas.png|无|缩略图|656x656像素|海康MVS软件]]&lt;br /&gt;
在这个过程中我们需要保证曝光均匀，需要设计一个合理的曝光结构，如下图&lt;br /&gt;
&lt;br /&gt;
[[文件:纹理.png|无框|661x661像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. 标定相机&lt;br /&gt;
&lt;br /&gt;
（1）. 准备15cm*15cm的标定纸（见下图），贴在平整的地面上，相机必须能够完全看到标定纸中的方格，为消除畸变对相机的影响，在使用前需要相对相机进行标定，由于相机的透镜影响，以及相机在机械组装过程中的误差会使得光线穿过透镜投影到成像面时位置会发生变化。由透镜引起的畸变称之为“径向畸变”。在实际拍摄中径向畸变会使得一条直线在图片中变为曲线。通常分为桶形畸变和枕形畸变，目前标定摄像头主要为消除桶形畸变，如下图，左侧是标定后，右侧是未标定过的。&lt;br /&gt;
[[文件:标定纸.png|无|有框|15*15标定纸]][[文件:标定.png|836x836像素]]&lt;br /&gt;
&lt;br /&gt;
（2）. 打开Detour.exe，打开车体编辑器，添加下视摄像头，选择该组件，名称改成”maincam”和medulla加载的名称一致即可，修改相机和雷达的位置，使其和机械设计的真实位置一致&lt;br /&gt;
[[文件:Detour参数.png|无框|941x941像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（3）. 点击动作-双击捕捉即可看到相机画面，再双击校准，我们进行标定工作，这块需要很有耐心。&lt;br /&gt;
[[文件:标定1.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（4）打开校准的界面后，我们可以看到相机画面以及标定线，点击修改校准点，然后，鼠标依次对着标定值黑色的方框点，从左到右把点标记，如下图&lt;br /&gt;
[[文件:标定-2.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''一定要耐心，5分钟内就可以标定好，标定完成后会提示准备就绪，可以观察右下角的提示，可以知道目前正在标定哪一个点''&lt;br /&gt;
[[文件:标定3.png|无|缩略图|513x513像素]]&lt;br /&gt;
（5）标定好后，我们选择摄像头，选择”保存校准数据”，然后再点击”校准数据另存为”保存到Detour目录下即可，然后保存下导航配置&lt;br /&gt;
[[文件:标定保存.png|无|有框]]''&amp;lt;big&amp;gt;'''注意：如果涉及到多个车，需要用同一个位置的地纹标定纸来进行标定'''&amp;lt;/big&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
= 7.地纹地图录制 =&lt;br /&gt;
&lt;br /&gt;
==== 1，建图方式 ====&lt;br /&gt;
&lt;br /&gt;
* 纯地纹建图--------大场景施工繁琐，耗时耗力&lt;br /&gt;
* 激光+地纹建图----施工方便&lt;br /&gt;
&lt;br /&gt;
(1)纯地纹建图，需要地面做标记，可以墨斗弹线/铺设标定线，目的是为了修图，因为纹理录的过程中会有误差，所以通过标定线来有目标性的进行图优化，可以看图6.1.1以及图6.1.2通过优化可以保证所有帧中的标定线处于同一水平，&lt;br /&gt;
[[文件:地纹地面弹线.png|无|有框|地面5mm标定线]]&lt;br /&gt;
[[文件:地纹纹理11.png|无|有框|6.1.1 连续录制的地面纹理地图-未修图]]&lt;br /&gt;
[[文件:E124eba91f7b7a4c8a707a412cf6ddb.png|无|缩略图|965x965像素|6.1.2 连续录制的地面纹理地图-修图后]]&lt;br /&gt;
（2）激光+地纹，是指在提前录制好激光地图的基础上，录制地纹，这个情况可以不需要标定线，但是有标定线也可以更方便的辅助修图。&lt;br /&gt;
[[文件:激光+地纹.png|无|有框|链接=文件:激光_地纹.png]]&lt;br /&gt;
&lt;br /&gt;
==== 2,开始建图 ====&lt;br /&gt;
1. 打开Detour.exe，选择里程计-添加里程计-地面纹理导航&lt;br /&gt;
[[文件:Detour-添加地纹里程计.png|无|缩略图|547x547像素]]&lt;br /&gt;
2. 点击地面纹理导航，添加图层，默认ground名称即可，这步结束后，保存下导航配置&lt;br /&gt;
[[文件:地纹里程计2.png|无|缩略图|547x547像素]]&lt;br /&gt;
3. 保存导航配置后，重启下detour,这时候就可以看到小车下有地面的图像了&lt;br /&gt;
[[文件:地纹里程计3.png|无|有框]]&lt;br /&gt;
4. 点击自动更新图层即可开启建图模式，对于纯纹理导航，需要按照标线遥控小车，把对应位置纹理录进去，对于激光+地纹，可以直接下发激光路径，在走激光的时候录制地纹地图。&lt;br /&gt;
[[文件:更新.png|无|有框]]&lt;br /&gt;
注意：激光+地纹录制的时候，我们需要注意按照以下步骤&lt;br /&gt;
&lt;br /&gt;
（1）保证AGV行驶激光路径精度正常，比如一条10米直线，AGV行驶过程整体行驶姿态误差都较为稳定&lt;br /&gt;
&lt;br /&gt;
（2）关闭图优化，取消勾选，会使得地纹关键帧停留在原始位置上不动&lt;br /&gt;
&lt;br /&gt;
[[文件:9906be627cab3cbfb3d49d0f6a38747.png|无框]]（3）每隔一段距离，锁一下最后一个关键帧，再开启图优化，就会把之前建的纹理图给优化好。然后再关闭，再走，走完后再锁一个关键帧.......以此类推。&lt;br /&gt;
&lt;br /&gt;
（4）录好后锁定图层，然后另存图层，保存导航配置即可，这样下次打开detour会自动加载地纹图层&lt;br /&gt;
&lt;br /&gt;
= 8.注意点 =&lt;br /&gt;
&lt;br /&gt;
==== 1，若使用激光+地纹方案，Detour中激光以及纹理相机的xyth需要按照实际物理位置填写，车体运动中心为坐标原点，前进方向为x正，前进方向左侧y正 ====&lt;br /&gt;
&lt;br /&gt;
==== 2，由于地纹相机实时性比较高因此，不同雷达配合地纹使用需要修改time_bias_ms，镭神3d激光相比较相机大概延迟100ms左右，因此我们需要把相机的time_bias_ms改成-100 ====&lt;br /&gt;
[[文件:Maincam.png|无框]]&lt;br /&gt;
&lt;br /&gt;
==== 3，fitTCfactor参数可以配置多传感器耦合的权重，越低则代表该传感器越不重要 ====&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=151</id>
		<title>使用手册 - 激光＋纹理导航</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=151"/>
		<updated>2023-10-13T06:16:50Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​/* 3.普通水泥，补光容易，纹理清晰 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1.什么是纹理导航？ =&lt;br /&gt;
一种基于地面图像纹理的视觉导航方法。硬件上由下视摄像头，补光灯(对光线有一定要求)等组成。纹理导航利用地面丰富的纹理信息，基于相位相关法和极坐标转换来计算出两图间的位移和旋转，对比地图已知的绝对坐标获取当前位置。&lt;br /&gt;
&lt;br /&gt;
不需对地面进行额外处理，无需安装反射板、磁条等，确保灵活性及扩展性。该方案性价比高、无需改造现场环境、施工周期短、能适应复杂应用场景。&lt;br /&gt;
&lt;br /&gt;
= 2.纹理导航适用的场景 =&lt;br /&gt;
纹理导航适用于一些特定的环境场景，其中地面或环境中存在明显的纹理特征，如金刚砂硬化地坪，普通水泥地坪，瓷砖地坪，车间铺设重复纹理的地板，且地板纹理重复度大于相机视野即可，&amp;lt;u&amp;gt;且多灰尘，油污等，地面纹理极少，且经常变化&amp;lt;/u&amp;gt;，不适合使用纹理导航&lt;br /&gt;
&lt;br /&gt;
==== 1，金刚砂硬化地坪，有反光但纹理清晰。需要注意补光 ====&lt;br /&gt;
[[文件:金刚砂.jpg|某现场金刚砂地面环境|缩略图|542x542像素|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:金刚砂地面.png|常规的金刚砂地面 |无|有框]]&lt;br /&gt;
&lt;br /&gt;
==== 2，瓷砖地面，有反光，纹理清晰。亮色系，补光容易。要求瓷砖尺寸&amp;gt;视觉相机视野（15*15cm） ====&lt;br /&gt;
[[文件:瓷砖地面.png|某酒店地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地面-总.png|常见的瓷砖地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地纹.png|瓷砖地面纹理地图|有框|无]]&lt;br /&gt;
&lt;br /&gt;
==== 3，普通水泥，补光容易，纹理清晰 ====&lt;br /&gt;
[[文件:水泥地面.png|普通水泥|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 3.纹理导航不适用的场景 =&lt;br /&gt;
不适用地面：地面反光且无纹理或纹理特征不明显的场地，不适用。&lt;br /&gt;
&lt;br /&gt;
A. 纹理没有或者极少，相机获取不到纹理特征，理论上无法实现。&lt;br /&gt;
&lt;br /&gt;
B. 打光困难，地面反光获取特征不是地面的真实情况，算法无法消除。&lt;br /&gt;
&lt;br /&gt;
C. 地面磨损，纹理极容易被损坏。&lt;br /&gt;
&lt;br /&gt;
D. 灰尘油污大的场地，地面纹理特征不稳定，经常变化，如室外泥泞环境。需要增加外部可靠纹理，保证导航稳定性能。&lt;br /&gt;
&lt;br /&gt;
E. 少纹理或者重复小纹理地面，例如载货电梯内部地面。需要增加外部标识，使纹理特征大于相机视野（15*15cm）&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
==== 1，环氧地坪，补光困难，初期缺少视觉纹理导航必须的地面纹理。地面容易划伤，纹理不稳定。 ====&lt;br /&gt;
[[文件:环氧地坪.png|环氧地坪图片|有框|无]]&lt;br /&gt;
&lt;br /&gt;
==== 2，重复小纹理地面，纹理特征不明显 ====&lt;br /&gt;
[[文件:扶梯地面.png|扶梯地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 4.纹理导航相比较SLAM的优缺点 =&lt;br /&gt;
纹理导航和SLAM是两种不同的导航方法，各自具有优缺点，适用于不同的应用场景&lt;br /&gt;
&lt;br /&gt;
===== 优点 =====&lt;br /&gt;
&lt;br /&gt;
* 简单实时性：纹理导航实现简单，通常具有较好的实时性，适用于对实时性要求较高的应用。&lt;br /&gt;
* 成本较低：相对于SLAM需要的昂贵传感器，纹理导航通常可以通过普通的相机或传感器实现，降低了系统成本。&lt;br /&gt;
* 适用广泛：适用于各类有明显地面纹理的场所。&lt;br /&gt;
* 相比较SLAM精度更稳定&lt;br /&gt;
&lt;br /&gt;
===== 缺点 =====&lt;br /&gt;
&lt;br /&gt;
* 局部信息：纹理导航一般只能提供相对局部的信息，不能构建全局一致的地图，因此适用于需要全局感知的场景有限。&lt;br /&gt;
* 对地面特征依赖性强：纹理导航依赖于地面的特征，如果地面特征变化或受到遮挡，可能会影响导航的准确性。&lt;br /&gt;
* 大场景建图耗时，需要地面弹线，修图，相比较slam实施较为耗时，麻烦。&lt;br /&gt;
&lt;br /&gt;
= 5.MDCS系统如何适用纹理导航 =&lt;br /&gt;
&lt;br /&gt;
==== 1．'''准备工作''' ====&lt;br /&gt;
1. 配置Medulla startup保证可以读取到相机图像数据，加载MVCamera.dll，如下方式&lt;br /&gt;
&lt;br /&gt;
mv=io load plugins/MVCamera.dll&lt;br /&gt;
&lt;br /&gt;
maincam=mv initMono MG010  //MG010为该相机型号&lt;br /&gt;
&lt;br /&gt;
打开Medulla.exe后就可以看到图像此准备工作完成&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image1.png|无框|658x658像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour根目录下需要有regcore_cuda和cufft64库文件&lt;br /&gt;
&lt;br /&gt;
2. 修改相机曝光参数，此处我们以海康相机为例，打开相机MVS软件，选择对应网卡的相机，双击，启动相机，就可以看到画面了，然后再右侧栏目中，调节相机的亮度和曝光即可，保证能够清晰的看到地面纹理即可,&lt;br /&gt;
[[文件:Cas.png|无|缩略图|656x656像素|海康MVS软件]]&lt;br /&gt;
在这个过程中我们需要保证曝光均匀，需要设计一个合理的曝光结构，如下图&lt;br /&gt;
&lt;br /&gt;
[[文件:纹理.png|无框|661x661像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. 标定相机&lt;br /&gt;
&lt;br /&gt;
（1）. 准备15cm*15cm的标定纸（见下图），贴在平整的地面上，相机必须能够完全看到标定纸中的方格，为消除畸变对相机的影响，在使用前需要相对相机进行标定，由于相机的透镜影响，以及相机在机械组装过程中的误差会使得光线穿过透镜投影到成像面时位置会发生变化。由透镜引起的畸变称之为“径向畸变”。在实际拍摄中径向畸变会使得一条直线在图片中变为曲线。通常分为桶形畸变和枕形畸变，目前标定摄像头主要为消除桶形畸变，如下图，左侧是标定后，右侧是未标定过的。&lt;br /&gt;
[[文件:标定纸.png|无|有框|15*15标定纸]][[文件:标定.png|836x836像素]]&lt;br /&gt;
&lt;br /&gt;
（2）. 打开Detour.exe，打开车体编辑器，添加下视摄像头，选择该组件，名称改成”maincam”和medulla加载的名称一致即可，修改相机和雷达的位置，使其和机械设计的真实位置一致&lt;br /&gt;
[[文件:Detour参数.png|无框|941x941像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（3）. 点击动作-双击捕捉即可看到相机画面，再双击校准，我们进行标定工作，这块需要很有耐心。&lt;br /&gt;
[[文件:标定1.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（4）打开校准的界面后，我们可以看到相机画面以及标定线，点击修改校准点，然后，鼠标依次对着标定值黑色的方框点，从左到右把点标记，如下图&lt;br /&gt;
[[文件:标定-2.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''一定要耐心，5分钟内就可以标定好，标定完成后会提示准备就绪，可以观察右下角的提示，可以知道目前正在标定哪一个点''&lt;br /&gt;
[[文件:标定3.png|无|缩略图|513x513像素]]&lt;br /&gt;
（5）标定好后，我们选择摄像头，选择”保存校准数据”，然后再点击”校准数据另存为”保存到Detour目录下即可，然后保存下导航配置&lt;br /&gt;
[[文件:标定保存.png|无|有框]]''&amp;lt;big&amp;gt;'''注意：如果涉及到多个车，需要用同一个位置的地纹标定纸来进行标定'''&amp;lt;/big&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
= 6.地纹地图录制 =&lt;br /&gt;
&lt;br /&gt;
==== 1，建图方式 ====&lt;br /&gt;
&lt;br /&gt;
* 纯地纹建图--------大场景施工繁琐，耗时耗力&lt;br /&gt;
* 激光+地纹建图----施工方便&lt;br /&gt;
&lt;br /&gt;
(1)纯地纹建图，需要地面做标记，可以墨斗弹线/铺设标定线，目的是为了修图，因为纹理录的过程中会有误差，所以通过标定线来有目标性的进行图优化，可以看图6.1.1以及图6.1.2通过优化可以保证所有帧中的标定线处于同一水平，&lt;br /&gt;
[[文件:地纹地面弹线.png|无|有框|地面5mm标定线]]&lt;br /&gt;
[[文件:地纹纹理11.png|无|有框|6.1.1 连续录制的地面纹理地图-未修图]]&lt;br /&gt;
[[文件:E124eba91f7b7a4c8a707a412cf6ddb.png|无|缩略图|965x965像素|6.1.2 连续录制的地面纹理地图-修图后]]&lt;br /&gt;
（2）激光+地纹，是指在提前录制好激光地图的基础上，录制地纹，这个情况可以不需要标定线，但是有标定线也可以更方便的辅助修图。&lt;br /&gt;
[[文件:激光+地纹.png|无|有框|链接=文件:激光_地纹.png]]&lt;br /&gt;
&lt;br /&gt;
==== 2,开始建图 ====&lt;br /&gt;
1. 打开Detour.exe，选择里程计-添加里程计-地面纹理导航&lt;br /&gt;
[[文件:Detour-添加地纹里程计.png|无|缩略图|547x547像素]]&lt;br /&gt;
2. 点击地面纹理导航，添加图层，默认ground名称即可，这步结束后，保存下导航配置&lt;br /&gt;
[[文件:地纹里程计2.png|无|缩略图|547x547像素]]&lt;br /&gt;
3. 保存导航配置后，重启下detour,这时候就可以看到小车下有地面的图像了&lt;br /&gt;
[[文件:地纹里程计3.png|无|有框]]&lt;br /&gt;
4. 点击自动更新图层即可开启建图模式，对于纯纹理导航，需要按照标线遥控小车，把对应位置纹理录进去，对于激光+地纹，可以直接下发激光路径，在走激光的时候录制地纹地图。&lt;br /&gt;
[[文件:更新.png|无|有框]]&lt;br /&gt;
注意：激光+地纹录制的时候，我们需要注意按照以下步骤&lt;br /&gt;
&lt;br /&gt;
（1）保证AGV行驶激光路径精度正常，比如一条10米直线，AGV行驶过程整体行驶姿态误差都较为稳定&lt;br /&gt;
&lt;br /&gt;
（2）关闭图优化，取消勾选，会使得地纹关键帧停留在原始位置上不动&lt;br /&gt;
&lt;br /&gt;
[[文件:9906be627cab3cbfb3d49d0f6a38747.png|无框]]（3）每隔一段距离，锁一下最后一个关键帧，再开启图优化，就会把之前建的纹理图给优化好。然后再关闭，再走，走完后再锁一个关键帧.......以此类推。&lt;br /&gt;
&lt;br /&gt;
（4）录好后锁定图层，然后另存图层，保存导航配置即可，这样下次打开detour会自动加载地纹图层&lt;br /&gt;
&lt;br /&gt;
= 7.注意点 =&lt;br /&gt;
&lt;br /&gt;
==== 1，若使用激光+地纹方案，Detour中激光以及纹理相机的xyth需要按照实际物理位置填写，车体运动中心为坐标原点，前进方向为x正，前进方向左侧y正 ====&lt;br /&gt;
&lt;br /&gt;
==== 2，由于地纹相机实时性比较高因此，不同雷达配合地纹使用需要修改time_bias_ms，镭神3d激光相比较相机大概延迟100ms左右，因此我们需要把相机的time_bias_ms改成-100 ====&lt;br /&gt;
[[文件:Maincam.png|无框]]&lt;br /&gt;
&lt;br /&gt;
==== 3，fitTCfactor参数可以配置多传感器耦合的权重，越低则代表该传感器越不重要 ====&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=150</id>
		<title>使用手册 - 激光＋纹理导航</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=150"/>
		<updated>2023-10-13T06:16:38Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​/* 1，金刚砂硬化地坪，有反光但纹理清晰。需要注意补光 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1.什么是纹理导航？ =&lt;br /&gt;
一种基于地面图像纹理的视觉导航方法。硬件上由下视摄像头，补光灯(对光线有一定要求)等组成。纹理导航利用地面丰富的纹理信息，基于相位相关法和极坐标转换来计算出两图间的位移和旋转，对比地图已知的绝对坐标获取当前位置。&lt;br /&gt;
&lt;br /&gt;
不需对地面进行额外处理，无需安装反射板、磁条等，确保灵活性及扩展性。该方案性价比高、无需改造现场环境、施工周期短、能适应复杂应用场景。&lt;br /&gt;
&lt;br /&gt;
= 2.纹理导航适用的场景 =&lt;br /&gt;
纹理导航适用于一些特定的环境场景，其中地面或环境中存在明显的纹理特征，如金刚砂硬化地坪，普通水泥地坪，瓷砖地坪，车间铺设重复纹理的地板，且地板纹理重复度大于相机视野即可，&amp;lt;u&amp;gt;且多灰尘，油污等，地面纹理极少，且经常变化&amp;lt;/u&amp;gt;，不适合使用纹理导航&lt;br /&gt;
&lt;br /&gt;
==== 1，金刚砂硬化地坪，有反光但纹理清晰。需要注意补光 ====&lt;br /&gt;
[[文件:金刚砂.jpg|某现场金刚砂地面环境|缩略图|542x542像素|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:金刚砂地面.png|常规的金刚砂地面 |无|有框]]&lt;br /&gt;
&lt;br /&gt;
==== 2，瓷砖地面，有反光，纹理清晰。亮色系，补光容易。要求瓷砖尺寸&amp;gt;视觉相机视野（15*15cm） ====&lt;br /&gt;
[[文件:瓷砖地面.png|某酒店地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地面-总.png|常见的瓷砖地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地纹.png|瓷砖地面纹理地图|有框|无]]&lt;br /&gt;
&lt;br /&gt;
==== 3.普通水泥，补光容易，纹理清晰 ====&lt;br /&gt;
[[文件:水泥地面.png|普通水泥|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 3.纹理导航不适用的场景 =&lt;br /&gt;
不适用地面：地面反光且无纹理或纹理特征不明显的场地，不适用。&lt;br /&gt;
&lt;br /&gt;
A. 纹理没有或者极少，相机获取不到纹理特征，理论上无法实现。&lt;br /&gt;
&lt;br /&gt;
B. 打光困难，地面反光获取特征不是地面的真实情况，算法无法消除。&lt;br /&gt;
&lt;br /&gt;
C. 地面磨损，纹理极容易被损坏。&lt;br /&gt;
&lt;br /&gt;
D. 灰尘油污大的场地，地面纹理特征不稳定，经常变化，如室外泥泞环境。需要增加外部可靠纹理，保证导航稳定性能。&lt;br /&gt;
&lt;br /&gt;
E. 少纹理或者重复小纹理地面，例如载货电梯内部地面。需要增加外部标识，使纹理特征大于相机视野（15*15cm）&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
==== 1，环氧地坪，补光困难，初期缺少视觉纹理导航必须的地面纹理。地面容易划伤，纹理不稳定。 ====&lt;br /&gt;
[[文件:环氧地坪.png|环氧地坪图片|有框|无]]&lt;br /&gt;
&lt;br /&gt;
==== 2，重复小纹理地面，纹理特征不明显 ====&lt;br /&gt;
[[文件:扶梯地面.png|扶梯地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 4.纹理导航相比较SLAM的优缺点 =&lt;br /&gt;
纹理导航和SLAM是两种不同的导航方法，各自具有优缺点，适用于不同的应用场景&lt;br /&gt;
&lt;br /&gt;
===== 优点 =====&lt;br /&gt;
&lt;br /&gt;
* 简单实时性：纹理导航实现简单，通常具有较好的实时性，适用于对实时性要求较高的应用。&lt;br /&gt;
* 成本较低：相对于SLAM需要的昂贵传感器，纹理导航通常可以通过普通的相机或传感器实现，降低了系统成本。&lt;br /&gt;
* 适用广泛：适用于各类有明显地面纹理的场所。&lt;br /&gt;
* 相比较SLAM精度更稳定&lt;br /&gt;
&lt;br /&gt;
===== 缺点 =====&lt;br /&gt;
&lt;br /&gt;
* 局部信息：纹理导航一般只能提供相对局部的信息，不能构建全局一致的地图，因此适用于需要全局感知的场景有限。&lt;br /&gt;
* 对地面特征依赖性强：纹理导航依赖于地面的特征，如果地面特征变化或受到遮挡，可能会影响导航的准确性。&lt;br /&gt;
* 大场景建图耗时，需要地面弹线，修图，相比较slam实施较为耗时，麻烦。&lt;br /&gt;
&lt;br /&gt;
= 5.MDCS系统如何适用纹理导航 =&lt;br /&gt;
&lt;br /&gt;
==== 1．'''准备工作''' ====&lt;br /&gt;
1. 配置Medulla startup保证可以读取到相机图像数据，加载MVCamera.dll，如下方式&lt;br /&gt;
&lt;br /&gt;
mv=io load plugins/MVCamera.dll&lt;br /&gt;
&lt;br /&gt;
maincam=mv initMono MG010  //MG010为该相机型号&lt;br /&gt;
&lt;br /&gt;
打开Medulla.exe后就可以看到图像此准备工作完成&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image1.png|无框|658x658像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour根目录下需要有regcore_cuda和cufft64库文件&lt;br /&gt;
&lt;br /&gt;
2. 修改相机曝光参数，此处我们以海康相机为例，打开相机MVS软件，选择对应网卡的相机，双击，启动相机，就可以看到画面了，然后再右侧栏目中，调节相机的亮度和曝光即可，保证能够清晰的看到地面纹理即可,&lt;br /&gt;
[[文件:Cas.png|无|缩略图|656x656像素|海康MVS软件]]&lt;br /&gt;
在这个过程中我们需要保证曝光均匀，需要设计一个合理的曝光结构，如下图&lt;br /&gt;
&lt;br /&gt;
[[文件:纹理.png|无框|661x661像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. 标定相机&lt;br /&gt;
&lt;br /&gt;
（1）. 准备15cm*15cm的标定纸（见下图），贴在平整的地面上，相机必须能够完全看到标定纸中的方格，为消除畸变对相机的影响，在使用前需要相对相机进行标定，由于相机的透镜影响，以及相机在机械组装过程中的误差会使得光线穿过透镜投影到成像面时位置会发生变化。由透镜引起的畸变称之为“径向畸变”。在实际拍摄中径向畸变会使得一条直线在图片中变为曲线。通常分为桶形畸变和枕形畸变，目前标定摄像头主要为消除桶形畸变，如下图，左侧是标定后，右侧是未标定过的。&lt;br /&gt;
[[文件:标定纸.png|无|有框|15*15标定纸]][[文件:标定.png|836x836像素]]&lt;br /&gt;
&lt;br /&gt;
（2）. 打开Detour.exe，打开车体编辑器，添加下视摄像头，选择该组件，名称改成”maincam”和medulla加载的名称一致即可，修改相机和雷达的位置，使其和机械设计的真实位置一致&lt;br /&gt;
[[文件:Detour参数.png|无框|941x941像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（3）. 点击动作-双击捕捉即可看到相机画面，再双击校准，我们进行标定工作，这块需要很有耐心。&lt;br /&gt;
[[文件:标定1.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（4）打开校准的界面后，我们可以看到相机画面以及标定线，点击修改校准点，然后，鼠标依次对着标定值黑色的方框点，从左到右把点标记，如下图&lt;br /&gt;
[[文件:标定-2.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''一定要耐心，5分钟内就可以标定好，标定完成后会提示准备就绪，可以观察右下角的提示，可以知道目前正在标定哪一个点''&lt;br /&gt;
[[文件:标定3.png|无|缩略图|513x513像素]]&lt;br /&gt;
（5）标定好后，我们选择摄像头，选择”保存校准数据”，然后再点击”校准数据另存为”保存到Detour目录下即可，然后保存下导航配置&lt;br /&gt;
[[文件:标定保存.png|无|有框]]''&amp;lt;big&amp;gt;'''注意：如果涉及到多个车，需要用同一个位置的地纹标定纸来进行标定'''&amp;lt;/big&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
= 6.地纹地图录制 =&lt;br /&gt;
&lt;br /&gt;
==== 1，建图方式 ====&lt;br /&gt;
&lt;br /&gt;
* 纯地纹建图--------大场景施工繁琐，耗时耗力&lt;br /&gt;
* 激光+地纹建图----施工方便&lt;br /&gt;
&lt;br /&gt;
(1)纯地纹建图，需要地面做标记，可以墨斗弹线/铺设标定线，目的是为了修图，因为纹理录的过程中会有误差，所以通过标定线来有目标性的进行图优化，可以看图6.1.1以及图6.1.2通过优化可以保证所有帧中的标定线处于同一水平，&lt;br /&gt;
[[文件:地纹地面弹线.png|无|有框|地面5mm标定线]]&lt;br /&gt;
[[文件:地纹纹理11.png|无|有框|6.1.1 连续录制的地面纹理地图-未修图]]&lt;br /&gt;
[[文件:E124eba91f7b7a4c8a707a412cf6ddb.png|无|缩略图|965x965像素|6.1.2 连续录制的地面纹理地图-修图后]]&lt;br /&gt;
（2）激光+地纹，是指在提前录制好激光地图的基础上，录制地纹，这个情况可以不需要标定线，但是有标定线也可以更方便的辅助修图。&lt;br /&gt;
[[文件:激光+地纹.png|无|有框|链接=文件:激光_地纹.png]]&lt;br /&gt;
&lt;br /&gt;
==== 2,开始建图 ====&lt;br /&gt;
1. 打开Detour.exe，选择里程计-添加里程计-地面纹理导航&lt;br /&gt;
[[文件:Detour-添加地纹里程计.png|无|缩略图|547x547像素]]&lt;br /&gt;
2. 点击地面纹理导航，添加图层，默认ground名称即可，这步结束后，保存下导航配置&lt;br /&gt;
[[文件:地纹里程计2.png|无|缩略图|547x547像素]]&lt;br /&gt;
3. 保存导航配置后，重启下detour,这时候就可以看到小车下有地面的图像了&lt;br /&gt;
[[文件:地纹里程计3.png|无|有框]]&lt;br /&gt;
4. 点击自动更新图层即可开启建图模式，对于纯纹理导航，需要按照标线遥控小车，把对应位置纹理录进去，对于激光+地纹，可以直接下发激光路径，在走激光的时候录制地纹地图。&lt;br /&gt;
[[文件:更新.png|无|有框]]&lt;br /&gt;
注意：激光+地纹录制的时候，我们需要注意按照以下步骤&lt;br /&gt;
&lt;br /&gt;
（1）保证AGV行驶激光路径精度正常，比如一条10米直线，AGV行驶过程整体行驶姿态误差都较为稳定&lt;br /&gt;
&lt;br /&gt;
（2）关闭图优化，取消勾选，会使得地纹关键帧停留在原始位置上不动&lt;br /&gt;
&lt;br /&gt;
[[文件:9906be627cab3cbfb3d49d0f6a38747.png|无框]]（3）每隔一段距离，锁一下最后一个关键帧，再开启图优化，就会把之前建的纹理图给优化好。然后再关闭，再走，走完后再锁一个关键帧.......以此类推。&lt;br /&gt;
&lt;br /&gt;
（4）录好后锁定图层，然后另存图层，保存导航配置即可，这样下次打开detour会自动加载地纹图层&lt;br /&gt;
&lt;br /&gt;
= 7.注意点 =&lt;br /&gt;
&lt;br /&gt;
==== 1，若使用激光+地纹方案，Detour中激光以及纹理相机的xyth需要按照实际物理位置填写，车体运动中心为坐标原点，前进方向为x正，前进方向左侧y正 ====&lt;br /&gt;
&lt;br /&gt;
==== 2，由于地纹相机实时性比较高因此，不同雷达配合地纹使用需要修改time_bias_ms，镭神3d激光相比较相机大概延迟100ms左右，因此我们需要把相机的time_bias_ms改成-100 ====&lt;br /&gt;
[[文件:Maincam.png|无框]]&lt;br /&gt;
&lt;br /&gt;
==== 3，fitTCfactor参数可以配置多传感器耦合的权重，越低则代表该传感器越不重要 ====&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=149</id>
		<title>使用手册 - 激光＋纹理导航</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=149"/>
		<updated>2023-10-13T06:15:46Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​/* 优点： */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1.什么是纹理导航？ =&lt;br /&gt;
一种基于地面图像纹理的视觉导航方法。硬件上由下视摄像头，补光灯(对光线有一定要求)等组成。纹理导航利用地面丰富的纹理信息，基于相位相关法和极坐标转换来计算出两图间的位移和旋转，对比地图已知的绝对坐标获取当前位置。&lt;br /&gt;
&lt;br /&gt;
不需对地面进行额外处理，无需安装反射板、磁条等，确保灵活性及扩展性。该方案性价比高、无需改造现场环境、施工周期短、能适应复杂应用场景。&lt;br /&gt;
&lt;br /&gt;
= 2.纹理导航适用的场景 =&lt;br /&gt;
纹理导航适用于一些特定的环境场景，其中地面或环境中存在明显的纹理特征，如金刚砂硬化地坪，普通水泥地坪，瓷砖地坪，车间铺设重复纹理的地板，且地板纹理重复度大于相机视野即可，&amp;lt;u&amp;gt;且多灰尘，油污等，地面纹理极少，且经常变化&amp;lt;/u&amp;gt;，不适合使用纹理导航&lt;br /&gt;
&lt;br /&gt;
==== 1，金刚砂硬化地坪，有反光但纹理清晰。需要注意补光 ====&lt;br /&gt;
[[文件:金刚砂.jpg|某现场金刚砂地面环境|缩略图|542x542像素|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:金刚砂地面.png|常规的金刚砂地面 |无|有框]]&lt;br /&gt;
&lt;br /&gt;
==== 2.瓷砖地面，有反光，纹理清晰。亮色系，补光容易。要求瓷砖尺寸&amp;gt;视觉相机视野（15*15cm） ====&lt;br /&gt;
[[文件:瓷砖地面.png|某酒店地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地面-总.png|常见的瓷砖地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地纹.png|瓷砖地面纹理地图|有框|无]]&lt;br /&gt;
&lt;br /&gt;
==== 3.普通水泥，补光容易，纹理清晰 ====&lt;br /&gt;
[[文件:水泥地面.png|普通水泥|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 3.纹理导航不适用的场景 =&lt;br /&gt;
不适用地面：地面反光且无纹理或纹理特征不明显的场地，不适用。&lt;br /&gt;
&lt;br /&gt;
A. 纹理没有或者极少，相机获取不到纹理特征，理论上无法实现。&lt;br /&gt;
&lt;br /&gt;
B. 打光困难，地面反光获取特征不是地面的真实情况，算法无法消除。&lt;br /&gt;
&lt;br /&gt;
C. 地面磨损，纹理极容易被损坏。&lt;br /&gt;
&lt;br /&gt;
D. 灰尘油污大的场地，地面纹理特征不稳定，经常变化，如室外泥泞环境。需要增加外部可靠纹理，保证导航稳定性能。&lt;br /&gt;
&lt;br /&gt;
E. 少纹理或者重复小纹理地面，例如载货电梯内部地面。需要增加外部标识，使纹理特征大于相机视野（15*15cm）&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
==== 1.环氧地坪，补光困难，初期缺少视觉纹理导航必须的地面纹理。地面容易划伤，纹理不稳定。 ====&lt;br /&gt;
[[文件:环氧地坪.png|环氧地坪图片|有框|无]]&lt;br /&gt;
&lt;br /&gt;
==== 2.重复小纹理地面，纹理特征不明显 ====&lt;br /&gt;
[[文件:扶梯地面.png|扶梯地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 4.纹理导航相比较SLAM的优缺点 =&lt;br /&gt;
纹理导航和SLAM是两种不同的导航方法，各自具有优缺点，适用于不同的应用场景&lt;br /&gt;
&lt;br /&gt;
===== 优点 =====&lt;br /&gt;
&lt;br /&gt;
* 简单实时性：纹理导航实现简单，通常具有较好的实时性，适用于对实时性要求较高的应用。&lt;br /&gt;
* 成本较低：相对于SLAM需要的昂贵传感器，纹理导航通常可以通过普通的相机或传感器实现，降低了系统成本。&lt;br /&gt;
* 适用广泛：适用于各类有明显地面纹理的场所。&lt;br /&gt;
* 相比较SLAM精度更稳定&lt;br /&gt;
&lt;br /&gt;
===== 缺点 =====&lt;br /&gt;
&lt;br /&gt;
* 局部信息：纹理导航一般只能提供相对局部的信息，不能构建全局一致的地图，因此适用于需要全局感知的场景有限。&lt;br /&gt;
* 对地面特征依赖性强：纹理导航依赖于地面的特征，如果地面特征变化或受到遮挡，可能会影响导航的准确性。&lt;br /&gt;
* 大场景建图耗时，需要地面弹线，修图，相比较slam实施较为耗时，麻烦。&lt;br /&gt;
&lt;br /&gt;
= 5.MDCS系统如何适用纹理导航 =&lt;br /&gt;
&lt;br /&gt;
==== 1．'''准备工作''' ====&lt;br /&gt;
1. 配置Medulla startup保证可以读取到相机图像数据，加载MVCamera.dll，如下方式&lt;br /&gt;
&lt;br /&gt;
mv=io load plugins/MVCamera.dll&lt;br /&gt;
&lt;br /&gt;
maincam=mv initMono MG010  //MG010为该相机型号&lt;br /&gt;
&lt;br /&gt;
打开Medulla.exe后就可以看到图像此准备工作完成&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image1.png|无框|658x658像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour根目录下需要有regcore_cuda和cufft64库文件&lt;br /&gt;
&lt;br /&gt;
2. 修改相机曝光参数，此处我们以海康相机为例，打开相机MVS软件，选择对应网卡的相机，双击，启动相机，就可以看到画面了，然后再右侧栏目中，调节相机的亮度和曝光即可，保证能够清晰的看到地面纹理即可,&lt;br /&gt;
[[文件:Cas.png|无|缩略图|656x656像素|海康MVS软件]]&lt;br /&gt;
在这个过程中我们需要保证曝光均匀，需要设计一个合理的曝光结构，如下图&lt;br /&gt;
&lt;br /&gt;
[[文件:纹理.png|无框|661x661像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. 标定相机&lt;br /&gt;
&lt;br /&gt;
（1）. 准备15cm*15cm的标定纸（见下图），贴在平整的地面上，相机必须能够完全看到标定纸中的方格，为消除畸变对相机的影响，在使用前需要相对相机进行标定，由于相机的透镜影响，以及相机在机械组装过程中的误差会使得光线穿过透镜投影到成像面时位置会发生变化。由透镜引起的畸变称之为“径向畸变”。在实际拍摄中径向畸变会使得一条直线在图片中变为曲线。通常分为桶形畸变和枕形畸变，目前标定摄像头主要为消除桶形畸变，如下图，左侧是标定后，右侧是未标定过的。&lt;br /&gt;
[[文件:标定纸.png|无|有框|15*15标定纸]][[文件:标定.png|836x836像素]]&lt;br /&gt;
&lt;br /&gt;
（2）. 打开Detour.exe，打开车体编辑器，添加下视摄像头，选择该组件，名称改成”maincam”和medulla加载的名称一致即可，修改相机和雷达的位置，使其和机械设计的真实位置一致&lt;br /&gt;
[[文件:Detour参数.png|无框|941x941像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（3）. 点击动作-双击捕捉即可看到相机画面，再双击校准，我们进行标定工作，这块需要很有耐心。&lt;br /&gt;
[[文件:标定1.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（4）打开校准的界面后，我们可以看到相机画面以及标定线，点击修改校准点，然后，鼠标依次对着标定值黑色的方框点，从左到右把点标记，如下图&lt;br /&gt;
[[文件:标定-2.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''一定要耐心，5分钟内就可以标定好，标定完成后会提示准备就绪，可以观察右下角的提示，可以知道目前正在标定哪一个点''&lt;br /&gt;
[[文件:标定3.png|无|缩略图|513x513像素]]&lt;br /&gt;
（5）标定好后，我们选择摄像头，选择”保存校准数据”，然后再点击”校准数据另存为”保存到Detour目录下即可，然后保存下导航配置&lt;br /&gt;
[[文件:标定保存.png|无|有框]]''&amp;lt;big&amp;gt;'''注意：如果涉及到多个车，需要用同一个位置的地纹标定纸来进行标定'''&amp;lt;/big&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
= 6.地纹地图录制 =&lt;br /&gt;
&lt;br /&gt;
==== 1,建图方式 ====&lt;br /&gt;
&lt;br /&gt;
* 纯地纹建图--------大场景施工繁琐，耗时耗力&lt;br /&gt;
* 激光+地纹建图----施工方便&lt;br /&gt;
&lt;br /&gt;
(1)纯地纹建图，需要地面做标记，可以墨斗弹线/铺设标定线，目的是为了修图，因为纹理录的过程中会有误差，所以通过标定线来有目标性的进行图优化，可以看图6.1.1以及图6.1.2通过优化可以保证所有帧中的标定线处于同一水平，&lt;br /&gt;
[[文件:地纹地面弹线.png|无|有框|地面5mm标定线]]&lt;br /&gt;
[[文件:地纹纹理11.png|无|有框|6.1.1 连续录制的地面纹理地图-未修图]]&lt;br /&gt;
[[文件:E124eba91f7b7a4c8a707a412cf6ddb.png|无|缩略图|965x965像素|6.1.2 连续录制的地面纹理地图-修图后]]&lt;br /&gt;
（2）激光+地纹，是指在提前录制好激光地图的基础上，录制地纹，这个情况可以不需要标定线，但是有标定线也可以更方便的辅助修图。&lt;br /&gt;
[[文件:激光+地纹.png|无|有框|链接=文件:激光_地纹.png]]&lt;br /&gt;
&lt;br /&gt;
==== 2,开始建图 ====&lt;br /&gt;
1. 打开Detour.exe，选择里程计-添加里程计-地面纹理导航&lt;br /&gt;
[[文件:Detour-添加地纹里程计.png|无|缩略图|547x547像素]]&lt;br /&gt;
2. 点击地面纹理导航，添加图层，默认ground名称即可，这步结束后，保存下导航配置&lt;br /&gt;
[[文件:地纹里程计2.png|无|缩略图|547x547像素]]&lt;br /&gt;
3. 保存导航配置后，重启下detour,这时候就可以看到小车下有地面的图像了&lt;br /&gt;
[[文件:地纹里程计3.png|无|有框]]&lt;br /&gt;
4. 点击自动更新图层即可开启建图模式，对于纯纹理导航，需要按照标线遥控小车，把对应位置纹理录进去，对于激光+地纹，可以直接下发激光路径，在走激光的时候录制地纹地图。&lt;br /&gt;
[[文件:更新.png|无|有框]]&lt;br /&gt;
注意：激光+地纹录制的时候，我们需要注意按照以下步骤&lt;br /&gt;
&lt;br /&gt;
（1）保证AGV行驶激光路径精度正常，比如一条10米直线，AGV行驶过程整体行驶姿态误差都较为稳定&lt;br /&gt;
&lt;br /&gt;
（2）关闭图优化，取消勾选，会使得地纹关键帧停留在原始位置上不动&lt;br /&gt;
&lt;br /&gt;
[[文件:9906be627cab3cbfb3d49d0f6a38747.png|无框]]（3）每隔一段距离，锁一下最后一个关键帧，再开启图优化，就会把之前建的纹理图给优化好。然后再关闭，再走，走完后再锁一个关键帧.......以此类推。&lt;br /&gt;
&lt;br /&gt;
（4）录好后锁定图层，然后另存图层，保存导航配置即可，这样下次打开detour会自动加载地纹图层&lt;br /&gt;
&lt;br /&gt;
= 7.注意点 =&lt;br /&gt;
&lt;br /&gt;
==== 1，若使用激光+地纹方案，Detour中激光以及纹理相机的xyth需要按照实际物理位置填写，车体运动中心为坐标原点，前进方向为x正，前进方向左侧y正 ====&lt;br /&gt;
&lt;br /&gt;
==== 2，由于地纹相机实时性比较高因此，不同雷达配合地纹使用需要修改time_bias_ms，镭神3d激光相比较相机大概延迟100ms左右，因此我们需要把相机的time_bias_ms改成-100 ====&lt;br /&gt;
[[文件:Maincam.png|无框]]&lt;br /&gt;
&lt;br /&gt;
==== 3，fitTCfactor参数可以配置多传感器耦合的权重，越低则代表该传感器越不重要 ====&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=148</id>
		<title>使用手册 - 激光＋纹理导航</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=148"/>
		<updated>2023-10-13T06:15:26Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1.什么是纹理导航？ =&lt;br /&gt;
一种基于地面图像纹理的视觉导航方法。硬件上由下视摄像头，补光灯(对光线有一定要求)等组成。纹理导航利用地面丰富的纹理信息，基于相位相关法和极坐标转换来计算出两图间的位移和旋转，对比地图已知的绝对坐标获取当前位置。&lt;br /&gt;
&lt;br /&gt;
不需对地面进行额外处理，无需安装反射板、磁条等，确保灵活性及扩展性。该方案性价比高、无需改造现场环境、施工周期短、能适应复杂应用场景。&lt;br /&gt;
&lt;br /&gt;
= 2.纹理导航适用的场景 =&lt;br /&gt;
纹理导航适用于一些特定的环境场景，其中地面或环境中存在明显的纹理特征，如金刚砂硬化地坪，普通水泥地坪，瓷砖地坪，车间铺设重复纹理的地板，且地板纹理重复度大于相机视野即可，&amp;lt;u&amp;gt;且多灰尘，油污等，地面纹理极少，且经常变化&amp;lt;/u&amp;gt;，不适合使用纹理导航&lt;br /&gt;
&lt;br /&gt;
==== 1，金刚砂硬化地坪，有反光但纹理清晰。需要注意补光 ====&lt;br /&gt;
[[文件:金刚砂.jpg|某现场金刚砂地面环境|缩略图|542x542像素|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:金刚砂地面.png|常规的金刚砂地面 |无|有框]]&lt;br /&gt;
&lt;br /&gt;
==== 2.瓷砖地面，有反光，纹理清晰。亮色系，补光容易。要求瓷砖尺寸&amp;gt;视觉相机视野（15*15cm） ====&lt;br /&gt;
[[文件:瓷砖地面.png|某酒店地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地面-总.png|常见的瓷砖地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地纹.png|瓷砖地面纹理地图|有框|无]]&lt;br /&gt;
&lt;br /&gt;
==== 3.普通水泥，补光容易，纹理清晰 ====&lt;br /&gt;
[[文件:水泥地面.png|普通水泥|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 3.纹理导航不适用的场景 =&lt;br /&gt;
不适用地面：地面反光且无纹理或纹理特征不明显的场地，不适用。&lt;br /&gt;
&lt;br /&gt;
A. 纹理没有或者极少，相机获取不到纹理特征，理论上无法实现。&lt;br /&gt;
&lt;br /&gt;
B. 打光困难，地面反光获取特征不是地面的真实情况，算法无法消除。&lt;br /&gt;
&lt;br /&gt;
C. 地面磨损，纹理极容易被损坏。&lt;br /&gt;
&lt;br /&gt;
D. 灰尘油污大的场地，地面纹理特征不稳定，经常变化，如室外泥泞环境。需要增加外部可靠纹理，保证导航稳定性能。&lt;br /&gt;
&lt;br /&gt;
E. 少纹理或者重复小纹理地面，例如载货电梯内部地面。需要增加外部标识，使纹理特征大于相机视野（15*15cm）&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
==== 1.环氧地坪，补光困难，初期缺少视觉纹理导航必须的地面纹理。地面容易划伤，纹理不稳定。 ====&lt;br /&gt;
[[文件:环氧地坪.png|环氧地坪图片|有框|无]]&lt;br /&gt;
&lt;br /&gt;
==== 2.重复小纹理地面，纹理特征不明显 ====&lt;br /&gt;
[[文件:扶梯地面.png|扶梯地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 4.纹理导航相比较SLAM的优缺点 =&lt;br /&gt;
纹理导航和SLAM是两种不同的导航方法，各自具有优缺点，适用于不同的应用场景&lt;br /&gt;
&lt;br /&gt;
===== 优点： =====&lt;br /&gt;
&lt;br /&gt;
* 简单实时性：纹理导航实现简单，通常具有较好的实时性，适用于对实时性要求较高的应用。&lt;br /&gt;
* 成本较低：相对于SLAM需要的昂贵传感器，纹理导航通常可以通过普通的相机或传感器实现，降低了系统成本。&lt;br /&gt;
* 适用广泛：适用于各类有明显地面纹理的场所。&lt;br /&gt;
* 相比较SLAM精度更稳定&lt;br /&gt;
&lt;br /&gt;
===== 缺点： =====&lt;br /&gt;
&lt;br /&gt;
* 局部信息：纹理导航一般只能提供相对局部的信息，不能构建全局一致的地图，因此适用于需要全局感知的场景有限。&lt;br /&gt;
* 对地面特征依赖性强：纹理导航依赖于地面的特征，如果地面特征变化或受到遮挡，可能会影响导航的准确性。&lt;br /&gt;
* 大场景建图耗时，需要地面弹线，修图，相比较slam实施较为耗时，麻烦。&lt;br /&gt;
&lt;br /&gt;
= 5.MDCS系统如何适用纹理导航 =&lt;br /&gt;
&lt;br /&gt;
==== 1．'''准备工作''' ====&lt;br /&gt;
1. 配置Medulla startup保证可以读取到相机图像数据，加载MVCamera.dll，如下方式&lt;br /&gt;
&lt;br /&gt;
mv=io load plugins/MVCamera.dll&lt;br /&gt;
&lt;br /&gt;
maincam=mv initMono MG010  //MG010为该相机型号&lt;br /&gt;
&lt;br /&gt;
打开Medulla.exe后就可以看到图像此准备工作完成&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image1.png|无框|658x658像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour根目录下需要有regcore_cuda和cufft64库文件&lt;br /&gt;
&lt;br /&gt;
2. 修改相机曝光参数，此处我们以海康相机为例，打开相机MVS软件，选择对应网卡的相机，双击，启动相机，就可以看到画面了，然后再右侧栏目中，调节相机的亮度和曝光即可，保证能够清晰的看到地面纹理即可,&lt;br /&gt;
[[文件:Cas.png|无|缩略图|656x656像素|海康MVS软件]]&lt;br /&gt;
在这个过程中我们需要保证曝光均匀，需要设计一个合理的曝光结构，如下图&lt;br /&gt;
&lt;br /&gt;
[[文件:纹理.png|无框|661x661像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. 标定相机&lt;br /&gt;
&lt;br /&gt;
（1）. 准备15cm*15cm的标定纸（见下图），贴在平整的地面上，相机必须能够完全看到标定纸中的方格，为消除畸变对相机的影响，在使用前需要相对相机进行标定，由于相机的透镜影响，以及相机在机械组装过程中的误差会使得光线穿过透镜投影到成像面时位置会发生变化。由透镜引起的畸变称之为“径向畸变”。在实际拍摄中径向畸变会使得一条直线在图片中变为曲线。通常分为桶形畸变和枕形畸变，目前标定摄像头主要为消除桶形畸变，如下图，左侧是标定后，右侧是未标定过的。&lt;br /&gt;
[[文件:标定纸.png|无|有框|15*15标定纸]][[文件:标定.png|836x836像素]]&lt;br /&gt;
&lt;br /&gt;
（2）. 打开Detour.exe，打开车体编辑器，添加下视摄像头，选择该组件，名称改成”maincam”和medulla加载的名称一致即可，修改相机和雷达的位置，使其和机械设计的真实位置一致&lt;br /&gt;
[[文件:Detour参数.png|无框|941x941像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（3）. 点击动作-双击捕捉即可看到相机画面，再双击校准，我们进行标定工作，这块需要很有耐心。&lt;br /&gt;
[[文件:标定1.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（4）打开校准的界面后，我们可以看到相机画面以及标定线，点击修改校准点，然后，鼠标依次对着标定值黑色的方框点，从左到右把点标记，如下图&lt;br /&gt;
[[文件:标定-2.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''一定要耐心，5分钟内就可以标定好，标定完成后会提示准备就绪，可以观察右下角的提示，可以知道目前正在标定哪一个点''&lt;br /&gt;
[[文件:标定3.png|无|缩略图|513x513像素]]&lt;br /&gt;
（5）标定好后，我们选择摄像头，选择”保存校准数据”，然后再点击”校准数据另存为”保存到Detour目录下即可，然后保存下导航配置&lt;br /&gt;
[[文件:标定保存.png|无|有框]]''&amp;lt;big&amp;gt;'''注意：如果涉及到多个车，需要用同一个位置的地纹标定纸来进行标定'''&amp;lt;/big&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
= 6.地纹地图录制 =&lt;br /&gt;
&lt;br /&gt;
==== 1,建图方式 ====&lt;br /&gt;
&lt;br /&gt;
* 纯地纹建图--------大场景施工繁琐，耗时耗力&lt;br /&gt;
* 激光+地纹建图----施工方便&lt;br /&gt;
&lt;br /&gt;
(1)纯地纹建图，需要地面做标记，可以墨斗弹线/铺设标定线，目的是为了修图，因为纹理录的过程中会有误差，所以通过标定线来有目标性的进行图优化，可以看图6.1.1以及图6.1.2通过优化可以保证所有帧中的标定线处于同一水平，&lt;br /&gt;
[[文件:地纹地面弹线.png|无|有框|地面5mm标定线]]&lt;br /&gt;
[[文件:地纹纹理11.png|无|有框|6.1.1 连续录制的地面纹理地图-未修图]]&lt;br /&gt;
[[文件:E124eba91f7b7a4c8a707a412cf6ddb.png|无|缩略图|965x965像素|6.1.2 连续录制的地面纹理地图-修图后]]&lt;br /&gt;
（2）激光+地纹，是指在提前录制好激光地图的基础上，录制地纹，这个情况可以不需要标定线，但是有标定线也可以更方便的辅助修图。&lt;br /&gt;
[[文件:激光+地纹.png|无|有框|链接=文件:激光_地纹.png]]&lt;br /&gt;
&lt;br /&gt;
==== 2,开始建图 ====&lt;br /&gt;
1. 打开Detour.exe，选择里程计-添加里程计-地面纹理导航&lt;br /&gt;
[[文件:Detour-添加地纹里程计.png|无|缩略图|547x547像素]]&lt;br /&gt;
2. 点击地面纹理导航，添加图层，默认ground名称即可，这步结束后，保存下导航配置&lt;br /&gt;
[[文件:地纹里程计2.png|无|缩略图|547x547像素]]&lt;br /&gt;
3. 保存导航配置后，重启下detour,这时候就可以看到小车下有地面的图像了&lt;br /&gt;
[[文件:地纹里程计3.png|无|有框]]&lt;br /&gt;
4. 点击自动更新图层即可开启建图模式，对于纯纹理导航，需要按照标线遥控小车，把对应位置纹理录进去，对于激光+地纹，可以直接下发激光路径，在走激光的时候录制地纹地图。&lt;br /&gt;
[[文件:更新.png|无|有框]]&lt;br /&gt;
注意：激光+地纹录制的时候，我们需要注意按照以下步骤&lt;br /&gt;
&lt;br /&gt;
（1）保证AGV行驶激光路径精度正常，比如一条10米直线，AGV行驶过程整体行驶姿态误差都较为稳定&lt;br /&gt;
&lt;br /&gt;
（2）关闭图优化，取消勾选，会使得地纹关键帧停留在原始位置上不动&lt;br /&gt;
&lt;br /&gt;
[[文件:9906be627cab3cbfb3d49d0f6a38747.png|无框]]（3）每隔一段距离，锁一下最后一个关键帧，再开启图优化，就会把之前建的纹理图给优化好。然后再关闭，再走，走完后再锁一个关键帧.......以此类推。&lt;br /&gt;
&lt;br /&gt;
（4）录好后锁定图层，然后另存图层，保存导航配置即可，这样下次打开detour会自动加载地纹图层&lt;br /&gt;
&lt;br /&gt;
= 7.注意点 =&lt;br /&gt;
&lt;br /&gt;
==== 1，若使用激光+地纹方案，Detour中激光以及纹理相机的xyth需要按照实际物理位置填写，车体运动中心为坐标原点，前进方向为x正，前进方向左侧y正 ====&lt;br /&gt;
&lt;br /&gt;
==== 2，由于地纹相机实时性比较高因此，不同雷达配合地纹使用需要修改time_bias_ms，镭神3d激光相比较相机大概延迟100ms左右，因此我们需要把相机的time_bias_ms改成-100 ====&lt;br /&gt;
[[文件:Maincam.png|无框]]&lt;br /&gt;
&lt;br /&gt;
==== 3，fitTCfactor参数可以配置多传感器耦合的权重，越低则代表该传感器越不重要 ====&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=147</id>
		<title>使用手册 - 激光＋纹理导航</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=147"/>
		<updated>2023-10-13T06:14:50Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​/* 3.纹理导航不适用的场景 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1.什么是纹理导航？ =&lt;br /&gt;
一种基于地面图像纹理的视觉导航方法。硬件上由下视摄像头，补光灯(对光线有一定要求)等组成。纹理导航利用地面丰富的纹理信息，基于相位相关法和极坐标转换来计算出两图间的位移和旋转，对比地图已知的绝对坐标获取当前位置。&lt;br /&gt;
&lt;br /&gt;
不需对地面进行额外处理，无需安装反射板、磁条等，确保灵活性及扩展性。该方案性价比高、无需改造现场环境、施工周期短、能适应复杂应用场景。&lt;br /&gt;
&lt;br /&gt;
= 2.纹理导航适用的场景 =&lt;br /&gt;
纹理导航适用于一些特定的环境场景，其中地面或环境中存在明显的纹理特征，如金刚砂硬化地坪，普通水泥地坪，瓷砖地坪，车间铺设重复纹理的地板，且地板纹理重复度大于相机视野即可，&amp;lt;u&amp;gt;且多灰尘，油污等，地面纹理极少，且经常变化&amp;lt;/u&amp;gt;，不适合使用纹理导航&lt;br /&gt;
&lt;br /&gt;
==== 1，金刚砂硬化地坪，有反光但纹理清晰。需要注意补光 ====&lt;br /&gt;
[[文件:金刚砂.jpg|某现场金刚砂地面环境|缩略图|542x542像素|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:金刚砂地面.png|常规的金刚砂地面 |无|有框]]&lt;br /&gt;
&lt;br /&gt;
==== 2.瓷砖地面，有反光，纹理清晰。亮色系，补光容易。要求瓷砖尺寸&amp;gt;视觉相机视野（15*15cm） ====&lt;br /&gt;
[[文件:瓷砖地面.png|某酒店地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地面-总.png|常见的瓷砖地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地纹.png|瓷砖地面纹理地图|有框|无]]&lt;br /&gt;
&lt;br /&gt;
==== 3.普通水泥，补光容易，纹理清晰 ====&lt;br /&gt;
[[文件:水泥地面.png|普通水泥|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 3.纹理导航不适用的场景 =&lt;br /&gt;
不适用地面：地面反光且无纹理或纹理特征不明显的场地，不适用。&lt;br /&gt;
&lt;br /&gt;
A. 纹理没有或者极少，相机获取不到纹理特征，理论上无法实现。&lt;br /&gt;
&lt;br /&gt;
B. 打光困难，地面反光获取特征不是地面的真实情况，算法无法消除。&lt;br /&gt;
&lt;br /&gt;
C. 地面磨损，纹理极容易被损坏。&lt;br /&gt;
&lt;br /&gt;
D. 灰尘油污大的场地，地面纹理特征不稳定，经常变化，如室外泥泞环境。需要增加外部可靠纹理，保证导航稳定性能。&lt;br /&gt;
&lt;br /&gt;
E. 少纹理或者重复小纹理地面，例如载货电梯内部地面。需要增加外部标识，使纹理特征大于相机视野（15*15cm）&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
==== 1.环氧地坪，补光困难，初期缺少视觉纹理导航必须的地面纹理。地面容易划伤，纹理不稳定。 ====&lt;br /&gt;
[[文件:环氧地坪.png|环氧地坪图片|有框|无]]&lt;br /&gt;
&lt;br /&gt;
==== 2.重复小纹理地面，纹理特征不明显 ====&lt;br /&gt;
[[文件:扶梯地面.png|扶梯地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 4.纹理导航相比较SLAM的优缺点 =&lt;br /&gt;
纹理导航和SLAM是两种不同的导航方法，各自具有优缺点，适用于不同的应用场景&lt;br /&gt;
&lt;br /&gt;
===== 优点： =====&lt;br /&gt;
&lt;br /&gt;
* 简单实时性：纹理导航实现简单，通常具有较好的实时性，适用于对实时性要求较高的应用。&lt;br /&gt;
* 成本较低：相对于SLAM需要的昂贵传感器，纹理导航通常可以通过普通的相机或传感器实现，降低了系统成本。&lt;br /&gt;
* 适用广泛：适用于各类有明显地面纹理的场所。&lt;br /&gt;
* 相比较SLAM精度更稳定&lt;br /&gt;
&lt;br /&gt;
===== 缺点： =====&lt;br /&gt;
&lt;br /&gt;
* 局部信息：纹理导航一般只能提供相对局部的信息，不能构建全局一致的地图，因此适用于需要全局感知的场景有限。&lt;br /&gt;
* 对地面特征依赖性强：纹理导航依赖于地面的特征，如果地面特征变化或受到遮挡，可能会影响导航的准确性。&lt;br /&gt;
* 大场景建图耗时，需要地面弹线，修图，相比较slam实施较为耗时，麻烦。&lt;br /&gt;
&lt;br /&gt;
= 5.MDCS系统如何适用纹理导航 =&lt;br /&gt;
&lt;br /&gt;
==== 1．'''准备工作''' ====&lt;br /&gt;
1. 配置Medulla startup保证可以读取到相机图像数据，加载MVCamera.dll，如下方式&lt;br /&gt;
&lt;br /&gt;
mv=io load plugins/MVCamera.dll&lt;br /&gt;
&lt;br /&gt;
maincam=mv initMono MG010  //MG010为该相机型号&lt;br /&gt;
&lt;br /&gt;
打开Medulla.exe后就可以看到图像此准备工作完成&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image1.png|无框|658x658像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour根目录下需要有regcore_cuda和cufft64库文件&lt;br /&gt;
&lt;br /&gt;
2. 修改相机曝光参数，此处我们以海康相机为例，打开相机MVS软件，选择对应网卡的相机，双击，启动相机，就可以看到画面了，然后再右侧栏目中，调节相机的亮度和曝光即可，保证能够清晰的看到地面纹理即可,&lt;br /&gt;
[[文件:Cas.png|无|缩略图|656x656像素|海康MVS软件]]&lt;br /&gt;
在这个过程中我们需要保证曝光均匀，需要设计一个合理的曝光结构，如下图&lt;br /&gt;
&lt;br /&gt;
[[文件:纹理.png|无框|661x661像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. 标定相机&lt;br /&gt;
&lt;br /&gt;
（1）. 准备15cm*15cm的标定纸（见下图），贴在平整的地面上，相机必须能够完全看到标定纸中的方格，为消除畸变对相机的影响，在使用前需要相对相机进行标定，由于相机的透镜影响，以及相机在机械组装过程中的误差会使得光线穿过透镜投影到成像面时位置会发生变化。由透镜引起的畸变称之为“径向畸变”。在实际拍摄中径向畸变会使得一条直线在图片中变为曲线。通常分为桶形畸变和枕形畸变，目前标定摄像头主要为消除桶形畸变，如下图，左侧是标定后，右侧是未标定过的。&lt;br /&gt;
[[文件:标定纸.png|无|有框|15*15标定纸]][[文件:标定.png|836x836像素]]&lt;br /&gt;
&lt;br /&gt;
（2）. 打开Detour.exe，打开车体编辑器，添加下视摄像头，选择该组件，名称改成”maincam”和medulla加载的名称一致即可，修改相机和雷达的位置，使其和机械设计的真实位置一致&lt;br /&gt;
[[文件:Detour参数.png|无框|941x941像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（3）. 点击动作-双击捕捉即可看到相机画面，再双击校准，我们进行标定工作，这块需要很有耐心。&lt;br /&gt;
[[文件:标定1.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（4）打开校准的界面后，我们可以看到相机画面以及标定线，点击修改校准点，然后，鼠标依次对着标定值黑色的方框点，从左到右把点标记，如下图&lt;br /&gt;
[[文件:标定-2.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''一定要耐心，5分钟内就可以标定好，标定完成后会提示准备就绪，可以观察右下角的提示，可以知道目前正在标定哪一个点''&lt;br /&gt;
[[文件:标定3.png|无|缩略图|513x513像素]]&lt;br /&gt;
（5）标定好后，我们选择摄像头，选择”保存校准数据”，然后再点击”校准数据另存为”保存到Detour目录下即可，然后保存下导航配置&lt;br /&gt;
[[文件:标定保存.png|无|有框]]''&amp;lt;big&amp;gt;'''注意：如果涉及到多个车，需要用同一个位置的地纹标定纸来进行标定'''&amp;lt;/big&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
= 6.地纹地图录制 =&lt;br /&gt;
&lt;br /&gt;
==== 1,建图方式： ====&lt;br /&gt;
&lt;br /&gt;
* 纯地纹建图--------大场景施工繁琐，耗时耗力&lt;br /&gt;
* 激光+地纹建图----施工方便&lt;br /&gt;
&lt;br /&gt;
(1)纯地纹建图，需要地面做标记，可以墨斗弹线/铺设标定线，目的是为了修图，因为纹理录的过程中会有误差，所以通过标定线来有目标性的进行图优化，可以看图6.1.1以及图6.1.2通过优化可以保证所有帧中的标定线处于同一水平，&lt;br /&gt;
[[文件:地纹地面弹线.png|无|有框|地面5mm标定线]]&lt;br /&gt;
[[文件:地纹纹理11.png|无|有框|6.1.1 连续录制的地面纹理地图-未修图]]&lt;br /&gt;
[[文件:E124eba91f7b7a4c8a707a412cf6ddb.png|无|缩略图|965x965像素|6.1.2 连续录制的地面纹理地图-修图后]]&lt;br /&gt;
（2）激光+地纹，是指在提前录制好激光地图的基础上，录制地纹，这个情况可以不需要标定线，但是有标定线也可以更方便的辅助修图。&lt;br /&gt;
[[文件:激光+地纹.png|无|有框|链接=文件:激光_地纹.png]]&lt;br /&gt;
&lt;br /&gt;
==== 2,开始建图 ====&lt;br /&gt;
1. 打开Detour.exe，选择里程计-添加里程计-地面纹理导航&lt;br /&gt;
[[文件:Detour-添加地纹里程计.png|无|缩略图|547x547像素]]&lt;br /&gt;
2. 点击地面纹理导航，添加图层，默认ground名称即可，这步结束后，保存下导航配置&lt;br /&gt;
[[文件:地纹里程计2.png|无|缩略图|547x547像素]]&lt;br /&gt;
3. 保存导航配置后，重启下detour,这时候就可以看到小车下有地面的图像了&lt;br /&gt;
[[文件:地纹里程计3.png|无|有框]]&lt;br /&gt;
4. 点击自动更新图层即可开启建图模式，对于纯纹理导航，需要按照标线遥控小车，把对应位置纹理录进去，对于激光+地纹，可以直接下发激光路径，在走激光的时候录制地纹地图。&lt;br /&gt;
[[文件:更新.png|无|有框]]&lt;br /&gt;
注意：激光+地纹录制的时候，我们需要注意按照以下步骤&lt;br /&gt;
&lt;br /&gt;
（1）保证AGV行驶激光路径精度正常，比如一条10米直线，AGV行驶过程整体行驶姿态误差都较为稳定&lt;br /&gt;
&lt;br /&gt;
（2）关闭图优化，取消勾选，会使得地纹关键帧停留在原始位置上不动&lt;br /&gt;
&lt;br /&gt;
[[文件:9906be627cab3cbfb3d49d0f6a38747.png|无框]]（3）每隔一段距离，锁一下最后一个关键帧，再开启图优化，就会把之前建的纹理图给优化好。然后再关闭，再走，走完后再锁一个关键帧.......以此类推。&lt;br /&gt;
&lt;br /&gt;
（4）录好后锁定图层，然后另存图层，保存导航配置即可，这样下次打开detour会自动加载地纹图层&lt;br /&gt;
&lt;br /&gt;
= 7.注意点 =&lt;br /&gt;
&lt;br /&gt;
==== 1，若使用激光+地纹方案，Detour中激光以及纹理相机的xyth需要按照实际物理位置填写，车体运动中心为坐标原点，前进方向为x正，前进方向左侧y正 ====&lt;br /&gt;
&lt;br /&gt;
==== 2，由于地纹相机实时性比较高因此，不同雷达配合地纹使用需要修改time_bias_ms，镭神3d激光相比较相机大概延迟100ms左右，因此我们需要把相机的time_bias_ms改成-100 ====&lt;br /&gt;
[[文件:Maincam.png|无框]]&lt;br /&gt;
&lt;br /&gt;
==== 3，fitTCfactor参数可以配置多传感器耦合的权重，越低则代表该传感器越不重要 ====&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Maincam.png&amp;diff=146</id>
		<title>文件:Maincam.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Maincam.png&amp;diff=146"/>
		<updated>2023-10-13T06:12:28Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;maincam&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:9906be627cab3cbfb3d49d0f6a38747.png&amp;diff=145</id>
		<title>文件:9906be627cab3cbfb3d49d0f6a38747.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:9906be627cab3cbfb3d49d0f6a38747.png&amp;diff=145"/>
		<updated>2023-10-13T06:04:24Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;9906be627cab3cbfb3d49d0f6a38747&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:E124eba91f7b7a4c8a707a412cf6ddb.png&amp;diff=144</id>
		<title>文件:E124eba91f7b7a4c8a707a412cf6ddb.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:E124eba91f7b7a4c8a707a412cf6ddb.png&amp;diff=144"/>
		<updated>2023-10-13T05:59:41Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;E124eba91f7b7a4c8a707a412cf6ddb&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=143</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=143"/>
		<updated>2023-10-12T11:05:21Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​/* 使用手册 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[文件:MDCS-2023.png|缩略图|159x159像素|MDCS logo 2023]]&lt;br /&gt;
MDCS is a robot fleet developing platform, including the following components:&lt;br /&gt;
&lt;br /&gt;
[[Medulla]]: Efficient hardware communication and control platform.&lt;br /&gt;
&lt;br /&gt;
Detour: Positioning system, built-in Lidar and Visual SLAM&lt;br /&gt;
&lt;br /&gt;
Clumsy: Robot movement instruction platform, built-in typical movements for AGV/AMR.&lt;br /&gt;
&lt;br /&gt;
Simple: Robot fleet management including traffic control system.&lt;br /&gt;
&lt;br /&gt;
CycleGUI: Cycle based GUI framework, use co-routine to host GUI in an immediate-mode fashion. the co-routine is invoked only when a GUI refresh is needed.&lt;br /&gt;
&lt;br /&gt;
== 使用手册 ==&lt;br /&gt;
[[使用手册 - MDCS简介]]&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;
[[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;
&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;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=142</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=142"/>
		<updated>2023-10-12T11:04:13Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​/* 使用手册 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[文件:MDCS-2023.png|缩略图|159x159像素|MDCS logo 2023]]&lt;br /&gt;
MDCS is a robot fleet developing platform, including the following components:&lt;br /&gt;
&lt;br /&gt;
[[Medulla]]: Efficient hardware communication and control platform.&lt;br /&gt;
&lt;br /&gt;
Detour: Positioning system, built-in Lidar and Visual SLAM&lt;br /&gt;
&lt;br /&gt;
Clumsy: Robot movement instruction platform, built-in typical movements for AGV/AMR.&lt;br /&gt;
&lt;br /&gt;
Simple: Robot fleet management including traffic control system.&lt;br /&gt;
&lt;br /&gt;
CycleGUI: Cycle based GUI framework, use co-routine to host GUI in an immediate-mode fashion. the co-routine is invoked only when a GUI refresh is needed.&lt;br /&gt;
&lt;br /&gt;
== 使用手册 ==&lt;br /&gt;
[[使用手册 - MDCS简介]]&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;
[[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;
&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;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=141</id>
		<title>使用手册 - 激光＋纹理导航</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=141"/>
		<updated>2023-10-12T11:03:55Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1.什么是纹理导航？ =&lt;br /&gt;
一种基于地面图像纹理的视觉导航方法。硬件上由下视摄像头，补光灯(对光线有一定要求)等组成。纹理导航利用地面丰富的纹理信息，基于相位相关法和极坐标转换来计算出两图间的位移和旋转，对比地图已知的绝对坐标获取当前位置。&lt;br /&gt;
&lt;br /&gt;
不需对地面进行额外处理，无需安装反射板、磁条等，确保灵活性及扩展性。该方案性价比高、无需改造现场环境、施工周期短、能适应复杂应用场景。&lt;br /&gt;
&lt;br /&gt;
= 2.纹理导航适用的场景 =&lt;br /&gt;
纹理导航适用于一些特定的环境场景，其中地面或环境中存在明显的纹理特征，如金刚砂硬化地坪，普通水泥地坪，瓷砖地坪，车间铺设重复纹理的地板，且地板纹理重复度大于相机视野即可，&amp;lt;u&amp;gt;且多灰尘，油污等，地面纹理极少，且经常变化&amp;lt;/u&amp;gt;，不适合使用纹理导航&lt;br /&gt;
&lt;br /&gt;
==== 1，金刚砂硬化地坪，有反光但纹理清晰。需要注意补光 ====&lt;br /&gt;
[[文件:金刚砂.jpg|某现场金刚砂地面环境|缩略图|542x542像素|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:金刚砂地面.png|常规的金刚砂地面 |无|有框]]&lt;br /&gt;
&lt;br /&gt;
==== 2.瓷砖地面，有反光，纹理清晰。亮色系，补光容易。要求瓷砖尺寸&amp;gt;视觉相机视野（15*15cm） ====&lt;br /&gt;
[[文件:瓷砖地面.png|某酒店地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地面-总.png|常见的瓷砖地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地纹.png|瓷砖地面纹理地图|有框|无]]&lt;br /&gt;
&lt;br /&gt;
==== 3.普通水泥，补光容易，纹理清晰 ====&lt;br /&gt;
[[文件:水泥地面.png|普通水泥|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 3.纹理导航不适用的场景 =&lt;br /&gt;
不适用地面：地面反光且无纹理或纹理特征不明显的场地，不适用。&lt;br /&gt;
&lt;br /&gt;
A. 纹理没有或者极少，相机获取不到纹理特征，理论上无法实现。&lt;br /&gt;
&lt;br /&gt;
B. 打光困难，地面反光获取特征不是地面的真实情况，算法无法消除。&lt;br /&gt;
&lt;br /&gt;
C. 地面磨损，纹理极容易被损坏。&lt;br /&gt;
&lt;br /&gt;
D. 灰尘油污大的场地，地面纹理特征不稳定，经常变化，如室外泥泞环境。需要增加外部可靠纹理，保证导航稳定性能。&lt;br /&gt;
&lt;br /&gt;
E. 少纹理或者重复小纹理地面，例如载货电梯内部地面。需要增加外部标识，使纹理特征大于相机视野（15*15cm）&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
==== 1.环氧地坪，补光困难，初期缺少视觉纹理导航必须的地面纹理。地面容易划伤，纹理不稳定。 ====&lt;br /&gt;
[[文件:环氧地坪.png|环氧地坪图片|有框|无]]&lt;br /&gt;
&lt;br /&gt;
==== 2.重复小纹理地面，纹理特征不明显 ====&lt;br /&gt;
[[文件:扶梯地面.png|扶梯地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 4.纹理导航相比较SLAM的优缺点 =&lt;br /&gt;
纹理导航和SLAM是两种不同的导航方法，各自具有优缺点，适用于不同的应用场景&lt;br /&gt;
&lt;br /&gt;
===== 优点： =====&lt;br /&gt;
&lt;br /&gt;
* 简单实时性：纹理导航实现简单，通常具有较好的实时性，适用于对实时性要求较高的应用。&lt;br /&gt;
* 成本较低：相对于SLAM需要的昂贵传感器，纹理导航通常可以通过普通的相机或传感器实现，降低了系统成本。&lt;br /&gt;
* 适用广泛：适用于各类有明显地面纹理的场所。&lt;br /&gt;
* 相比较SLAM精度更稳定&lt;br /&gt;
&lt;br /&gt;
===== 缺点： =====&lt;br /&gt;
&lt;br /&gt;
* 局部信息：纹理导航一般只能提供相对局部的信息，不能构建全局一致的地图，因此适用于需要全局感知的场景有限。&lt;br /&gt;
* 对地面特征依赖性强：纹理导航依赖于地面的特征，如果地面特征变化或受到遮挡，可能会影响导航的准确性。&lt;br /&gt;
* 大场景建图耗时，需要地面弹线，修图，相比较slam实施较为耗时，麻烦。&lt;br /&gt;
&lt;br /&gt;
= 5.MDCS系统如何适用纹理导航 =&lt;br /&gt;
&lt;br /&gt;
==== 1．'''准备工作''' ====&lt;br /&gt;
1. 配置Medulla startup保证可以读取到相机图像数据，加载MVCamera.dll，如下方式&lt;br /&gt;
&lt;br /&gt;
mv=io load plugins/MVCamera.dll&lt;br /&gt;
&lt;br /&gt;
maincam=mv initMono MG010  //MG010为该相机型号&lt;br /&gt;
&lt;br /&gt;
打开Medulla.exe后就可以看到图像此准备工作完成&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image1.png|无框|658x658像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour根目录下需要有regcore_cuda和cufft64库文件&lt;br /&gt;
&lt;br /&gt;
2. 修改相机曝光参数，此处我们以海康相机为例，打开相机MVS软件，选择对应网卡的相机，双击，启动相机，就可以看到画面了，然后再右侧栏目中，调节相机的亮度和曝光即可，保证能够清晰的看到地面纹理即可,&lt;br /&gt;
[[文件:Cas.png|无|缩略图|656x656像素|海康MVS软件]]&lt;br /&gt;
在这个过程中我们需要保证曝光均匀，需要设计一个合理的曝光结构，如下图&lt;br /&gt;
&lt;br /&gt;
[[文件:纹理.png|无框|661x661像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. 标定相机&lt;br /&gt;
&lt;br /&gt;
（1）. 准备15cm*15cm的标定纸（见下图），贴在平整的地面上，相机必须能够完全看到标定纸中的方格，为消除畸变对相机的影响，在使用前需要相对相机进行标定，由于相机的透镜影响，以及相机在机械组装过程中的误差会使得光线穿过透镜投影到成像面时位置会发生变化。由透镜引起的畸变称之为“径向畸变”。在实际拍摄中径向畸变会使得一条直线在图片中变为曲线。通常分为桶形畸变和枕形畸变，目前标定摄像头主要为消除桶形畸变，如下图，左侧是标定后，右侧是未标定过的。&lt;br /&gt;
[[文件:标定纸.png|无|有框|15*15标定纸]][[文件:标定.png|836x836像素]]&lt;br /&gt;
&lt;br /&gt;
（2）. 打开Detour.exe，打开车体编辑器，添加下视摄像头，选择该组件，名称改成”maincam”和medulla加载的名称一致即可，修改相机和雷达的位置，使其和机械设计的真实位置一致&lt;br /&gt;
[[文件:Detour参数.png|无框|941x941像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（3）. 点击动作-双击捕捉即可看到相机画面，再双击校准，我们进行标定工作，这块需要很有耐心。&lt;br /&gt;
[[文件:标定1.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（4）打开校准的界面后，我们可以看到相机画面以及标定线，点击修改校准点，然后，鼠标依次对着标定值黑色的方框点，从左到右把点标记，如下图&lt;br /&gt;
[[文件:标定-2.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''一定要耐心，5分钟内就可以标定好，标定完成后会提示准备就绪，可以观察右下角的提示，可以知道目前正在标定哪一个点''&lt;br /&gt;
[[文件:标定3.png|无|缩略图|513x513像素]]&lt;br /&gt;
（5）标定好后，我们选择摄像头，选择”保存校准数据”，然后再点击”校准数据另存为”保存到Detour目录下即可，然后保存下导航配置&lt;br /&gt;
[[文件:标定保存.png|无|有框]]''&amp;lt;big&amp;gt;'''注意：如果涉及到多个车，需要用同一个位置的地纹标定纸来进行标定'''&amp;lt;/big&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
= 6.地纹地图录制 =&lt;br /&gt;
&lt;br /&gt;
==== 1,建图方式： ====&lt;br /&gt;
&lt;br /&gt;
* 纯地纹建图--------大场景施工繁琐，耗时耗力&lt;br /&gt;
* 激光+地纹建图----施工方便&lt;br /&gt;
&lt;br /&gt;
(1)纯地纹建图，需要地面做标记，可以墨斗弹线/铺设标定线，目的是为了修图，因为纹理录的过程中会有误差，所以通过标定线来有目标性的进行图优化，可以看图6.1.1以及图6.1.2通过优化可以保证所有帧中的标定线处于同一水平，&lt;br /&gt;
[[文件:地纹地面弹线.png|无|有框|地面5mm标定线]]&lt;br /&gt;
[[文件:地纹纹理11.png|无|有框|6.1.1 连续录制的地面纹理地图]]&lt;br /&gt;
（2）激光+地纹，是指在提前录制好激光地图的基础上，录制地纹，这个情况可以不需要标定线，但是有标定线也可以更方便的辅助修图。&lt;br /&gt;
[[文件:激光+地纹.png|无|有框|链接=文件:激光_地纹.png]]&lt;br /&gt;
&lt;br /&gt;
==== 2,开始建图 ====&lt;br /&gt;
1. 打开Detour.exe，选择里程计-添加里程计-地面纹理导航&lt;br /&gt;
[[文件:Detour-添加地纹里程计.png|无|缩略图|547x547像素]]&lt;br /&gt;
2. 点击地面纹理导航，添加图层，默认ground名称即可，这步结束后，保存下导航配置&lt;br /&gt;
[[文件:地纹里程计2.png|无|缩略图|547x547像素]]&lt;br /&gt;
3. 保存导航配置后，重启下detour,这时候就可以看到小车下有地面的图像了&lt;br /&gt;
[[文件:地纹里程计3.png|无|有框]]&lt;br /&gt;
4. 点击自动更新图层即可开启建图模式，对于纯纹理导航，需要按照标线遥控小车，把对应位置纹理录进去，对于激光+地纹，可以直接下发激光路径，在走激光的时候录制地纹地图。&lt;br /&gt;
[[文件:更新.png|无|有框]]&lt;br /&gt;
注意：激光+地纹录制的时候，我们需要注意按照以下步骤来会比较方便&lt;br /&gt;
&lt;br /&gt;
（1）&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
5. 录好后锁定图层，然后另存图层，保存导航配置即可，这样下次打开detour会自动加载地纹图层&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=140</id>
		<title>使用手册 - 激光＋纹理导航</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C_-_%E6%BF%80%E5%85%89%EF%BC%8B%E7%BA%B9%E7%90%86%E5%AF%BC%E8%88%AA&amp;diff=140"/>
		<updated>2023-10-12T11:00:37Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​/* 2.纹理导航适用的场景 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1.什么是纹理导航？ =&lt;br /&gt;
一种基于地面图像纹理的视觉导航方法。硬件上由下视摄像头，补光灯(对光线有一定要求)等组成。纹理导航利用地面丰富的纹理信息，基于相位相关法和极坐标转换来计算出两图间的位移和旋转，对比地图已知的绝对坐标获取当前位置。&lt;br /&gt;
&lt;br /&gt;
不需对地面进行额外处理，无需安装反射板、磁条等，确保灵活性及扩展性。该方案性价比高、无需改造现场环境、施工周期短、能适应复杂应用场景。&lt;br /&gt;
&lt;br /&gt;
= 2.纹理导航适用的场景 =&lt;br /&gt;
纹理导航适用于一些特定的环境场景，其中地面或环境中存在明显的纹理特征，如金刚砂硬化地坪，普通水泥地坪，瓷砖地坪，车间铺设重复纹理的地板，且地板纹理重复度大于相机视野即可，&amp;lt;u&amp;gt;且多灰尘，油污等，地面纹理极少，且经常变化&amp;lt;/u&amp;gt;，不适合使用纹理导航&lt;br /&gt;
&lt;br /&gt;
==== 1，金刚砂硬化地坪，有反光但纹理清晰。需要注意补光 ====&lt;br /&gt;
[[文件:金刚砂.jpg|某现场金刚砂地面环境|缩略图|542x542像素|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:金刚砂地面.png|常规的金刚砂地面 |无|有框]]&lt;br /&gt;
&lt;br /&gt;
==== 2.瓷砖地面，有反光，纹理清晰。亮色系，补光容易。要求瓷砖尺寸&amp;gt;视觉相机视野（15*15cm） ====&lt;br /&gt;
[[文件:瓷砖地面.png|某酒店地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地面-总.png|常见的瓷砖地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
[[文件:瓷砖地纹.png|瓷砖地面纹理地图|有框|无]]&lt;br /&gt;
&lt;br /&gt;
==== 3.普通水泥，补光容易，纹理清晰 ====&lt;br /&gt;
[[文件:水泥地面.png|普通水泥|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 3.纹理导航不适用的场景 =&lt;br /&gt;
不适用地面：地面反光且无纹理或纹理特征不明显的场地，不适用。&lt;br /&gt;
&lt;br /&gt;
A. 纹理没有或者极少，相机获取不到纹理特征，理论上无法实现。&lt;br /&gt;
&lt;br /&gt;
B. 打光困难，地面反光获取特征不是地面的真实情况，算法无法消除。&lt;br /&gt;
&lt;br /&gt;
C. 地面磨损，纹理极容易被损坏。&lt;br /&gt;
&lt;br /&gt;
D. 灰尘油污大的场地，地面纹理特征不稳定，经常变化，如室外泥泞环境。需要增加外部可靠纹理，保证导航稳定性能。&lt;br /&gt;
&lt;br /&gt;
E. 少纹理或者重复小纹理地面，例如载货电梯内部地面。需要增加外部标识，使纹理特征大于相机视野（15*15cm）&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
==== 1.环氧地坪，补光困难，初期缺少视觉纹理导航必须的地面纹理。地面容易划伤，纹理不稳定。 ====&lt;br /&gt;
[[文件:环氧地坪.png|环氧地坪图片|有框|无]]&lt;br /&gt;
&lt;br /&gt;
==== 2.重复小纹理地面，纹理特征不明显 ====&lt;br /&gt;
[[文件:扶梯地面.png|扶梯地面|有框|无]]&lt;br /&gt;
&lt;br /&gt;
= 4.纹理导航相比较SLAM的优缺点 =&lt;br /&gt;
纹理导航和SLAM是两种不同的导航方法，各自具有优缺点，适用于不同的应用场景&lt;br /&gt;
&lt;br /&gt;
===== 优点： =====&lt;br /&gt;
&lt;br /&gt;
* 简单实时性：纹理导航实现简单，通常具有较好的实时性，适用于对实时性要求较高的应用。&lt;br /&gt;
* 成本较低：相对于SLAM需要的昂贵传感器，纹理导航通常可以通过普通的相机或传感器实现，降低了系统成本。&lt;br /&gt;
* 适用广泛：适用于各类有明显地面纹理的场所。&lt;br /&gt;
* 相比较SLAM精度更稳定&lt;br /&gt;
&lt;br /&gt;
===== 缺点： =====&lt;br /&gt;
&lt;br /&gt;
* 局部信息：纹理导航一般只能提供相对局部的信息，不能构建全局一致的地图，因此适用于需要全局感知的场景有限。&lt;br /&gt;
* 对地面特征依赖性强：纹理导航依赖于地面的特征，如果地面特征变化或受到遮挡，可能会影响导航的准确性。&lt;br /&gt;
* 大场景建图耗时，需要地面弹线，修图，相比较slam实施较为耗时，麻烦。&lt;br /&gt;
&lt;br /&gt;
= 5.MDCS系统如何适用纹理导航 =&lt;br /&gt;
&lt;br /&gt;
==== 1．'''准备工作''' ====&lt;br /&gt;
1. 配置Medulla startup保证可以读取到相机图像数据，加载MVCamera.dll，如下方式&lt;br /&gt;
&lt;br /&gt;
mv=io load plugins/MVCamera.dll&lt;br /&gt;
&lt;br /&gt;
maincam=mv initMono MG010  //MG010为该相机型号&lt;br /&gt;
&lt;br /&gt;
打开Medulla.exe后就可以看到图像此准备工作完成&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:Image1.png|无框|658x658像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Detour根目录下需要有regcore_cuda和cufft64库文件&lt;br /&gt;
&lt;br /&gt;
2. 修改相机曝光参数，此处我们以海康相机为例，打开相机MVS软件，选择对应网卡的相机，双击，启动相机，就可以看到画面了，然后再右侧栏目中，调节相机的亮度和曝光即可，保证能够清晰的看到地面纹理即可,&lt;br /&gt;
[[文件:Cas.png|无|缩略图|656x656像素|海康MVS软件]]&lt;br /&gt;
在这个过程中我们需要保证曝光均匀，需要设计一个合理的曝光结构，如下图&lt;br /&gt;
&lt;br /&gt;
[[文件:纹理.png|无框|661x661像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. 标定相机&lt;br /&gt;
&lt;br /&gt;
（1）. 准备15cm*15cm的标定纸（见下图），贴在平整的地面上，相机必须能够完全看到标定纸中的方格，为消除畸变对相机的影响，在使用前需要相对相机进行标定，由于相机的透镜影响，以及相机在机械组装过程中的误差会使得光线穿过透镜投影到成像面时位置会发生变化。由透镜引起的畸变称之为“径向畸变”。在实际拍摄中径向畸变会使得一条直线在图片中变为曲线。通常分为桶形畸变和枕形畸变，目前标定摄像头主要为消除桶形畸变，如下图，左侧是标定后，右侧是未标定过的。&lt;br /&gt;
[[文件:标定纸.png|无|有框|15*15标定纸]][[文件:标定.png|836x836像素]]&lt;br /&gt;
&lt;br /&gt;
（2）. 打开Detour.exe，打开车体编辑器，添加下视摄像头，选择该组件，名称改成”maincam”和medulla加载的名称一致即可，修改相机和雷达的位置，使其和机械设计的真实位置一致&lt;br /&gt;
[[文件:Detour参数.png|无框|941x941像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（3）. 点击动作-双击捕捉即可看到相机画面，再双击校准，我们进行标定工作，这块需要很有耐心。&lt;br /&gt;
[[文件:标定1.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（4）打开校准的界面后，我们可以看到相机画面以及标定线，点击修改校准点，然后，鼠标依次对着标定值黑色的方框点，从左到右把点标记，如下图&lt;br /&gt;
[[文件:标定-2.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''一定要耐心，5分钟内就可以标定好，标定完成后会提示准备就绪，可以观察右下角的提示，可以知道目前正在标定哪一个点''&lt;br /&gt;
[[文件:标定3.png|无|缩略图|513x513像素]]&lt;br /&gt;
（5）标定好后，我们选择摄像头，选择”保存校准数据”，然后再点击”校准数据另存为”保存到Detour目录下即可，然后保存下导航配置&lt;br /&gt;
[[文件:标定保存.png|无|有框]]''&amp;lt;big&amp;gt;'''注意：如果涉及到多个车，需要用同一个位置的地纹标定纸来进行标定'''&amp;lt;/big&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
= 6.地纹地图录制 =&lt;br /&gt;
&lt;br /&gt;
==== 1,建图方式： ====&lt;br /&gt;
&lt;br /&gt;
* 纯地纹建图--------大场景施工繁琐，耗时耗力&lt;br /&gt;
* 激光+地纹建图----施工方便&lt;br /&gt;
&lt;br /&gt;
(1)纯地纹建图，需要地面做标记，可以墨斗弹线/铺设标定线，目的是为了修图，因为纹理录的过程中会有误差，所以通过标定线来有目标性的进行图优化，可以看图6.1.1以及图6.1.2通过优化可以保证所有帧中的标定线处于同一水平，&lt;br /&gt;
[[文件:地纹地面弹线.png|无|有框|地面5mm标定线]]&lt;br /&gt;
[[文件:地纹纹理11.png|无|有框|6.1.1 连续录制的地面纹理地图]]&lt;br /&gt;
（2）激光+地纹，是指在提前录制好激光地图的基础上，录制地纹，这个情况可以不需要标定线，但是有标定线也可以更方便的辅助修图。&lt;br /&gt;
[[文件:激光+地纹.png|无|有框]]&lt;br /&gt;
&lt;br /&gt;
==== 2,开始建图 ====&lt;br /&gt;
1. 打开Detour.exe，选择里程计-添加里程计-地面纹理导航&lt;br /&gt;
[[文件:Detour-添加地纹里程计.png|无|缩略图|547x547像素]]&lt;br /&gt;
2. 点击地面纹理导航，添加图层，默认ground名称即可，这步结束后，保存下导航配置&lt;br /&gt;
[[文件:地纹里程计2.png|无|缩略图|547x547像素]]&lt;br /&gt;
3. 保存导航配置后，重启下detour,这时候就可以看到小车下有地面的图像了&lt;br /&gt;
[[文件:地纹里程计3.png|无|有框]]&lt;br /&gt;
4. 点击自动更新图层即可开启建图模式，这时候手动遥控小车或者在原本slam地图的基础上，并且已经绘制Simple地图，直接下任务让小车自动走即可。&lt;br /&gt;
[[文件:更新.png|无|有框]]&lt;br /&gt;
5. 录好后锁定图层，然后另存图层，保存导航配置即可，这样下次打开detour会自动加载地纹图层&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:%E6%9B%B4%E6%96%B0.png&amp;diff=139</id>
		<title>文件:更新.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:%E6%9B%B4%E6%96%B0.png&amp;diff=139"/>
		<updated>2023-10-12T11:00:12Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;更新&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:%E5%9C%B0%E7%BA%B9%E9%87%8C%E7%A8%8B%E8%AE%A13.png&amp;diff=138</id>
		<title>文件:地纹里程计3.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:%E5%9C%B0%E7%BA%B9%E9%87%8C%E7%A8%8B%E8%AE%A13.png&amp;diff=138"/>
		<updated>2023-10-12T10:59:22Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;地纹里程计3&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:%E5%9C%B0%E7%BA%B9%E9%87%8C%E7%A8%8B%E8%AE%A12.png&amp;diff=137</id>
		<title>文件:地纹里程计2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:%E5%9C%B0%E7%BA%B9%E9%87%8C%E7%A8%8B%E8%AE%A12.png&amp;diff=137"/>
		<updated>2023-10-12T10:58:24Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;地纹里程计2&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Detour-%E6%B7%BB%E5%8A%A0%E5%9C%B0%E7%BA%B9%E9%87%8C%E7%A8%8B%E8%AE%A1.png&amp;diff=136</id>
		<title>文件:Detour-添加地纹里程计.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:Detour-%E6%B7%BB%E5%8A%A0%E5%9C%B0%E7%BA%B9%E9%87%8C%E7%A8%8B%E8%AE%A1.png&amp;diff=136"/>
		<updated>2023-10-12T10:57:48Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;detour-添加地纹里程计&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
	<entry>
		<id>https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:%E6%BF%80%E5%85%89%2B%E5%9C%B0%E7%BA%B9.png&amp;diff=135</id>
		<title>文件:激光+地纹.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lessokaji.com/index.php?title=%E6%96%87%E4%BB%B6:%E6%BF%80%E5%85%89%2B%E5%9C%B0%E7%BA%B9.png&amp;diff=135"/>
		<updated>2023-10-12T10:54:53Z</updated>

		<summary type="html">&lt;p&gt;Huangzhaowei：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;激光+地纹&lt;/div&gt;</summary>
		<author><name>Huangzhaowei</name></author>
	</entry>
</feed>