PlanningScene是MoveIt2中用于运动规划的核心环境表示类,它维护了机器人状态和世界环境的完整信息,为碰撞检测、运动学计算和轨迹规划提供数据基础。

简单来说,如果Motion Planning是一道“如何在环境中移动机器人”的命题,那PlanningScene就是这道题目的“题干”——它定义了机器人自身是什么样子、周围有什么物体、以及它们之间的相互关系。

核心组成部分

PlanningScene主要包含以下几大块信息:

  • 机器人状态 (RobotState):记录了机器人当前所有关节的位置、速度和加速度等信息。它是进行运动学和动力学计算的基础。

  • 世界表示 (World Representation):描述了机器人周围环境中的物体,包括静态障碍物(如墙壁、桌面)和动态物体(如需要抓取的工件)。

  • 碰撞检测:提供了完整的碰撞检测接口,用于检查机器人在特定状态下是否与环境或自身发生碰撞。

关键能力与操作

  • 碰撞检测:这是PlanningScene最核心的功能。它提供了一系列方法,可以检查整个机器人或特定规划组(如"right_arm")的碰撞情况,并获取碰撞的接触点信息。

  • "允许碰撞矩阵" (Allowed Collision Matrix, ACM):这是一个非常实用的机制。它允许你告诉碰撞检测器,忽略某些特定物体或机器人连杆之间的碰撞。这在处理机器人抓取物体时尤其有用,因为抓取的物体需要与机器人的末端执行器接触,而这些"碰撞"在逻辑上是允许的。

  • 状态管理PlanningScene维护着当前的状态。你可以方便地获取当前状态并进行修改(如设置随机位置或特定关节值),然后进行碰撞检测或其他计算。

如何与实际ROS系统同步?—— PlanningSceneMonitor

在实际的ROS2应用中,你很少会直接、独立地使用PlanningScene。因为机器人的状态和环境信息是动态变化的,我们需要一个机制来保持PlanningScene与真实世界同步,这个机制就是PlanningSceneMonitor

你可以把PlanningSceneMonitor理解为一个"守护者",它通过订阅ROS话题(如/joint_states/collision_object)自动更新内部的PlanningScene,确保其始终反映最真实的状态。

如何更新场景?—— "场景差异 (Diff)"机制

MoveIt2采用了一种高效的"差异(Diff)"机制来更新PlanningScene。你可以通过PlanningSceneInterface等工具发布一个PlanningScene消息,但它不必包含完整的环境信息,只需描述从当前场景到目标场景发生的变化即可,例如"添加一个立方体"或"将盒子附着到机械臂末端"。PlanningSceneMonitor接收到这个"差异"后,会自动应用并更新其内部的场景。

概念澄清:PlanningScene vs. PlanningSceneMonitor vs. PlanningSceneInterface

这三者是初学者容易混淆的概念,这里做一个清晰的区分:

概念 核心职责 类比
PlanningScene 数据容器:存储机器人状态和环境信息的"数据库"。提供碰撞检测、运动学计算等核心API。 一个不断更新的3D数字世界模型
PlanningSceneMonitor 同步守护者:负责通过各种ROS话题,将PlanningScene这个"数据库"与真实的硬件或仿真环境保持同步。 负责更新和维护这个"3D世界模型"的后台服务
PlanningSceneInterface 操作工具:一个方便开发者与move_group节点中的PlanningScene交互的C++工具类。你用它来发送"场景差异"指令,比如"添加/移除/附着物体"。 一个用于向"3D世界模型"发出修改指令的遥控器

总结来说,PlanningScene是MoveIt2规划能力的"中央大脑"和"信息仓库",而PlanningSceneMonitor是确保这个"大脑"信息"不过时"的同步机制,PlanningSceneInterface则是对外操作这个"大脑"的工具。这三者协同工作,为MoveIt2的规划器提供了准确、实时的世界认知。

如果你对特定操作(比如如何添加障碍物,或如何进行更复杂的约束检查)感兴趣,我们可以继续深入探讨。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