跳转到内容

Celestia/SPICE

来自维基教科书,开放世界中的开放书籍

使用 SPICE 与 Celestia

[编辑 | 编辑源代码]

SPICE 是 NASA 开发的一套软件套件,用于进行规划星际任务所需的几何计算。SPICE 被 NASA、ESA、JAXA 和其他太空机构的任务团队使用。大多数版本的 Celestia 都内置了 SPICE 库,使 Celestia 能够直接使用来自太空任务的导航数据。

目标受众

[编辑 | 编辑源代码]

本教程面向两组人群

  • 希望使用 Celestia 进行可视化的任务操作员和科学家
  • 有经验的 Celestia 用户,他们对太空任务的非常精确的重建感兴趣

那些已经熟悉 SPICE 的人可以跳过“SPICE 简介”部分。

SPICE 简介

[编辑 | 编辑源代码]

对 SPICE 的深入讨论超出了本教程的范围,但了解一些概念足以使本教程的大部分内容易于理解。SPICE 内核文件包含与太空任务相关的不同类型的数据。SPK 文件(通常扩展名为 bsp)用于计算航天器、行星或其他天体的 位置。单个 SPK 文件可能包含多个天体的 数据。查找相对于某个其他物体的天体的位置可能需要多个内核。例如,一个 SPK 文件可能包含卡西尼相对于土星的位置。第二个 SPK 内核可能给出行星相对于太阳的位置。为了计算卡西尼的日心位置,我们需要这两个内核。内核文件具有涵盖有限时间跨度的轨道或轨迹文件。对于航天器,任务通常被分成几个内核,每个内核涵盖不同的任务阶段。您下载 SPK 文件的站点应该有一些 README 文件来描述每个文件的来源和时间覆盖范围。

NAIF 主站上提供了有关 SPICE 的大量文档

http://naif.jpl.nasa.gov/naif/

NAIF 站点是寻找许多太空任务(包括目前在运行的任务和历史任务)的 SPICE 内核的好地方

http://naif.jpl.nasa.gov/naif/data.html

Celestia 简介

[编辑 | 编辑源代码]

Celestia 从 .ssc(太阳系目录)文件中加载有关太阳系天体(包括行星、天然卫星、小行星和航天器)的信息。每个 ssc 文件都是一个或多个天体定义的列表。太阳系天体具有轨迹、旋转模型和与其外观相关的属性集合(因为 Celestia 毕竟是视觉模拟)。轨迹和旋转模型指定天体在一系列时间内的位置和方向。轨迹信息的可能来源包括开普勒元素、硬编码计算(例如 VSOP87)以及当然还有 SPICE 内核。旋转模型类型的列表类似。

简单示例

[编辑 | 编辑源代码]

这是一个示例的太阳系天体定义

Body "Earth" "Sun"
{
    Texture "earth.*"
    Radius 6378.140  # equatorial
    Oblateness 0.0034
 
    CustomOrbit "vsop87-earth"
    CustomRotation "earth-p03lp"
}

此示例定义了一个名为地球的天体,它绕太阳运行。内置计算用于地球的轨迹和旋转。这些特定的内置计算假设坐标系是日心 J2000 黄道系统。事实上,这是 Celestia 中日心物体的默认系统。但是,我们可以通过添加 OrbitFrame 和 BodyFrame 定义来明确说明这一点

Body "Earth" "Sun"
{
    Texture "earth.*"
    Radius 6378.140  # equatorial
    Oblateness 0.0034

    OrbitFrame { J2000Ecliptic {} }  
    CustomOrbit "vsop87-earth"
    BodyFrame { J2000Ecliptic {} }
    CustomRotation "earth-p03lp"
}

在这里,轨迹和方向的框架设置为相同。但是,如果需要,我们可以使 BodyFrame 不同于轨道框架。这对航天器很有用,在航天器中,指定局部垂直/局部水平系统可能更有意义。

航天器示例

[编辑 | 编辑源代码]

本教程将逐步介绍将一个具有 SPICE 计算的位置和姿态的新航天器对象引入 Celestia 的过程。我们将使用 深度撞击 任务作为示例。从 NAIF 站点可以下载该任务所需的所有 SPICE 内核

ftp://naif.jpl.nasa.gov/pub/naif/DEEPIMPACT/kernels/

首先要做的是为深度撞击插件创建一个新文件夹。在 Celestia 的 extras 文件夹中创建一个名为 deepimpact 的文件夹。然后,在 deepimpact 中创建名为 data 和 models 的子文件夹。文件夹结构应如下所示

