在自己的数据包上运行 CartographerROS

作者 易水 2025年06月15日 14:47 阅读 604

在自己的数据包上运行 CartographerROS¶现在,您已经在几个提供的袋子上运行了 Cartographer ROS,可以继续让 Cartographer 使用您自己的数据了。找到一个您想用于 SLAM 的.bag记录,然后阅读本教程。警告当你想运行 cartographer_ros 时,可能需要先运行source install_isolated/setup.bash(如果你的 shell 是 zsh,请将 bash 替换为 zsh),为你的 ROS 环境添加源代码。验证您的包Cartographer ROS 提供了一个名为cartographer_rosbag_validate的工具,用于自动分析工具包中的数据。一般来说,在尝试调整 Cartographer 以纠正错误数据之前,最好先运行该工具。该工具得益于 Cartographer 作者的经验,可以检测出数据包中常见的各种错

在自己的数据包上运行 CartographerROS¶

现在,您已经在几个提供的袋子上运行了 Cartographer ROS,可以继续让 Cartographer 使用您自己的数据了。找到一个您想用于 SLAM 的.bag记录,然后阅读本教程。

警告

当你想运行 cartographer_ros 时,可能需要先运行source install_isolated/setup.bash(如果你的 shell 是 zsh,请将 bash 替换为 zsh),为你的 ROS 环境添加源代码

验证您的

Cartographer ROS 提供了一个名为cartographer_rosbag_validate的工具,用于自动分析工具包中的数据。一般来说,在尝试调整 Cartographer 以纠正错误数据之前,最好先运行该工具。

该工具得益于 Cartographer 作者的经验,可以检测出数据包中常见的各种错误。例如,如果检测到sensor_msgs/Imu主题,该工具将确保重力矢量未从 IMU 测量中移除,因为 Cartographer 使用重力规范来确定地面方向。

该工具还能提供如何提高数据质量的提示。例如,对于 Velodyne 激光雷达,建议在传感器发送的每个 UDP 数据包中包含一条sensor_msgs/PointCloud2消息,而不是每转一圈发送一条消息。有了这样的粒度,Cartographer 就能消除机器人运动造成的点云变形,从而获得更好的重建效果。

如果您已创建了 Cartographer ROS 环境,就可以像这样简单地运行该工具:

cartographer_rosbag_validate -bag_filename your_bag.bag

创建 .lua配置

Cartographer 具有高度灵活性,可配置为在各种机器人上运行。机器人配置是从选项数据结构中读取的,该数据结构必须由 Lua 脚本定义。配置示例定义在src/cartographer_ros/cartographer_ros/configuration_files中,并安装在install_isolated/share/cartographer_ros/configuration_files/ 中

注意事项

理想情况下,.lua 配置应针对机器人,而不是针对包。

您可以先复制一个示例,然后根据自己的需要进行调整。如果您想使用 3D SLAM,可以使用.lua 配置:

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,以满足机器人的需要。选项块中定义的值定义了 Cartographer ROS 前端应如何与您的包接口。选项段后定义的值用于调整 Cartographer 的内部工作,我们暂且忽略这些值。

在你需要调整的值中,你可能需要在map_frametracking_framepublished_frameodom_frame 中提供环境和机器人的 TF 帧 ID。

注意事项

您可以在包中的/tf主题中发布机器人的 TF 树,也可以在.urdf机器人定义中进行定义。

警告

您应该相信您的姿势!机器人与 IMU 或激光雷达之间的微小偏移都可能导致地图重建不连贯。制图师通常可以纠正微小的姿势误差,但不能完全纠正!

您需要定义的其他值与您希望使用的传感器数量和类型有关。

  • num_laser_scan激光扫描次数):您要使用的sensor_msgs/LaserScan主题的数量。

  • num_multi_echo_laser_scan多重激光扫描):您要使用的sensor_msgs/MultiEchoLaserScan主题的数量。

  • num_point_clouds:您将使用的sensor_msgs/PointCloud2主题的数量。

您还可以使用use_landmarksuse_nav_sat,启用地标和 GPS 作为额外的定位来源。选项块中的其他变量通常应保持不变。

注意

即使您使用的是 2D SLAM,地标也是 3D 物体,如果仅在 2D 平面上查看,可能会因为其三维性而误导您。

不过,有一个全局变量您绝对需要根据您的包的需要进行调整:TRAJECTORY_BUILDER_3D.num_accumulated_range_dataTRAJECTORY_BUILDER_2D.num_accumulated_range_ data。该变量定义了构建一次完整扫描(通常为一整圈)所需的信息数量。如果按照制图师_rosbag_validate的建议,每次扫描使用 100 条 ROS 信息,则可以将该变量设为 100。如果有两个测距传感器(例如两个激光雷达)同时提供完整扫描,则应将该变量设置为 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.launch
  • my_robot.launch用于在机器人上使用真实传感器数据在线(实时)执行SLAM。

  • demo_my_robot.launch用于在开发机器上使用,需要一个bag_filename参数来重放录音中的数据。该启动文件还会生成一个 rviz 窗口,用于可视化 Cartographer 的状态。

  • offline_my_robot.launchdemo_my_robot.launch非常相似,但会尽可能快地执行 SLAM。这将大大加快地图绘制速度。该启动文件还可以使用为bag_filenames参数提供的多个 bag 文件。

  • demo_my_robot_localization.launchdemo_my_robot.launch非常相似,但它需要一个load_state_filename参数,该参数指向 Cartographer 之前执行的.pbstream记录。之前的记录将用作预计算地图,Cartographer 将仅在该地图上执行本地化。

  • assets_writer_my_robot.launch用于从之前执行 Cartographer 的.pbstream记录中提取数据。

同样,需要对这些文件进行一些调整,以适应您的机器人。

  • 配置_basename中的每个参数都应指向my_robot.lua

  • 如果您决定使用.urdf来描述您的机器人,则应将描述文件放在install_isolated/share/cartographer_ros/urdf中,并调整robot_description参数,使其指向您的文件名。

  • 如果您决定使用/tf消息,则可以移除robot_description参数、robot_state_publisher节点以及使用urdf 进行统计的行。

  • 如果您的包或传感器发布的主题名称与 Cartographer ROS 期望的名称不一致,您可以使用<remap>元素来重定向主题。预期的主题名称取决于您使用的测距设备类型。

注意

  • IMU 主题应命名为 "imu"。

  • 如果只使用一个sensor_msgs/LaserScan主题,则应将其命名为scan。如果有更多主题,则应分别命名为scan_1scan_2等...

  • 如果只使用一个sensor_msgs/MultiEchoLaserScan主题,则应将其命名为echoes。如果有更多主题,则应命名为echoes_1echoes_2等...

  • 如果只使用一个sensor_msgs/PointCloud2主题,则应将其命名为points2。如果有更多主题,则应命名为points2_1point2_2 等。

尝试配置

一切就绪!现在可以启动 Cartographer 了:

roslaunch cartographer_ros my_robot.launch bag_filename:=/path/to/your_bag.bag

如果您足够幸运,一切都应该已经按预期运行。不过,您可能会遇到一些需要调整的问题。


发表评论