目录
Cartographer 节点
cartographer_node
是用于在线实时 SLAM 的节点。
命令行标志
使用 --help
标志调用节点以查看所有可用选项。
订阅的主题
以下范围数据主题是互斥的。至少需要一个范围数据源。
-
scan (sensor_msgs/LaserScan)
支持 2D 和 3D(例如使用轴向旋转的平面激光扫描仪)。如果在 Lua 配置参考文档中将num_laser_scans
设置为 1,则此主题将用作 SLAM 的输入。如果num_laser_scans
大于 1,将使用多个编号的扫描主题(即scan_1
、scan_2
、scan_3
等)作为 SLAM 的输入。 -
echoes (sensor_msgs/MultiEchoLaserScan)
支持 2D 和 3D(例如使用轴向旋转的平面激光扫描仪)。如果在 Lua 配置参考文档中将num_multi_echo_laser_scans
设置为 1,则此主题将用作 SLAM 的输入。仅使用第一个回波。如果num_multi_echo_laser_scans
大于 1,将使用多个编号的回波主题(即echoes_1
、echoes_2
、echoes_3
等)作为 SLAM 的输入。 -
points2 (sensor_msgs/PointCloud2)
如果在 Lua 配置参考文档中将num_point_clouds
设置为 1,则此主题将用作 SLAM 的输入。如果num_point_clouds
大于 1,将使用多个编号的points2
主题(即points2_1
、points2_2
、points2_3
等)作为 SLAM 的输入。
其他可以提供的传感器数据主题:
-
imu (sensor_msgs/Imu)
支持 2D(可选)和 3D(必需)。此主题将用作 SLAM 的输入。 -
odom (nav_msgs/Odometry)
支持 2D(可选)和 3D(可选)。如果在 Lua 配置参考文档中启用了use_odometry
,则此主题将用作 SLAM 的输入。
发布的主题
-
scan_matched_points2 (sensor_msgs/PointCloud2)
用于扫描到子地图匹配的点云。根据 Lua 配置参考文档,此点云可能会被过滤和投影。 -
submap_list (cartographer_ros_msgs/SubmapList)
所有子地图的列表,包括每个子地图的位姿和最新版本号,跨所有轨迹。 -
tracked_pose (geometry_msgs/PoseStamped)
仅在参数publish_tracked_pose
设置为true
时发布。跟踪帧相对于地图帧的位姿。
服务
所有服务响应还包括一个 StatusResponse,其中包含一个代码和一个消息字段。为了保持一致性,整数代码等同于 gRPC API 中使用的状态代码。
-
submap_query (cartographer_ros_msgs/SubmapQuery)
获取请求的子地图。 -
start_trajectory (cartographer_ros_msgs/StartTrajectory)
使用默认传感器主题和提供的配置启动轨迹。可以选择指定初始位姿。返回分配的轨迹 ID。 -
trajectory_query (cartographer_ros_msgs/TrajectoryQuery)
返回来自位姿图的轨迹数据。 -
finish_trajectory (cartographer_ros_msgs/FinishTrajectory)
通过运行最终优化来完成给定的轨迹 ID 的轨迹。 -
write_state (cartographer_ros_msgs/WriteState)
将当前内部状态写入磁盘到文件名。文件通常会出现在~/.ros
或设置的 ROS_HOME 中。此文件可以用作assets_writer_main
的输入,以生成概率网格、X 射线或 PLY 文件。 -
get_trajectory_states (cartographer_ros_msgs/GetTrajectoryStates)
返回轨迹的 ID 和状态。例如,这可以用于从单独的节点观察 Cartographer 的状态。 -
read_metrics (cartographer_ros_msgs/ReadMetrics)
返回 Cartographer 的所有内部指标的最新值。收集运行时指标是可选的,必须使用节点中的--collect_metrics
命令行标志激活。
必需的 tf 变换
所有传入的传感器数据帧到配置的 tracking_frame
和 published_frame
的变换必须可用。通常,这些由 robot_state_publisher
或 static_transform_publisher
定期发布。
提供的 tf 变换
提供配置的 map_frame
和 published_frame
之间的变换,除非参数 publish_to_tf
设置为 false
。
如果在 Lua 配置参考文档中启用了 provide_odom_frame
,还将提供配置的 odom_frame
和 published_frame
之间的连续(即不受回环闭合影响)变换。
离线节点
offline_node
是处理一组传感器数据包的最快方式。它不监听任何主题,而是从命令行提供的一组包中读取 TF 和传感器数据。它还发布带有前进传感器数据的时钟,即替换 rosbag play
。在其他方面,它的行为与 cartographer_node
相同。每个包将在最终状态中成为一个单独的轨迹。一旦处理完所有数据,它会写出最终的 Cartographer 状态并退出。
发布的主题
除了在线节点发布的主题外,此节点还发布:
- ~bagfile_progress (cartographer_ros_msgs/BagfileProgress)
包文件处理进度,包括有关当前正在处理的包的详细信息,这些信息将以可以使用 ~bagfile_progress_pub_interval ROS 参数指定的预定义间隔发布。
参数
- ~bagfile_progress_pub_interval (double, default=10.0):
发布包文件处理进度的时间间隔(秒)。
占用网格节点
occupancy_grid_node
监听 SLAM 发布的子地图,从中构建 ROS 占用网格并发布它。此工具对于保持需要单个整体地图的旧节点是有用的,直到新的导航栈可以直接处理 Cartographer 的子地图。生成地图既昂贵又缓慢,因此地图更新的时间以秒为单位。可以使用命令行选项选择性地包括/排除冻结(静态)或活动轨迹的子地图。使用 --help
标志调用节点以查看这些选项。
订阅的主题
仅订阅 Cartographer 的 submap_list
主题。
发布的主题
- map (nav_msgs/OccupancyGrid)
如果订阅了该主题,节点将连续计算并发布地图。更新之间的时间间隔会随着地图的大小而增加。要更快的更新,请使用子地图 API。
Pbstream 地图发布节点
pbstream_map_publisher
是一个简单节点,它从序列化的 Cartographer 状态(pbstream 格式)创建静态占用网格。如果不需要实时更新,这是一个高效的替代方案。
订阅的主题
无。
发布的主题
- map (nav_msgs/OccupancyGrid)
发布的占用网格主题是锁存的。