规划场景监控器Planning Scene Monitor
建议使用PlanningSceneMonitor界面来维护最新的规划场景。起初,RobotState,CurrentStateMonitor,PlanningScene,PlanningSceneMonitor和PlanningSceneInterface之间的关系可能确实令人困惑。本教程旨在阐明这些关键概念。
机器人状态
所述RobotState是机器人的快照。它包含RobotModel和一组关节值。
CurrentStateMonitor
可以将CurrentStateMonitor(CSM)视为RobotState的ROS包装器。它订阅了为JointState消息提供的主题,该消息为诸如旋转关节或棱柱形关节之类的单自由度执行器提供了最新的传感器值,并使用这些关节值更新了其内部RobotState。除了单自由度关节之外,机器人还可以具有多个自由度的关节,例如浮动关节和平面关节。为了维护链接和带有多自由度关节的其他框架的最新变换信息,CSM存储了一个TF2缓冲区,该缓冲区使用TF2 TransformListener在其内部数据中设置其变换。
规划场景
该PlanningScene是同时包含RobotState和任何数量的碰撞对象的世界的一个快照。规划场景可用于冲突检查以及获取有关环境的信息。
PlanningSceneMonitor
该PlanningSceneMonitor封装了一个PlanningScene与ROS接口,用于保持PlanningScene最新的。要访问PlanningSceneMonitor的基础PlanningScene,请使用提供的LockedPlanningSceneRW和LockedPlanningSceneRO类。
PlanningSceneMonitor具有以下对象,它们具有自己的ROS接口,用于使计划场景的子组件保持最新状态::
- 一个CurrentStateMonitor,用于通过robot_state_subscriber_和跟踪对RobotState的更新tf_buffer_,还有一个计划场景订户,用于监听来自其他发布者的计划场景差异。
- 一个OccupancyMapMonitor,用于通过ROS主题和服务跟踪对OccupancyMap的更新。
PlanningSceneMonitor具有以下订阅者: - collision_object_subscriber_-在提供的主题中侦听CollisionObject消息,这些消息可能会在规划场景中添加,删除或修改碰撞对象,并将其传递到其受监视的规划场景中
- planning_scene_world_subscriber_-侦听所提供的PlanningSceneWorld消息主题,其中可能包含碰撞对象信息和/或octomap信息。这对于使计划场景监视器保持同步非常有用
- attached_collision_object_subscriber_-在提供的主题上侦听AttachedCollisionObject消息,该消息确定在机器人状态下将对象附加/分离到链接。
PlanningSceneMonitor提供以下服务: - get_scene_service_ -这是一项可选服务,可获取完整的计划场景状态。
使用以下内容初始化PlanningSceneMonitor:
- startSceneMonitor-开始的是planning_scene_subscriber_,
- startWorldGeometryMonitor-这将启动collision_object_subscriber_,planning_scene_world_subscriber_和OccupancyMapMonitor,
- startStateMonitor-这将启动CurrentStateMonitor和attached_collision_object_subscriber_,
- startPublishingPlanningScene
-这将启动另一个线程,用于在提供的主题上发布整个计划场景,以供其他PlanningSceneMonitor订阅,以及 - providePlanningSceneService-开始get_scene_service_。
PlanningSceneInterface
PlanningSceneInterface是一个有用的类,用于通过C ++ API将更新发布到MoveGroup的PlanningSceneMonitor,而无需创建您自己的订阅者和服务客户端。 没有MoveGroup或MoveItCpp,它可能无法工作。