)
来源:哔哩哔哩
本来只是想讲一下游戏中的三个姿态角的,没想到越写越上头,综合了一些看过的资料,在游戏的基础上整合了一下两种姿态描述方法,限于本人学历,文章难免有错误观点和漏洞,还请谅解并可在评论中指出。
在游戏中,飞船的姿态可以由三个欧拉角来确定,分别是航向角,俯仰角和倾斜角。
(资料图片)
欧拉角的定义是这样的:将参考坐标系依次绕某个坐标轴旋转三个角度后,与体坐标系重合。通过导航球,很容易看出,游戏中的参考坐标系与水平面有关,前两个欧拉角决定了飞船的指向,而第三个欧拉角则与飞船的滚转有关。
由于游戏中的Local坐标系(体坐标系)是左手系,限于本人知识水平并为了减少不必要的麻烦,下面我将重新规定一下参考坐标系和飞船的体坐标系,使用的欧拉角会和游戏中的三个姿态角有所出入。
为了方便起见,参考坐标系的原点选在飞船的质心(与体坐标系的原点重合),X轴为飞船所在位置的正北方向,Y轴为飞船的地心矢径方向,即垂直地面指向天空(我确信简星是个理想球体),Z轴为飞船所在位置的正东方向。方便起见,下文中称此坐标系为“北天东坐标系”。显然,当飞船在轨道上运行时,该坐标系会有一个旋转角速度,并非惯性坐标系。而由于这个角速度一般都很小,在下文的讨论中将忽略不计。
体坐标系固联于飞船,原点为飞船质心,x轴为飞船的滚转轴(Roll Axis),y轴为飞船的偏航轴(Yaw Axis),z轴为飞船的俯仰轴(Pitch Axis)。这三根轴的具体方位都是可以在Vizzy中获取的。从chase view看,三根轴分别指向飞船的前、上、右方,构成右手系,与游戏中的Local坐标系是有一些不同的。
有了这两个坐标系,飞船的任意姿态都可以用体坐标系相对于北天东坐标系的三个欧拉角来表示。常见的用于航天器的旋转次序是3-2-1,即Z轴-Y轴-X轴的顺序。为了和游戏中的导航球以及vizzy提供的三个欧拉角相匹配,这里采用2-3-1,即Y轴-Z轴-X轴的顺序将参考坐标系进行旋转,使其与体坐标系重合。下面给出三次坐标系旋转的具体步骤以及三个欧拉角的具体定义。
第一次旋转,将北天东坐标系绕Y轴旋转偏航角,得到坐标系O-x'y'z'。的符号由右手定则确定,即向左偏航为正。偏航角与游戏中的Heading角大小一致,符号相反。
此次旋转对应的坐标变换为:
第二次旋转,将O-x'y'z'坐标系绕z'轴旋转俯仰角,得到坐标系O-x''y''z''。的符号由右手定则确定,即向上抬头为正。俯仰角游戏中的Pitch角符号和大小都一致。
此次旋转对应的坐标变换为:
第三次旋转,将O-x''y''z''坐标系绕x''轴旋转滚转角,得到体坐标系O-xyz。的符号由右手定则确定,即向右滚转为正。
此次旋转对应的坐标变换为:
经过这三次旋转之后,参考坐标系就和体坐标系重合了。有意思的是,这三次旋转的过程和游戏中使用导航球确定飞船指向的过程是一样的:首先旋转橙色的导航球以确定航向(偏航角),然后旋转蓝色的导航球确定俯仰(俯仰角),至此,飞船的指向已经确定下来了,如果再滚转一个角度(偏航角),那么飞船的姿态就能唯一确定,这就是我觉得方向锁设计的巧妙之处所在。
经过三次旋转,总的坐标变换为(北天东坐标系到体坐标系):
三个欧拉角可以在vizzy中由以下方式计算:
偏航角:体坐标系的x轴(飞船的滚转轴)在水平面内的投影与正北方向的夹角,向左偏航为正;
俯仰角:体坐标系的x轴(飞船的滚转轴)与水平面的夹角,抬头为正;
滚转角:体坐标系的z轴(飞船的俯仰轴)与参考矢量的夹角,向右滚转为正,参考矢量可以由体坐标系的x轴(飞船指向)与北天东坐标系的Y轴(正上方)做向量积得到。
最后,在这里说明一下游戏中的三个欧拉角:游戏中的参考坐标系和体坐标系与上文中规定的是类似的,但坐标轴的次序和方向有些不同,而且是左手系,采用的坐标系旋转方式也未必相同,最终得到的欧拉角有些差别。Heading角与上文中的角等大反向,Pitch角与上文中的角完全相同,而bank angle则有较大不同:bank angle大小等于飞船的俯仰轴与水平面的夹角,而上文中的角大小等于飞船的俯仰轴与一个参考矢量的夹角,二者并不相等。
飞船转动时的角速度可以在飞船的体坐标系中分解为、、(也就是vizzy提供的pitch rate、yaw rate的相反数(因为左手系的原因)、roll rate):
同时,也可以由三个欧拉角的变化率乘以各自对应的转轴来表示:
需要注意的是,北天东坐标系的Y轴、第一次旋转后的坐标系的z'轴、第二次旋转后的坐标系的x''轴通常情况下不一定是正交的关系,因此需要进行坐标变换在体坐标系中表示。
由前文的坐标系旋转过程可得:
具体展开过程不再列出,这里给出最后结果:
其中,即为vizzy中提供的roll rate、yaw rate的相反数、 pitch rate,也即角速度在体坐标系中的三个分量。
对上式中的矩阵求其逆,即可得到由三个角速度分量表示的三个欧拉角变化率:
可以看出,这种旋转方式得到的欧拉角在接近90°时(飞船的指向在正上方附近)会出现奇异状况。
上式中的可以从vizzy中获取其具体数值,这样上式就变成了三个相互耦合的非线性微分方程。该方程组除少数情况外无解析解,可通过数值积分解出其数值解,这样就可以得知飞船在不受外力矩时姿态随时间的变化规律。
需要注意的是,上述欧拉角及其转换关系是在2-3-1旋转顺序下的,采用不同的坐标系旋转顺序将会导致不同的表达式。
根据正交矩阵的性质,由北天东坐标系到体坐标系的坐标变换矩阵必然存在特征值为1的特征向量,即存在向量,使得。也就是说,存在这么一个矢量,它经过旋转之后保持不变,那么体坐标系可由参考坐标系直接绕这个矢量旋转一个角度之后得到。
四元数就是这样描述坐标系的旋转的,它由一个表示旋转角度的数和三个表示转轴方向的数构成:
其中,表示转轴的三个方向余弦,表示旋转的角度。
上文中,用欧拉角表示姿态时的三次旋转,都可以用对应的四元数来分别表示,而四元数也有两两相乘的定义,将三次旋转对应的四元数乘起来即可得到两个坐标系之间的四元数。运算过程比较麻烦,这里也是直接给出结果:
注意,这是采用2-3-1旋转顺序对应的四元数表达式,采用不同旋转顺序得到的表达式是不同的。
将两个坐标系之间的旋转关系用四元数表达出来之后,从参考坐标系到体坐标系的坐标变换矩阵可以表示如下:
考虑到两个坐标系之间的坐标变换矩阵在某一特定时刻是唯一的,因此用四元数表示的变换矩阵与用欧拉角表示的变换矩阵等价,对应元素相等。设上面矩阵中的每个元素为,则参照由欧拉角表示的坐标变换矩阵可以得出:
,,
以上就是四元数及其与欧拉角的相互表示。
这里直接上结论。四元数的变化与在体坐标系中表示的角速度的关系可以表示如下:
当已知时,上式即为一阶常系数线性微分方程组,加上初值条件以及式子
的约束,可以解出解析解,得到四元数随时间的变化,再将其转换为三个欧拉角,也就间接得到了欧拉角随时间的变化,避免了直接使用数值积分计算欧拉角的计算量大和有误差的问题。此外,使用四元数表示欧拉角还可以避免飞船指向在正上方附近时出现的奇异情况。
后面的东西就和游戏有些脱节了。总之,描述三维空间中物体的转动是比较复杂的,以上只是简单地叙述了一下两种常用方法,只涉及到了刚体姿态的运动学部分,如果加上动力学部分会更加复杂。
标签: