欧拉角、旋转矩阵、四元数、万向死锁

描述一个三维物体方向的变化,可以用欧拉角来表示,参考https://www.cnblogs.com/flyinggod/p/8144100.html

欧拉角有两种: 
静态:即绕世界坐标系三个轴的旋转,由于物体旋转过程中坐标轴保持静止,所以称为静态。 
动态:即绕物体坐标系三个轴的旋转,由于物体旋转过程中坐标轴随着物体做相同的转动,所以称为动态。 
使用动态欧拉角会出现万向锁现象;静态欧拉角不存在万向锁的问题。

旋转矩阵:

  • 对于两个三维点 p1(x1,y1,z1),p2(x2,y2,z2),由点 p1 经过旋转矩阵 R 旋转到 p2,则有

 

欧拉角、旋转矩阵、四元数、万向死锁

注:旋转矩阵为正交矩阵R·R^T=E,其中R^T是R的转置

欧拉角、旋转矩阵、四元数、万向死锁

以上三种旋转变化,都是针对固定于自身的坐标系来说的,如果一个物体先绕自己的X转、再绕自己的Y转,最后绕自己的Z转,旋转后的坐标P2与P1的关系就是:欧拉角、旋转矩阵、四元数、万向死锁,需要注意的是,矩阵的点乘运算极大多数情况下并不满足交换律,也即:A·B≠B·A

也即,例如:欧拉角、旋转矩阵、四元数、万向死锁

 

     而如果绕y轴旋转不等于90°(1°也好89°也好),只要选择适当的绕x和z的角度,就可以让手机指向三维空间中的任何一个方向,手机是自由的,也就不会遇到万向锁现象。

 

 

三维旋转中的万向死锁

现象描述:在描述前,先做几个定义,绕X转称为偏航、绕Y转称为俯仰、绕Z转称为滚转,上述三个轴指的是固定于飞机上的坐标轴。初始t0时,飞机水平飞行中,我们把此刻飞机的姿态(θx, θy, θz)定义为(0,0,0),接下来t1时刻,飞机依次分别绕自己的三个轴XYZ转过了一定角度,假设为(30,80,-40),这个坐标就称为t1时刻飞机的姿态(相对于t0时刻的姿态),飞机继续做特技,t2时刻其姿态角为(30,90,-40),这个姿态也是相对于t0时刻的姿态。

欧拉角、旋转矩阵、四元数、万向死锁

在t0到t1的这段时间内,飞机是均匀的从s1姿态变为s2姿态的的,t1到t2时间段内也是均匀变化的。如果飞机从s3姿态变为s2姿态,也是可以均匀变化的。

按照t1到t2均匀变化的情况,在t2-Δt这一时刻(Δt无限小),飞机的姿态s_3肯定=(30,90-Δθ,-40),其中Δθ为一个无限小的角度。

下面再看另一种飞行过程,只给出3个关键帧:s1‘=(0,0,0),s2’=(70,80,0),s3‘=(70,90,0)

那么在t2’-Δt这一时刻(Δt无限小),飞机的姿态s_3‘肯定=(70,90-Δθ,0),其中Δθ为一个无限小的角度。

我们要注意的是,s3姿态和s3’姿态,其实是同一个姿态,这是因为把Y转动90度以后的Z轴,和Y转动90度以前的X轴,是平行的或者说共线的,也即,绕Z的旋转,可以用绕X的反旋转来代替,也即当a-b=c-d时,姿态(a,90,b)和姿态(c,90,d)就是同一个姿态。

这时问题来了,看下面这种姿态变化情况

欧拉角、旋转矩阵、四元数、万向死锁

s3和s3’其实是同一个姿势,那么s_3 ----- s3-------s3' ---------s_3',就简化为s_3 ----- s3 ---------s_3',s_3和s3几乎是同一个姿态,再次简略一下,上图的4次姿态变化,其实就是s_3 ------s_3'。

也即,飞机要在2*Δt的时间段内(Δt无限小),把姿态由(30,90-Δθ,-40)变为(70,90-Δθ,0),可以看到,绕X和绕Z的角度必须要突变才能完成这个动作