今天一直没有更新专栏里的文章,因为看到cartographer的官网文档做了更新:添加了测试Landmark的demo——Static Landmarks. 详见:demo of static landmarks。 但是直接按照官网上的指导运行会出error. 昨天下午和今天一上午的时间就是在解决这些error。所幸,终于解决了这些问题,所以把我遇到的问题和解决的方案写一下,分享给大家,以免让大家多耽误时间。
cartographer和cartographer_ros等的安装请见:Cartographer源码阅读_预准备
1. cartographer_mir的安装
首先,运行static landmark这个demo需要在原先代码的基础上新安装一个包:cartographer_mir. 安装过程如下:
首先,把cartographer_mir下载到你的源码文件中:
cd catkin_ws // 进入到你安装cartographer的工作空间
cd src
git clone https://github.com/googlecartographer/cartographer_mir.git
这是从GitHub上克隆源码的命令行方式。当然,你也可以从下面这个链接下载下来源码后再复制到相应目录 https://github.com/googlecartographer/cartographer_mir
其次,重新编译整个project:
cd .. //回到catkin_ws这个目录下
catkin_make_isolated --install --use-ninja
source install_isolated/setup.bash
没有错误的话,cartographer_mir就安装成功了。接下来你可以在/src/cartographer_mir/cartographer_mir目录下分别看到launch和configuration_files这两个目录。这两个目录里就分别存放着运行新的demo所需的launch文件和配置文件。
2. 下载landmark测试集数据包的rosbag
wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/mir/landmarks_demo_uncalibrated.bag
但是这个数据包的地址也是需要翻墙的。如果不翻墙下载不下来。我自己已经懒得翻墙了(或者说穷的买不起VPN),所以让朋友下载下来后传给了我。
3. Bug修改
以下记录了一下我的debug过程,不感兴趣的直接跳到后面看总结。
在cartographer_mir安装完毕和测试集数据包下载完成后,理论上就可以运行测试demo了。
roslaunch cartographer_mir offline_mir_100_rviz.launch bag_filename:=${HOME}/Downloads/landmarks_demo_uncalibrated.bag
然而,很遗憾,直接拷贝上述命令运行后,报了一个错误:
[...../offline_mir_100_rviz.launch] requires the 'bag_filenames' arg to be set
囧!!!!我明明已经给bag_filename这个参数赋值了啊,数据包地址和名称检查也没有错误。到底是什么错误呢??
后来,非常仔细地检查launch文件之后,发现官网提供的这个命令行中“bag_filename:=”少了一个s,而在launch文件中,要求的参数名是“bag_filenames”而不是“bag_filename”。所以,命令必须修改如下:
roslaunch cartographer_mir offline_mir_100_rviz.launch bag_filenames:=${HOME}/Downloads/landmarks_demo_uncalibrated.bag
其中,“bag_filename:=”修改为了“bag_filenames:=”。注意对比和区分。
这个错误应该就是官网的说明文档刚上线的一个typo,目前还没被作者发现。
然后,修改后又重新运行,满心期待,结果再次报错:
[FATAL] [1542782924.721540472]: F1121 14:48:44.000000 27311 http:// lua_parameter_dictionary.cc:410 ] Check failed: 1 == reference_counts_.count(key) (1 vs. 0) Key 'collate_landmarks' was used the wrong number of times.
再囧一次!!!
于是打开配置文件查看。配置文件在/src/cartographer_mir/cartographer_mir/configuration_files中。找到collate_landmarks这个参数:
TRAJECTORY_BUILDER.collate_landmarks = false
定位到错误所在,ok. 将该值改为true:
TRAJECTORY_BUILDER.collate_landmarks = true
再次运行。心惊胆颤地等待运行结果。结果再次报错:
[FATAL] [1542782924.721540472]: F1121 14:48:44.000000 27311 http:// lua_parameter_dictionary.cc:410 ] Check failed: 1 == reference_counts_.count(key) (1 vs. 0) Key 'collate_landmarks' was used the wrong number of times.
坑爹呢!!!
改前改后一个样,完全没有效果。到底是哪里的问题嘛!!
然后在github上搜索。一直找不到问题所在。亏得我还在GitHub上提问(我在GitHub上的提问),直到无意间看到别人的描述里有这么一句:
TRAJECTORY_BUILDER.collate_landmarks = on
。。。。。。
所以,这个配置项不应该是"true"和 "false",而应该是"on" 和"off"。内心一万句mmp飞过:为啥我下载下来的文件里默认的是false,难道不应该写成off嘛!
所以,赶紧改成了
TRAJECTORY_BUILDER.collate_landmarks = on
然后,编译->重新运行。
结果再次报错:
[FATAL] [1542782924.721540472]: F1121 14:48:44.000000 27311 http:// lua_parameter_dictionary.cc:410 ] Check failed: 1 == reference_counts_.count(key) (1 vs. 0) Key 'use_pose_extrapolator' was used the wrong number of times.
心脏差点受不了了,还以为我的解决方案有问题呢。不过幸好我发现错误的参数已经不再是collate_landmarks了,而是换成了“use_pose_extrapolator”了。没关系,同样类型的错误很好改:
use_pose_extrapolator = on,
然后再次编译,运行。这次终于成功。
建图的效果如下(由于constraints太多,我设置为不显示constraints了。不然landmark都被盖住了,根本看不到):
所以,总结一下,这个demo要想运行成功需要改两个地方:
1. launch命令必须修改如下:
roslaunch cartographer_mir offline_mir_100_rviz.launch bag_filenames:=${HOME}/Downloads/landmarks_demo_uncalibrated.ba
其中,“bag_filename:=”修改为了“bag_filenames:=”。多了一个‘s’,注意对比和区分。
2. 修改配置文件/src/cartographer_mir/cartographer_mir/configuration_files/mir-100-mapping.lua中的两个参数为:
use_pose_extrapolator = on,
TRAJECTORY_BUILDER.collate_landmarks = on
以上!
祝大家跑demo顺利。
最近我重新跑了一下程序,发现cartographer中德landmark的数据确实没有发布。这段程序虽然能够跑通,但其中landmark似乎没有起作用,不知道cartographer的代码出了什么问题,期望能有cartographer官方发布的进一步消息。