extras/
   deepimpact/
       data/
       models/

深度撞击任务的 ssc 文件将放在 deepimpact 文件夹中。models 文件夹将包含一个表示航天器的 3D Studio 网格文件。最后,所有必要的 SPICE 内核文件将放在 data 中。

获取 SPICE 内核文件

[编辑 | 编辑源代码]

我们需要执行该任务的第一个文件是 SPK 文件。这些文件可以在 SPK 目录中找到

ftp://naif.jpl.nasa.gov/pub/naif/DEEPIMPACT/kernels/spk/aareadme.txt

该目录中有很多内核,但幸运的是,大多数是不必要的。aareadme.txt 文件有帮助地说明了哪些内核文件是必要的。

  NOTE 4: The following four of these SPKs should be loaded in
  this order to make sure that the best trajectory solutions are
  available to the calling application at any given time:

     dii_preenc174_nav_v1.bsp
     dif_preenc174_nav_v1.bsp
     di_tempel1_ssd_v1.bsp
     di_finalenc_nav_v3_to2006048.bsp

该说明还指定了文件的加载顺序。我们稍后将注意这一点。现在,只需将四个 .bsp 文件复制到深度撞击任务插件的 data 子文件夹中。

彗星轨迹

[编辑 | 编辑源代码]

我们将从创建一个表示 Tempel 彗星 9P/ 的新 Celestia 对象开始。虽然我们可以在单独的 ssc 文件中定义彗星,但我们将保持一致,并在一个名为 deepimpact.ssc 的文件中定义与深度撞击任务相关的所有对象。以下是用开普勒元素定义 Tempel 彗星 9P/ 的轨迹的定义

Body "9P Tempel" "Sol"
{
    Class "comet"
    SemiAxes [ 3.1 2.1 2.1 ]
    Texture "asteroid.jpg"

    EllipticalOrbit {
        Epoch                "2005 7 4 00:00:00"
        Period               5.51521370
        SemiMajorAxis        3.121543768
        Eccentricity         0.517493300
        Inclination         10.530163779
        AscendingNode       68.938123883
        ArgOfPericenter    178.837987181
        MeanAnomaly        359.765094570
    } 
}

轨道元素是从 HORIZONS 导出的。如果您有一个物体的 SPICE 内核,则没有必要从轨道元素开始。这样做只是为了说明如何更改对象定义以添加 SPICE 轨迹。

转换为 SPICE

[编辑 | 编辑源代码]

SPK 目录中的 README 文件列出了深度撞击任务所需的四个 SPK 文件。同一个文件还建议了加载文件的顺序。顺序很重要,因为当存在多个对特定时间有效的物体轨迹段时,最后加载的段优先。Celestia 始终以 SSC 文件中列出的顺序加载 SPICE 文件。README 没有提到执行该任务所需的另外两个内核文件:di_tempel1_v01.tpc 和 di_v17.tf。这两个文件共同定义了 Tempel 1 彗星的 SPICE 框架。该框架用于深度撞击的轨迹,恰好在撞击时间前后。仔细阅读附带一组 SPICE 内核的文档通常是必要的,以便了解应该使用哪些内核文件。

以下是用开普勒轨道替换为 SPICE 轨道的 Tempel 1

Body "9P Tempel" "Sol"
{
    Class "comet"
    SemiAxes [ 3.1 2.1 2.1 ]
    Texture "asteroid.jpg"

    SpiceOrbit {
        Kernel [
            "dii_preenc174_nav_v1.bsp"
            "dif_preenc174_nav_v1.bsp"
            "di_tempel1_ssd_v1.bsp"
            "di_finalenc_nav_v3_to06048.bsp"
            "di_tempel1_v01.tpc"
            "di_v17.tf"
        ]

        Origin "SUN"
        Target "TEMPEL 1"
        BoundingRadius 10
    }
}

我们使用了四个参数来定义 SpiceOrbit。内核文件列表首先出现。Celestia 将从插件的 data 目录中加载这些内核文件。它将忽略已经加载的内核,因此在每个需要它的对象的定义中重复内核列表是无害的。但是,这意味着如果内核文件名发生更改,则必须更新多个对象。Origin 和 target 都是 NAIF 名称或 ID。我们可以使用 NAIF ID 代码 1000093,而不是“TEMPEL 1”。名称更清晰,因此在可用时更受欢迎。SPICE origin 必须与 Celestia origin 相匹配。在 Celestia 中,origin 由轨道框架中心给出;如果没有明确指定轨道框架(如我们的示例中),则默认框架以父对象为中心。在我们的示例中,太阳是父对象。

