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]。它把旋转和平移统一为矩阵乘法,便于链式组合,是机器人运动学、手眼标定和坐标系变换的标准工具。

位姿表示与相互转换关系图 旋转矩阵 R 3×3 正交矩阵 RᵀR=I, det(R)=1 9参数 / 3自由度 欧拉角 (r,p,y) ZYX / XYZ / ZYZ 直观、易示教 存在万向节死锁 四元数 q (w, x, y, z) 无死锁、插值平滑 q 与 -q 同旋转 齐次变换 T [ R t ] [ 0 1 ] 旋转+平移统一表示 R→欧拉角 欧拉角→q q→R→T R + t → T 欧拉角→R→T 转换核心:所有表示最终都通过旋转矩阵 R 与齐次变换 T 建立联系;转换顺序、单位、符号必须统一 工程建议:内部计算用四元数或旋转矩阵,人机接口用欧拉角,坐标系变换用齐次矩阵

二、相互转换的方法与流程

四种表示之间的转换,核心枢纽是旋转矩阵。欧拉角转旋转矩阵时,按指定旋转顺序依次相乘,例如 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 倍,标定失败 统一弧度制,接口处显式转换
齐次矩阵连乘顺序写反 坐标系变换方向错误 按“从右到左”理解变换链
特别注意:旋转矩阵长期迭代后会失去正交性,建议每若干次更新后重新正交化;欧拉角在 ±90° 附近不要做插值或求导;四元数在跨语言接口中要确认存储顺序是 (w,x,y,z) 还是 (x,y,z,w),这是工程中最常见的低级错误之一。
工程建议:在机器人视觉位姿评测系统中,建议内部统一采用“齐次变换 + 四元数”作为标准表示,仅在示教、显示和日志中转换为欧拉角。所有转换函数应附带单元测试,覆盖 0°、±90°、±180° 等边界姿态,确保转换闭环误差在 1e-6 以内。

掌握四种位姿表示及其转换,是后续手眼标定、位姿误差评估、轨迹部署和坐标系对齐的基础。实际工程中,表示方法本身没有绝对优劣,关键在于明确使用场景、统一约定、并在接口边界做好校验与归一化。