Rodrigues公式将旋转向量转换为旋转矩阵
Rodrigues formula to convert rotation vector to rotation matrix
我正在尝试了解 3D 旋转矢量到旋转矩阵的转换。
假设我有一个 3D 旋转矢量 [a b g]。来自 Trucco 等人的 'Introductory Techniques for 3D computer Vision',我相信我可以将其表示为每个轴 x、y、z 的旋转矩阵的乘积。
但我更经常看到使用 Rodrigues 公式从旋转向量到矩阵的转换,该公式在下图中给出 A.17
我正在 Matlab 中测试这两个(我在 Matlab 图像处理工具箱中使用内置的 rotationVectorToMatrix 函数来执行 Rodrigues),我得到的小旋转的结果彼此非常接近,例如
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 方法吗?如果是,为什么?感谢您的帮助。
“旋转矢量”假定角度是同时的。因此,使用欧拉角不是假定连续角度的正确比较。对于小角度,你会得到接近的东西,但对于更大的角度,预计会有显着差异。
一个适当的比较是四元数,它也假定与旋转矢量相同意义的同时角度。所以像
V = [alpha beta gamma];
angle = norm(V);
q = [cos(angle/2) sin(angle/2)*V/angle];
然后用这个做你的比较。例如,
quat2dcm(q)
编辑
如果您没有 MATLAB Aerospace Toolbox,则可以手动进行此转换。航空航天工具箱使用标量向量阶、右链、右手汉密尔顿约定。所以转换将是:
qw = q(1); qv = q(2:4); % note qv is a row vector here
skew = @(v)[0 -v(3) v(2);v(3) 0 -v(1);-v(2) v(1) 0];
dcm = (qw^2 - qv*qv')*eye(3) + 2*qv'*qv - 2*qw*skew(qv) % right-chain Hamilton
顺便说一下,机器人工具箱使用左链约定,因此如果您要与该工具箱中的函数进行比较,则需要翻转叉积偏斜项的符号。例如,
dcm = (qw^2 - qv*qv')*eye(3) + 2*qv'*qv + 2*qw*skew(qv) % left-chain Hamilton
如果您要与左手四元数约定(又名 JPL)进行比较,则叉积偏斜项高于翻转符号。所以归结为
% right-chain right-handed Hamilton OR left-chain left-handed JPL
dcm = (qw^2 - qv*qv')*eye(3) + 2*qv'*qv - 2*qw*skew(qv)
% left-chain right-handed Hamilton OR right-chain left-handed JPL
dcm = (qw^2 - qv*qv')*eye(3) + 2*qv'*qv + 2*qw*skew(qv)
Right-chain表示未修改的四元数出现在三重四元数旋转操作的右侧(常用于两个不同坐标系之间的被动坐标系变换):
vnew = q^-1 * v * q
Left-chain表示未修改的四元数出现在三重四元数旋转操作的左侧(常用于同一坐标系内的主动向量旋转):
vnew = q * v * q^-1
右手表示四元数虚数单位像常规叉积项一样相乘。例如,
i * j = k
j * k = i
k * i = j
左撇子表示四元数虚数单位乘以正则叉积项的负数。即,就像一个左手坐标系。例如,
i * j = -k
j * k = -i
k * i = -j
当然,如果您使用的是向量-标量顺序的四元数,则需要以不同于上面的方式选择标量和向量部分。
我正在尝试了解 3D 旋转矢量到旋转矩阵的转换。 假设我有一个 3D 旋转矢量 [a b g]。来自 Trucco 等人的 'Introductory Techniques for 3D computer Vision',我相信我可以将其表示为每个轴 x、y、z 的旋转矩阵的乘积。
但我更经常看到使用 Rodrigues 公式从旋转向量到矩阵的转换,该公式在下图中给出 A.17
我正在 Matlab 中测试这两个(我在 Matlab 图像处理工具箱中使用内置的 rotationVectorToMatrix 函数来执行 Rodrigues),我得到的小旋转的结果彼此非常接近,例如
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 方法吗?如果是,为什么?感谢您的帮助。
“旋转矢量”假定角度是同时的。因此,使用欧拉角不是假定连续角度的正确比较。对于小角度,你会得到接近的东西,但对于更大的角度,预计会有显着差异。
一个适当的比较是四元数,它也假定与旋转矢量相同意义的同时角度。所以像
V = [alpha beta gamma];
angle = norm(V);
q = [cos(angle/2) sin(angle/2)*V/angle];
然后用这个做你的比较。例如,
quat2dcm(q)
编辑
如果您没有 MATLAB Aerospace Toolbox,则可以手动进行此转换。航空航天工具箱使用标量向量阶、右链、右手汉密尔顿约定。所以转换将是:
qw = q(1); qv = q(2:4); % note qv is a row vector here
skew = @(v)[0 -v(3) v(2);v(3) 0 -v(1);-v(2) v(1) 0];
dcm = (qw^2 - qv*qv')*eye(3) + 2*qv'*qv - 2*qw*skew(qv) % right-chain Hamilton
顺便说一下,机器人工具箱使用左链约定,因此如果您要与该工具箱中的函数进行比较,则需要翻转叉积偏斜项的符号。例如,
dcm = (qw^2 - qv*qv')*eye(3) + 2*qv'*qv + 2*qw*skew(qv) % left-chain Hamilton
如果您要与左手四元数约定(又名 JPL)进行比较,则叉积偏斜项高于翻转符号。所以归结为
% right-chain right-handed Hamilton OR left-chain left-handed JPL
dcm = (qw^2 - qv*qv')*eye(3) + 2*qv'*qv - 2*qw*skew(qv)
% left-chain right-handed Hamilton OR right-chain left-handed JPL
dcm = (qw^2 - qv*qv')*eye(3) + 2*qv'*qv + 2*qw*skew(qv)
Right-chain表示未修改的四元数出现在三重四元数旋转操作的右侧(常用于两个不同坐标系之间的被动坐标系变换):
vnew = q^-1 * v * q
Left-chain表示未修改的四元数出现在三重四元数旋转操作的左侧(常用于同一坐标系内的主动向量旋转):
vnew = q * v * q^-1
右手表示四元数虚数单位像常规叉积项一样相乘。例如,
i * j = k
j * k = i
k * i = j
左撇子表示四元数虚数单位乘以正则叉积项的负数。即,就像一个左手坐标系。例如,
i * j = -k
j * k = -i
k * i = -j
当然,如果您使用的是向量-标量顺序的四元数,则需要以不同于上面的方式选择标量和向量部分。