STK/Component/Cesium中的月球坐标系的计算

28 篇文章 47 订阅
10 篇文章 3 订阅

下图中,已如某飞行器在地球惯性系(ICRS或GCRS或ICRF)中T时刻的位置,那么如何求解此飞行器T时刻在月球坐标系下的位置(速度)?

显然,这个问题涉及到两个方面,一是月球相对地球的位置(即地月的星历),二是ICRS到月球坐标轴的转换。

在STK桌面软件、Stk Comonent算法库、Cesium中均涉及到月球坐标系,其实这三者本一家,内部的算法也基本一致,但是由于月球的特殊性导致在涉及到月球坐标系计算的时候常常搞不清。

月球坐标系主要指:月球惯性系(Moon Inertial)与月球固连系(Moon Fixed)
此外为了比较,定义了月球ICRS坐标系,即原点在月心,坐标轴与ICRS的坐标轴重合。

本文阐述在STK/Component/Cesium中有关月球坐标系计算的问题。
Moon Frame

STK

STK软件中,打开矢量工具可查看月球的坐标系主要有两种:Moon Inertial和Moon Fixed

STK中心天体cb等相关文件说明一文可知,在STK中,每一个中心天体都有其对应的配置文件(.cb文件),分别存放在其对应名称的文件夹中,并且在STK启动时加载。

对于月球,其cb文件缺省位于目录下:C:\Program Files\AGI\STK 12\STKData\CentralBodies\Moon\Moon.cb,打开后部分文件内容如下图,可知缺省情况下的参数配置:

  1. 月球的星历采用Jpl精密历表,目前是DE430。
  2. 月球的固连坐标系采用"MeanEarth(ME)“,而不是"PrincipalAxes(PA)”,有关ME和PA的定义和区别,本文不再展开,请读者自行查阅。
  3. MeanEarth坐标系的参数由Jpl DE430中定义,需要进行插值计算,为数值方法。
  4. 也可设置Moon Fixed为FIxed_IAU2003,此坐标系的参数由MoonAttitude2000.rot文件中定义,为解析方法,具体参数的定义来源于国际天文联合会(IAU)的报告"Report of the IAU/IAG Working Group on Cartographic Coordinates and Rotational Elements of the Planets and satellites: 2000"。IAU每三年对此报告进行更新,此报告主要描述太阳系行星以及它们的卫星、小天体以及彗星等自转轴的指向和自转参数。

Moon.cb

Stk Component

在Stk Component算法库中,提供了Jpl精密历表,月球Moon Fixed系的相关类,下面代码给出T时刻地球惯性系(ICRS)中的某点在月球三个坐标系下的计算过程。

    //  当前测试的时刻(UTCG)
    JulianDate t = new JulianDate(new GregorianDate(2020, 11, 23, 21, 6, 35.761));
                        
    //  STK中,某点在earth ICRF中的位置(STK)
    Cartesian r_stk_earthICRF = new Cartesian(-1.8087745223670499e+06, -6.2101045856704302e+06, -2.3931223275352502e+06);

    //  STK中,将上点转换到Moon不同坐标系下的数值:
    //  moon ICRF中的位置(STK)
    Cartesian r_stk_moonICRF = new Cartesian(-3.9577388635354376e+08, 3.8320783066947967e+07, 5.6969332431772619e+07);
    //  moon Inertial中的位置(STK)
    Cartesian r_stk_moonInertial = new Cartesian(-3.9727941178273672e+08, 3.8590773800480925e+07, 4.5064148976947613e+07);
    //  moon Fixed中的位置(STK)
    Cartesian r_stk_moonFixed = new Cartesian(3.9631923150127202e+08, 4.4511426953787886e+07, 4.7966196271462679e+07);
                   
    //=====================================================================================
    //  使用JPL精密历表De430               
    string filePath0 = AppDomain.CurrentDomain.BaseDirectory;
    string fp = Path.Combine(filePath0, @"Data/plneph.430");
    JplDE430 jplde = new JplDE430(fp);
    // Use the JplDE data in a CentralBodiesFacet
    CentralBodiesFacet centralBodies = CentralBodiesFacet.GetFromContext();
    jplde.UseForCentralBodyPositions(centralBodies);

    //  地球、月球
    EarthCentralBody earth = CentralBodiesFacet.GetFromContext().Earth;
    MoonCentralBody moon = CentralBodiesFacet.GetFromContext().Moon;

    //  使用JplDE 430中定义的月球Fixed系("Mean Earth")            
    moon.FixedFrame = jplde.GetMoonTopographicFixedFrame();

    //=====================================================================================
    //  创建地球ICRF系中的点
    var pos0 = new PointFixedOffset(earth.InertialFrame, r_stk_earthICRF);

    //  判断误差(0.01m)
    double ebsl = 0.01;

    //  在moon ICRF系下的位置(由于都是ICRF坐标轴,因此此处验证地月位置的正确性,采用Jplde430)
    //=====================================================================================
    ReferenceFrame moonIcrfFrame = new ReferenceFrame(moon.CenterOfMassPoint, earth.InternationalCelestialReferenceFrame.Axes);
    var r_moonICRF = GeometryTransformer.ObservePoint(pos0, moonIcrfFrame).Evaluate(t);
    Assert.AreEqual(r_stk_moonICRF.X, r_moonICRF.X, ebsl);
    Assert.AreEqual(r_stk_moonICRF.Y, r_moonICRF.Y, ebsl);
    Assert.AreEqual(r_stk_moonICRF.Z, r_moonICRF.Z, ebsl);

    //  在moon Inertial系下的位置(验证ICRF系转换到Moon Inertial系的正确性)
    //=====================================================================================
    var r_moonInertial = GeometryTransformer.ObservePoint(pos0, moon.InertialFrame).Evaluate(t);
    Assert.AreEqual(r_stk_moonInertial.X, r_moonInertial.X, ebsl);
    Assert.AreEqual(r_stk_moonInertial.Y, r_moonInertial.Y, ebsl);
    Assert.AreEqual(r_stk_moonInertial.Z, r_moonInertial.Z, ebsl);

    //  在moon Fixed系下的位置(验证ICRF系到Moon Fixed系的正确性)
    //  注意,此处Moon Fixed系为JplDE"Mean Earth" Axes
    //=====================================================================================
    var r_moonFixed = GeometryTransformer.ObservePoint(pos0, moon.FixedFrame).Evaluate(t);
    Assert.AreEqual(r_stk_moonFixed.X, r_moonFixed.X, ebsl);
    Assert.AreEqual(r_stk_moonFixed.Y, r_moonFixed.Y, ebsl);
    Assert.AreEqual(r_stk_moonFixed.Z, r_moonFixed.Z, ebsl);

