跳转至

连杆、关节与自由度

连杆、关节、自由度是描述机器人结构的三个核心概念。理解它们才能建立后续运动学和动力学模型。


一、关节与连杆

1.1 关节类型

机器人中最常用的两种基本关节:

  • 转动关节(Revolute, R):绕轴旋转,提供 1 个自由度
  • 移动关节(Prismatic, P):沿轴平移,提供 1 个自由度

其他关节类型

还有球面关节(3 DOF)、圆柱关节(2 DOF)、螺旋关节(1 DOF)等,但工业机器人中绝大多数使用 R 和 P 关节。

连杆是连接相邻关节的刚性构件。机器人可以看成由若干连杆通过关节依次连接而成的运动链。

  • 固定连杆(Link 0):机器人的基座,固定不动
  • 末端连杆(Link \(n\)):安装末端执行器的连杆

二、URDF:从机械结构到机器人模型

URDF(Unified Robot Description Format)是 ROS 中最常用的机器人结构描述格式。它用 XML 描述机器人由哪些 linkjoint 组成,每个关节怎么连接、转轴在哪里、运动范围是多少,以及每个连杆的几何外形和惯性参数。

URDF 和 DH 参数的关系

DH 参数更适合手算和推导串联机械臂的运动学;URDF 更适合工程项目,因为它同时包含运动学树、可视化模型、碰撞模型和动力学惯量。实际项目中常用 URDF 作为仿真、规划、控制和动力学库的统一输入。

2.1 URDF 的核心结构

一个 URDF 文件主要由两类标签组成:

标签 作用 重点关注
<link> 描述一个刚体连杆 visual、collision、inertial
<joint> 描述两个 link 之间的连接关系 parent、child、origin、axis、limit

最小结构类似这样:

<robot name="seven_dof_arm">
  <link name="base_link"/>

  <link name="upper_arm_link">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <mesh filename="package://arm_description/meshes/upper_arm.stl"/>
      </geometry>
    </visual>
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <mesh filename="package://arm_description/meshes/upper_arm_collision.stl"/>
      </geometry>
    </collision>
    <inertial>
      <origin xyz="0.12 0 0.02" rpy="0 0 0"/>
      <mass value="1.35"/>
      <inertia ixx="0.018" ixy="0" ixz="0" iyy="0.021" iyz="0" izz="0.006"/>
    </inertial>
  </link>

  <joint name="shoulder_pitch_joint" type="revolute">
    <parent link="base_link"/>
    <child link="upper_arm_link"/>
    <origin xyz="0 0 0.18" rpy="0 1.5708 0"/>
    <axis xyz="0 0 1"/>
    <limit lower="-2.0" upper="2.0" effort="45" velocity="3.0"/>
  </joint>
</robot>

2.2 做运动学时重点看哪些参数

运动学只关心“关节如何把 link 串起来”,重点看 <joint>

参数 含义 为什么重要
type 关节类型:revolute(带限位的旋转关节)、continuous(不带限位的旋转关节)、prismatic(移动关节)、fixed(固定关节) 决定关节变量是角度、位移还是固定变换
parent / child 父子连杆 决定运动链方向和 TF 树结构
origin xyz 子关节坐标系相对父 link 的平移 决定连杆长度、偏置和末端位置
origin rpy 子关节坐标系相对父 link 的旋转 决定关节轴方向和坐标系姿态
axis xyz 关节运动轴,在 joint 坐标系中表达 转动/移动方向,直接影响 FK、IK 和雅可比
limit lower/upper 关节位置限位 IK 选解、轨迹规划和安全保护必须使用
mimic 从动关节关系 夹爪、联动机构中常见

最容易出错的地方

axis xyz 是在 joint 坐标系 中表达的,不一定是世界坐标系。origin rpy 先把 joint 坐标系转过去,轴再在这个坐标系里生效。很多 IK 方向错、雅可比列错,根源都在这里。

以 7 自由度仿人机械臂为例,检查运动学链时可以按这个顺序读:

  1. base_link 开始,沿 parent -> child 找到 tool_link
  2. 记录每个非 fixed 关节的 nametype
  3. 读取每个关节的 origin xyz/rpy,确定相邻关节坐标系的相对位姿
  4. 读取 axis xyz,确定每个关节的转轴方向
  5. 读取 limit lower/upper,作为 IK 和轨迹规划的边界

如果把这些信息按顺序整理出来,就已经可以构建正运动学:

\[ {}^0T_n(q)=T_{\text{joint},1}(q_1)T_{\text{joint},2}(q_2)\cdots T_{\text{joint},n}(q_n) \]

2.3 做动力学时重点看哪些参数

动力学除了关节结构,还必须看 <link> 里的 <inertial>

参数 含义 为什么重要
mass value 连杆质量 决定惯性项和重力项
inertial/origin xyz 质心相对 link 坐标系的位置 决定重力力矩和耦合项
inertial/origin rpy 惯性主轴相对 link 坐标系的姿态 决定惯性张量如何旋转到 link 坐标系
inertia ixx...izz 惯性张量 决定加速和转动时需要的力矩
limit effort 关节最大力矩/力 用于电机选型和轨迹可行性检查
limit velocity 关节最大速度 用于时间参数化和控制限幅
dynamics damping/friction 阻尼和摩擦 仿真和低速控制中有用,但常需实验修正

visual、collision、inertial 不要混在一起

visual 是给人看的外观模型,collision 是给碰撞检测用的简化模型,inertial 才是动力学计算用的质量属性。三者的坐标原点可以不同,不能默认它们完全一致。

