在您自己的 bag 上运行 Cartographer ROS
现在您已经在几个提供的 bag 文件上运行了 Cartographer ROS,可以继续让 Cartographer 使用您自己的数据了。 找到一个您想用于 SLAM 的 .bag 记录文件,然后按照本教程进行操作。
WARNING
当您想要运行 cartographer_ros 时,可能需要先通过运行 source install_isolated/setup.bash 来配置 ROS 环境(如果您的 shell 是 zsh,请将 bash 替换为 zsh)
验证您的 bag
Cartographer ROS 提供了一个名为 cartographer_rosbag_validate 的工具,用于自动分析 bag 中存在的数据。 在尝试为不正确的数据调整 Cartographer 之前运行此工具通常是个好主意。
它借鉴了 Cartographer 作者的经验,可以检测 bag 中常见的各种错误。 例如,如果检测到 sensor_msgs/Imu 主题,该工具将确保重力矢量没有从 IMU 测量中移除,因为 Cartographer 使用重力范数来确定地面的方向。
该工具还可以就如何提高数据质量提供建议。 例如,对于 Velodyne LIDAR,建议传感器发送的每个 UDP 数据包对应一个 sensor_msgs/PointCloud2 消息,而不是每转一圈对应一个消息。 有了这种粒度,Cartographer 就能够解除由机器人运动引起的点云变形,从而获得更好的重建效果。
如果您已配置 Cartographer ROS 环境,只需像这样运行该工具:
cartographer_rosbag_validate -bag_filename your_bag.bag创建 .lua 配置文件
Cartographer 非常灵活,可以配置为在各种机器人上工作。 机器人配置从 options 数据结构中读取,该结构必须通过 Lua 脚本定义。 示例配置定义在 src/cartographer_ros/cartographer_ros/configuration_files 中,并安装在 install_isolated/share/cartographer_ros/configuration_files/ 中。
NOTE
理想情况下,.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_2d.lua install_isolated/share/cartographer_ros/configuration_files/my_robot.lua然后您可以编辑 my_robot.lua 以满足机器人的需求。 options 块中定义的值定义了 Cartographer ROS 前端应如何与您的 bag 交互。 options 段落之后定义的值用于调整 Cartographer 的内部工作,我们暂时忽略这些。
在您需要调整的值中,您可能需要在 map_frame、tracking_frame、published_frame 和 odom_frame 中提供环境和机器人的 TF 坐标系 ID。
NOTE
您可以从 bag 中的 /tf 主题分发机器人的 TF 树,或在 .urdf 机器人定义中定义它。
WARNING
您应该信任您的位姿!机器人与 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 块中的其余变量通常应保持不变。
NOTE
即使您使用 2D SLAM,地标也是 3D 对象,如果仅在 2D 平面上查看,由于其第三维度,可能会误导您。
但是,有一个全局变量您绝对需要根据 bag 的需求进行调整:TRAJECTORY_BUILDER_3D.num_accumulated_range_data 或 TRAJECTORY_BUILDER_2D.num_accumulated_range_data。 此变量定义构建完整扫描(通常是完整旋转一圈)所需的消息数量。 如果您遵循 cartographer_rosbag_validate 的建议,每次扫描使用 100 条 ROS 消息,则可以将此变量设置为 100。 如果您有两个测距传感器(例如两个 LIDAR)同时提供完整扫描,则应将此变量设置为 2。
为您的 SLAM 场景创建 .launch 文件
您可能已经注意到,上一节介绍的每个演示都是使用不同的 roslaunch 命令运行的。 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.launchmy_robot.launch用于在机器人上使用真实传感器数据在线(实时)执行 SLAM。demo_my_robot.launch用于从开发机器使用,需要bag_filename参数来重放记录的数据。此启动文件还会生成一个配置为可视化 Cartographer 状态的 rviz 窗口。offline_my_robot.launch与demo_my_robot.launch非常相似,但尝试尽可能快地执行 SLAM。这可以显著加快地图构建速度。此启动文件还可以使用提供给bag_filenames参数的多个 bag 文件。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中,并调整robot_description参数以指向您的文件名。 - 如果您决定使用
/tf消息,可以删除robot_description参数、robot_state_publisher节点以及以-urdf开头的行。 - 如果您的 bag 或传感器发布的主题名称与 Cartographer ROS 期望的名称不匹配,您可以使用
<remap>元素重定向您的主题。期望的主题名称取决于您使用的测距设备类型。
NOTE
- 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如果您足够幸运,一切都应该按预期工作。 但是,您可能会遇到一些需要调整的问题。
Cody Gu