Math 两次旋转之间的误差?

Math 两次旋转之间的误差?,math,3d,rotation,Math,3d,Rotation,对不起,我应该知道,但我不知道。 我通过两个不同的过程计算了参考帧(S1)相对于基准参考帧(S0)的位置,这两个过程给出了两个不同的4x4仿射变换矩阵。我想计算两者之间的误差,但不确定如何处理旋转分量。我想听听你的建议 谢谢大家! 您正在寻找从帧S1到帧S0的单轴旋转(反之亦然)。旋转轴在这里并不重要。您需要旋转角度 设R0和R1为4x4矩阵S0和S1的左上3x3旋转矩阵。现在计算E=R0*transpose(R1)(或者transpose(R0)*R1;哪一个并不重要。) 现在计算 d(0)

对不起,我应该知道,但我不知道。 我通过两个不同的过程计算了参考帧(S1)相对于基准参考帧(S0)的位置,这两个过程给出了两个不同的4x4仿射变换矩阵。我想计算两者之间的误差,但不确定如何处理旋转分量。我想听听你的建议


谢谢大家!

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

设R0和R1为4x4矩阵S0和S1的左上3x3旋转矩阵。现在计算E=R0*transpose(R1)(或者transpose(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度)不精确


如果有从矩阵中提取单轴旋转的通用函数,请使用它。或者,如果您有一个从矩阵中提取四元数的通用函数,请使用该函数。(单轴旋转和四元数之间的关系非常密切)。

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

设R0和R1为4x4矩阵S0和S1的左上3x3旋转矩阵。现在计算E=R0*transpose(R1)(或者transpose(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度)不精确


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

如果R0和R1是两个旋转矩阵,它们应该是相同的,那么R0*R1'应该是相同的。对应于R0*R1'的旋转向量的大小是从恒等式开始的旋转(通常以弧度为单位)。通过罗德里格斯公式可以有效地将旋转矩阵转换为旋转向量

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

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

如果R0和R1是假设相同的两个旋转矩阵,那么R0*R1'应该是恒等式。对应于R0*R1'的旋转向量的大小是从恒等式开始的旋转(通常以弧度为单位)。通过罗德里格斯公式可以有效地将旋转矩阵转换为旋转向量

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

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

这取决于您希望捕获的错误。你能详细说明一下吗?答案会随着你感兴趣的内容而变化。听起来你想同时处理旋转和平移,但我不确定。这取决于你想捕获什么样的错误。你能详细说明一下吗?答案会随着你感兴趣的内容而变化。听起来你想同时处理旋转和平移,但我不确定。