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 — 修改已有的配置
我建议你第一次用的时候,选第一个。哪怕你只是改一个小参数,也重新生成一次,这样不容易漏掉东西。
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 — 完全自由,比如无人机
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
4.4 知识体系总览
下面这张图,是我自己总结的SRDF配置流程。你看一遍,心里就有数了:
4.5 实际操作中的几个坑
我做了这么多年机器人,在SRDF配置上踩过的坑,随便说几个:
- 虚拟关节的父坐标系 — 一定要跟你的TF树对应上。我见过有人把父坐标系写成 map,但实际用的是 odom,结果规划出来的路径全在另一个坐标系里。
- 碰撞矩阵不要全删 — 有些人嫌麻烦,把所有碰撞对都删了。这样做规划确实快,但机器人真的会撞到自己。嗯,我亲眼见过一台机械臂把自己拧成麻花。
- 每次改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这块,核心就是这些。你只要把虚拟关节和碰撞矩阵搞明白,后面规划组、预设位姿那些,都是水到渠成的事。