一个连杆的动力学参数要满足基本物理合理性:

  1. 质量必须为正
  2. 惯性矩阵应对称正定
  3. 质心应落在合理位置,不要远离实体模型
  4. 单位必须是 SI:米、千克、弧度、牛米

2.4 读 URDF 的小例子

看下面这个关节:

<joint name="elbow_pitch_joint" type="revolute">
  <parent link="upper_arm_link"/>
  <child link="forearm_link"/>
  <origin xyz="0.28 0 0" rpy="0 0 0"/>
  <axis xyz="0 1 0"/>
  <limit lower="-0.2" upper="2.6" effort="38" velocity="3.5"/>
</joint>

可以读出:

信息 解释
父连杆 upper_arm_link
子连杆 forearm_link
关节位置 相对上臂坐标系沿 \(x\) 方向 0.28 m
关节轴 在 elbow joint 坐标系中绕 \(y\) 轴旋转
关节范围 \([-0.2, 2.6]\) rad
最大力矩 38 N·m
最大速度 3.5 rad/s

对运动学来说,它贡献了一个固定变换和一个绕 \(y\) 轴的转动:

\[ T_{\text{elbow}}(q)=T_{xyz}(0.28,0,0)R_y(q) \]

对动力学来说,还需要去 forearm_link 里找质量、质心和惯性张量,才能知道肘关节加速前臂时需要多大力矩。

2.5 从机械模型导出 URDF 的流程

从 SolidWorks、Fusion 360、Onshape 或其他 CAD 模型导出 URDF 时,可以按下面流程做:

  1. 整理机械装配
  2. 每个会相对运动的刚体整理成一个 link
  3. 螺丝、轴承、外壳等固定在一起的零件可以合并到同一个 link
  4. 删除过细的倒角、螺纹、装饰细节,避免网格过重

  5. 建立坐标系

  6. base_link 坐标系与机器人安装基准一致
  7. 每个关节处建立 joint 坐标系,原点放在真实转轴/滑轨中心
  8. joint 的某一轴与真实运动轴对齐,方便写 axis xyz
  9. 末端建立 tool0ee_link,作为 IK 和轨迹规划目标

  10. 定义关节

  11. 确认 parent / child 方向,从基座一路指向末端
  12. 写清楚 revolute、prismatic、fixed 等类型
  13. 填入关节限位、速度限位、力矩限位

  14. 导出网格

  15. visual 可以用较细的 STL/DAE
  16. collision 尽量用简化模型:盒子、圆柱、凸包或低面数 STL
  17. 文件路径统一放到 meshes/visualmeshes/collision

  18. 导出惯性参数

  19. 从 CAD 质量属性中导出质量、质心、惯性张量
  20. 确认材料密度已经设置正确
  21. 确认惯性张量的参考坐标系和 URDF 中 inertial/origin 一致

  22. 检查和修正

  23. 用 RViz / robot_state_publisher 查看 TF 树和模型姿态
  24. 转动每个关节,确认轴方向和正方向正确
  25. 用动力学库或仿真器检查质量、惯量是否报错
  26. 加入简单轨迹,确认末端运动方向和预期一致

导出后的第一件事

不要急着做 IK。先让每个关节单独从小角度正向转动,观察模型是否绕真实机械轴运动。只要某个 joint 的 originaxis 错了,后面的运动学、雅可比、动力学都会一起错。

2.6 URDF 与 Xacro

复杂机器人通常不用纯 URDF 手写,而是用 Xacro 生成 URDF。Xacro 支持变量、宏和文件拆分,适合 7 自由度机械臂这种重复结构:

<xacro:property name="upper_arm_length" value="0.28"/>

<xacro:macro name="revolute_joint" params="name parent child xyz axis lower upper effort velocity">
  <joint name="${name}" type="revolute">
    <parent link="${parent}"/>
    <child link="${child}"/>
    <origin xyz="${xyz}" rpy="0 0 0"/>
    <axis xyz="${axis}"/>
    <limit lower="${lower}" upper="${upper}" effort="${effort}" velocity="${velocity}"/>
  </joint>
</xacro:macro>

工程中建议:

文件 内容
arm.urdf.xacro 主入口,组织所有 link 和 joint
links.xacro 连杆、visual、collision、inertial
joints.xacro 关节定义和限位
materials.xacro 颜色和材质
transmission.xacro ros_control 或仿真需要的传动配置

三、自由度(DOF)

自由度(Degrees of Freedom) 是描述机器人运动能力的关键指标:

\[ \text{DOF} = \text{机器人末端在空间中独立运动的参数个数} \]

对于刚体在三维空间中的运动:

  • 位置:3 个自由度(\(x, y, z\)
  • 姿态:3 个自由度(绕三个轴的旋转)
  • 总计:6 个自由度

为什么常见 6 轴机器人?

要让末端执行器在三维空间中达到任意位置和任意姿态,至少需要 6 个独立自由度。因此 6 轴关节型机器人是工业中最常见的构型。超过 6 轴的机器人称为冗余机器人,冗余自由度可以用来避障或优化关节配置。

3.1 Grübler-Kutzbach 公式

对于平面机构,自由度计算公式为:

\[ F = 3(n - 1) - 2l - h \]

对于空间机构:

\[ F = 6(n-1) - \sum_{i=1}^{j}(6-f_i) \]

其中:

  • \(n\):包含机架在内的构件总数
  • \(j\):关节总数
  • \(f_i\):第 \(i\) 个关节的自由度数

例:平面三连杆机构

构件数 \(n = 4\)(含机架),低副数 \(l = 4\),高副数 \(h = 0\)

\[F = 3(4-1) - 2 \times 4 - 0 = 9 - 8 = 1\]

该机构有 1 个自由度。