3、SRDF与配置包生成:MoveIt Setup Assistant使用、规划组定义、自碰撞矩阵、虚拟关节、初始位姿设置
好,咱们接着往下走。上一章我们把URDF模型搞定了,模型在RViz里也能动起来。但MoveIt光有URDF还不够,它还需要知道一些「元信息」——比如哪些关节可以一起规划、哪些零件永远不会碰撞、机器人初始该摆什么pose。这些信息就写在SRDF文件里。
说白了,URDF描述的是机器人长什么样,SRDF描述的是机器人怎么用。我个人习惯把SRDF看作是MoveIt的「配置文件」,没有它,MoveIt就是个瞎子。
3.1 MoveIt Setup Assistant:你的配置向导
手动写SRDF?别傻了,那玩意儿又长又容易出错。MoveIt官方提供了一个图形化工具——MoveIt Setup Assistant(简称MSA)。你只需要点点鼠标,它就能帮你生成完整的配置包。
启动方式:
roslaunch moveit_setup_assistant setup_assistant.launch
然后选择「Create New MoveIt Configuration Package」,加载你上一章做好的URDF文件。
嗯,这里要注意:加载URDF时,MSA会解析整个机器人模型。如果你的URDF有语法错误或者缺少必要的标签,它会直接报错。我在项目中遇到过好几次,URDF在RViz里显示正常,但MSA就是加载不了——后来发现是忘了加<transmission>标签。
3.2 规划组定义:告诉MoveIt哪些关节一起动
规划组(Planning Group)是MoveIt的核心概念。你想想看,一个六轴机械臂,你不可能让每个关节独立规划——那样走出来的轨迹肯定乱七八糟。你需要把肩关节、肘关节、腕关节定义成一个组,告诉MoveIt:「这几个关节是一伙的,你一起规划它们。」
在MSA里,点击「Planning Groups」选项卡,然后添加组。我一般这样命名:
| 组名 | 包含关节 | 用途 |
|---|---|---|
| arm_group | joint1~joint6 | 主臂运动规划 |
| gripper_group | finger_joint1, finger_joint2 | 夹爪开合 |
| end_effector | (链接到gripper_group) | 定义末端执行器 |
定义组的时候,记得选对类型:
- Kinematic Chain:适用于串联机械臂,从基座到末端执行器的一条链
- Joint Group:适用于夹爪、头部等非链式结构
- Subgroup:适用于嵌套组,比如把arm_group和gripper_group组合成一个更大的组
我的经验:如果你有多个机械臂协同工作,每个臂单独定义一个规划组,然后创建一个「super_group」把它们包起来。这样既可以单独控制每个臂,也可以做双臂协同规划。
3.3 自碰撞矩阵:别让机器人打自己
自碰撞矩阵(Self-Collision Matrix)是SRDF里最枯燥但最重要的部分。它告诉MoveIt:「哪些零件永远不会碰到一起,你就不用浪费算力去检测它们了。」
举个例子:机械臂的基座和第三个连杆,距离很远,正常情况下不可能碰撞。如果你不告诉MoveIt这一点,它每次规划都要计算这两个零件之间的距离——纯属浪费CPU。
在MSA里,点击「Self-Collision Matrix」选项卡,然后点击「Regenerate Default Collision Matrix」。MSA会自动计算所有可能的碰撞对,并标记出那些距离足够远、永远不会碰撞的对。
我曾经踩过的坑:默认生成的碰撞矩阵有时候会漏掉一些「可能碰撞」的对。特别是当你的机器人有非对称结构或者附加了传感器时。我建议生成后手动检查一遍,把那些距离很近但确实不会碰撞的对标记为「允许碰撞」。否则MoveIt会过于保守,导致规划失败。
嗯,这里有个小技巧:你可以把自碰撞矩阵导出为YAML文件,然后在代码里动态修改。这样在不同工况下可以切换不同的碰撞矩阵,提高规划效率。
3.4 虚拟关节:连接机器人与世界
虚拟关节(Virtual Joint)是个很有意思的概念。它不真实存在,但MoveIt需要它来知道机器人基座和世界坐标系之间的关系。
如果你的机器人是固定安装的,虚拟关节就是一个固定的变换——基座在世界坐标系中的位置。如果机器人是移动的(比如AGV上装的机械臂),虚拟关节就是一个浮动关节,MoveIt会把它当作一个可规划的维度。
在MSA里,点击「Virtual Joints」选项卡,添加一个虚拟关节:
- 名称:virtual_joint
- 子链接:base_link(你的机器人基座)
- 父框架:world
- 类型:fixed(固定安装)或planar(移动平台)
我个人习惯把虚拟关节的类型设为fixed,除非你确实需要移动基座。因为一旦设为planar,MoveIt的规划维度就变成了7个(6个关节+2个平面自由度),计算量会大很多。
3.5 初始位姿设置:给机器人一个「起床姿势」
初始位姿(Initial Pose)就是机器人启动时的默认姿势。你可以定义多个命名位姿,比如:
- home:所有关节归零,机械臂竖直向上
- folded:机械臂折叠收纳,节省空间
- ready:机械臂前伸,准备抓取
在MSA里,点击「Initial Pose」选项卡,拖动每个关节到你想要的位置,然后保存命名。这些位姿会写入SRDF,之后在代码里可以直接调用:
move_group.setNamedTarget("home")
move_group.go()
避坑指南:初始位姿一定要保证在机器人的工作空间内,并且不能有自碰撞。我曾经设置了一个「home」位姿,结果关节角度超出了限位,机器人启动时直接报错。后来我学乖了,每次设置完位姿都会在RViz里模拟一下,确认没问题再保存。
3.6 生成配置包:大功告成
所有设置完成后,点击「Generate Package」按钮。MSA会生成一个完整的MoveIt配置包,包含:
- config/:SRDF文件、关节限位、运动学参数等
- launch/:各种启动文件,包括demo.launch(用于测试)
- srdf/:SRDF文件本体
生成后,你可以直接运行roslaunch your_robot_moveit_config demo.launch来测试。如果一切正常,你会看到机器人在RViz里摆出你设置的初始位姿,并且可以通过拖拽来规划运动。
嗯,到这里,MoveIt配置包就搞定了。下一章我们会深入运动学插件配置——说白了就是告诉MoveIt怎么算逆解。不过那是后话了,先把今天的内容消化掉。