新工作:制作一个送咖啡机器人——调参

调了一下午参数调到怀疑人生,最后发现是参数配置文件没有同步 - -
晚上遗留的一大堆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
2
3
4
5
<node name="flat_world_imu_node" pkg="cartographer_turtlebot"
type="cartographer_flat_world_imu_node" output="screen">
<remap from="imu_in" to="/mobile_base/sensors/imu_data_raw" />
<remap from=Navigation"imu_out" to="/imu" />
</node>

(3) 其它参数

TRAJECTORY_BUILDER_2D.submaps.num_range_data submap的大小

0x02 Navigation

坑先仍这,下周继续调

没接触过navigation的同鞋可以看这篇blog《拿ROS navigation 玩自主导航攻略(1)——by 西工大一小学生》写得很详细。