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生成的核心流程:

SRDF生成核心流程 URDF 模型文件 MoveIt Setup Assistant 定义规划组 arm_group / gripper_group 自碰撞矩阵 采样10000点位姿 虚拟关节 base_link → world MoveIt 配置包 (SRDF)

从图上可以看得很清楚:URDF是输入,经过Setup Assistant的三个核心步骤,最终输出完整的MoveIt配置包。每一步都缺一不可。

4.7 验证你的配置

配置包生成后,我建议你做两件事来验证:

  1. 启动demo.launch:看看Rviz里能不能正常显示机器人模型
  2. 拖拽交互:在Rviz里用Interact工具拖拽末端,看看规划组是否按预期运动

如果拖拽时关节乱动,说明规划组的运动学求解器配置有问题。如果机器人显示不全,检查URDF的link定义。

总结一下:SRDF是MoveIt的灵魂。规划组决定了你能做什么动作,自碰撞矩阵决定了动作的安全性,虚拟关节决定了机器人在世界中的位置。这三者配合好了,你的机械臂才能「指哪打哪」。