Cesium

由于Cesium中以地球Fixed系为世界坐标系,太阳和月球仅仅是一个特殊的对象用来衬托背景的。因此,Cesium中有关月球的星历和坐标系的计算均为解析方法。当然,此解析方法计算太阳月球的位置的精度也足够精确了,但是相比于JPL精密历表仍有一定的差距。

月球的星历采用Simon1994解析方法。Cesium中的源文件为:Source\Core\Simon1994PlanetaryPositions.js。
计算月球在地心惯性系下的代码如下:

/**
 * Computes the position of the Moon in the Earth-centered inertial frame
 *
 * @param {JulianDate} [julianDate] The time at which to compute the Sun's position, if not provided the current system time is used.
 * @param {Cartesian3} [result] The object onto which to store the result.
 * @returns {Cartesian3} Calculated moon position
 */
Simon1994PlanetaryPositions.computeMoonPositionInEarthInertialFrame = function (
  julianDate,
  result
) {
  if (!defined(julianDate)) {
    julianDate = JulianDate.now();
  }

  result = computeSimonMoon(julianDate, result);
  Matrix3.multiplyByVector(axesTransformation, result, result);

  return result;
};

月球的地固系计算采用STK中的解析方法:FIxed_IAU2003(参见上面)。源代码文件为:
Source\Iau2000Orientation.js和IauOrientationAxes.js

下面代码为计算ICRF到月球Fixed系的转换的部分代码:

//  获取Moon IAU J2000的参数
var axes = new IauOrientationAxes(Iau2000Orientation.ComputeMoon);
//  计算date时刻的ICRF->Moon Fixed的转换矩阵
axes.evaluate(date, result);

Cesium中,没有直接函数计算一个点在月球Fixed系下的位置,此外,Cesium中也没有ICRF到月球惯性系的转换方法。

小节

从上面分析可以看出。STK软件和Stk Component算法库基本一致,都可采用Jpl DE430精密历表计算月球的Fixed坐标系,也提供月球惯性系(Inertial)。

而Cesium中,仅仅有ICRF系到月球Fixed系的转换方法(IAU 2000解析方法),和月球在地球惯性系下的位置方法(Simon1994解析方法)。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于STK(Systems Tool Kit)和MATLAB的航天器可见性仿真分析可以用于评估航天器与地面站之间的可见性,从而确定通信和数据传输的时间窗口。 STK是一款强大的航天器运行仿真软件,它可以建模和模拟地球上的物理和天文现象,包括轨道运动、大气层影响、地球自转等。MATLAB则提供了强大的编程和数据分析功能。通过将两者结合使用,我们可以对航天器与地面站之间的可见性进行仿真分析。 首先,我们需要在STK创建航天器的轨道模型,包括距离地球的高度、轨道形状、倾角等参数。然后,我们可以将地面站的位置信息导入STK,以确定地面站的经纬度、高度和通信参数。 接下来,我们可以使用MATLAB编写脚本来与STK进行交互。通过STK的API接口,我们可以获取航天器与地面站之间的相对位置和角度信息。使用这些信息,我们可以计算航天器与地面站之间的可见性。 在仿真过程,我们可以设定特定的时间范围,并在每个时间点上通过计算航天器与地面站之间的角度来确定它们是否可见。通过分析得到的可见性数据,我们可以评估航天器与地面站之间的可见性情况,并确定通信和数据传输的可行时间窗口。 除了可见性分析,我们还可以基于STK和MATLAB进行其他分析,比如计算航天器与地面站之间的最短距离、飞行时间等参数,以便进行更详细的仿真和分析。 总之,基于STK和MATLAB的航天器可见性仿真分析可以为航天器的通信和数据传输提供重要的参考信息,对于航天器的轨道设计和任务规划具有重要的意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值