2. 机器人建模基础

机器人虚拟样机的可信度,首先取决于模型是否把“几何、运动、质量、约束”四件事说清楚。刚体运动学回答“各连杆在哪里、以什么姿态相连”,动力学回答“力与力矩如何产生加速度”,而关节类型、坐标系约定、DH参数与URDF/SDF则是把这些数学描述落到可计算、可仿真的文件结构中的桥梁。本节从表示方法出发,逐步过渡到实际建模文件的组织方式。

一、刚体运动的两种基本表示

刚体在三维空间中的位姿由位置和姿态共同确定。位置用三维平移向量 p = [x, y, z]ᵀ 表示,姿态常用旋转矩阵 R ∈ SO(3)、单位四元数 q = [w, x, y, z] 或欧拉角表示。旋转矩阵直观但冗余(9个元素仅3个自由度),四元数无奇异且插值平滑,欧拉角便于人理解但存在万向节死锁。工程中通常内部用四元数或旋转矩阵计算,界面显示用欧拉角。

齐次变换矩阵把旋转和平移统一为 4×4 形式:

T = [ R  p ]
    [ 0  1 ]

串联机器人末端位姿就是各连杆变换的连乘:T_0n = T_01 · T_12 · … · T_(n-1)n。这一连乘结构是正运动学计算的核心,也是后面DH参数和URDF关节链能够直接映射到代码的基础。

二、关节类型与自由度

关节决定相邻连杆之间允许的相对运动。常见类型包括:旋转关节(revolute,1自由度,绕轴转动,有角度限位)、连续旋转关节(continuous,无角度限位)、移动关节(prismatic,1自由度,沿轴平移,有位移限位)、固定关节(fixed,0自由度,用于连接不可动部件)、以及球关节(spherical/ball,3自由度)和平面关节(planar,3自由度)。URDF中主要支持 revolute、continuous、prismatic、fixed、floating、planar 六种;SDF对关节类型和动力学属性的描述更接近物理引擎,支持更细的阻尼、摩擦和限位配置。

选择关节类型时,关键判断是:该连接是否需要相对运动、运动形式是转动还是平移、是否需要限位、是否参与动力学计算。例如机械臂的肩、肘、腕通常用 revolute 并设置角度上下限;移动底盘的驱动轮常用 continuous;夹爪的平行开合可用 prismatic;而传感器支架与连杆之间若无需运动,应使用 fixed 以减少求解自由度。

三、坐标系约定:把“正方向”说清楚

建模中最容易出错的是坐标系方向不一致。机器人领域常用两种约定:一是以基座为原点的基坐标系(base frame),二是每个连杆随动的连杆坐标系(link frame)。DH参数法要求在每个关节处建立连杆坐标系,并规定 Z 轴沿关节轴线、X 轴沿相邻 Z 轴的公垂线方向。若采用标准DH(Standard DH),变换顺序为绕 Z 旋转、沿 Z 平移、沿 X 平移、绕 X 旋转;若采用改进DH(Modified DH),顺序为沿 X 平移、绕 X 旋转、绕 Z 旋转、沿 Z 平移。两者参数定义不同,混用会导致模型姿态错误。

在URDF中,每个 link 有自己的坐标系,joint 的 origin 描述子连杆坐标系相对于父连杆坐标系的位姿,axis 描述关节轴在本关节坐标系中的方向。因此,URDF的坐标系约定是“父子相对”,而不是全局绝对。建模时必须先明确:基座 link 的原点在哪里、Z 轴朝上还是朝前、关节轴方向是 +Z 还是 +X。建议在模型说明中固定一条规则,例如“所有旋转关节轴默认沿本关节坐标系 Z 轴,基座 Z 轴竖直向上”,并在全文和图示中保持一致。

机器人建模信息流:从数学表示到仿真文件 数学表示层 位姿:R, p, q 齐次变换 T 正运动学连乘 T_0n = T_01…T_(n-1)n 动力学:M(q)q̈+C+G 质量、惯量、力/力矩 关节类型与自由度 revolute / prismatic / fixed 坐标系约定 基座系 / 连杆系 / 关节轴 参数化建模层 DH参数 a, α, d, θ 标准DH / 改进DH URDF link / joint / origin axis / limit / inertial SDF model / link / joint damping / friction / pose 质量与惯量 mass / inertia / com 仿真与验证层 正运动学验证 末端位姿对比 逆运动学求解 关节角 / 可达性 动力学仿真 力矩 / 加速度 / 能耗 碰撞与约束检查 限位 / 干涉 / 稳定性 结果判读与迭代 核心原则:坐标系方向一致、关节类型与自由度匹配、质量惯量参数完整、DH与URDF/SDF描述可相互校验

