4、SRDF与配置助手:使用MoveIt Setup Assistant生成SRDF
好,咱们继续往下走。上一章我们把URDF模型搞定了,但那只是告诉机器人「你长什么样」。这一章我们要解决的是——机器人该怎么动?哪些关节可以一起动?哪些地方不能撞到自己?
这些信息,就写在SRDF文件里。SRDF的全称是Semantic Robot Description Format,翻译过来就是「语义机器人描述格式」。说白了,URDF描述的是物理属性,SRDF描述的是运动逻辑。
核心理解:URDF + SRDF = 完整的MoveIt配置。URDF告诉系统「我有几个关节」,SRDF告诉系统「这些关节能组成什么运动组」。
4.1 启动MoveIt Setup Assistant
我个人习惯用命令行启动,干净利落:
roslaunch moveit_setup_assistant setup_assistant.launch
启动后你会看到一个图形界面。第一次用的话,选择「Create New MoveIt Configuration Package」。然后加载你上一章生成的URDF文件。
嗯,这里要注意:URDF文件路径不要有中文,我之前有个学员把模型放在「桌面/新建文件夹」里,结果加载报错,折腾了半天。
4.2 定义规划组——这是核心中的核心
规划组(Planning Group)是什么?你想想看,一个六轴机械臂,你不可能每次都单独控制每个关节吧?你需要的是——「让末端走到那个位置」,至于中间六个关节怎么配合,那是规划器的事。
所以,规划组就是把一组关节打包成一个逻辑单元。我一般这样分:
| 规划组名称 | 包含关节 | 类型 | 用途 |
|---|---|---|---|
| arm_group | joint1 ~ joint6 | Kinematic Chain | 主臂运动 |
| gripper_group | gripper_left_joint, gripper_right_joint | Planar | 夹爪开合 |
| whole_body | 所有关节 | Kinematic Chain | 全身协同 |
在Setup Assistant里,点击「Planning Groups」选项卡,然后「Add Group」。在弹出的对话框里:
- Group Name:起个有意义的名字,比如arm_group
- Kinematic Solver:选KDL(默认),如果你有自定义求解器可以换
- Group Type:选Kinematic Chain,然后指定基座和末端
基座我通常选base_link,末端选tool0或gripper_base。然后点「Add Joints」,把joint1到joint6加进去。
我的经验:如果你有多个末端工具,建议每个工具单独定义一个规划组。比如gripper_group只管夹爪,vacuum_group只管吸盘。这样在写抓取逻辑时,切换工具非常方便。
4.3 自碰撞矩阵——别让机器人打自己
自碰撞矩阵(Self-Collision Matrix)是SRDF里一个容易被忽略但极其重要的部分。说白了,就是告诉MoveIt:「哪些连杆之间永远不会碰撞,你不用检查了」。
为什么要做这个?因为碰撞检测很费算力。如果每两个连杆都检查一遍,规划速度会慢得让你怀疑人生。
在Setup Assistant里,点击「Self-Collisions」选项卡。系统会自动计算默认的碰撞矩阵。我建议你:
- 保留默认设置,不要手动删减太多
- 采样密度选10000个点,覆盖大部分位姿
- 点击「Regenerate Default Collision Matrix」
我曾经在一个六轴机器人项目里,为了省事跳过了这一步。结果运行时MoveIt频繁报错,说检测到自碰撞。后来发现是默认矩阵没生成完整,导致一些本不该碰撞的连杆被误判了。
注意:自碰撞矩阵不是万能的。如果你的机器人结构特殊(比如有并联机构),建议手动检查一下生成的矩阵,把那些「距离很近但不会碰」的连杆对手动添加进去。
4.4 虚拟关节——连接机器人与世界
虚拟关节(Virtual Joint)的作用,是把你的机器人「固定」到世界坐标系里。对于固定式机械臂,虚拟关节通常是一个6自由度的固定关节。
在Setup Assistant里,点击「Virtual Joints」选项卡,然后「Add Virtual Joint」:
- Virtual Joint Name:取个名字,比如virtual_joint
- Child Link:选base_link(你的机器人基座)
- Parent Frame:选world(世界坐标系)
- Joint Type:选Fixed
如果你做的是移动机械臂,这里就要选Planar或Floating了。不过咱们课程主要讲固定式抓取,所以Fixed就够了。
4.5 生成配置包
所有设置完成后,点击「Generate Package」。系统会生成一个完整的MoveIt配置包,里面包含:
- config/ 目录:SRDF文件、关节限位、运动学配置等
- launch/ 目录:各种启动文件
- CMakeLists.txt 和 package.xml
我个人习惯把生成的包命名为 robot_moveit_config,这样一看就知道是MoveIt配置。
小技巧:生成后先跑一下 roslaunch robot_moveit_config demo.launch,看看能不能正常加载。如果报错,90%是URDF路径问题或规划组定义有误。
4.6 本章知识结构图
下面这张图,帮你理清SRDF生成的核心流程:
从图上可以看得很清楚:URDF是输入,经过Setup Assistant的三个核心步骤,最终输出完整的MoveIt配置包。每一步都缺一不可。
4.7 验证你的配置
配置包生成后,我建议你做两件事来验证:
- 启动demo.launch:看看Rviz里能不能正常显示机器人模型
- 拖拽交互:在Rviz里用Interact工具拖拽末端,看看规划组是否按预期运动
如果拖拽时关节乱动,说明规划组的运动学求解器配置有问题。如果机器人显示不全,检查URDF的link定义。
总结一下:SRDF是MoveIt的灵魂。规划组决定了你能做什么动作,自碰撞矩阵决定了动作的安全性,虚拟关节决定了机器人在世界中的位置。这三者配合好了,你的机械臂才能「指哪打哪」。