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