"""
Illustration of the rotation matrix / sometimes called 'orientation' matrix
R = [
R11 , R12 , R13,
R21 , R22 , R23,
R31 , R32 , R33
]
REMARKS:
1. this implementation is meant to make the mathematics easy to be deciphered
from the script, not so much on 'optimized' code.
You can then optimize it to your own style.
2. I have utilized naval rigid body terminology here whereby;
2.1 roll -> rotation about x-axis
2.2 pitch -> rotation about the y-axis
2.3 yaw -> rotation about the z-axis (this is pointing 'upwards')
"""
from math import (
asin, pi, atan2, cos
)
if R31 != 1 and R31 != -1:
pitch_1 = -1*asin(R31)
pitch_2 = pi - pitch_1
roll_1 = atan2( R32 / cos(pitch_1) , R33 /cos(pitch_1) )
roll_2 = atan2( R32 / cos(pitch_2) , R33 /cos(pitch_2) )
yaw_1 = atan2( R21 / cos(pitch_1) , R11 / cos(pitch_1) )
yaw_2 = atan2( R21 / cos(pitch_2) , R11 / cos(pitch_2) )
# IMPORTANT NOTE here, there is more than one solution but we choose the first for this case for simplicity !
# You can insert your own domain logic here on how to handle both solutions appropriately (see the reference publication link for more info).
pitch = pitch_1
roll = roll_1
yaw = yaw_1
else:
yaw = 0 # anything (we default this to zero)
if R31 == -1:
pitch = pi/2
roll = yaw + atan2(R12,R13)
else:
pitch = -pi/2
roll = -1*yaw + atan2(-1*R12,-1*R13)
# convert from radians to degrees
roll = roll*180/pi
pitch = pitch*180/pi
yaw = yaw*180/pi
rxyz_deg = [roll , pitch , yaw]
9条答案
按热度按时间mum43rcc1#
我们可以用下面的公式从旋转矩阵得到欧拉角。
给定一个3×3旋转矩阵
3个欧拉角为
这里atan 2是相同的反正切函数,带有象限检查,通常在C或Matlab中找到。
注意:如果绕y轴的Angular 正好为+/-90°,则必须注意。在这种情况下,第一列和最后一行中的所有元素(除了下角的元素,它是1或-1)都将为0(cos(1)=0)。一种解决方案是将绕x轴的旋转固定为180°,并根据下式计算绕z轴的Angular :atan2(r_12,-r_22)。
另请参见https://www.geometrictools.com/Documentation/EulerAngles.pdf,其中包括六个不同阶数的欧拉角的实现。
p3rjfoxz2#
如果R是(3x 3)旋转矩阵,则旋转Angular 将为acos((tr(R)-1)/2),其中tr(R)是矩阵的迹(即对角线元素之和)。
这是你要求的我估计有90%的可能不是你想要的。
ozxc1zmp3#
我想在这里发表一点意见,因为我也在研究同样的问题。我通过发布一个纯Python实现来将3-D旋转矩阵(3x3)转换为相应的滚动(Rx)、俯仰(Ry)、偏航(Rz)Angular ,从而为上述答案增添价值。
希望这对其他的程序员有帮助!
qacovj5a4#
以下代码在MATLAB中计算欧拉角,供您参考:
代码由Graham Taylor、Geoff欣顿和Sam Roweis提供。有关详细信息,请参见here
fdbelqdn5#
假设R1c和R2c是你计算的2个旋转矩阵,它们分别表示从姿态1和2的物体到相机帧的旋转(因此有第二个后缀c)。您需要的旋转矩阵是从pose 1到pose 2,即R12。要计算它,您必须在头脑中旋转对象,使其从pose_1到camera,然后从摄像机旋转到pose_2。后者的旋转与R2c所表示的pose_2到摄像机的旋转相反,因此:
第一个月
从矩阵R12中,您可以使用Rodiguez公式计算Angular 和旋转轴。
v8wbuo2f6#
假设它主要是绕某个坐标轴旋转(一个人站在摄像头前,绕着旋转得到旋转矩阵),试试下面的代码:
你可以用下面的代码来可视化
fjaof16o7#
对于2D的情况,python代码。
00jrzges8#
我猜你想知道如何从旋转矩阵计算精确的Angular 。首先,你应该决定命令(XYZ,ZYZ,ZXZ等)从旋转的乘积的结果,你可以采取反正弦函数的Angular 。(使用旋转矩阵你已经采取了!)
pepwfjgg9#
对于Matlab用户,有一个内置函数:
它是inverse