两次旋转之间的误差?

时间:2011-06-29 14:14:43

标签: math 3d rotation

抱歉 - 我应该知道这一点,但我不知道。 我通过两个不同的过程计算了参考帧(S1)相对于基准参考帧(S0)的位置,这两个过程给出了两个不同的4x4仿射变换矩阵。我想计算两者之间的错误,但不知道如何处理旋转组件。会喜欢任何建议。

谢谢你!

2 个答案:

答案 0 :(得分:3)

如果R0和R1是两个应该相同的旋转矩阵,那么R0 * R1'应该是同一性的。对应于R0 * R1'的旋转矢量的大小是来自同一性的旋转(通常以弧度表示)。通过罗德里格斯公式有效地将旋转矩阵转换为旋转矢量。

使用常见用例Python和OpenCV回答您的问题,错误是

r, _ = cv2.Rodrigues(R0.dot(R1.T))
rotation_error_from_identity = np.linalg.norm(r)

答案 1 :(得分:1)

您正在寻找从第S1帧到第S0帧的单轴旋转(反之亦然)。旋转轴在这里并不重要。你想要旋转角度。

设R0和R1为4x4矩阵S0和S1的左上3x3旋转矩阵。现在计算E = R0 *转置(R1)(或转置(R0)* R1;它实际上并不重要。)

现在计算

d(0) = E(1,2) - E(2,1)
d(1) = E(2,0) - E(0,2)
d(2) = E(0,1) - E(1,0)

dmag = sqrt(d(0)*d(0) + d(1)*d(1) + d(2)*d(2))

phi = asin (dmag/2)

我遗漏了一些毛茸茸的细节(这些细节可以咬你)。特别地,上述对于非常大的误差角度(误差> 90度)是无效的,并且对于大的误差角度(角度> 45度)是不精确的。

如果您有一个从矩阵中提取单轴旋转的通用功能,请使用它。或者,如果您有一个从矩阵中提取四元数的通用函数,请使用它。 (单轴旋转和四元数彼此密切相关)。