最近在测试一款新的雷达,跑gmapping和cartographer都没有遇到问题,但是在跑Karto的时候出现无法正常建图,具体表现就是机器人运动一小段距离后就会在地图上都会被“拉回”到地图原点附近,如下图,建图效果一片稀烂,相同配置文件在思岚A1下是可以正常运行建图的。
既然是机器人实际位置在不断错误的被修正,首先怀疑的当然是scan_matching出了问题,关掉karto中的use_scan_matching选项,设置为false,再跑一下,图是好了点,但是奇怪的是机器人走过的位置都留下了零零散散的点,如下图,看起来就像边走边下蛋一样,绿色的线条是机器人大概的运行轨迹,可以看到图中机器人经过的位置留下了一堆点,连起来差不多就是机器人运行的轨迹了。
其实到这里问题应该已经很清晰,然而我当时已经花了数小时来测试和思考这个问题,所以大脑基本浆糊了,直到晚上十一点多才想起来打印雷达数据看一下,截取一段,大概是这样的,可以看到,ranges数组中出现了大量的0.0的值,这样一来多有问题都能解释通了,机器人被不断的拉会原地,是因为这一堆0.0的值让scan_match做出了错误的判断,机器人经过的地方留下了点,是因为雷达给出的数据中机器人雷达中心位置就是有障碍的。
检查雷达驱动代码,将没有实际意义的值修改为无穷大,即 std::numeric_limits::infinity();编译后重新运行,一切正常,既不乱match了,也不边走边下蛋了。
到这里问题也就解决了,中间走了很多弯路,因为来打在gmapping和cartographer以及用于导航时候是没有问题的,所以先是调整scan_match相关参数,最后才从机器人经过的位置留下的一堆点中找到了灵感,怀疑起了雷达数据问题,回头想想,如果scan_match中忽略掉0.0值或者小于某个阈值的值,这个问题也一样暴露不出来的。
经过测试,有一些品牌的雷达也存在相同的问题,例如LG的雷达,而思岚和EAI对于未测量到的点都是设置为无穷大,目前不清楚ROS下对雷达数据数组中没有测量到的点应该怎么样处理有没有规范,个人觉得应该是设置为无穷大更合理,至少不会像设置为0.0那样,让很多点聚集在雷达的中心点。
好啦,我要去diss一下雷达原厂的工程师去了。
一个雷达数据Bug引起的Karto SLAM建图混乱
最新推荐文章于 2025-02-05 21:59:37 发布