大概流程走完,其实还是有点懵逼的,下面就官方文档,讨论下细节,要是我自己没注意到的点。 Validate your bag 如果是准备跑自己的或者别人的bag包,这一步是很有必要的,可以从中获得相关消息的topic和frame_id,这个在填写lua文件和launch 文件的topic重映射时可以用到。 首先要在工作目录 source 下,然后执行命令:
source devel_isolated/setup.bash
cartographer_rosbag_validate -bag_filename your_bag_path.bag
lua文件的配置 lua文件定义在src/cartographer_ros/cartographer_ros/configuration_files 安装在install_isolated/share/cartographer_ros/configuration_files/. 可以通过copy然后再修改: 3D:
cp install_isolated/share/cartographer_ros/configuration_files/backpack_3d.lua install_isolated/share/cartographer_ros/configuration_files/my_robot.lua
2D:
cp install_isolated/share/cartographer_ros/configuration_files/backpack_3d.lua install_isolated/share/cartographer_ros/configuration_files/my_robot.lua
num_laser_scans:二位激光的数量 num_point_cloud:三维激光的数量 还有个num_multi_echo_laser_scans:大概和laser_scan差不多,我没用到过。 还有一个全局变量TRAJECTORY_BUILDER_3D.num_accumulated_range_data or TRAJECTORY_BUILDER_2D.num_accumulated_range_data 大概是表征激光雷达的扫描一幁需要分多少个消息传出来。 lua文件里面的具体参数,这里暂时不做详细介绍,可以查看官方文档。 除此之外,还需要提供map_frame、tracking_frame、publish_frame、odom_frame之间的tf转化关系, 这里可以通过自己发布/tf消息,也可以通过加载urdf或者xacro文件,然后利用robot_state_publisher节点来发布tf tree。 常用的做法就是利用urdf文件,这里可以cp然后根据自己机器人的传感器相对位置关系进行配置。 launch文件,会调用不同的节点。这里需要分清楚,将你的需求和launch文件对应。
cp install_isolated/share/cartographer_ros/launch/backpack_3d.launch install_isolated/share/cartographer_ros/launch/my_robot.launch
cp install_isolated/share/cartographer_ros/launch/demo_backpack_3d.launch install_isolated/share/cartographer_ros/launch/demo_my_robot.launch
cp install_isolated/share/cartographer_ros/launch/offline_backpack_3d.launch install_isolated/share/cartographer_ros/launch/offline_my_robot.launch
cp install_isolated/share/cartographer_ros/launch/demo_backpack_3d_localization.launch install_isolated/share/cartographer_ros/launch/demo_my_robot_localization.launch
cp install_isolated/share/cartographer_ros/launch/assets_writer_backpack_3d.launch install_isolated/share/cartographer_ros/launch/assets_writer_my_robot.launch
官网给了五个launch,这里以3D为讨论,需要2D,copy时候换下即可。 第一个用于实时在线跑SLAM,用传感器真实数据。 第二个使用数据包离线跑。需要提供参数bag_filename; 第三个和第二个很接近,不过第三个建图速度会相对快一点。 第四个和第二个也很接近,不过不是用来建图,用来定位,需要提供之前建图的.bpstream文件作为load_state_filename. 第五个用来提取.bpstream文件数据。第四个和第五个我暂时还没接触,等有接触在补充。