罗德里格斯进入Eulerangles,反之亦然

use*_*460 8 c++ opencv rotation

我正在使用solvePnP,我正在使用翻译向量.现在我需要将一些euler角度与solvePnP的结果进行比较.我希望/需要将欧拉角转换为"罗德里格斯";

solvePnP的平移向量是否等于欧拉角.翻译矩阵是唯一与Rodrigues有关的东西吗?或者是否有特殊的罗德里格角,它们与3个欧拉角完全不同?两者之间的数学如何?是否有OpenCV功能,我找不到?

dun*_*dar 61

首先,忘记翻译矢量,因为它与旋转无关:翻译会移动物体,旋转会改变它们的方向.

Rodrigues参数也称为轴角旋转.它们由4个数字组成[theta, x, y, z],这意味着您必须围绕单位矢量描述的轴旋转角度"theta" v=[x, y, z].看看cv :: Rodrigues函数引用,似乎OpenCV使用Rodrigues表示法的"紧凑"表示作为具有3个元素的向量rod2=[a, b, c],其中:

  • 旋转角度theta是输入矢量的模块theta = sqrt(a^2 + b^2 + c^2)
  • 旋转轴v是标准化的输入向量:v = rod2/theta = [a/theta, b/theta, c/theta]

因此,来自solvePnP的Rodrigues矢量与Euler角度符号甚至没有轻微关系,Euler角度符号表示围绕X,Y和Z轴组合的三个连续旋转.

如何比较两个旋转?这是一个很好的问题.Euler和Rodrigues表示都有奇点和其他问题.例如,如果比较两个Euler燕鸥或两个Rodrigues参数,它们看起来可能完全不同,但实际上代表几乎相同的旋转.如果您只需要检查两个旋转是否相同(或大约),您可以按照下一个方法:

  1. 将两个旋转转换为矩阵表示法(四元数也有效)
    • 可以使用cv :: Rodrigues函数将OpenCV Rodrigues向量转换为矩阵
    • 为了将Euler转换为矩阵,我建议你看一下euclideanspace.com的转换部分
  2. 从另一个"减去"一个旋转,即将一个旋转与另一个旋转连接
    • 使用旋转矩阵,乘以另一个的转置(反向旋转).空旋转是单位矩阵.
    • 使用四元数,将一个乘以另一个的复共轭(否定最后三个分量).
  3. 检查结果是否接近空旋转:
    • 空旋转矩阵是身份.
    • 空四元数在第一个组件中有1或-1

  • 你救了我的命!!!theta = sqrt(a^2 + b^2 + c^2) 和 v = rod2/theta = [a/theta, b/theta, c/theta] 正是我正在寻找的函数...谢谢 (2认同)