当前位置:首页阅读

kRPC(二)参考系

kRPC(二)参考系

参考系

kRPC(二)参考系

为什么才第二篇就讲参考系呢?因为火箭的位置、姿态的获取都和参考系密切相关,如果不把参考系搞明白,基本上什么事也干不了。

本文将带你以几个小实验的形式熟悉kRPC的参考系系统。

推荐食用方法:把游戏调成窗口模式,同时打开python命令行,根据本文流程输入代码,观察游戏内的现象。

kRPC(二)参考系_WWW.XUNWANGBA.COM

目录

0.连接

1.由载具位置引发的思考

2.一些参考系的对比

3.自定义参考系

4.自定义参考系实例-着陆点参考系

5.参考系间的坐标变换

kRPC(二)参考系_WWW.XUNWANGBA.COM

0.连接

在一切开始之前,我们首先需要发射一个火箭

kRPC(二)参考系_WWW.XUNWANGBA.COM

并且通过以下代码建立连接,获取几个重要的变量。

下文代码中再出现conn、space_center、vessel和body时,都是由上述方式获取。

kRPC(二)参考系_WWW.XUNWANGBA.COM

1.由载具位置引发的思考

如果你自己看过文档,可能会注意到vessel.position可以获取载具当前的位置坐标。

kRPC(二)参考系_WWW.XUNWANGBA.COM

但是vessel.position和其他的可以直接获取的变量不同,它还要求我们传入一个ReferenceFrame,这是因为在不同的参考系中丈量载具的坐标会得出不同的结果,只有给定了一个参考系,才能确定载具的坐标。

下面介绍几个常用的参考系。

kRPC(二)参考系_WWW.XUNWANGBA.COM

2.一些参考系的对比

注:kRPC中参考系均为左手系(DirectX的锅)

① body.reference_frame(地固系)

原点位置:天体的质心

x轴指向:天体赤道与本初子午线(0°经线)的交点

y轴指向:天体北极点

z轴指向:天体赤道与90°经线的交点

注:星球自转的时候,该参考系也随着星球一起旋转,故和星球的地表保持相对静止。

kRPC(二)参考系_WWW.XUNWANGBA.COM

尝试把这个参考系传到vessel.position里面:

会得到一组很大的数,这就是载具在这个参考系中的坐标(单位是米)

(159780.45515613444, -1018.041367139316, -578410.2647400706)

如果在游戏里移动一下载具,再次获取坐标,可以观察到数值发生变化。

尝试把这个参考系传到vessel.rotation里面:

会得到一组四元数,表示载具相对于这个参考系的姿态

(0.6947076985870788, 0.0541483458318239, 0.13507225300463907, -0.7044180122713716)

如果在游戏里旋转一下载具,再次获取姿态,可以观察到数值发生变化。

② vessel.surface_reference_frame(地面系)

原点位置:载具的质心

x轴指向:天顶(竖直向上)

y轴指向:地平圈的北方

z轴指向:地平圈的东方

kRPC(二)参考系_WWW.XUNWANGBA.COM

尝试把这个参考系传到vessel.position里面:

你会发现输出是(0, 0, 0),这是因为根据这个参考系的定义,原点就在载具质心上,所以载具在这个参考系中的始终与原点重合,坐标自然全是0。无论如何移动载具,结果都不会有变化。

尝试把这个参考系传到vessel.rotation里面:

会得到一组四元数,表示载具相对于地面系的姿态

(-0.4705658128076773, -0.47014719861673526, -0.527809485877349, 0.5281540054226154)

如果在游戏里旋转一下载具,再次获取姿态,可以观察到数值发生变化。

③ vessel.reference_frame(机体系)

原点位置:载具的质心

x轴指向:载具右方

y轴指向:载具前方

z轴指向:载具下方

kRPC(二)参考系_WWW.XUNWANGBA.COM

kRPC(二)参考系_WWW.XUNWANGBA.COM

