3、URDF与SRDF:机械臂建模基础

在MoveIt2的机器人控制体系中,URDF(Unified Robot Description Format)与SRDF(Semantic Robot Description Format)是构建运动规划能力的基石。URDF负责描述机械臂的“物理骨架”——连杆(link)的几何尺寸、惯性参数以及关节(joint)的类型与运动学约束;而SRDF则赋予这个骨架“语义能力”——告诉MoveIt2哪些关节可以协同规划、末端执行器如何定义、哪些关节是被动冗余的。理解这两者的分工与配置方法,是后续进行运动学求解、碰撞检测与轨迹规划的前提。本章将深入剖析URDF与SRDF的核心定义、配置逻辑及实战中的常见陷阱。

URDF与SRDF在MoveIt2中的协作关系 URDF(物理模型) • link:几何、惯性、碰撞 • joint:类型、原点、轴 • 运动学树状结构 • 可视化网格与材质 • 传动与模拟参数 描述“长什么样、怎么动” 解析 SRDF(语义模型) • group:规划关节集合 • end_effector:末端执行器 • virtual_joint:基座浮动 • passive_joint:被动关节 • 预设位姿与碰撞矩阵 描述“怎么规划、怎么用” 生成 MoveIt2 规划场景 • 运动学求解器 • 碰撞检测矩阵 • 规划组与轨迹 • 末端执行器控制 核心原则:URDF提供运动学与动力学参数,SRDF提供规划语义,二者缺一不可

上图清晰地展示了URDF与SRDF在MoveIt2系统中的协作关系。URDF是纯物理描述,不包含任何与规划相关的信息;SRDF则是在URDF之上的一层“语义注解”。在MoveIt2的启动流程中,机器人状态(RobotState)由URDF构建,而规划场景(PlanningScene)则通过加载SRDF来配置规划组、末端执行器与碰撞豁免关系。下面我们分模块详细拆解。

3.1 核心原理:URDF的link/joint定义与SRDF的语义映射

URDF的link定义是机械臂建模的起点。每个link代表一个刚体,包含三个关键子元素:<visual>(可视化外观)、<collision>(碰撞检测几何体)和<inertial>(惯性参数)。其中,<collision>的几何体应尽量简化——使用球体、圆柱体或长方体近似,而非精细的网格模型,这能显著提升碰撞检测效率。例如,对于一个六轴机械臂的末端连杆,碰撞模型通常用一个半径2cm的球体代替复杂的法兰盘网格。

URDF的joint定义则描述了相邻link之间的运动关系。MoveIt2最关心的是revolute(旋转关节)和prismatic(移动关节),每个关节必须明确指定<parent>、<child>、<origin>(相对变换)和<axis>(旋转轴或移动方向)。一个常见的错误是<origin>的坐标设置不当,导致机械臂在RViz中呈现“扭曲”的姿态。此外,<limit>中的effort和velocity参数虽然不影响运动学求解,但会被MoveIt2用于轨迹约束检查。

SRDF的语义映射则是将URDF中的关节和连杆“分组”并赋予角色。核心概念包括:

  • group:定义一个规划组,例如arm_group包含从shoulder_pan_joint到wrist_3_joint的所有关节。MoveIt2的运动学插件(如KDL或IKFast)会基于这个组进行逆解。
  • end_effector:指定末端执行器所在的link及其父组。例如,夹爪的gripper_link属于gripper_group,父组为arm_group。
  • virtual_joint:用于移动机器人基座,将基座link与“世界”坐标系连接,类型通常为planar或floating。
  • passive_joint:标记那些无法主动控制但会影响运动学的关节,例如带有弹簧的被动轮或四连杆机构中的中间关节。

知识结构表:URDF与SRDF核心元素对比

维度URDFSRDF
文件格式纯XML,描述物理属性XML,描述语义属性
核心元素link, joint, transmissiongroup, end_effector, virtual_joint
运动学作用提供关节轴、原点、极限定义规划组与求解器接口
碰撞检测提供碰撞几何体定义免碰撞矩阵(ACM)
加载方式robot_state_publisher 解析moveit_setup_assistant 生成

3.2 判断方法与操作流程:从URDF到SRDF的完整配置路径

