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体系中的位置:
4.5 避坑指南
最后分享几个我踩过的坑,希望能帮你省点时间:
- 关节名称必须一致:SRDF里引用的关节名称,必须和URDF里定义的完全一致,大小写都不能错。我曾经因为一个下划线写成了连字符,排查了整整一下午。
- 规划组不要嵌套太深:虽然支持多层嵌套,但嵌套太深会导致规划效率下降。我一般控制在两层以内。
- 生成配置包后检查一下:Setup Assistant生成的配置包不一定完美。我建议打开
config/目录下的YAML文件,手动检查一下参数是否合理,尤其是joint_limits.yaml里的速度限制和加速度限制。 - 备份你的配置:每次修改完SRDF后,记得备份。这个文件一旦损坏,整个MoveIt配置包就废了。
好了,这一章的内容就到这里。配置包生成之后,下一章我们就可以真正开始让机器人动起来了。