4. SRDF与配置助手:Setup Assistant工具使用、定义碰撞矩阵、定义虚拟关节

说实话,很多初学者一上来就急着写代码,结果在配置这一步栽了跟头。我见过太多人花了两周时间,最后发现是SRDF文件里少定义了一个虚拟关节。嗯,咱们今天就把这块彻底讲透。

4.1 Setup Assistant 到底是个啥?

Setup Assistant,说白了就是MoveIt的图形化配置向导。你不需要手写XML,它帮你生成所有配置文件。我个人习惯是,每次拿到一个新机器人模型,第一件事就是跑一遍这个工具。

启动方式很简单:

roslaunch moveit_setup_assistant setup_assistant.launch

启动后你会看到两个选项:

  • Create New MoveIt Configuration Package — 从零开始创建
  • Edit Existing MoveIt Configuration Package — 修改已有的配置

我建议你第一次用的时候,选第一个。哪怕你只是改一个小参数,也重新生成一次,这样不容易漏掉东西。

小技巧: 如果你在终端里找不到这个命令,先检查一下 moveit_setup_assistant 有没有安装。我踩过这个坑,折腾了半小时才发现没装包。

4.2 SRDF 文件 — 机器人的“社交关系”定义

SRDF(Semantic Robot Description Format)是URDF的“好搭档”。URDF描述的是机器人的物理结构——连杆、关节、尺寸。而SRDF描述的是机器人的“语义信息”——哪些关节可以动、哪些零件不能碰、机器人怎么固定在世界上。

你可以把URDF理解成机器人的“骨架”,SRDF就是它的“行为规范”。

SRDF里最重要的几个东西:

  • 虚拟关节(Virtual Joint) — 机器人跟世界怎么连接
  • 碰撞矩阵(Collision Matrix) — 哪些零件之间不用检测碰撞
  • 规划组(Planning Group) — 哪些关节一起运动
  • 预设位姿(Default Pose) — 常用的机器人姿势

4.3 定义虚拟关节 — 把机器人“放”到世界里

虚拟关节是什么?说白了,就是告诉MoveIt:你的机器人是固定在地上的,还是装在移动底盘上的?

我在做AGV项目时遇到过一个问题:机器人明明在移动,但MoveIt一直认为它卡在原地不动。后来发现,就是虚拟关节的类型定义错了。

在Setup Assistant里,点击 Virtual Joints,然后添加:

参数 说明 常用值
Virtual Joint Name 虚拟关节的名字 virtual_joint
Child Link 机器人的基座连杆 base_link
Parent Frame 世界坐标系 world
Joint Type 关节类型 fixed / planar / floating

三种关节类型的区别:

  • fixed — 机器人固定不动,比如桌面机械臂
  • planar — 机器人可以在平面上移动+旋转,比如AGV
  • floating — 完全自由,比如无人机
注意: 如果你用的是移动机器人,虚拟关节类型一定要选 planar 或 floating。我曾经见过有人选了 fixed,结果导航规划出来的路径全是原地转圈,折腾了两天才找到原因。

4.4 定义碰撞矩阵 — 别让机器人“自己打自己”

碰撞矩阵,英文叫 Collision Matrix。它的作用很简单:告诉MoveIt哪些零件之间不需要检测碰撞。

你想想看,一个机械臂有几十个连杆,如果每两个连杆之间都要做碰撞检测,计算量会非常大。实际上,很多连杆之间永远不会碰到,比如相邻的两个连杆。把这些“安全对”排除掉,规划速度能快好几倍。

在Setup Assistant里,点击 Collision Matrix,你会看到一个表格:

Link A Link B 状态
base_link link_1 Never Collide
link_1 link_2 Never Collide
base_link link_5 Default

这里有个原则:

  • 相邻连杆 — 设为 Never Collide(永远不会碰撞)
  • 不相邻但距离远的 — 保持 Default(由MoveIt自动判断)
  • 可能碰撞的 — 保持 Default
核心经验: 我一般会先点一下 "Regenerate Default Collision Matrix" 按钮,让MoveIt自动生成一份。然后手动检查那些相邻的连杆,确保它们都被标记为 Never Collide。这一步省不了,自动生成有时候会漏掉。

4.4 知识体系总览

下面这张图,是我自己总结的SRDF配置流程。你看一遍,心里就有数了:

SRDF配置流程 加载URDF模型 定义虚拟关节 定义规划组 配置碰撞矩阵 生成配置文件 关键说明 • 必须从URDF开始 • 虚拟关节决定运动类型 • 规划组决定运动范围 • 碰撞矩阵影响规划速度 • 生成后不要手动改SRDF 常见错误: • 虚拟关节类型选错 • 碰撞矩阵漏配 • 规划组包含多余关节

4.5 实际操作中的几个坑

我做了这么多年机器人,在SRDF配置上踩过的坑,随便说几个:

  1. 虚拟关节的父坐标系 — 一定要跟你的TF树对应上。我见过有人把父坐标系写成 map,但实际用的是 odom,结果规划出来的路径全在另一个坐标系里。
  2. 碰撞矩阵不要全删 — 有些人嫌麻烦,把所有碰撞对都删了。这样做规划确实快,但机器人真的会撞到自己。嗯,我亲眼见过一台机械臂把自己拧成麻花。
  3. 每次改URDF都要重新跑Setup Assistant — 这个很多人不知道。你改了URDF里的连杆尺寸,但SRDF里的碰撞矩阵还是旧的,规划出来的路径可能就有问题。
我的习惯: 每次生成完配置文件,我都会用 check_collision 这个工具快速验证一下。随便选几个位姿,看看碰撞检测是不是正常工作。这一步花不了两分钟,但能省下后面调试的好几个小时。

4.6 生成后的文件结构

Setup Assistant跑完之后,会生成一个配置包。里面最重要的文件:

  • config/robot.srdf — 核心语义文件,包含虚拟关节、碰撞矩阵、规划组
  • config/kinematics.yaml — 运动学求解器配置
  • config/ompl_planning.yaml — 运动规划器参数
  • launch/ — 启动文件,包括 move_group.launch

我个人建议,robot.srdf 这个文件你最好别手动改。真要改,就重新跑一遍Setup Assistant。手动改容易出格式错误,而且改完你自己都记不住改了啥。

好了,SRDF和Setup Assistant这块,核心就是这些。你只要把虚拟关节和碰撞矩阵搞明白,后面规划组、预设位姿那些,都是水到渠成的事。