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 轴竖直向上”,并在全文和图示中保持一致。
四、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输出;第六,在仿真器中加载模型,观察是否出现穿模、抖动或关节飞脱。若出现异常,优先排查坐标系方向、关节轴定义和惯性参数,这三类问题占建模错误的绝大多数。