You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ArUco标记rvec与欧拉角差异及正确获取Yaw/Pitch/Roll方法问询

ArUco rvec与欧拉角问题解答

1. rvec与欧拉角的区别及数值差异原因

  • rvec(旋转向量):OpenCV中rvec采用轴角表示法,向量方向为旋转轴,向量长度为旋转角度(弧度制)。比如绕X轴转10°,rvec的X分量约为0.1745弧度(10°转弧度),Y、Z分量趋近于0,这和你观察到的rvec小幅度变化一致。
  • 欧拉角异常原因:核心是坐标系定义与旋转顺序不匹配:
    • OpenCV默认相机坐标系为:X轴向右,Y轴向下,Z轴向前(指向镜头外);而多数欧拉角定义(如航空系)采用Y轴向上的右手系,且旋转顺序(如Z-Y-X)有明确要求。
    • 若直接将rvec转欧拉角时未对齐坐标系或用错旋转顺序,会导致角度映射错误——比如你绕X轴转10°,错误的转换会把这个旋转拆解到其他轴的组合上,最终算出的Roll出现大幅偏差。
    • 万向锁虽为欧拉角固有问题,但你的情况更大概率是坐标系/旋转顺序不匹配导致,而非万向锁。

2. 获取正确Yaw、Pitch、Roll的方法

需严格对齐坐标系与旋转顺序,步骤如下:

步骤1:将rvec转为旋转矩阵

使用OpenCV的Rodrigues函数完成转换:

import cv2
import numpy as np

R, _ = cv2.Rodrigues(rvec)

步骤2:修正坐标系映射

将OpenCV相机坐标系(Y轴向下)转换为标准右手系(Y轴向上),调整旋转矩阵:

# 翻转Y轴的坐标系转换矩阵
coord_transform = np.array([
    [1, 0, 0],
    [0, -1, 0],
    [0, 0, 1]
])
R_corrected = R @ coord_transform

步骤3:按标准旋转顺序计算欧拉角

采用航空系通用的Z-Y-X(Yaw→Pitch→Roll)外旋顺序计算:

# 计算弧度制欧拉角
yaw = np.arctan2(R_corrected[1, 0], R_corrected[0, 0])
pitch = np.arcsin(-R_corrected[2, 0])
roll = np.arctan2(R_corrected[2, 1], R_corrected[2, 2])

# 转换为角度
yaw_deg = np.degrees(yaw)
pitch_deg = np.degrees(pitch)
roll_deg = np.degrees(roll)

验证注意事项

  • 绕X轴(相机右方向)旋转时,Roll数值应与实际旋转角度一致;
  • 绕Y轴(修正后的上方向)旋转时,Pitch变化符合预期;
  • 绕Z轴(镜头前方向)旋转时,Yaw数值正确;
  • 若仍有问题,检查ArUco标记的坐标系:ArUco默认标记坐标系为X右、Y上、Z垂直标记面向外,确保未搞反标记轴方向。

内容的提问来源于stack exchange,提问作者Plutus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:50:09