连杆、关节与自由度¶
连杆、关节、自由度是描述机器人结构的三个核心概念。理解它们才能建立后续运动学和动力学模型。
一、关节与连杆¶
1.1 关节类型¶
机器人中最常用的两种基本关节:
- 转动关节(Revolute, R):绕轴旋转,提供 1 个自由度
- 移动关节(Prismatic, P):沿轴平移,提供 1 个自由度
其他关节类型
还有球面关节(3 DOF)、圆柱关节(2 DOF)、螺旋关节(1 DOF)等,但工业机器人中绝大多数使用 R 和 P 关节。
1.2 连杆(Link)¶
连杆是连接相邻关节的刚性构件。机器人可以看成由若干连杆通过关节依次连接而成的运动链。
- 固定连杆(Link 0):机器人的基座,固定不动
- 末端连杆(Link \(n\)):安装末端执行器的连杆
二、URDF:从机械结构到机器人模型¶
URDF(Unified Robot Description Format)是 ROS 中最常用的机器人结构描述格式。它用 XML 描述机器人由哪些 link 和 joint 组成,每个关节怎么连接、转轴在哪里、运动范围是多少,以及每个连杆的几何外形和惯性参数。
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 自由度仿人机械臂为例,检查运动学链时可以按这个顺序读:
- 从
base_link开始,沿parent -> child找到tool_link - 记录每个非 fixed 关节的
name和type - 读取每个关节的
origin xyz/rpy,确定相邻关节坐标系的相对位姿 - 读取
axis xyz,确定每个关节的转轴方向 - 读取
limit lower/upper,作为 IK 和轨迹规划的边界
如果把这些信息按顺序整理出来,就已经可以构建正运动学:
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 才是动力学计算用的质量属性。三者的坐标原点可以不同,不能默认它们完全一致。
一个连杆的动力学参数要满足基本物理合理性:
- 质量必须为正
- 惯性矩阵应对称正定
- 质心应落在合理位置,不要远离实体模型
- 单位必须是 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\) 轴的转动:
对动力学来说,还需要去 forearm_link 里找质量、质心和惯性张量,才能知道肘关节加速前臂时需要多大力矩。
2.5 从机械模型导出 URDF 的流程¶
从 SolidWorks、Fusion 360、Onshape 或其他 CAD 模型导出 URDF 时,可以按下面流程做:
- 整理机械装配
- 每个会相对运动的刚体整理成一个 link
- 螺丝、轴承、外壳等固定在一起的零件可以合并到同一个 link
-
删除过细的倒角、螺纹、装饰细节,避免网格过重
-
建立坐标系
base_link坐标系与机器人安装基准一致- 每个关节处建立 joint 坐标系,原点放在真实转轴/滑轨中心
- joint 的某一轴与真实运动轴对齐,方便写
axis xyz -
末端建立
tool0或ee_link,作为 IK 和轨迹规划目标 -
定义关节
- 确认 parent / child 方向,从基座一路指向末端
- 写清楚 revolute、prismatic、fixed 等类型
-
填入关节限位、速度限位、力矩限位
-
导出网格
visual可以用较细的 STL/DAEcollision尽量用简化模型:盒子、圆柱、凸包或低面数 STL-
文件路径统一放到
meshes/visual和meshes/collision -
导出惯性参数
- 从 CAD 质量属性中导出质量、质心、惯性张量
- 确认材料密度已经设置正确
-
确认惯性张量的参考坐标系和 URDF 中
inertial/origin一致 -
检查和修正
- 用 RViz / robot_state_publisher 查看 TF 树和模型姿态
- 转动每个关节,确认轴方向和正方向正确
- 用动力学库或仿真器检查质量、惯量是否报错
- 加入简单轨迹,确认末端运动方向和预期一致
导出后的第一件事
不要急着做 IK。先让每个关节单独从小角度正向转动,观察模型是否绕真实机械轴运动。只要某个 joint 的 origin 或 axis 错了,后面的运动学、雅可比、动力学都会一起错。
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) 是描述机器人运动能力的关键指标:
对于刚体在三维空间中的运动:
- 位置:3 个自由度(\(x, y, z\))
- 姿态:3 个自由度(绕三个轴的旋转)
- 总计:6 个自由度
为什么常见 6 轴机器人?
要让末端执行器在三维空间中达到任意位置和任意姿态,至少需要 6 个独立自由度。因此 6 轴关节型机器人是工业中最常见的构型。超过 6 轴的机器人称为冗余机器人,冗余自由度可以用来避障或优化关节配置。
3.1 Grübler-Kutzbach 公式¶
对于平面机构,自由度计算公式为:
对于空间机构:
其中:
- \(n\):包含机架在内的构件总数
- \(j\):关节总数
- \(f_i\):第 \(i\) 个关节的自由度数
例:平面三连杆机构
构件数 \(n = 4\)(含机架),低副数 \(l = 4\),高副数 \(h = 0\):
该机构有 1 个自由度。