一、任务描述
播放录制好的 rosbag,使用 cartographer 建图,在 rosbag 播放完后保存所构建的地图。
二、步骤
1. 使用仿真时间
<!-- 在roslaunch中设置仿真时间 -->
<param name="/use_sim_time" value="true" />
或
# 在终端中设置仿真时间
rosparam get use_sim_time
rosparam set use_sim_time false
2. 播放数据包并启动建图
<!-- 在roslaunch中设置播放数据包 -->
<node name="playbag" pkg="rosbag" type="play"
args="--clock $(arg bag_filename)" />
# 用cartographer建图
roslaunch cartographer_ros xxx.launch bag_filename:=xxx.bag
或
rosbag play xxx.bag --clock # 播放数据包
roslaunch cartographer_ros xxx.launch # 用cartographer建图
3.保存地图
rosservice call /write_state ~/map1.pbstream true
rosrun cartographer_ros cartographer_pbstream_to_ros_map -map_filestem=map1 -pbstream_filename=map1.pbstream -resolution=0.05
或
# 自己写的直接保存pgm
rosservice call /save_pgm #TAB,填写参数
三、问题描述
rosbag 数据包播放完毕后,rosservice call
没反应。
四、原因和解决方法
因为使用了仿真时间,且在rosbag play
时附带参数--clock
,也就是使用了 rosbag 的时间作为时钟,所以,随着rosbag 播放完毕,时钟也消失了。没有时钟就没有办法调用 rosservice。
解决思路:既然没有时钟,再制作一个时钟就可以了。
具体方法:
在播放完要建图的 rosbag 之后,再播放另一个 rosbag ,然后就可以正常rosservice call
了。注意需要保证后一个 rosbag 没有包含建图会订阅的话题(/scan 乃至 /odom /imu等),以免 cartographer 又继续建图,干扰了建图效果。
rosbag play xxx.bag --clock