4、SRDF与配置包:SRDF文件作用、MoveIt Setup Assistant、生成配置包

好,咱们继续往下走。上一章我们把URDF模型搞定了,机器人长什么样、有几个关节,这些信息都写清楚了。但MoveIt光知道这些还不够——它还得知道哪些关节能动、哪些是固定的、机器人怎么规划路径、末端夹爪怎么抓东西。

这些信息,就写在SRDF文件里。说白了,SRDF就是给MoveIt看的“说明书”,告诉它这个机器人该怎么用。

4.1 SRDF到底是什么?

SRDF的全称是Semantic Robot Description Format,语义机器人描述格式。名字听着挺唬人,其实内容很直白。

URDF描述的是机器人的物理结构——连杆、关节、尺寸、质量。SRDF描述的是机器人的语义信息——哪些关节是主动的、哪些是被动的、哪些连杆可以碰撞、哪些不能碰。

我刚开始接触MoveIt的时候,总觉得URDF就够了,干嘛还要多一个SRDF?后来在项目里调试一个六轴机械臂,发现URDF里明明定义了所有关节,但MoveIt就是规划不出路径。折腾了半天,才发现是SRDF里忘了把某个关节标记为可规划。嗯,从那以后我再也不敢小看这个文件了。

核心要点:URDF告诉MoveIt“机器人长什么样”,SRDF告诉MoveIt“机器人怎么用”。两者缺一不可。

SRDF文件里主要包含以下几类信息:

  • 规划组(Planning Group):把一组关节或连杆打包成一个逻辑组,比如“手臂组”、“夹爪组”。
  • 默认姿态(Default Pose):定义机器人的初始姿态,比如“home”位置。
  • 碰撞矩阵(Allowed Collision Matrix):指定哪些连杆之间允许碰撞,哪些必须避免碰撞。
  • 末端执行器(End Effector):定义夹爪或工具的父连杆和连接方式。
  • 被动关节(Passive Joint):标记那些不能主动控制的关节,比如弹簧关节。

4.2 MoveIt Setup Assistant——你的配置向导

手动写SRDF?说实话,我见过有人这么干,但真的不推荐。SRDF的XML结构虽然不复杂,但里面的关节名称、连杆名称必须和URDF完全一致,一个字母写错就报错。你想想看,一个六轴机械臂加上夹爪,光关节就有七八个,手动配一遍得疯掉。

MoveIt官方提供了一个图形化工具——MoveIt Setup Assistant。它能帮你自动生成SRDF和整套配置包。

4.2.1 启动Setup Assistant

前提是你已经安装了MoveIt2。在终端里运行:

ros2 launch moveit2_setup_assistant setup_assistant.launch.py

界面启动后,第一步就是加载你的URDF文件。点击“Load File”,选择你上一章生成的机器人URDF。我个人习惯把URDF放在urdf/目录下,这样路径清晰。

小技巧:如果你用的是xacro文件,记得先转换成纯URDF再加载。Setup Assistant对xacro的支持不太稳定,我踩过这个坑。

4.2.2 配置规划组

这是最核心的一步。你需要把机器人的关节分成几个逻辑组。比如一个典型的六轴机械臂:

规划组名称 包含关节 类型
arm_group joint1 ~ joint6 Kinematic Chain
gripper_group gripper_left_joint, gripper_right_joint Kinematic Chain
whole_body arm_group + gripper_group Group

操作很简单:在左侧选择关节,点击“Add Group”,输入名称,选择类型。Kinematic Chain是最常用的,它表示一个运动链,从基座到末端。

我记得第一次配置的时候,把夹爪的两个关节单独设成了一个组,结果规划的时候总是报错。后来才发现,夹爪应该用End Effector来定义,而不是普通的规划组。这个区别很重要。

4.2.3 定义默认姿态

给机器人设定几个常用姿态。比如:

  • home:所有关节归零,机器人直立。
  • vertical:手臂竖直向上,方便抓取高处的物体。
  • folded:折叠状态,节省空间。

你只需要拖动滑块调整每个关节的角度,然后点击“Save”命名即可。这些姿态在后续编程中可以直接调用,非常方便。

4.2.4 配置碰撞矩阵

碰撞矩阵是SRDF里最容易忽略但又最关键的部分。默认情况下,MoveIt会认为所有连杆之间都可能发生碰撞,这会导致规划速度极慢,甚至规划失败。

你需要告诉MoveIt:哪些连杆永远不会碰到一起。比如,同一个关节的两个相邻连杆,它们之间本来就有物理连接,不会发生碰撞。还有那些距离很远的连杆,比如基座和夹爪,正常情况下也不会碰到。

注意:不要盲目地把所有碰撞对都禁用。我曾经在一个项目里为了省事,把所有碰撞检查都关了,结果机器人规划出一条自碰撞的路径,差点把夹爪撞坏。安全第一,该检查的还是要检查。

Setup Assistant会自动计算默认的碰撞矩阵,你只需要手动调整那些明显不合理的条目。我个人习惯先保留所有碰撞检查,然后逐步禁用那些确定安全的碰撞对。

4.3 生成配置包

所有配置完成后,点击“Generate Package”。你需要指定:

  • 包名:比如my_robot_moveit_config
  • 作者信息:填你的名字和邮箱
  • 输出路径:通常放在你的工作空间里

生成完成后,你会得到一个完整的MoveIt配置包。它的目录结构大概是这样的:

my_robot_moveit_config/
├── config/
│   ├── my_robot.srdf
│   ├── kinematics.yaml
│   ├── joint_limits.yaml
│   ├── ompl_planning.yaml
│   └── fake_controllers.yaml
├── launch/
│   ├── demo.launch.py
│   ├── move_group.launch.py
│   └── planning_context.launch.py
├── srdf/
│   └── my_robot.srdf
└── package.xml

这里面最重要的就是config/my_robot.srdf文件。你可以打开看看,里面就是你刚才在Setup Assistant里配置的所有内容。

核心文件:SRDF文件是MoveIt配置包的灵魂。没有它,MoveIt就无法理解机器人的语义信息,规划、控制、碰撞检测全都无法工作。

4.4 知识体系总览

下面这张图帮你理清SRDF和配置包在整个MoveIt体系中的位置:

SRDF与配置包知识体系 URDF文件 机器人物理描述 MoveIt Setup Assistant 图形化配置工具 加载URDF → 配置规划组 → 生成SRDF 配置包 my_robot_moveit_config 包含SRDF、YAML、Launch文件 SRDF文件核心内容 规划组 arm_group / gripper_group 默认姿态 home / vertical / folded 碰撞矩阵 允许/禁止碰撞对 最终输出:可用的MoveIt配置包 可直接用于运动规划、碰撞检测、仿真控制

4.5 避坑指南

最后分享几个我踩过的坑,希望能帮你省点时间:

  • 关节名称必须一致:SRDF里引用的关节名称,必须和URDF里定义的完全一致,大小写都不能错。我曾经因为一个下划线写成了连字符,排查了整整一下午。
  • 规划组不要嵌套太深:虽然支持多层嵌套,但嵌套太深会导致规划效率下降。我一般控制在两层以内。
  • 生成配置包后检查一下:Setup Assistant生成的配置包不一定完美。我建议打开config/目录下的YAML文件,手动检查一下参数是否合理,尤其是joint_limits.yaml里的速度限制和加速度限制。
  • 备份你的配置:每次修改完SRDF后,记得备份。这个文件一旦损坏,整个MoveIt配置包就废了。

好了,这一章的内容就到这里。配置包生成之后,下一章我们就可以真正开始让机器人动起来了。