四、DH参数:用四个数描述一个关节

DH参数法用四个参数描述相邻连杆坐标系的变换:连杆长度 a、连杆扭角 α、连杆偏距 d、关节角 θ。对于旋转关节,θ 是变量,其余为常量;对于移动关节,d 是变量。以标准DH为例,从坐标系 i-1 到 i 的变换为:

T_i = Rot_z(θ_i) · Trans_z(d_i) · Trans_x(a_i) · Rot_x(α_i)

实际建模时,先画出机器人简图,标出每个关节的 Z 轴,再确定相邻 Z 轴的公垂线作为 X 轴,最后量取 a、α、d、θ。以一台六轴机械臂为例,假设其DH参数为:关节1(a=0, α=90°, d=0.15m, θ₁变量)、关节2(a=0.30m, α=0°, d=0, θ₂变量)、关节3(a=0.25m, α=0°, d=0, θ₃变量)、关节4(a=0, α=90°, d=0.20m, θ₄变量)、关节5(a=0, α=90°, d=0, θ₅变量)、关节6(a=0, α=0°, d=0.08m, θ₆变量)。给定一组关节角,例如 θ=[0°, 30°, -45°, 0°, 60°, 0°],即可通过连乘得到末端位姿。这个结果可以与URDF模型在仿真器中加载后的正运动学输出对比,若两者一致,说明DH参数与URDF描述匹配。

五、URDF与SDF:从参数到可仿真文件

URDF(Unified Robot Description Format)是ROS中描述机器人运动学与动力学的主要XML格式。一个URDF模型由 link 和 joint 两类元素组成。link 描述连杆的几何形状(visual)、碰撞体(collision)和惯性参数(inertial);joint 描述连接关系、关节类型、父连杆、子连杆、关节轴方向、限位和动力学阻尼。以下是一个旋转关节的典型片段:

<joint name="joint2" type="revolute">
  <parent link="link1"/>
  <child link="link2"/>
  <origin xyz="0.30 0 0" rpy="0 0 0"/>
  <axis xyz="0 0 1"/>
  <limit lower="-2.9" upper="2.9" effort="100" velocity="2.0"/>
  <dynamics damping="0.5" friction="0.1"/>
</joint>

其中 origin 的 xyz 和 rpy 描述子连杆坐标系相对父连杆坐标系的平移和旋转,axis 描述关节轴在本关节坐标系中的方向,limit 给出角度或位移范围,dynamics 给出阻尼和摩擦。惯性参数则写在 link 的 inertial 标签中,包括质量 mass、质心 origin 和惯性张量 inertia。若惯性参数缺失或错误,动力学仿真会出现异常抖动或力矩计算失真。

SDF(Simulation Description Format)与URDF类似,但更面向物理仿真。SDF的 model 可以嵌套,link 和 joint 的 pose 用六自由度描述,joint 支持更丰富的动力学属性,如 spring stiffness、damping、friction 等。Gazebo等仿真器通常将URDF转换为SDF后加载。若模型只在ROS中做运动学可视化,URDF足够;若要做接触、摩擦、柔顺控制等物理仿真,SDF的表达更完整。

六、建模检查清单

完成模型后,建议按以下顺序检查:第一,确认基座坐标系和所有关节轴方向与设计文档一致;第二,检查每个 joint 的 parent/child 是否形成无环的树结构;第三,核对 limit 的上下限是否与机械设计一致;第四,检查 inertial 的质量、质心和惯性张量是否为正定且量级合理;第五,用正运动学对比DH参数与URDF输出;第六,在仿真器中加载模型,观察是否出现穿模、抖动或关节飞脱。若出现异常,优先排查坐标系方向、关节轴定义和惯性参数,这三类问题占建模错误的绝大多数。

建模时建议保留一份“坐标系与关节轴约定表”,记录每个关节的轴方向、正方向定义和限位来源。当多人协作或模型迭代时,这张表比反复读XML更高效。