第三节 机械臂数学基础:空间描述、位置与姿态表示、旋转矩阵、欧拉角与四元数
机械臂运动学研究的核心问题是:如何精确描述末端执行器在三维空间中的位置与姿态,以及如何在不同坐标系之间进行变换。无论是正运动学求解、逆运动学分析,还是轨迹规划中的插补计算,都建立在对空间描述的数学语言之上。本节将系统讲解位置矢量、姿态矩阵、欧拉角与四元数的数学定义、相互转换关系及其在MATLAB中的实现方法,为后续建立DH参数模型和运动学方程奠定坚实的数学基础。
3.1 空间描述与坐标变换的基本概念
在机械臂运动学中,空间描述包含两个核心要素:位置(Position)和姿态(Orientation)。位置描述物体在空间中的坐标点,姿态描述物体的朝向。两者合在一起构成物体的位姿(Pose)。机械臂的每个连杆都可以看作一个刚体,其位姿需要相对于某个参考坐标系进行描述。
设参考坐标系为 {A},空间中任意一点 P 的位置可以用一个 3×1 的位置矢量 ᵃP = [pₓ, p_y, p_z]ᵀ 表示。而刚体的姿态则需要用固定在刚体上的坐标系 {B} 相对于 {A} 的旋转关系来描述。完整的位姿描述通常采用 4×4 齐次变换矩阵:
T = [ R p ]
[ 0 1 ]
其中 R 为 3×3 旋转矩阵,p 为 3×1 位置矢量。齐次变换矩阵将旋转和平移统一在一个矩阵中,便于进行复合变换计算。在MATLAB中,可以使用 tform = trvec2tform([x y z]) * eul2tform([phi theta psi]) 构造齐次变换矩阵。
3.2 旋转矩阵:姿态的数学表达
旋转矩阵 R 是一个 3×3 的正交矩阵,满足 RᵀR = I 且 det(R) = +1。其列向量分别表示被旋转坐标系各轴在参考坐标系中的方向余弦。例如,绕Z轴旋转角度 θ 的基本旋转矩阵为:
Rz(θ) = [cosθ -sinθ 0]
[sinθ cosθ 0]
[ 0 0 1]
同理可定义绕X轴和Y轴的基本旋转矩阵 Rx(α) 和 Ry(β)。任意姿态的旋转矩阵可以由这三个基本旋转矩阵按一定顺序复合得到。旋转矩阵的9个元素并非独立,它们受到6个正交约束条件的限制,因此实际只有3个自由度。
在MATLAB中,可以使用 rotx()、roty()、rotz() 函数直接生成基本旋转矩阵,使用 axang2rotm() 将轴角表示转换为旋转矩阵。旋转矩阵的主要优点是计算稳定、无奇异问题,但缺点是参数冗余(9个元素描述3个自由度),且不够直观。
| 表示方法 | 参数数量 | 约束条件 | 优点 | 缺点 |
|---|---|---|---|---|
| 旋转矩阵 | 9 | 6个正交约束 | 计算稳定、无奇异 | 参数冗余、不直观 |
| 欧拉角 | 3 | 无 | 直观、参数少 | 存在万向节锁 |
| 四元数 | 4 | 1个单位范数约束 | 无奇异、插值平滑 | 不够直观 |
3.3 欧拉角:直观的姿态描述
欧拉角通过三次绕坐标轴的旋转来描述姿态,共有12种可能的旋转顺序组合。机械臂领域最常用的是ZYX欧拉角(也称为RPY角,Roll-Pitch-Yaw),其旋转顺序为:先绕Z轴旋转偏航角(Yaw)ψ,再绕新的Y轴旋转俯仰角(Pitch)θ,最后绕新的X轴旋转翻滚角(Roll)φ。对应的旋转矩阵为:
R = Rz(ψ) * Ry(θ) * Rx(φ)
在MATLAB中,使用 eul = rotm2eul(R, 'ZYX') 可以从旋转矩阵提取ZYX欧拉角,使用 R = eul2rotm(eul, 'ZYX') 进行逆变换。需要注意的是,欧拉角存在万向节锁问题:当俯仰角 θ = ±90° 时,翻滚和偏航的旋转轴重合,导致一个自由度丢失,此时无法唯一确定姿态。
3.4 四元数:无奇异的姿态表示
四元数由爱尔兰数学家哈密顿于1843年提出,形式为 q = w + xi + yj + zk,其中 w 为标量部分,(x, y, z) 为矢量部分。单位四元数满足 w² + x² + y² + z² = 1,可用于表示三维空间中的旋转。四元数相对于欧拉角的优势在于:不存在万向节锁问题,且姿态插值可以通过球面线性插值(SLERP)实现平滑过渡。
四元数与旋转矩阵的转换关系为:
R = [1-2(y²+z²) 2(xy-wz) 2(xz+wy) ]
[2(xy+wz) 1-2(x²+z²) 2(yz-wx) ]
[2(xz-wy) 2(yz+wx) 1-2(x²+y²)]
在MATLAB中,quat = rotm2quat(R) 将旋转矩阵转换为四元数(返回格式为 [w x y z]),R = quat2rotm(quat) 进行逆变换。四元数的乘法对应旋转的复合,但注意四元数乘法不满足交换律,旋转顺序与四元数乘法顺序一致。
slerp(q1, q2, t) 函数(需自行实现或使用Robotics System Toolbox中的 slerp 方法)对四元数进行球面线性插值。
3.5 姿态表示转换与MATLAB实现
在实际工程中,经常需要在不同姿态表示之间进行转换。MATLAB的Robotics System Toolbox和Navigation Toolbox提供了完整的转换函数集。以下是一个典型的转换流程示例:
% 定义ZYX欧拉角(单位:弧度)
eul = [0.3, -0.2, 0.5]; % [yaw, pitch, roll]
% 欧拉角 → 旋转矩阵
R = eul2rotm(eul, 'ZYX');
% 旋转矩阵 → 四元数
quat = rotm2quat(R); % 返回 [w x y z]
% 四元数 → 旋转矩阵
R2 = quat2rotm(quat);
% 旋转矩阵 → 欧拉角
eul2 = rotm2eul(R2, 'ZYX');
% 验证转换一致性
disp(['欧拉角误差: ', num2str(norm(eul - eul2))]);
在编写转换代码时,需要注意MATLAB中四元数的分量顺序为 [w x y z],而某些第三方库(如ROS中的 geometry_msgs/Quaternion)也采用相同顺序,但部分C++库(如Eigen)默认顺序为 [x y z w]。跨语言或跨平台传递四元数时,务必确认分量顺序,否则会导致严重的姿态错误。
3.6 案例拆解:六轴机械臂末端姿态的表示与转换
假设某六轴机械臂在示教模式下,操作人员通过示教器记录了末端执行器的一个目标位姿。示教器显示的姿态信息为ZYX欧拉角:偏航角 30°、俯仰角 -15°、翻滚角 45°。我们需要完成以下任务:
- 将该姿态转换为旋转矩阵和四元数;
- 验证转换结果的一致性;
- 分析该姿态是否接近万向节锁位置。
步骤1:欧拉角转旋转矩阵
eul_deg = [30, -15, 45]; % 角度制
eul_rad = deg2rad(eul_deg);
R = eul2rotm(eul_rad, 'ZYX');
disp('旋转矩阵 R =');
disp(R);
步骤2:旋转矩阵转四元数
quat = rotm2quat(R);
disp('四元数 q = [w x y z]');
disp(quat);
步骤3:一致性验证
R_check = quat2rotm(quat);
eul_check = rotm2eul(R_check, 'ZYX');
error_rotm = norm(R - R_check);
error_eul = norm(eul_rad - eul_check);
fprintf('旋转矩阵误差: %e\n', error_rotm);
fprintf('欧拉角误差: %e\n', error_eul);
步骤4:万向节锁分析
该姿态的俯仰角为 -15°,远离 ±90° 的奇异位置,因此不存在万向节锁问题。但如果在后续轨迹规划中,末端需要经过俯仰角接近 90° 的路径点,则必须切换为四元数插值。
结果分析:转换后的旋转矩阵和四元数在数值精度范围内完全一致。该案例展示了从示教器读取的欧拉角到内部计算所需四元数的完整转换流程。在实际机器人控制系统中,示教器通常显示欧拉角供操作人员理解,而控制器内部使用四元数或旋转矩阵进行运动学计算和轨迹插补。
3.7 常见误区与总结
在学习和使用机械臂姿态表示时,初学者常犯以下错误:
- 混淆旋转顺序:不同文献或软件库可能采用不同的欧拉角旋转顺序(ZYX、ZYZ、XYZ等),直接套用公式会导致错误结果。务必明确所使用的旋转顺序约定。
- 忽略单位制:MATLAB中三角函数默认使用弧度,而示教器通常显示角度。在转换过程中忘记进行单位换算,是导致姿态错误的常见原因。
- 四元数未归一化:经过多次乘法运算后,四元数可能因数值误差偏离单位范数。在关键计算前应重新归一化,否则旋转矩阵将不再正交。
- 直接使用欧拉角插值:在轨迹规划中直接对欧拉角进行线性插值,可能导致姿态路径不自然,甚至经过万向节锁区域时产生跳变。
本节内容为机械臂运动学奠定了数学基础。位置矢量描述空间点,旋转矩阵、欧拉角和四元数从不同角度描述姿态,齐次变换矩阵统一了位置与姿态的表达。在后续的DH参数建模和运动学求解中,我们将频繁使用这些数学工具。建议读者在MATLAB中自行编写转换脚本,加深对各种表示方法内在联系的理解,并熟练掌握 eul2rotm、rotm2quat 等核心函数的用法。