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怎么算逆解。不过那是后话了,先把今天的内容消化掉。

SRDF与配置包生成知识体系 MoveIt Setup Assistant 规划组定义 Kinematic Chain / Joint Group 自碰撞矩阵 碰撞对自动生成与手动校验 虚拟关节 fixed / planar 类型选择 初始位姿设置 home / folded / ready 命名位姿 输出:MoveIt配置包(config/ launch/ srdf/)
可可精品资料库