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

用户可以通过两种方式访问 move_group 提供的 action 和服务:
-
在 C++ 中 —— 使用 move_group_interface 软件包,它提供了易于使用的 C++ 接口来访问 move_group
-
通过 GUI —— 使用 Motion Planning plugin to Rviz(ROS 可视化工具)
move_group 是一个 ROS 节点。
它通过 ROS 参数服务器(param server)获取三类信息:
-
URDF
move_group查找robot_description参数以获取机器人的 URDF。
-
SRDF
move_group查找robot_description_semantic参数以获取机器人的 SRDF。SRDF 通常由用户使用 MoveIt Setup Assistant 创建(仅需一次)。
-
MoveIt 配置
move_group还会查找其他 MoveIt 特有的配置,包括关节限位(joint limits)、运动学(kinematics)、运动规划(motion planning)、感知(perception)等信息。这些配置文件由 MoveIt Setup Assistant 自动生成,存储在机器人对应 MoveIt 配置包的config目录中。
move_group 通过 ROS topic 和 action 与机器人通信。
具体而言,它获取当前状态信息(关节位置等)、从机器人传感器获取点云(point cloud)和其他传感器数据,并与机器人上的控制器通信。
关节状态信息
Section titled “关节状态信息”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)中自动配置好了。