slam_toolbox建图漂移
一.问题
问题:我使用的是ros2的humble版本,在使用slam_toolbox建图时,总会发现地图重叠,以及里程计漂移;
我用gazebo仿真的界面是一个三室一厅的房间,如下图1所示。但是出现了地图重叠问题,如图2所示。

图1 gazebo仿真图片

图2 地图出现重叠
二、问题根源
后来,我发现这个地图重叠是因为SLAM算法在走长廊和相似场景中的累计误差和回环检测失效导致的。
1.累积误差导致地图变形
场景中有长走廊,机器人在这种相似环境中移动时,激光里程计的误差会不断的积累。走得越远,位置偏差越大,所以地图会出现扭曲、错位,和真实场景对不上。
2.回环检测没有及时修正
当机器人回到之前走过的地方的时候,算法应该通过“回环检测”来修正累积的误差。但如果回环检测参数设置不合理(调得太激进或太保守),就无法触发修正,导致地图越走越偏。
3.激光匹配在重复场景中失效
长走廊的墙面非常相似,激光匹配算法容易“认错”点云,把不同位置的墙面当成同一面。这会让算法计算出错误的位姿,进一步加剧地图的扭曲。
三、修正思路
通过修改/opt/ros/humble/share/slam_toolbox/config/mapper_params_online_async.yaml这个配置文件,来修正误差。(注:我的mapper_params_online_async.yaml是在这个路径下,其它版本的不一定)。
1.修正激光雷达的“硬件匹配”问题
1)打开仿真环境,查看激光雷达的实际最大量程(比如8米)。
2)在配置文件里把max_laser_range改成这个真实值(比如8.0).
3)同时把min_laser_range改成雷达的真实最小值(比如0.1).
作用:避免算法处理超出雷达能力的无效数据,减少干扰。
2.让回环检测更“灵敏”(核心步骤)
回环检测是修正长走廊误差的关键,我们要让它更积极地去“认路”。
· 操作:
1)打开配置文件,找到do_loop_closing,确保它是true(开启回环检测)。
2)把loop_serch_maximum_distance改成12.0(不要太大,否则容易误匹配)。
3)把loop_match_minimum_response_coarse改成0.35(降低回环检测地门槛,让它更容易认出旧地方)。
4)把loop_match_minimum_response_fine改成0.35(精细匹配也降低门槛)。
作用:让算法在走廊里更容易发现“我刚才来过”,然后立刻修正地图。
3.让激光匹配更“稳定”
· 操作:
1)把minimun_travel_distance改成0.25(机器人走更短的距离就触发一次匹配,减少每一步的误差)。
2)把correlation_search_space_dimension改成0.4(缩小匹配的搜索范围,让算法更聚焦,避免“认错墙”)。
3)把distance_variance_penalty改成0.9(让算法对距离误差更敏感,修正得更积极)。
作用:让每一步的激光匹配更准,减少误差的产生。
4.改善位姿偏移
位姿偏移
想象一下,你闭着眼睛在房间里走路,只靠自己数步数和转弯角度来记路线。第一步你向前走了10步,你以为自己在正前方10米。但实际上,每一步都可能有微小偏差,比如有时步子大一点,有时小一点,转弯角度也可能多转或少转了1°。走了几百步后,你以为自己回到了起点,但睁眼一看,可能已经偏到了另一个房间的另一个角落。这个“以为的位置”和“实际的位置”之间的偏差,就是位姿漂移。
在SLAM里,这个过程也是一样的:机器人,每走一段路,都会根据传感器数据计算自己的位置和朝向(位姿)。哪怕是最精准的传感器,每一次计算也会有一点点误差。走得越远,这些小误差就会不断累积,导致机器人“以为自己在A点”,但实际上在B点。简单说:位姿漂移就是机器人“记路”记偏了,走得越远,偏得越厉害。
解决措施:
1.先把硬件和基础设置调稳,这是最底层的保障,硬件稳了,算法才好发挥。
1)检查轮子和地面:确保轮子没有打滑,地面不要太光滑或有杂物,这能减少里程计的误差。
2)校准IMU:如果你的机器人带IMU,先做一次严格的静态校准,让它的角度测量更准。
3)加固激光雷达:把激光雷达的支架拧紧,避免转弯时抖动,导致激光点云模糊。
2.操作习惯上的小技巧
1)慢转弯,转大弯:转弯时放慢速度,角度不要太急。比如90°的直角弯,分2-3次转完,让系统有时间跟上。
2)转弯后走一段直线再继续:每次转完弯,先直走1-2米,让系统用直线运动来修正刚才转弯产生的角度误差。
3)多走闭合环路:尽量让路线回到之前走过的地方,触发回环检测,系统会自动把歪掉的地图“拉”回来。
最后经过修正后的地图如图3所示。

图3
更多推荐

所有评论(0)