【发布时间】:2021-02-19 14:29:40
【问题描述】:
我试图了解 3D 旋转矢量到旋转矩阵的转换。 假设我有一个 3D 旋转矢量 [a b g]。从 Trucco 等人的“3D 计算机视觉介绍技术”中,我相信我可以将其表示为每个轴 x、y、z 的旋转矩阵的乘积。
但我更经常看到使用罗德里格斯公式从旋转向量到矩阵的转换,该公式在下图中给出了 A.17
我在 Matlab 中测试这两个(我在执行 Rodrigues 的 Matlab 图像处理工具箱中使用内置的 rotationVectorToMatrix 函数),我得到的小旋转结果非常接近,例如
alpha = 1 * (pi/180);
beta = 2 * (pi/180);
gamma = 3 * (pi/180);
R = [(cos(beta) * cos(gamma)) (-cos(beta)*sin(gamma)) sin(beta);
sin(alpha) * sin(beta) * cos(gamma) + cos(alpha)*sin(gamma) ...
-sin(alpha) * sin(beta) * sin(gamma) + cos(alpha) * cos(gamma) ...
-sin(alpha) * cos(beta); ...
-cos(alpha)*sin(beta)*cos(gamma) + sin(alpha)*sin(gamma) ...
cos(alpha) * sin(beta) * sin(gamma) + sin(alpha) * cos(gamma) ...
cos(alpha) * cos(gamma)]
Rm = rotationVectorToMatrix([alpha beta gamma])'
我明白了
R =
0.9980 -0.0523 0.0349
0.0529 0.9984 -0.0174
-0.0339 0.0193 0.9985
Rm =
0.9980 -0.0520 0.0353
0.0526 0.9985 -0.0165
-0.0344 0.0184 0.9992
但是随着我的角度变大,它们会发散一点,例如如果我这样做了
alpha = 10 * (pi/180);
beta = 20 * (pi/180);
gamma = 30 * (pi/180);
我明白了
R =
0.8138 -0.4698 0.3420
0.5438 0.8232 -0.1632
-0.2049 0.3188 0.8529
Rm =
0.8089 -0.4578 0.3689
0.5166 0.8530 -0.0742
-0.2807 0.2506 0.9265
再次,我真的只是想在这里获得更好的理解,这些从旋转向量转换为矩阵的方法是否等效?我应该一直使用 Rodriguez 方法吗?如果是,为什么?感谢您的帮助。
【问题讨论】:
-
您可以更直接地从旋转向量构造矩阵...不需要欧拉角(如果使用不当并处理边缘情况很可能会产生差异...)。只需计算 3 个垂直基向量 ... 一个是您的旋转向量,另外两个可以通过叉积获得(与任何非平行向量)。在此之后,您可以将向量直接输入到旋转矩阵中,参见Understanding 4x4 homogenous transform matrices。
-
然后只需将结果(或其逆/转置)乘以增量旋转矩阵(围绕放置旋转向量的轴),就是这样 3 个叉积 3 个向量的归一化和 1矩阵乘法。请参阅glCircle3D,C++ 函数或多或少与我描述的相同。 顺便说一句。如果旋转向量是指欧拉角(不是方向向量),请参阅Is there a way to calculate 3D rotation on X and Y axis from a 4x4 matrix
-
太好了,我需要更仔细地阅读您在另一个线程上的答案。谢谢!
标签: matlab math computer-vision image-rotation