4、SRDF与配置助手:SRDF文件作用、MoveIt Setup Assistant使用、规划组定义
好,我们继续往下走。前面几章我们把机器人的URDF模型搞定了,但URDF只描述了机器人长什么样、关节怎么连。要让MoveIt真正动起来,还需要一个“灵魂文件”——SRDF。
SRDF全称是Semantic Robot Description Format,语义机器人描述格式。说白了,它告诉MoveIt:哪些关节可以动、哪些零件是一组、哪些地方不能碰撞。没有SRDF,MoveIt就是个瞎子。
4.1 SRDF文件到底在干什么?
我刚开始接触MoveIt时,以为URDF就够了。结果一跑运动规划,机器人直接把自己拧成了麻花。后来才发现,SRDF才是那个“约束规则书”。
SRDF主要干这几件事:
- 定义规划组:把一组关节或连杆打包成一个逻辑组,比如“左臂”、“夹爪”、“全身”。
- 指定默认姿态:比如“home姿态”、“垂直姿态”,方便快速切换。
- 定义虚拟关节:把机器人基座和世界坐标系连起来,用于移动机器人。
- 设置碰撞矩阵:告诉MoveIt哪些连杆之间永远不会碰撞,可以跳过检测,提升性能。
- 添加被动关节:有些关节是随动的(比如弹簧关节),规划时不要主动控制它们。
核心理解:URDF是“物理描述”,SRDF是“语义描述”。一个管长相,一个管行为。
举个例子。我有一个六轴机械臂,URDF里定义了6个旋转关节。但在SRDF里,我把这6个关节打包成一个规划组叫“arm_group”。MoveIt就知道:你要规划“arm_group”的运动,就是同时控制这6个关节。
4.2 MoveIt Setup Assistant——你的配置向导
手动写SRDF?太痛苦了。ROS社区早就想到了这一点,提供了MoveIt Setup Assistant(简称MSA)。这是一个图形化工具,你只需要点一点、填一填,就能生成完整的SRDF和配置文件。
我个人习惯是:先用MSA生成初始配置,再手动微调。因为MSA生成的碰撞矩阵有时太保守,影响规划速度。
4.2.1 启动MSA
确保你已经安装了moveit_setup_assistant包。然后在终端运行:
roslaunch moveit_setup_assistant setup_assistant.launch
界面会弹出来,选择“Create New MoveIt Configuration Package”。然后加载你的URDF文件(xacro格式也可以)。
小技巧:如果你的URDF用了xacro,MSA会自动解析。但记得先source一下你的工作空间,否则可能找不到宏定义。
4.2.2 核心配置步骤
MSA的界面分左右两栏。左侧是配置步骤列表,右侧是具体操作区。我按顺序带你过一遍关键步骤:
- Self-Collisions:自动生成碰撞矩阵。MSA会采样机器人各种姿态,检测哪些连杆永远不会碰撞。点击“Generate Collision Matrix”即可。
- Virtual Joints:如果你的机器人是移动的,需要添加虚拟关节。比如把基座和“world”坐标系连起来。
- Planning Groups:定义规划组。这是最核心的一步,我们下面单独讲。
- Robot Poses:定义默认姿态。比如“home”姿态,所有关节归零。
- End Effectors:指定末端执行器。比如夹爪的父连杆是哪个。
- Passive Joints:标记被动关节。
- Configuration Files:最后一步,设置包名和路径,点击“Generate Package”生成。
嗯,这里要注意:MSA生成的配置包会包含launch文件、config文件、SRDF文件等。建议放在你的机器人功能包的同级目录下。
4.3 规划组定义——核心中的核心
规划组(Planning Group)是MoveIt规划的最小单元。你告诉MoveIt:“我要让这个组从A点运动到B点”,MoveIt就会控制组内所有关节协同运动。
我在项目中遇到过一个问题:一个七轴协作机器人,我把所有关节放在一个组里,结果规划速度极慢。后来拆成“肩部组”和“腕部组”,速度提升了好几倍。所以规划组的划分很有讲究。
4.3.1 如何定义规划组
在MSA的“Planning Groups”页面,点击“Add Group”。你会看到:
- Group Name:组名,比如“arm_group”。
- Kinematic Solver:运动学求解器。一般选KDL(默认),精度要求高可以用TRAC-IK或BioIK。
- Kin. Search Resolution:求解精度,默认0.005。
- Kin. Search Timeout:超时时间,默认0.005秒。
然后点击“Add Joints”或“Add Links”,把属于这个组的关节或连杆加进去。
避坑指南:我曾经把基座连杆也加进了规划组,结果规划时基座跟着乱动。记住:规划组只包含可动关节和它们之间的连杆,基座是固定的。
4.3.2 规划组的类型
MoveIt支持两种规划组:
| 类型 | 说明 | 适用场景 |
|---|---|---|
| Joint Group | 由一组关节组成 | 机械臂、夹爪 |
| Link Group | 由一组连杆组成 | 需要跟踪特定连杆的姿态 |
大多数情况下我们用Joint Group。Link Group常用于末端执行器跟踪。
4.3.3 一个完整的规划组示例
假设我有一个六轴机械臂,关节名为joint1到joint6。在SRDF中,规划组定义大概长这样:
<group name="arm_group">
<joint name="joint1"/>
<joint name="joint2"/>
<joint name="joint3"/>
<joint name="joint4"/>
<joint name="joint5"/>
<joint name="joint6"/>
</group>
如果你有夹爪,可以再定义一个夹爪组:
<group name="gripper_group">
<joint name="gripper_left_finger_joint"/>
<joint name="gripper_right_finger_joint"/>
</group>
然后还可以定义一个“全身组”,包含arm_group和gripper_group:
<group name="whole_body">
<subgroup name="arm_group"/>
<subgroup name="gripper_group"/>
</group>
这种嵌套结构非常实用。你可以单独规划手臂,也可以规划全身协调运动。
4.4 SRDF与配置助手的知识体系
为了让你更直观地理解本章内容,我画了一张图:
从图中可以看到,URDF经过MSA加工,输出SRDF。SRDF又包含规划组、碰撞矩阵、默认姿态三大核心内容。这三者共同构成了MoveIt规划的基础。
4.5 实战建议与避坑
最后,分享几个我在实际项目中积累的经验:
- 规划组不要太大:一个组包含太多关节,规划器会非常慢。建议按功能拆分成多个子组。
- 碰撞矩阵要手动优化:MSA生成的碰撞矩阵是“安全但保守”的。你可以手动去掉一些永远不会发生的碰撞对,提升规划速度。
- 默认姿态一定要设:没有默认姿态,MoveIt启动时所有关节都在零位,可能直接撞到工作台。
- 虚拟关节别漏了:如果你的机器人是移动底盘+机械臂,一定要加虚拟关节,否则基座无法移动。
个人习惯:我每次生成完配置包,都会先跑一下roslaunch your_moveit_config demo.launch,看看机器人能不能正常显示、规划组能不能选中。这一步能发现90%的配置问题。
好了,SRDF和配置助手的内容就到这里。记住:URDF是骨架,SRDF是灵魂。两者缺一不可。下一章我们会深入运动学求解器的选型与调优,到时候见。