一、引言
在双目视觉系统开发中,若需实现右相机坐标系与左相机坐标系平行,核心在于通过双目标定获取的旋转矩阵RRR,消除两相机间的相对旋转。本报告聚焦旋转矩阵的物理意义与工程应用,详细说明如何通过旋转矩阵计算相对旋转角度,为实现两坐标系平行提供技术支撑,为相关技术人员提供实用参考。
二、旋转矩阵的定义与物理意义
旋转矩阵RRR是一个3×33 \times 33×3的正交矩阵,满足RTR=IR^T R = IRTR=I(转置矩阵等于逆矩阵)且行列式值为111,专门用于表征右相机坐标系相对左相机坐标系的旋转关系。当右相机仅发生纯旋转运动时,该矩阵可完整描述其姿态变化规律。
在实现右相机坐标系与左相机坐标系平行的目标中,旋转矩阵的核心作用是:通过计算其对应的旋转角度,反向调整右相机姿态,最终使RRR变为单位矩阵(此时两坐标系完全平行)。
三、旋转矩阵的工程应用(坐标系平行化)
当目标为右相机坐标系与左相机坐标系平行时,核心操作是利用旋转矩阵进行逆旋转变换,消除两坐标系间的姿态差异:
右相机坐标系下的点转换至左相机坐标系(平行化目标下):
P左=RT⋅P右P_{\text{左}} = R^T \cdot P_{\text{右}}P左=RT⋅P右
(转换逻辑:利用旋转矩阵的正交性R−1=RTR^{-1} = R^TR−1=RT,通过逆旋转消除右相机相对左相机的旋转偏移,使两坐标系姿态对齐)
四、从旋转矩阵提取旋转角度的实用方法
要实现右相机坐标系与左相机坐标系平行,需精确计算两相机间的相对旋转角度,常用以下两种方法:
4.1 轴角表示法(通用场景)
任意旋转运动均可表示为 " 绕单位轴u=(ux,uy,uz)\boldsymbol{u} = (u_x, u_y, u_z)u=(ux,uy,uz)旋转θ\thetaθ角 ",通过计算该角度并反向旋转右相机θ\thetaθ角,可使两坐标系平行。
步骤 1:计算旋转角度θ\thetaθ
旋转矩阵的迹(主对角线元素之和)与旋转角θ\thetaθ存在确定关系:
tr(R)=R11+R22+R33=1+2cosθ\text{tr}(R) = R_{11} + R_{22} + R_{33} = 1 + 2\cos\thetatr(R)=R11+R22+R33=1+2cosθ
由此推导旋转角度计算公式:
θ=arccos(tr(R)−12)\theta = \arccos\left( \frac{\text{tr}(R) - 1}{2} \right)θ=arccos(2tr(R)−1)
计算结果范围为[0,π][0, \pi][0,π](弧度),转换为角度制:
θ度=θ×180π\theta_{\text{度}} = \theta \times \frac{180}{\pi}θ度=θ×π180
步骤 2:计算旋转轴u\boldsymbol{u}u
旋转轴方向由旋转矩阵的反对称部分确定:
R−RT=2sinθ⋅[u]×R - R^T = 2\sin\theta \cdot [\boldsymbol{u}]_{\times}R−RT=2sinθ⋅[u]×
其中[u]×[\boldsymbol{u}]_{\times}[u]×为u\boldsymbol{u}u的反对称矩阵,展开后解得:
ux=R23−R322sinθ,uy=R31−R132sinθ,uz=R12−R212sinθu_x = \frac{R_{23} - R_{32}}{2\sin\theta}, \quad u_y = \frac{R_{31} - R_{13}}{2\sin\theta}, \quad u_z = \frac{R_{12} - R_{21}}{2\sin\theta}ux=2sinθR23−R32,uy=2sinθR31−R13,uz=2sinθR12−R21
技术特点:无万向锁问题,可直接获取右相机需反向旋转的轴和角度,是实现坐标系平行的高效方法,适用于任意旋转场景。
4.2 欧拉角表示法(分轴旋转场景)
欧拉角将复合旋转分解为绕三个坐标轴的依次旋转(常用 Z-Y-X 顺序,对应 “偏航 - 俯仰 - 滚转”),通过分别计算各轴旋转角度并反向调整,可逐步实现两坐标系平行。
旋转矩阵构成
总旋转矩阵表达式为R=Rx(α)Ry(β)Rz(γ)R = R_x(\alpha) R_y(\beta) R_z(\gamma)R=Rx(α)Ry(β)Rz(γ),其中:
● Rx(α)R_x(\alpha)Rx(α):绕 X 轴旋转α\alphaα(滚转角);
● Ry(β)R_y(\beta)Ry(β):绕 Y 轴旋转β\betaβ(俯仰角);
● Rz(γ)R_z(\gamma)Rz(γ):绕 Z 轴旋转γ\gammaγ(水平角 / 偏航角)。
角度提取步骤
- 俯仰角计算:β=−arcsin(R31)\beta = -\arcsin(R_{31})β=−arcsin(R31),取值范围[−π/2,π/2][-\pi/2, \pi/2][−π/2,π/2];
- 偏航角计算:当cosβ≠0\cos\beta \neq 0cosβ=0时,γ=arctan2(R11/cosβ,R21/cosβ)\gamma = \arctan2(R_{11}/\cos\beta, R_{21}/\cos\beta)γ=arctan2(R11/cosβ,R21/cosβ);
- 滚转角计算:当cosβ≠0\cos\beta \neq 0cosβ=0时,α=arctan2(R32/cosβ,R33/cosβ)\alpha = \arctan2(R_{32}/\cos\beta, R_{33}/\cos\beta)α=arctan2(R32/cosβ,R33/cosβ)。
操作逻辑:分别将右相机绕 X 轴反向旋转α\alphaα、绕 Y 轴反向旋转β\betaβ、绕 Z 轴反向旋转γ\gammaγ(按 Z-Y-X 逆顺序),即可消除相对旋转,使两坐标系平行。
注意事项:当β=±π/2\beta = \pm\pi/2β=±π/2时,会出现 “万向锁” 现象(偏航角与滚转角耦合),此时需采用轴角表示法替代。
4.3 工程实现代码(欧拉角)
import numpy as np
# 输入双目标定得到的旋转矩阵R
R = np.array([[0.9998, -0.0175, 0.0043],[0.0175, 0.9998, -0.0043],[-0.0043, 0.0043, 0.9999]])
# 计算绕X轴旋转角度(滚转角)
theta_x = np.arctan2(R[2,1], R[2,2])
# 计算绕Y轴旋转角度(俯仰角)
theta_y = np.arctan2(-R[2,0], np.sqrt(R[2,1]**2 + R[2,2]** 2))# 计算绕Z轴旋转角度(偏航角)
theta_z = np.arctan2(R[1,0], R[0,0])print(f"右相机相对左相机绕X轴旋转角度(度): {np.degrees(theta_x):.2f}")
print(f"右相机相对左相机绕Y轴旋转角度(度): {np.degrees(theta_y):.2f}")
print(f"右相机相对左相机绕Z轴旋转角度(度): {np.degrees(theta_z):.2f}")
print(f"使坐标系平行需反向旋转角度: 绕X轴{-np.degrees(theta_x):.2f}度, 绕Y轴{-np.degrees(theta_y):.2f}度, 绕Z轴{-np.degrees(theta_z):.2f}度")
五、工程应用注意事项
- 旋转矩阵正交性验证:标定后需验证RTR≈IR^T R \approx IRTR≈I(误差应小于1e−61e-61e−6),若不满足需检查标定板图像质量(如模糊、姿态单一、特征点检测错误)并重新标定,否则角度计算会出现偏差。
- 旋转顺序标准化:欧拉角计算结果与旋转顺序强相关(如 Z-Y-X 与 X-Y-Z 结果差异显著),工程中建议统一采用 Z-Y-X 顺序(符合双目视觉系统常规定义),确保反向旋转操作的准确性。
- 角度符号工程约定:
● 水平角(绕 Z 轴):默认逆时针为正(从 Z 轴正方向俯视),反向旋转时取负值即可。
● 俯仰角(绕 Y 轴):OpenCV 坐标系(Y 轴向下)中,向上仰头为正,反向旋转需取负值;机器人系统(Y 轴向上)中,向上仰头为负,反向旋转需取正值,需根据实际坐标系类型调整。 - 平行度验证:调整后需通过新的标定验证旋转矩阵是否接近单位矩阵(各元素误差小于1e−41e-41e−4),确保两坐标系达到预期平行度。
六、结论
实现右相机坐标系与左相机坐标系平行的核心是通过双目标定得到的旋转矩阵,精确计算相对旋转角度并进行反向调整。轴角表示法适用于一次性实现平行的场景,欧拉角表示法适用于需要分轴调整的场景。应用过程中需重点关注旋转矩阵正交性验证、旋转顺序标准化及反向旋转角度的符号正确性,以确保两坐标系平行度满足工程需求。