如何使用自己录制的bag包来运行Cartographer ROS
参考Cartographer_ros官方教程
当运行 cartographer_ros 时,你需要先运行 source install_isolated/setup.bash 来配置 ROS 环境(如果你的 shell 是 zsh,请将 bash 替换为 zsh)
验证数据包的有效性
Cartographer ROS 提供了一个名为 cartographer_rosbag_validate
的工具来自动分析包中的数据。 在尝试针对不正确的数据调整 Cartographer 的参数之前运行此工具通常是一个好主意。
它受益于 Cartographer 作者的经验,可以检测bag数据包中常见的各种错误。 例如,如果检测到 sensor_msgs/Imu
消息,该工具将确保重力矢量尚未从 IMU 测量中移除,因为 Cartographer 使用重力的模值来确定地面方向。
该工具还可以提供有关如何提高数据质量的提示。 例如,对于 Velodyne 激光雷达,建议传感器发送的每个 UDP 数据包有一条`` sensor_msgs/PointCloud2 消息,而不是激光雷达每转动一个角度就发送一次扫描消息。 有了这个间隔,Cartographer 就能够去除由机器人运动引起的点云变形,从而实现更好的重建。
如果已配置好 Cartographer ROS 环境,则可以简单地运行该工具,如下所示:
cartographer_rosbag_validate -bag_filename your_bag.bag
创建.lua配置文件
Cartographer 高度灵活,可以配置为在各种机器人上工作。 机器人配置是从option
数据结构中读取的,该数据结构必须从 Lua 脚本中定义。 示例配置在 src/cartographer_ros/cartographer_ros/configuration_files
中定义并安装在 install_isolated/share/cartographer_ros/configuration_files/
中。
理想情况下,.lua 配置应该是针对于机器人配置的,而不是针对于具体的数据包配置的。
您可以先复制其中一个示例,然后根据自己的需要进行调整。 如果要使用 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_2d.lua install_isolated/share/cartographer_ros/configuration_files/my_robot.lua
然后您可以编辑 my_robot.lua
以满足您的机器人的需要。 options
参数块中定义的值定义了 Cartographer ROS 前端应如何与数据包交互。 在options
参数块之后定义的值用于调整 Cartographer 的内部工作。
具体的参数含义请参考另外两篇文章Cartographer_ros配置文件参数讲解
在需要调整的值中,可能必须中根据环境和机器人的设置下列坐标系map_frame
、tracking_frame
、published_frame
和 odom_frame
。
可以从包中的
/tf
消息发布机器人的 TF 树,也可以在.urdf
机器人描述文件中定义它。
你应该相信你提供的位姿闭环! 机器人与 IMU 或 LIDAR 之间的连接上的小偏移可能会导致地图重建不一致。 Cartographer通常可以纠正小的位姿错误,但不是所有的!
需要定义的其他值与要使用的传感器的数量和类型有关
num_laser_scans
:你将会使用的sensor_msgs/LaserScan
类型的传感器消息的数量。num_multi_echo_laser_scans
: 你将会使用的sensor_msgs/MultiEchoLaserScan
类型的传感器消息的数量。num_point_clouds
: 你将会使用的sensor_msgs/PointCloud2
类型的传感器消息的数量。
还可以设置use_landmarks
和use_nav_sat
启用地标和 GPS 作为附加定位源来使用。 options
块中的其余变量通常应保持不变。
即使使用 2D SLAM,地标也是 3D 对象,如果仅在 2D 平面上查看,由于它们的第三维,可能会对你产生误导。
但是,有一个全局变量你需要修改来适应你的数据包的需求:TRAJECTORY_BUILDER_3D.num_accumulated_range_data
或 TRAJECTORY_BUILDER_2D.num_accumulated_range_data
。 此变量定义构建完整扫描(通常为完整旋转)所需的消息数。 如果遵循 cartographer_rosbag_validate
的建议并对每次扫描使用 100 条 ROS 消息来发送,则可以将此变量设置为 100。如果您有两个测距传感器(例如,两个 LIDAR)同时提供全部扫描,则应将此变量设置为 2 。
注意,一般我们使用的雷达不会提供完整扫描的拆分功能,所以这里一般设置为1
为你的SLAM 场景创建 .launch 文件
Cartographer 的推荐用法是为每个机器人和 SLAM 类型提供一个自定义的 .launch 文件。.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
参数从记录中重放数据。 此启动文件还会生成一个 rviz 窗口,该窗口配置为可视化 Cartographer 的状态。offline_my_robot.launch
与demo_my_robot.launch
非常相似,但尝试尽可能快地执行 SLAM。 这可以显著地加快地图构建速度。 此启动文件还可以使用通过bag_filenames
参数提供的多个包文件。demo_my_robot_localization.launch
与demo_my_robot.launch
非常相似,但需要一个load_state_filename
参数指向之前 Cartographer 执行所提供的.pbstream
记录文件。 之前的记录文件将用作预先计算的地图,Cartographer 将仅在此地图上执行定位。assets_writer_my_robot.launch
用于从先前 Cartographer 执行提供的.pbstream
记录文件中提取数据。
同样,需要对这些文件进行一些修改以适合您的机器人。
- 赋予
-configuration_basename
的每个参数都应调整为指向my_robot.lua
。 - 如果决定使用您的机器人的
.urdf
描述文件,您应该将您的描述文件放在install_isolated/share/cartographer_ros/urdf
并调整robots_description
参数以指向您的描述文件名。 - 如果决定使用
/tf
消息,可以删除robots_description
参数、robot_state_publisher
节点和以-urdf
开头的行。 - 如果您的数据包或传感器发布的消息名称与 Cartographer ROS 预期的名称不匹配,可以使用
<remap>
来重定向传感器提供的消息。 预期的主题名称取决于使用的测距设备类型。
- IMU消息期望命名为
imu
- 如果仅使用一个·
sensor_msgs/LaserScan
类型的消息,则应将其命名为scan
。 如果你有更多,它们应该被命名为scan_1
、scan_2
等等。- 如果仅使用一个
sensor_msgs/MultiEchoLaserScan
类型的消息,它应该被命名为echoes
。 如果你有更多,它们应该被命名为echoes_1
、echoes_2
等等。- 如果仅使用一个
sensor_msgs/PointCloud2
类型的消息,则应将其命名为points2
。 如果你有更多,它们应该被命名为points2_1
、points2_2
等等。
使用你的配置
一切都设置好了! 现在可以使用以下命令启动 Cartographer:
roslaunch cartographer_ros my_robot.launch bag_filename:=/path/to/your_bag.bag