OpenGL - 运动轨迹-欧拉角(姿态角)-万向锁

来源:互联网 发布:电信网络延迟高怎么办 编辑:程序博客网 时间:2024/04/30 02:29

坐标系

要了解飞机姿态,需要首先知道什么是地面坐标系和机体坐标系。

■地面坐标系(earth-surface inertial reference frameSg--------Oxgygzg


①在地面上选一点Og
②使xg轴在水平面内并指向某一方向
zg轴垂直于地面并指向地心
yg轴在水平面内垂直于xg轴,其指向按右手定则确定

■机体坐标系(Aircraft-body coordinate frame)Sb-------oxyz



①原点O取在飞机质心处,坐标系与飞机固连
x轴在飞机对称平面内并平行于飞机的设计轴线指向机头
y轴垂直于飞机对称平面指向机身右方
z轴在飞机对称平面内,与x轴垂直并指向机身下方
■欧拉角/姿态角(Euler Angle
 

机体坐标系与地面坐标系的关系是三个Euler角,反应了飞机相对地面的姿态。



俯仰角θ(pitch)

机体坐标系X轴与水平面的夹角。当X轴的正半轴位于过坐标原点的水平面之上(抬头)时,俯仰角为正,否则为负。

\

偏航角ψ(yaw)

机体坐标系xb轴在水平面上投影与地面坐标系xg轴(在水平面上,指向目标为正)之间的夹角,由xg轴逆时针转至机体xb的投影线时,偏航角为正,即机头右偏航为正,反之为负。
\

滚转角Φ(roll):

机体坐标系zb轴与通过机体xb轴的铅垂面间的夹角,机体向右滚为正,反之为负。

\


万向死结锁

欧拉角存在一个缺陷就是 万向锁 ,网上有个形象的解释

假如我们有一个望远镜和一个用来放望远镜的三脚架,(我们将)三脚架放在地面上,使支撑望远镜的三脚架的顶部是平行于地平面(参考平面)的,以便使得竖向的旋转轴(记为x轴)是完全地垂直于地平面的。现在,我们就可以将望远镜饶x轴旋转360度,从而观察(以望远镜为中心的)水平包围圈的所有方向。通常将正北朝向方位角度记为0度方位角。第二个坐标轴,即平行于地平面的横向的坐标轴(记为y轴)使得望远镜可以饶着它上下旋转,通常将地平面朝向的仰角记为0 度,这样,望远镜可以向上仰+90度指向天顶,或者向下-90度指向脚底。

现在,天空中(包括地面上)的每个点只需要唯一的一对x和y度数就可以确定。比如x=90度,y=45度指向的点是位于正东方向的半天空上。

让我们看看万向节死锁是怎么发生的吧。一次,我们探测到有一个飞行器贴地飞行,位于望远镜的正东方向(x=90度,y=10度),朝着我们直飞过来,我们跟踪它。飞行器飞行方向是保持x轴角度90度不变,而y向的角度在慢慢增大。随着飞行器的临近,y轴角增长的越来越快且当y向的角度达到90度时(即将超越),突然它急转弯朝南飞去。这时,我们发现我们不能将望远镜朝向南方,因为此时y向已经是90度,造成我们失去跟踪目标。这就是万向节死锁!

在这里有必要解释一下:为什么说不能将望远镜朝向南方呢?让我们看看坐标变化,从开始的(x=90度,y=10度)到(x=90度,y=90度),这个过程没有问题,望远镜慢慢转动跟踪飞行器。当飞行器到达(x=90度,y=90度)后,坐标突然变成(x=180度,y=90度)(因为朝南),x由90突变成180度,所以望远镜需要饶垂直轴向x轴旋转180-90=90度以便追上飞行器,但此时,望远镜已经是平行于x轴,我们知道饶平行于自身的中轴线的旋转改变不了朝向,就像拧螺丝一样,螺丝头的指向不变。所以望远镜的指向还是天顶。而后由于飞行器飞远,坐标变成(x=180度,y<90度)时,y向角减小,望远镜只能又转回到正东指向(刚刚还在那啊,怎么没了?),望'器'兴叹。这说明用x, y旋转角(又称欧拉角)来定向物体有时并不能按照你想象的那样工作,像上面的例子中从(x=90 度,y=10度)到(x=90度,y=90度),坐标值的变化和飞行器空间的位置变化一一对应,但是从(x=90度,y=90度)到x=180度,y=90度),再到(x=180度,y<90度)这个变化,飞行器位置是连续的变化,但坐标值的变化却不是连续的(从90突变到 180),其原因在于(x=90度,y=90度)和(x=180度,y=90度)甚至和(x=任意度,y=90度)这些不同的坐标值对应空间同一个位置,这种多个坐标值对应同一个位置的不一致性是造成死锁的根源.

上面是2维坐标系中的例子,同样,对于3维的也一样。比如有一个平行于x轴的向量,我们先将它饶y旋转直到它平行于z轴,这时,我们会发现任何饶z的旋转都改变不了向量的方向,即万向节死锁。

遇到这种情况可以用 四元数 代替情景使用


0 0