1、验证自己的bag
cartographer ROS提供了一个工具cartographer_rosbag_validate来自动分析包中的数据。在尝试调试cartographer之前运行这个工具。
操作方式:
cartographer_rosbag_validate -bag_filename your_bag.bag
2.创建一个.lua配置文件
cartographer非常灵活且可以配置用于任何机器人上。机器人配置读取来自于一个options的数据结构,该数据结构必须定义在一个Lua脚本里面。配置例子定义在文件src/cartographer_ros/cartographer_ros/configuration_files
,且安装在install_isolated/share/cartographer_ros/configuration_files/
.
注意,理想情况下,一个.lua配置应该是具体机器人的而不是一个具体bag的。
可以通过复制例子中的一个,然后调整以适合自己的需求,
3D SLAM:
cp install_isolated/share/cartographer_ros/configuration_files/backpack_3d.lua install_isolated/share/cartographer_ros/configuration_files/my_robot.lua
2D SLAM:
cp install_isolated/share/cartographer_ros/configuration_files/backpack_3d.lua install_isolated/share/cartographer_ros/configuration_files/my_robot.lua
下面去编辑my_robot.lua来适合于自己的机器人。在options块中定义的值定义了cartographer ros前端应当如何与你的bag进行交互。定义在options段后的值用于调试cartographer的内部信息。
你可能需要调整的值,需要提供环境的TF frame IDs,robot in map_frame
, tracking_frame
, published_frame
and odom_frame
.
You can either distribute your robot’s TF tree from a /tf
topic in your bag or define it in a .urdf
robot definition.
警告:应该信任你的位姿!在机器人和IMU或者LIDAR之间的小的offset可能会导致不相关的地图重构。cartographer通过可以纠正小的位姿误差,但并不是万能的。
需要修改的其他的值有,传感器的数量和类型:
a、num_laser_scans:你使用话题sensor_msgs.LaserScan的数量
b、num_multi_echo_laser_scans
:话题num_multi_echo_laser_scans
的数量
c、num_point_clouds
:话题sensor_msgs/PointCloud2
的数量
可以使用use_landmarks和use_nav_sat,来使能路标和GPS作为附加的定位源.在options块中的其他的变量通常保持不变。
然而,有一个全局变量需要调整来适用于自己的bag:
TRAJECTORY_BUILDER_3D.num_accumulated_range_data or TRAJECTORY_BUILDER_2D.num_accumulated_range_data
这个变量定义了构建一个完整激光的信息的数量(通常,是一个完整的分辨率)。如果听从工具cartographer_rosbag_validate
的建议,没一帧激光使用100个ROS messages,可以设置这个变量为100。If you have two range finding sensors (for instance, two LIDARs) providing their full scans all at once, you should set this variable to 2.
Create.launch 文件用于自己的SLAM场景
例子中的.launch文件在中src/cartographer_ros/cartographer_ros/launch
定义,并安装在install_isolated/share/cartographer_ros/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
my_robot.launch用于在线的SLAM
demo_my_robot.launch应用于研发的机器人上,并期望一个bag_filename参数来重放记录的数据.这个launch文件也会启动一个rviz窗口用于可视化cartographer的状态。
offline_my_robot.launch非常类似于demo_my_robot.launch,但它尝试执行SLAM尽可能的快.这使得地图构建非常快,它也可以用于多个bag文件的地图构建。
demo_my_robot_localication.launch非常类似于demo_my_robot.launch但是它期望一个load_state_filename参数来指出一个.pbstream,它记录了先前cartographer的执行。先前的记录将作为一个预先计算的地图,然后cartographer只会在这个地图上执行定位。
assets_writer_my_robot.launch用于提取.pstream中的数据,.pstream中记录了先前cartographer的执行。
Again, a few adaptations need to be made to those files to suit your robot.
- Every parameter given to
-configuration_basename
should be adapted to point tomy_robot.lua
. - If you decided to use a
.urdf
description of your robot, you should place your description ininstall_isolated/share/cartographer_ros/urdf
and adapt therobot_description
parameter to point to your file name. - If you decided to use
/tf
messages, you can remove therobot_description
parameter, therobot_state_publisher
node and the lines statring with-urdf
. - If the topic names published by your bag or sensors don’t match the ones expected by Cartographer ROS, you can use
elements to redirect your topics. The expected topic names depend on the type of range finding devices you use.
注意:
- The IMU topic is expected to be named “imu”
- If you use only one
sensor_msgs/LaserScan
topic, it is expected to be namedscan
. If you have more, they should be namedscan_1
,scan_2
etc… - If you use only one
sensor_msgs/MultiEchoLaserScan
topic, it is expected to be namedechoes
. If you have more, they should be namedechoes_1
,echoes_2
etc… - If you use only one
sensor_msgs/PointCloud2
topic, it is expected be namedpoints2
. If you have more, they should be namedpoints2_1
,points2_2
, etc…
配置好之后,开始启动
roslaunch cartographer_ros my_robot.launch bag_filename:=/path/to/your_bag.bag