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的界面分左右两栏。左侧是配置步骤列表,右侧是具体操作区。我按顺序带你过一遍关键步骤:

  1. Self-Collisions:自动生成碰撞矩阵。MSA会采样机器人各种姿态,检测哪些连杆永远不会碰撞。点击“Generate Collision Matrix”即可。
  2. Virtual Joints:如果你的机器人是移动的,需要添加虚拟关节。比如把基座和“world”坐标系连起来。
  3. Planning Groups:定义规划组。这是最核心的一步,我们下面单独讲。
  4. Robot Poses:定义默认姿态。比如“home”姿态,所有关节归零。
  5. End Effectors:指定末端执行器。比如夹爪的父连杆是哪个。
  6. Passive Joints:标记被动关节。
  7. 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与配置助手的知识体系

为了让你更直观地理解本章内容,我画了一张图:

SRDF与配置助手知识体系 URDF 模型 MoveIt Setup Assistant 图形化配置工具 SRDF 语义描述文件 规划组定义 关节组 / 连杆组 运动学求解器配置 碰撞矩阵 自碰撞检测 性能优化 默认姿态与末端 Home姿态 末端执行器定义

从图中可以看到,URDF经过MSA加工,输出SRDF。SRDF又包含规划组、碰撞矩阵、默认姿态三大核心内容。这三者共同构成了MoveIt规划的基础。

4.5 实战建议与避坑

最后,分享几个我在实际项目中积累的经验:

  • 规划组不要太大:一个组包含太多关节,规划器会非常慢。建议按功能拆分成多个子组。
  • 碰撞矩阵要手动优化:MSA生成的碰撞矩阵是“安全但保守”的。你可以手动去掉一些永远不会发生的碰撞对,提升规划速度。
  • 默认姿态一定要设:没有默认姿态,MoveIt启动时所有关节都在零位,可能直接撞到工作台。
  • 虚拟关节别漏了:如果你的机器人是移动底盘+机械臂,一定要加虚拟关节,否则基座无法移动。

个人习惯:我每次生成完配置包,都会先跑一下roslaunch your_moveit_config demo.launch,看看机器人能不能正常显示、规划组能不能选中。这一步能发现90%的配置问题。

好了,SRDF和配置助手的内容就到这里。记住:URDF是骨架,SRDF是灵魂。两者缺一不可。下一章我们会深入运动学求解器的选型与调优,到时候见。