这个图很重要,最好能刻在DNA里(

尝试把这个参考系传到vessel.position里面:

输出当然还是(0, 0, 0)

尝试把这个参考系传到vessel.rotation里面:

会得到一个非常接近于(0, 0, 0, ±1)的四元数。这也是显而易见的,因为这个参考系各个轴的方向始终与载具自身的方向锁定,所以载具相对于这个参考系的姿态永远都是固定的,无论如何旋转载具,结果都不会有变化。

kRPC(二)参考系_WWW.XUNWANGBA.COM

通过以上三个例子,我们可以体会到参考系选取的重要性。如果选错了参考系,可能会得到一个永远固定的值,对之后的计算没有任何意义。

kRPC(二)参考系_WWW.XUNWANGBA.COM

3.自定义参考系

kRPC提供的这几个参考系不一定能满足我们的日常需求。我们还可以在已有参考系的基础上利用相对变换或参考系的混合来创建出新的参考系。

(1)相对变换

space_center.ReferenceFrame.create_relative(reference_frame[, position = (0.0, 0.0, 0.0)][, rotation = (0.0, 0.0, 0.0, 1.0)][, velocity = (0.0, 0.0, 0.0)][, angular_velocity = (0.0, 0.0, 0.0)])

根据已有的某个参考系,创建出一个和它保持一定相对位置和姿态的新参考系。

position:新参考系在旧参考系下的相对位置

rotation:新参考系在旧参考系下的相对姿态

velocity:新参考系在旧参考系下的相对速度

angular_velocity:新参考系在旧参考系下的相对角速度

注:velocity和angular_velocity并不会让新参考系随着时间移动和旋转,只是当你在新参考系中获取载具速度和角速度的时候会被加上相应的增量。新参考系的原点位置和姿态总是相对与旧参考系固定。

kRPC(二)参考系_WWW.XUNWANGBA.COM

相对变换

(2)混合参考系

space_center.ReferenceFrame.create_hybrid(position[, rotation = None][, velocity = None][, angular_velocity = None])

将多个已有的参考系混合成一个新的参考系。

position:提供原点定位的参考系

rotation:提供姿态的参考系

velocity:提供速度的参考系

angular_velocity:提供角速度的参考系

kRPC(二)参考系_WWW.XUNWANGBA.COM

4.自定义参考系实例-着陆点参考系

在处理自动着陆问题时,通常将参考系原点设位着陆点,x轴竖直向上,y轴朝向北方,z轴朝向东方。这样直接在着陆点参考系中获取载具的速度和位置,得到的就是载具相对于着陆点的偏差,而且位置的x分量就是当前高度,便于计算。

假设着陆点的经度和纬度分别为lon和lat(单位度)(图中的绿点),那么着陆点参考系可以在地固系的基础上通过如下的相对变换得到:

kRPC(二)参考系_WWW.XUNWANGBA.COM

注:左手系中旋转方向按左手确定

以发射台的经度-74.5577,纬度-0.0972为例,可以通过以下代码建立发射台的着陆点参考系

接下来可以用以下代码在游戏中绘制出坐标系的坐标轴,直观地看到这个坐标系长什么样子:

kRPC(二)参考系_WWW.XUNWANGBA.COM

红、绿、蓝分别为x、y、z轴

接下来尝试一下在目标系中获取当前载具的位置

得到一组坐标

(1.8493274966667803, -0.039573418671747025, 0.19948541072083092)

容易看出,这表示火箭质心位于发射台上方1.849米的地方;后两个分量就是火箭相对于发射台中心的水平偏移。

回想一下之前我们直接从地固系获取的火箭坐标,对比可以发现,选取一个良好的坐标系可以让获得的数据更容易分析和解读。

kRPC(二)参考系_WWW.XUNWANGBA.COM

5.参考系间的坐标变换

上文介绍了参考系的选取。一般来说如果选定了一个好的参考系,就可以一直在一个参考系内获取各种数据并计算,不需要考虑坐标变换。不过有时候当问题比较复杂的时,会不可避免地需要从不同参考系中获取数据并在参考系之间转换。

一种方法是使用kRPC提供的函数

space_center.transform_position(position, from, to)

space_center.transform_direction(direction, from, to)

space_center.transform_rotation(rotation, from, to)

space_center.transform_velocity(position, velocity, from, to)

具体用法请看 

另外,如果遇到的坐标变换比较简单,可以直接从定义出发推导出变换的数学公式。这样所有计算都发生在python环境中,不涉及网络通信,效率比较高。

比如在已知载具在目标系下的姿态(四元数)的情况下,如果要从机体系将一个方向向量变换成目标系中的方向,只需要进行一次旋转变换,可以定义如下函数完成:

如果要反过来,从目标系变换到机体系,只需要把旋转矩阵转置即可(单位正交阵的转置=逆)

kRPC(二)参考系_WWW.XUNWANGBA.COM

思考题

1.已知VAB大楼楼顶停机坪中心点的经度为 -74.61739,纬度为 -0.09678,请构造出该点的着陆点参考系,并且画出来,观察结果是否正确。

2.请尝试将VAB大楼楼顶的着陆点参考系中的坐标(10, 0, 0)变换为发射台着陆点参考系中的坐标。

kRPC(二)参考系_WWW.XUNWANGBA.COM

kRPC(二)参考系)宝,都看到这里了你确定不收藏一下??

92%的人还看了