BoundingRadius 字段给出以 origin 为中心的球体的半径,该球体足够大,可以完全包含轨道。Celestia 使用此信息来优化渲染;有了它,Celestia 可以进行非常快速的检查,以查看物体是否可能可见。设置过小的 BoundingRadius 值可能会导致物体在应该可见时消失。使其过大不会产生可见的副作用,但可能会迫使 Celestia 进行额外的计算。没有必要太精确——过大两倍的边界半径不应该会导致任何性能问题。另一方面,应该避免将所有边界半径设置为极大的值,例如 1000 AU。与 Celestia 中的其他距离一样,BoundingRadius 的单位对于日心物体为 AU,对于其他所有物体为公里。

航天器轨迹

[编辑 | 编辑源代码]

现在我们已经找到了任务中涉及的物体轨迹所需的内核文件,添加飞越航天器就非常直观了。

Body "Deep Impact" "Sol"
{
    Class "spacecraft"
    Radius 0.003
    Mesh "DeepImpact2.3ds"

    SpiceOrbit {
        Origin "SUN"
        Target "DEEP IMPACT FLYBY SPACECRAFT"
        BoundingRadius 10
    }
}

内核文件被省略,因为它们已经加载到坦普尔1号的定义中。与彗星的 SpiceOrbit 唯一不同的是,我们更改了目标对象的名称。

航天器姿态

[编辑 | 编辑源代码]

显示航天器的准确姿态比获得正确的轨迹要困难一些。主要的任务可能是找到所有必要的内核文件。对于航天器,通常需要四种类型的内核文件。

  • 一个或多个 C 内核,给出航天器在不同时间的方位
  • 一个文本框架内核,为航天器定义一个 SPICE 框架
  • 一个航天器时钟 (SCLK) 内核,用于将 UTC 转换为航天器时钟时间
  • 一个闰秒内核,用于将星历时间转换为 UTC

一旦将所需的内核文件安装到附加组件的数据目录中,我们只需要用 SpiceRotation 替换航天器现有的旋转模型(如果有的话)。语法与 SpiceOrbit 非常相似。

SpiceRotation {
    Kernel [
        "dif_sc_050112_050809.bc"
        "di_v17.tf"
        "DIF_SCLKSCET.00036.tsc"       
        "naif0009.tls"
    ]
    Frame "DIF_SPACECRAFT"
    BaseFrame "eclipj2000"
}

请注意,有四个内核文件列表:C 内核、文本框架内核、航天器时钟内核和闰秒内核。框架内核实际上不是必需的,因为它已经在 SpiceOrbit 中加载了。但是,这里仍然列出它,因为这是一个教程,在更典型的情况下,.tf 文件将出现在轨迹的内核列表中。Frame 给出为航天器定义的 C 内核框架的名称。BaseFrame 应该设置为 SPICE 等效于 Celestia 中对象的 BodyFrame 的内容。Celestia 中绕太阳运行的物体的默认 BodyFrame 是 J2000 黄道。这与 SpiceRotation 的默认 BaseFrame 相匹配:eclipj2000。尽管如此,明确指定这两个框架仍然是一个好主意。这是一种情况下,Celestia 的默认值可能会令人困惑:对于绕除恒星以外的东西运行的物体,默认的 BodyFrame 是*父对象的赤道框架*。这在使用 SPICE 时很少是你想要的!

调试 SpiceRotation

[编辑 | 编辑源代码]

使用 SPICE 定位航天器时,可能出现很多问题。如果重新启动 Celestia 后发现航天器指向错误的方向,请检查以下事项。

  • 按波浪号键 (~) 调出 Celestia 的控制台日志。查看是否有任何 SPICE 错误滚动经过,可能表明缺少一些必需的内核文件。如果没有,按向上箭头键滚动查看日志中的先前内容。查看加载附加组件时是否发生任何错误。
  • 确保没有忘记闰秒内核或框架内核。
  • 验证 SPICE 框架是否与对象的 Celestia 框架匹配(即 BaseFrame 适用于对象的 BodyFrame)。
  • 检查航天器的 3D 网格在机体框架中是否正确定向。航天器右键弹出菜单中的“参考矢量/机体轴”选项在此处*非常*有用。

添加撞击器

[编辑 | 编辑源代码]

SPICE 行星

[编辑 | 编辑源代码]

我们现在将把地球示例转换为使用 SPICE 内核来获取地球的轨道。SPICE 内核 de421.bsp 可以从 NAIF FTP 站点下载

ftp://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets/

华夏公益教科书