在实际项目中,我们通常使用MoveIt Setup Assistant(MSA)工具从URDF自动生成SRDF。但手动理解配置流程对于排障至关重要。以下是标准操作流程:

  1. URDF完整性检查:在终端运行 check_urdf my_robot.urdf,确认所有link和joint的树状结构无断链。使用 urdf_to_graphiz 生成结构图,直观检查父子关系。
  2. 定义规划组:在MSA中,选择“Add Group”,指定组名(如manipulator),选择运动学求解器(KDL默认),然后勾选该组包含的关节。注意:组内关节必须构成连续的运动学链,不能跳跃。
  3. 配置末端执行器:选择“Add End Effector”,指定末端link(如tool0)和父组(manipulator)。如果夹爪有独立关节,需要单独建立gripper组。
  4. 设置虚拟关节:对于固定基座机械臂,选择fixed类型;对于AGV上的机械臂,选择planar类型,并指定基座link。
  5. 生成碰撞矩阵:MSA会自动计算默认的免碰撞矩阵(ACM),但需要人工检查相邻link的碰撞对是否被正确禁用。

一个关键的判断方法是:如果MoveIt2报错“No kinematics solver found for group”,则说明SRDF中的group配置与运动学插件不匹配。此时需要检查kinematics.yaml文件中的group_name是否与SRDF一致。

3.3 案例拆解:六轴机械臂的URDF/SRDF配置实战

我们以常见的六轴协作机械臂(如UR5e)为例,展示关键配置片段。该机械臂有6个旋转关节,末端带有电动夹爪。

URDF关节定义示例(肩部关节):

<joint name="shoulder_pan_joint" type="revolute">
  <parent link="base_link"/>
  <child link="shoulder_link"/>
  <origin xyz="0 0 0.15" rpy="0 0 0"/>
  <axis xyz="0 0 1"/>
  <limit lower="-3.14" upper="3.14" effort="150" velocity="3.14"/>
</joint>

SRDF规划组与末端执行器配置:

<group name="arm_group">
  <joint name="shoulder_pan_joint"/>
  <joint name="shoulder_lift_joint"/>
  <joint name="elbow_joint"/>
  <joint name="wrist_1_joint"/>
  <joint name="wrist_2_joint"/>
  <joint name="wrist_3_joint"/>
</group>
<group name="gripper_group">
  <joint name="finger_joint1"/>
  <joint name="finger_joint2"/>
</group>
<end_effector name="gripper_eef" parent_link="tool0" group="gripper_group"/>

在配置过程中,我们遇到了一个典型问题:当尝试规划抓取动作时,MoveIt2提示“No IK solution found”。通过排查发现,URDF中wrist_2_joint的<origin>的rpy(翻滚-俯仰-偏航)设置错误,导致腕部坐标系翻转,使得逆解在奇异点附近失败。修正方法是将rpy="0 1.57 0"改为rpy="0 -1.57 0",并重新生成SRDF。这一案例说明,URDF的坐标精度直接影响运动学求解的稳定性。

经验提醒:在配置SRDF时,务必为每个规划组设置合理的default_planner_config(如RRTConnect或PRM)。如果规划组包含超过7个自由度,建议启用ompl的简化求解器,否则规划速度会显著下降。

3.4 常见误区与总结复盘

在URDF/SRDF建模中,以下误区最为常见:

  • 误区一:碰撞几何体过于精细。直接使用STL网格作为碰撞模型,导致碰撞检测耗时增加数倍。正确做法是使用原始几何体(box、cylinder、sphere)近似,误差控制在2-3mm内即可。
  • 误区二:忽略passive_joint的声明。对于带有四连杆机构的机械臂,如果未将中间关节标记为passive,MoveIt2会尝试控制该关节,导致规划失败。
  • 误区三:virtual_joint类型选择错误。固定基座机械臂误设为planar,会导致基座在规划时产生不必要的平移自由度,增加求解维度。
  • 误区四:SRDF与URDF的link名称不一致。例如URDF中末端link名为tool0,而SRDF中写成了ee_link,导致末端执行器无法关联。

总结复盘:URDF与SRDF的建模质量决定了MoveIt2后续所有功能的可靠性。在建模阶段,应遵循“物理精确、语义清晰、计算高效”的原则。物理精确指关节轴、原点必须与真实机械臂一致;语义清晰指规划组、末端执行器的划分要符合实际控制需求;计算高效则要求碰撞几何体尽量简化。建议在完成建模后,使用moveit_visual_tools在RViz中加载模型,手动拖动关节验证运动学正确性,再进行后续的规划测试。

风险提示:不要直接修改由MSA生成的SRDF文件中的<group_state>名称,除非你同时更新了move_group节点中引用的状态名称。否则在调用setNamedTarget()时会出现“Named state not found”错误。