在自己的数据包上运行 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 作者的经验,可以检测出数据包中常见的各种错
现在,您已经在几个提供的袋子上运行了 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_frame、tracking_frame、published_frame和odom_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_landmarks和use_nav_sat,启用地标和 GPS 作为额外的定位来源。选项块中的其他变量通常应保持不变。
注意
即使您使用的是 2D SLAM,地标也是 3D 物体,如果仅在 2D 平面上查看,可能会因为其三维性而误导您。
不过,有一个全局变量您绝对需要根据您的包的需要进行调整:TRAJECTORY_BUILDER_3D.num_accumulated_range_data或TRAJECTORY_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.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记录中提取数据。
同样,需要对这些文件进行一些调整,以适应您的机器人。
配置_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_1、scan_2等...如果只使用一个
sensor_msgs/MultiEchoLaserScan主题,则应将其命名为echoes。如果有更多主题,则应命名为echoes_1、echoes_2等...如果只使用一个
sensor_msgs/PointCloud2主题,则应将其命名为points2。如果有更多主题,则应命名为points2_1、point2_2等。
尝试
一切就绪!现在可以启动 Cartographer 了:
roslaunch cartographer_ros my_robot.launch bag_filename:=/path/to/your_bag.bag
发表评论