2. 位姿表示基础
在机器人视觉位姿评测与部署中,位姿表示是所有算法、标定、误差分析和部署接口的共同语言。一个机械臂末端在相机坐标系下的位置与姿态,最终要转换成机器人基坐标系下的目标位姿;一个标定板在图像中的观测,也要通过位姿变换与机器人运动学对齐。如果表示方法选错、转换顺序写反、单位混用,后续的误差评估和部署都会出现系统性偏差。因此,理解旋转矩阵、欧拉角、四元数和齐次变换的数学含义、转换关系与工程注意事项,是位姿评测的第一道基本功。
一、四种表示方法的核心原理
旋转矩阵用一个 3×3 正交矩阵 R 描述姿态,满足 RTR=I 且 det(R)=1。它的优点是直接作用于向量,便于连续变换和误差度量;缺点是 9 个参数只有 3 个自由度,存在 6 个约束,存储冗余且数值误差会破坏正交性。
欧拉角用三个角度描述姿态,常见有 ZYX、XYZ、ZYZ 等顺序。它直观、便于人机交互和示教,但存在万向节死锁:当中间角为 ±90° 时,第一和第三旋转轴重合,姿态自由度退化,插值和求逆会不稳定。
四元数用单位四元数 q=(w,x,y,z) 表示旋转,满足 w²+x²+y²+z²=1。它无死锁、插值平滑、计算高效,是机器人中间件和视觉库中最常用的姿态表示。注意 q 与 -q 表示同一旋转,比较和插值时要处理符号一致性。
齐次变换用 4×4 矩阵 T 同时描述旋转和平移,形式为 [R t; 0 1]。它把旋转和平移统一为矩阵乘法,便于链式组合,是机器人运动学、手眼标定和坐标系变换的标准工具。
二、相互转换的方法与流程
四种表示之间的转换,核心枢纽是旋转矩阵。欧拉角转旋转矩阵时,按指定旋转顺序依次相乘,例如 ZYX 顺序对应 R=Rz(yaw)·Ry(pitch)·Rx(roll)。旋转矩阵转欧拉角时,需要根据矩阵元素反解角度,并处理 ±90° 附近的奇异情况。四元数转旋转矩阵有标准公式,旋转矩阵转四元数则常用 Shepperd 方法,通过比较对角线元素选择数值稳定的分支。
齐次变换的构建与分解最为直接:给定旋转矩阵 R 和平移向量 t,拼成 4×4 矩阵即可;反过来,从 T 中取左上 3×3 为 R,右上 3×1 为 t。多个坐标系之间的链式变换通过矩阵连乘完成,例如 Tbase_cam=Tbase_ee·Tee_cam。
# Python 示例:旋转矩阵、欧拉角、四元数、齐次变换互转
import numpy as np
from scipy.spatial.transform import Rotation as R
# 欧拉角(ZYX) -> 旋转矩阵
rpy = [0.1, -0.2, 0.3] # roll, pitch, yaw
R_mat = R.from_euler('zyx', rpy).as_matrix()
# 旋转矩阵 -> 四元数
q = R.from_matrix(R_mat).as_quat() # [x, y, z, w]
# 四元数 -> 欧拉角
rpy_back = R.from_quat(q).as_euler('zyx')
# 构建齐次变换矩阵
t = np.array([0.4, 0.1, 0.6])
T = np.eye(4)
T[:3, :3] = R_mat
T[:3, 3] = t
print(T)
三、典型场景:手眼标定中的位姿转换
在 Eye-in-Hand 手眼标定中,相机固定在机械臂末端。标定板在相机坐标系下的位姿 Tcam_board 由视觉算法给出,机械臂末端在基坐标系下的位姿 Tbase_ee 由机器人控制器给出。待求的是相机到末端的固定变换 Tee_cam。对多组运动数据,满足:
T_base_ee(i) · T_ee_cam · T_cam_board(i) = T_base_board(常量)
实际求解时通常把旋转和平移分离,旋转部分用四元数或旋转矩阵构造 AX=XB 方程,平移部分再线性求解。若直接对欧拉角做线性插值或平均,会在奇异点附近产生明显误差,因此标定内部应统一使用旋转矩阵或四元数。
四、常见误区与复盘清单
| 误区 | 后果 | 正确做法 |
|---|---|---|
| 欧拉角旋转顺序不统一 | 姿态完全错误,误差无法解释 | 接口中显式标注 ZYX/XYZ 及内旋/外旋 |
| 四元数未归一化 | 旋转矩阵出现缩放,位姿漂移 | 每次转换后执行 q /= ||q|| |
| 忽略 q 与 -q 等价 | 插值路径绕远,姿态跳变 | 比较时取符号一致,插值用最短弧 |
| 角度单位混用 | 数值差 57.3 倍,标定失败 | 统一弧度制,接口处显式转换 |
| 齐次矩阵连乘顺序写反 | 坐标系变换方向错误 | 按“从右到左”理解变换链 |
掌握四种位姿表示及其转换,是后续手眼标定、位姿误差评估、轨迹部署和坐标系对齐的基础。实际工程中,表示方法本身没有绝对优劣,关键在于明确使用场景、统一约定、并在接口边界做好校验与归一化。