datetime:2025/01/24 14:15
author:nzb
规划场景监控器
规划场景监控器(PlanningSceneMonitor)是维护最新规划场景的推荐接口。 机器人状态(RobotState)、当前状态监控器(CurrentStateMonitor)、规划场景(PlanningScene)、规划场景监控器(PlanningSceneMonitor)和规划场景接口(PlanningSceneInterface)之间的关系一开始可能会令人困惑。 本教程旨在阐明这些关键概念。
RobotState
机器人状态(RobotState)是机器人的快照。 它包含机器人模型和一组关节值。
CurrentStateMonitor
当前状态监控器(CurrentStateMonitor,简称 CSM)可视为机器人状态的 ROS 封装器。 它订阅所提供的 JointState 消息主题,该主题可提供单自由度执行器(如外旋或棱柱关节)的最新传感器值,并根据这些关节值更新其内部的 RobotState。 除了单自由度关节外,机器人还可能有浮动关节和平面关节等多自由度关节。 为了维护连接多自由度关节的链接和其他框架的最新变换信息,CSM 存储了一个 TF2 缓冲区,该缓冲区使用 TF2 变换监听器在其内部数据中设置变换。
PlanningScene
规划场景(PlanningScene)是世界的一个快照,其中包括机器人状态(RobotState)和任意数量的碰撞对象。 规划场景可用于碰撞检查以及获取环境信息。
PlanningSceneMonitor
规划场景监控器(PlanningSceneMonitor)用 ROS 接口封装了一个规划场景,用于保持规划场景的最新状态。
要访问 PlanningSceneMonitor 的底层规划场景,请使用所提供的 LockedPlanningSceneRW 和 LockedPlanningSceneRO 类。
PlanningSceneMonitor 有以下对象,它们都有自己的 ROS 接口,用于保持规划场景子组件的最新状态:
- 当前状态监控器(
CurrentStateMonitor)用于通过机器人状态订阅器(robot_state_subscriber_)和缓冲区(tf_buffer_)跟踪机器人状态的更新,以及规划场景订阅器(planning scene subscriber)用于监听来自其他发布者的规划场景差异。 - 占用图监控器(
OccupancyMapMonitor)用于通过 ROS 主题和服务跟踪占用图的更新。
规划场景监控器(PlanningSceneMonitor)有以下订阅:
collision_object_subscriber_- 侦听所提供主题的 CollisionObject 消息,这些消息可能会添加、删除或修改规划场景中的碰撞对象,并将这些对象传递到其监控的规划场景中planning_scene_world_subscriber_- 侦听所提供主题的 PlanningSceneWorld 消息,这些消息可能包含碰撞对象信息和/或八维地图信息。 这对于保持规划场景监控器同步非常有用attached_collision_object_subscriber_- 在提供的主题上监听 AttachedCollisionObject(附着碰撞对象)消息,该消息决定机器人状态中对象与链接的附着/脱落。
PlanningSceneMonitor 有以下服务:
get_scene_service_- 这是一个可选服务,用于获取完整的规划场景状态。
规划场景监视器的初始化条件是:
startSceneMonitor- 启动planning_scene_subscriber_;startWorldGeometryMonitor- 启动collision_object_subscriber_、planning_scene_world_subscriber_和OccupancyMapMonitor;startStateMonitor- 启动CurrentStateMonitor和attached_collision_object_subscriber_startPublishingPlanningScene- 启动另一个线程,在提供的主题上发布整个规划场景,供其他规划场景监控程序订阅providePlanningSceneService- 启动get_scene_service_.
PlanningSceneInterface
PlanningSceneInterface 是一个有用的类,可通过 C++ API 向 MoveGroup 的 PlanningSceneMonitor 发布更新,而无需创建自己的订阅者和服务客户端。 如果没有 MoveGroup 或 MoveItCpp,该类可能无法工作。