4、SRDF与MoveIt2配置助手:SRDF文件结构、规划组、预设位姿、虚拟关节、碰撞免检矩阵的配置方法
在MoveIt2的配置体系中,URDF(统一机器人描述格式)定义了机器人的物理属性——连杆、关节、惯量、碰撞几何体,而SRDF(语义机器人描述格式)则定义了机器人的“语义能力”——哪些关节可以协同运动、机械臂可以摆出哪些典型姿态、哪些部件在规划时可以被忽略。如果说URDF是机器人的“骨骼与肌肉”,SRDF就是机器人的“神经与记忆”。本章将深入剖析SRDF文件的结构,并围绕MoveIt2 Setup Assistant(配置助手)详细讲解规划组(Planning Group)、预设位姿(Predefined Pose)、虚拟关节(Virtual Joint)与碰撞免检矩阵(ACM,Allowed Collision Matrix)的配置方法,帮助读者从“能显示模型”进阶到“能规划运动”。
4.1 SRDF文件结构与核心原理
SRDF(Semantic Robot Description Format)是一个XML格式的语义描述文件,它不重复描述机器人的几何与物理属性,而是补充URDF无法表达的高层信息。MoveIt2通过SRDF回答三个关键问题:哪些关节可以组合成运动单元?(规划组)、机械臂有哪些常用姿态?(预设位姿)、哪些碰撞检查可以安全跳过?(碰撞免检矩阵)。此外,虚拟关节将机器人基座与外部世界(如世界坐标系)关联起来,是移动机械臂或自由漂浮机器人的必备元素。
一个典型的SRDF文件结构如下:
<robot name="arm_robot">
<!-- 规划组定义 -->
<group name="arm_group">
<joint name="j1"/>
<joint name="j2"/>
<joint name="j3"/>
<joint name="j4"/>
<joint name="j5"/>
<joint name="j6"/>
</group>
<!-- 预设位姿 -->
<group_state name="home" group="arm_group">
<joint name="j1" value="0.0"/>
<joint name="j2" value="-1.57"/>
<joint name="j3" value="1.57"/>
<joint name="j4" value="0.0"/>
<joint name="j5" value="0.785"/>
<joint name="j6" value="0.0"/>
</group_state>
<!-- 虚拟关节 -->
<virtual_joint name="world_joint" type="fixed" parent_frame="world" child_link="base_link"/>
<!-- 碰撞免检矩阵 -->
<disable_collisions link1="base_link" link2="link1" reason="Adjacent"/>
<disable_collisions link1="link1" link2="link2" reason="Adjacent"/>
</robot>
SRDF文件通常由MoveIt2 Setup Assistant自动生成,但理解其结构对于手动调整和排障至关重要。文件中的每个标签都对应配置助手中的一个交互步骤,掌握这些标签的含义,就能在配置助手界面和底层文件之间自由切换。
4.2 规划组(Planning Group)的配置方法
规划组是MoveIt2中最核心的概念之一,它定义了一组关节的集合,这些关节可以作为一个整体进行运动规划。规划组可以是串联链(如六轴机械臂)、并联结构(如Stewart平台)或自由关节集合(如手爪的多个手指)。
4.2.1 规划组的类型与选择
| 规划组类型 | 适用场景 | 配置要点 |
|---|---|---|
| Kinematic Chain | 串联机械臂、灵巧手 | 指定base_link和tip_link,自动提取中间关节 |
| Joint Group | 手爪、非链式关节集合 | 手动勾选参与规划的关节 |
| Fixed | 固定不动的关节组 | 用于标记固定部件,不参与规划 |
在配置助手中,选择“Add Group”后,需要填写组名称、选择类型,并指定关节或链的端点。对于六轴机械臂,推荐使用Kinematic Chain类型,将base_link设为起始连杆,tool0设为末端连杆,配置助手会自动识别中间的所有关节。
4.2.2 规划组的实战配置流程
- 在MoveIt2 Setup Assistant中点击“Add Group”,输入组名(如arm_group)。
- 选择“Kinematic Chain”作为规划组类型。
- 在“Base Link”下拉框中选择base_link,在“Tip Link”中选择tool0。
- 点击“Add”后,配置助手会自动列出该链上的所有关节。
- 如果机械臂带有手爪,可以再创建一个名为“gripper”的Joint Group,勾选手指关节。
规划组的命名规范建议使用小写字母和下划线,避免使用空格和特殊字符。一个机器人可以有多个规划组,它们可以重叠(例如arm_group包含全部六个关节,而arm_with_gripper包含六个关节加两个手指关节),MoveIt2允许这种重叠配置。
4.3 预设位姿(Predefined Pose)的配置与使用
预设位姿是SRDF中为特定规划组保存的关节角度快照。它们用于快速将机械臂导航到常用位置,如“home”(初始位姿)、“vertical”(竖直向上)、“folded”(折叠收纳)等。预设位姿不仅提高了开发效率,还能帮助避免奇异点或碰撞风险。
4.3.1 预设位姿的配置步骤
在配置助手的“Add Pose”功能中,选择目标规划组,然后通过滑块或直接输入数值调整每个关节的角度,点击“Save”即可保存当前状态为预设位姿。关键操作流程如下:
- 在配置助手中选择“Add Pose”,指定所属规划组。
- 输入位姿名称(如home、pick_ready、place_ready)。
- 通过关节滑块调整到目标角度,或直接输入数值。
- 点击“Save”保存,配置助手会将其写入SRDF的
<group_state>标签中。
在运行时,可以通过MoveGroup接口直接调用预设位姿:
from moveit.core.robot_state import RobotState
# 设置到home位姿
move_group.set_named_target("home")
move_group.go(wait=True)
4.3.2 预设位姿的工程实践
在实际项目中,预设位姿的设计需要结合工艺需求。例如,在焊接应用中,需要定义“焊接起始位”、“焊接结束位”、“避障位”等;在码垛应用中,需要定义“抓取位”、“放置位”、“中间过渡位”。每个预设位姿都应该经过碰撞验证,确保机械臂在该位姿下不会与周围环境发生干涉。
check_urdf工具或RViz中的RobotModel显示进行验证。
4.4 虚拟关节(Virtual Joint)的配置方法
虚拟关节用于将机器人的基座与外部坐标系(通常是world或odom)关联起来。对于固定安装的机械臂,虚拟关节类型为fixed,表示基座固定在世界坐标系中。对于移动机器人或自由漂浮的机械臂(如无人机搭载的机械臂),虚拟关节类型为planar(平面移动)或floating(六自由度自由移动)。
4.4.1 虚拟关节的配置要点
| 类型 | 自由度 | 适用场景 |
|---|---|---|
| fixed | 0 | 固定安装的机械臂 |
| planar | 3 (x, y, yaw) | AGV/AMR上的机械臂 |
| floating | 6 (x, y, z, roll, pitch, yaw) | 无人机、水下机器人 |
在配置助手中,虚拟关节的配置位于“Virtual Joints”选项卡。需要指定关节名称(如world_joint)、类型、父坐标系(parent_frame)和子连杆(child_link)。对于固定机械臂,父坐标系通常设为world,子连杆设为base_link。
4.4.2 虚拟关节的实战案例
假设我们有一个AGV搭载六轴机械臂,AGV可以在平面上移动和旋转。此时虚拟关节应配置为planar类型,这样MoveIt2在规划时会将AGV的移动纳入考虑,实现“移动+操作”的联合规划。配置如下:
<virtual_joint name="agv_joint" type="planar" parent_frame="odom" child_link="base_link">
<axis xyz="0 0 1"/> <!-- 绕Z轴旋转 -->
</virtual_joint>
需要注意的是,planar虚拟关节的父坐标系通常是odom(里程计坐标系),而不是map(地图坐标系)。这是因为odom坐标系更适合局部规划,而map坐标系用于全局定位。
4.5 碰撞免检矩阵(ACM)的配置与优化
碰撞免检矩阵(Allowed Collision Matrix,ACM)是SRDF中用于声明“哪些连杆对在碰撞检测中可以安全忽略”的矩阵。默认情况下,MoveIt2会检查所有连杆对之间的碰撞,但很多检查是冗余的——例如相邻连杆之间通过关节连接,永远不会发生碰撞;固定连接的连杆之间也不会发生相对运动。ACM通过跳过这些检查,显著提升规划效率。
4.5.1 ACM的自动生成与手动调整
MoveIt2 Setup Assistant在加载URDF后,会自动计算默认的ACM。它会自动标记以下连杆对为免检:
- 相邻连杆对:通过关节直接连接的两个连杆。
- 固定连接对:通过fixed关节连接的连杆对。
- 同一规划组内的“父子”连杆:在运动学链上相邻的连杆。
在配置助手的“Calculate Collision Matrix”按钮中,可以自动生成初始ACM。生成后,用户可以在矩阵中手动添加或删除免检项。手动添加免检项需要谨慎,因为错误的免检可能导致实际碰撞被忽略。
4.5.2 ACM的工程优化策略
| 场景 | 建议 | 原因 |
|---|---|---|
| 相邻关节连杆 | 必须免检 | 几何上不可能碰撞 |
| 固定连接部件 | 建议免检 | 相对位置不变 |
| 距离较远的连杆 | 保留检查 | 可能发生意外碰撞 |
| 对称结构 | 可考虑免检 | 结构对称且距离远 |
在实际项目中,ACM的优化是一个迭代过程。初始ACM可能过于保守(检查过多),导致规划速度慢;也可能过于激进(免检过多),导致规划出碰撞轨迹。建议在仿真环境中反复测试,逐步调整ACM。
4.6 案例拆解:六轴机械臂SRDF完整配置实战
下面通过一个完整的案例,演示如何从零开始配置一个六轴机械臂的SRDF文件。假设我们有一个典型的工业六轴机械臂,URDF中定义了base_link、link1~link6、tool0,以及六个旋转关节j1~j6。
4.6.1 配置目标与约束
机械臂固定安装在工作台上,需要完成搬运任务。工作台周围有护栏,机械臂在运动过程中需要避开护栏。初始配置目标如下:
- 规划组:arm_group(j1~j6),gripper_group(两个手指关节)。
- 预设位姿:home(竖直向上)、pick(抓取位)、place(放置位)。
- 虚拟关节:fixed类型,world → base_link。
- ACM:自动生成后,手动添加“link3与link5”免检(因为结构上距离较远且中间有link4阻挡)。
4.6.2 配置操作步骤
- 启动配置助手:
ros2 run moveit_setup_assistant moveit_setup_assistant,选择“Create New MoveIt Config Package”,加载URDF文件。 - 在“Planning Groups”中,添加arm_group(Kinematic Chain,base_link→tool0),添加gripper_group(Joint Group,勾选finger1_joint和finger2_joint)。
- 在“Poses”中,为arm_group添加home位姿(所有关节为0),为gripper_group添加open(手指张开)和close(手指闭合)位姿。
- 在“Virtual Joints”中,添加world_joint,类型fixed,parent_frame=world,child_link=base_link。
- 点击“Calculate Collision Matrix”生成初始ACM,然后在矩阵中手动找到link3和link5,勾选免检。
- 点击“Generate Package”,生成完整的MoveIt2配置包。
4.6.3 验证与结果
生成配置包后,使用以下命令启动仿真验证:
ros2 launch arm_robot_moveit_config demo.launch.py
在RViz中,可以通过拖拽交互标记(InteractiveMarker)手动拖动机械臂末端,观察运动是否平滑。然后使用“Motion Planning”面板,将目标设置为“pick”位姿,点击“Plan”按钮,观察规划是否成功。如果规划失败,检查ACM是否过于激进,或预设位姿是否超出关节限位。
通过对比优化前后的规划时间,可以发现合理的ACM可以将规划时间从平均200ms降低到80ms左右,提升约60%的效率。同时,预设位姿的合理设计减少了手动调整关节的时间,提高了调试效率。
4.7 常见误区与总结复盘
在SRDF配置过程中,初学者常犯以下错误:
- 误区一:规划组包含过多关节。将不相关的关节(如手爪关节)也加入机械臂规划组,导致规划空间维度过高,规划速度下降。
- 误区二:预设位姿未验证碰撞。直接使用数值输入预设位姿,未在RViz中验证,导致机械臂在到达该位姿时与周围环境碰撞。
- 误区三:虚拟关节类型错误。将固定机械臂的虚拟关节配置为planar,导致规划器认为基座可以移动,产生不可执行的轨迹。
- 误区四:ACM过度免检。为了追求速度,手动添加大量免检项,导致规划出的轨迹在实际执行时发生碰撞。
总结本章核心要点:SRDF是MoveIt2的“语义大脑”,规划组定义了运动单元,预设位姿提供了常用姿态,虚拟关节连接了机器人与世界,ACM优化了碰撞检测效率。掌握这些配置方法,是使用MoveIt2进行机械臂控制的基础。在实际项目中,建议遵循“先自动生成,后手动微调”的原则,在仿真环境中充分验证后再部署到真实机器人上。