新工作:制作一个送咖啡机器人——调参
调了一下午参数调到怀疑人生,最后发现是参数配置文件没有同步 - -
晚上遗留的一大堆Bug,第二天都自动消失了
肯定是有会写代码的海螺姑娘偷偷入侵了我的电脑 >_<
上一节中,机器人已经勉强能跑起来了,现在的任务是通过调参让机器人越来越稳定、好用。引用Cartographer Docs
的一句话 Tuning Cartographer is unfortunately really difficult. 不过折腾半天最后的效果还是挺不错的。
0x01 Cartographer
(1) 机器人被劫持了咋办
尝试过把机器人搬到另一个地方,Cartographer以为机器人还在原处,生成的地图就2B了。
Cartographer中有一个文档中没有的函数
PerformGlobalLocalization()
,可以解决这个问题。《Localization in Existing Map》和《Support localization》中有对它的讨论。
其实看了上面两个帖子,并没有什么太大的卵用,因为我不会越过 Cartographer_ROS Api
直接调用Cartographer的函数。如果在构建地图的时候碰到这种被劫持的情况(特别是搬动到比较远的地方),地图基本就GG了;如果已经构建好整个区域的地图,使用-map_filename
调用地图文件进行导航的时候,还是有可能解决的:
TRAJECTORY_BUILDER.pure_localization = true
减少了增长的SLAM数据,使内存使用降低到以前的1/10左右SPARSE_POSE_GRAPH.optimize_every_n_scans = 1
进行全局校正的时间,每秒钟都会对自己的局部地图与全局地图进行匹配,如果位移不是很大,会看到地图被慢慢的矫正过去。(如果这个值设大了或者设为0,你的地图会乱成一坨屎也矫正不过去)
虽然矫正后的map会有点乱,但submap还是很好看的。
所以TRAJECTORY_BUILDER.pure_localization = true
SPARSE_POSE_GRAPH.optimize_every_n_scans = 1
这两个参数基本是在定位的时候成对出现的。而在建立地图的时候TRAJECTORY_BUILDER.pure_localization
不能开启,并且SPARSE_POSE_GRAPH.optimize_every_n_scans
最好设置大一点(200左右)。
矫正失败的情况
我把机器人搬到一个很相似的空间里,基本就失败了,控制机器人在屋里转来转去也没矫正成功。
(2) 为什么要使用cartographer_turtlebot,而不是直接用cartographer_ROS
除了多出几个turtlebot的配置文件省去你调参的麻烦以外,cartographer_turtlebot
还多了flat_world_imu_node这个函数,官方的解释是'imu_data_raw' topic
传递的Kobuki的IMU信息因为驱动的问题会导致乱顺序,这个函数去掉了乱序的信息。
有个开关叫TRAJECTORY_BUILDER_2D.use_imu_data
,如果不用imu的话,构图的时候一定要移动的很慢、很慢,使用了imu就可以让小车飞快的跑。在cartographer_turtlebot中能找到使用方法
1 | <node name="flat_world_imu_node" pkg="cartographer_turtlebot" |
(3) 其它参数
TRAJECTORY_BUILDER_2D.submaps.num_range_data
submap的大小
0x02 Navigation
坑先仍这,下周继续调
没接触过navigation的同鞋可以看这篇blog《拿ROS navigation 玩自主导航攻略(1)——by 西工大一小学生》写得很详细。