规划场景监控

The PlanningSceneMonitor 是维护最新规划场景的推荐接口。 RobotState, CurrentStateMonitor, PlanningScene, PlanningSceneMonitor, and PlanningSceneInterface 一开始可能会让人感到困惑。本教程旨在澄清这些关键概念。

机器人状态

The RobotState 是机器人的快照。它包含 RobotModel 以及一组联合价值观。

当前状态监视器

The CurrentStateMonitor (CSM) 可以被认为是 RobotState 的 ROS 包装器。它订阅提供的主题以 JointState 消息为单自由度执行器(例如旋转或平移关节)提供最新的传感器值,并使用这些关节值更新其内部 RobotState。除了单自由度关节外,机器人还可以具有多自由度关节,例如浮动关节和平面关节。为了维护与多自由度关节连接的连杆和其他框架的最新变换信息,CSM 存储了一个 TF2 Buffer that uses a TF2 TransformListener 在其内部数据中设置它们的变换。

规划场景

The PlanningScene 是包含 RobotState 和任意数量的碰撞对象的世界快照。规划场景可用于碰撞检查以及获取有关环境的信息。

规划场景监控

The PlanningSceneMonitor 使用 ROS 接口包装 PlanningScene,以使 PlanningScene 保持最新状态。要访问 PlanningSceneMonitor 的底层 PlanningScene,请使用提供的 LockedPlanningSceneRW and LockedPlanningSceneRO classes.

PlanningSceneMonitor 具有以下对象,它们具有自己的 ROS 接口,用于使规划场景的子组件保持最新状态:

  • A CurrentStateMonitor for tracking updates to the RobotState via a robot_state_subscriber_ and a tf_buffer_, 以及规划场景订阅者,用于聆听来自其他出版商的规划场景差异。

  • OccupancyMapMonitor 用于通过 ROS 主题和服务跟踪 OccupancyMap 的更新。

PlanningSceneMonitor 具有以下订阅者:

  • collision_object_subscriber_ - 聆听给定的话题 CollisionObject 可能添加、移除或修改规划场景中的碰撞对象的消息,并将它们传递到其监视的规划场景中

  • planning_scene_world_subscriber_ - 聆听给定的话题 PlanningSceneWorld 可能包含碰撞对象信息和/或八面体图信息的消息。这对于保持规划场景监视器同步非常有用

  • attached_collision_object_subscriber_ - 聆听给定主题的内容 AttachedCollisionObject 确定机器人状态下对象与链接的附加/分离的消息。

PlanningSceneMonitor 有以下服务:

  • get_scene_service_ - 这是获取完整规划场景状态的一项可选服务。

PlanningSceneMonitor 的初始化方法如下:

  • startSceneMonitor - 这开始了 planning_scene_subscriber_,

  • startWorldGeometryMonitor - 这开始了 collision_object_subscriber_, the planning_scene_world_subscriber_, 以及 OccupancyMapMonitor,

  • startStateMonitor - 启动 CurrentStateMonitor 和 attached_collision_object_subscriber_,

  • startPublishingPlanningScene - 启动另一个线程,在提供的主题上发布整个规划场景,供其他 PlanningSceneMonitors 订阅,并且

  • providePlanningSceneService - 这开始了 get_scene_service_.

规划场景界面

The PlanningSceneInterface 是一个有用的类,用于发布 MoveGroup 的更新 PlanningSceneMonitor 通过 C++ API 实现,无需创建自己的订阅者和服务客户​​端。如果没有 MoveGroup 或 MoveItCpp,它可能无法工作。