Skip to content

move_group 节点

下图展示了 MoveIt 提供的关键节点——move_group——的高层系统架构。该节点充当集成器(integrator),将所有独立组件整合在一起,为用户提供一组可供使用的 ROS action 和 service。

用户可以通过两种方式访问 move_group 提供的 action 和服务:

move_group 是一个 ROS 节点。 它通过 ROS 参数服务器(param server)获取三类信息:

  1. URDF

    • move_group 查找 robot_description 参数以获取机器人的 URDF。
  2. SRDF

    • move_group 查找 robot_description_semantic 参数以获取机器人的 SRDF。SRDF 通常由用户使用 MoveIt Setup Assistant 创建(仅需一次)。
  3. MoveIt 配置

    • move_group 还会查找其他 MoveIt 特有的配置,包括关节限位(joint limits)、运动学(kinematics)、运动规划(motion planning)、感知(perception)等信息。这些配置文件由 MoveIt Setup Assistant 自动生成,存储在机器人对应 MoveIt 配置包的 config 目录中。

move_group 通过 ROS topic 和 action 与机器人通信。 具体而言,它获取当前状态信息(关节位置等)、从机器人传感器获取点云(point cloud)和其他传感器数据,并与机器人上的控制器通信。

move_group 监听 /joint_states topic 来确定当前状态信息——即机器人每个关节的位置。 move_group 能够处理该 topic 上的多个发布者(publisher),即使它们只发布机器人状态的部分信息(例如,机器人的手臂和移动底盘可能使用不同的发布者)。 需要注意的是,move_group 不会自行设置关节状态发布者——这必须由每个机器人自行实现。

move_group 使用 ROS TF 库监视变换(transform)信息。 这使该节点能够获取机器人位姿(pose)的全局信息。 例如,ROS 导航栈会将机器人 map 坐标系与 base 坐标系之间的变换发布到 TF。 move_group 可以使用 TF 计算出这个变换供内部使用。需要注意的是,move_group 只监听 TF。 要从机器人发布 TF 信息,你需要在机器人上运行 robot_state_publisher 节点。

move_group 使用 FollowJointTrajectoryAction 接口与机器人上的控制器通信。 这是一个 ROS action 接口。 机器人上需要有一个服务器(server)来处理这个 action——该服务器不由 move_group 本身提供。 move_group 只会实例化一个客户端(client),用于与机器人上的控制器 action 服务器通信。

move_group 使用 Planning Scene Monitor(规划场景监视器)来维护一个规划场景(planning scene),即对世界和机器人当前状态的表示。 机器人状态可以包括任何附着在机器人上、被视为刚性连接的物体。 关于维护和更新规划场景的架构细节,请参阅”规划场景监视器”部分。

move_group 的结构设计为易于扩展。 拾放(pick and place)、运动学、运动规划等单项能力实际上都作为独立的插件(plugin)实现,共享同一基类。 这些插件可以通过一组 ROS yaml 参数以及 ROS pluginlib 库在 ROS 中进行配置。 大多数用户无需手动配置 move_group 插件,因为它们已在 MoveIt Setup Assistant 生成的启动文件(launch files)中自动配置好了。