3、SRDF与配置包:机械臂的“身份证”与“工具箱”
大家好,欢迎来到第三章。上一章我们把机械臂的骨头和关节(URDF)搭好了,但光有骨头可动不了。今天聊的SRDF,说白了就是给MoveIt用的“行为配置文件”。
我个人习惯把URDF比作机械臂的解剖图,而SRDF就是它的“使用说明书”。没有它,MoveIt根本不知道哪些关节能一起动、哪些姿势是安全的。
3.1 SRDF 文件到底在干什么?
SRDF(Semantic Robot Description Format)是语义层的描述。它不描述几何形状,而是描述“这个机械臂该怎么用”。
举个例子:URDF里定义了6个旋转关节,但SRDF会告诉MoveIt——这6个关节组成一个叫“arm_group”的规划组,它们一起运动时不能自己撞自己。
核心作用:SRDF 是 MoveIt 运动规划管道的“配置入口”。没有它,规划器不知道哪些零件属于同一个手臂,也不知道哪些姿势是安全的。
3.2 定义规划组(Group)—— 把关节“打包”
规划组是SRDF里最重要的概念。你想想看,一个六轴机械臂有6个关节,但如果你想让末端执行器走到某个点,MoveIt需要知道这6个关节是一伙的。
我在项目中遇到过新手直接把所有关节塞进一个组,结果规划器把夹爪的关节和手臂的关节一起算,运动轨迹乱七八糟。嗯,这里要注意:不同功能的关节要分不同的组。
典型的规划组定义方式:
<group name="arm_group">
<joint name="joint_1"/>
<joint name="joint_2"/>
<joint name="joint_3"/>
<joint name="joint_4"/>
<joint name="joint_5"/>
<joint name="joint_6"/>
</group>
<group name="gripper_group">
<joint name="gripper_left_finger_joint"/>
<joint name="gripper_right_finger_joint"/>
</group>
我的建议:命名规范很重要。我习惯用“_group”后缀,比如“arm_group”、“head_group”。这样在代码里调用时一目了然。
3.3 定义预设位姿 —— 给机械臂“记位置”
预设位姿就是给机械臂的某个状态起个名字。比如“home”姿势是所有关节归零,“vertical”是手臂竖直向上。
为什么要定义这个?因为你在编程时可以直接写:
arm_group.setNamedTarget("home")
arm_group.go()
而不是每次都要算6个关节的角度。省事多了,对吧?
我曾经调试一个码垛程序,每次复位都要手动计算关节角度,后来发现SRDF里定义个“home”姿势就解决了。说白了,这就是给机械臂“记位置”。
<group_state name="home" group="arm_group">
<joint name="joint_1" value="0"/>
<joint name="joint_2" value="0"/>
<joint name="joint_3" value="0"/>
<joint name="joint_4" value="0"/>
<joint name="joint_5" value="0"/>
<joint name="joint_6" value="0"/>
</group_state>
3.4 自碰撞矩阵 —— 别让机械臂“打自己”
自碰撞矩阵(Self-Collision Matrix)是SRDF里容易被忽略但极其重要的部分。它定义了哪些连杆之间不需要做碰撞检测。
为什么会这样?因为机械臂的某些连杆永远不可能碰到一起。比如基座和末端执行器,中间隔着整个手臂,根本撞不上。如果每对连杆都做碰撞检测,计算量会爆炸。
我记得第一次做七轴冗余机械臂时,没配置自碰撞矩阵,结果规划速度慢得像蜗牛。后来发现默认的碰撞检测对太多了,去掉那些不可能碰撞的对,速度提升了3倍。
避坑指南:我曾经因为漏掉一对相邻连杆的碰撞检测,导致机械臂在运动时关节撞到了自己。相邻的连杆一定要保留碰撞检测!
SRDF中自碰撞矩阵的写法:
<disable_collisions link1="base_link" link2="link_3" reason="Never"/>
<disable_collisions link1="link_1" link2="link_5" reason="Adjacent"/>
这里的“reason”字段可以填“Never”(永远不会碰撞)或“Adjacent”(相邻连杆,但默认已处理)。
3.5 MoveIt Setup Assistant —— 图形化“配置神器”
手动写SRDF太痛苦了,尤其是自碰撞矩阵,几百个组合谁记得住?MoveIt Setup Assistant就是来解决这个问题的。
启动命令很简单:
roslaunch moveit_setup_assistant setup_assistant.launch
它会加载你的URDF文件,然后让你在图形界面里:
- 定义规划组:勾选关节,拖拽排序
- 设置预设位姿:拖动滑块调整关节角度,然后保存命名
- 生成自碰撞矩阵:自动计算并生成,你只需要确认
- 添加虚拟关节:把机械臂固定到某个基座上
个人经验:我建议先用Setup Assistant生成初始配置,然后手动微调SRDF文件。因为图形界面生成的代码有时会冗余,比如自碰撞矩阵里会包含一些不必要的禁用对。
生成的配置包结构大致如下:
| 文件/目录 | 作用 |
|---|---|
| config/robot.srdf | 语义描述文件(本章核心) |
| config/kinematics.yaml | 运动学求解器配置 |
| config/ompl_planning.yaml | 运动规划算法参数 |
| launch/ | 启动文件,加载配置并启动MoveIt |
嗯,到这里你应该明白了:SRDF就是MoveIt的“灵魂配置”,而Setup Assistant是生成它的“快捷方式”。下一章我们会深入运动学求解器的配置,那才是真正让机械臂“算得准”的关键。