3、SRDF与配置包:机械臂的“身份证”与“工具箱”

大家好,欢迎来到第三章。上一章我们把机械臂的骨头和关节(URDF)搭好了,但光有骨头可动不了。今天聊的SRDF,说白了就是给MoveIt用的“行为配置文件”。

我个人习惯把URDF比作机械臂的解剖图,而SRDF就是它的“使用说明书”。没有它,MoveIt根本不知道哪些关节能一起动、哪些姿势是安全的。

SRDF 核心组成 SRDF 文件 规划组 (Group) 定义关节与连杆集合 预设位姿 home、vertical等命名姿势 自碰撞矩阵 禁用碰撞检测对 虚拟关节 连接机械臂与基座 每个机械臂配置包都包含一个 .srdf 文件,位于 config/ 目录下 MoveIt Setup Assistant 是生成它的图形化工具

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是生成它的“快捷方式”。下一章我们会深入运动学求解器的配置,那才是真正让机械臂“算得准”的关键。