跳转到内容

Celestia/轨迹

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

Celestia 中对象的轨道和轨迹是预定义的。它们定义在 Celestia 启动时加载。

Celestia 不计算任何引力效应。所有引力效应都必须包含在轨道和轨迹定义中。引力效应已包含在 Celestia 的 VSOP87 CustomOrbits 和 JPL DE405 星历文件中,这些文件可用于 CustomOrbits,以及 NASA 的 SPICE 星历文件中,这些文件可用于 SpiceOrbits,以及 Celestia 中包含的航天器的 SampledOrbits。

在许多情况下,Celestia 假设一个物体将始终在同一时间处于同一位置。周期性轨道为它们绘制了轨道路径。

CustomOrbitEllipticalOrbitSampledOrbit 指令被所有版本的 Celestia 识别。FixedPositionSpiceOrbitScriptedOrbit 是新的指令,需要 Celestia v1.5.0 或更高版本。

默认情况下,如果 SSC 或 STC 物体绕恒星或 STC 重心运行,则轨迹相对于我们太阳系的 J2000 黄道面定义。如果 SSC 物体绕另一个 SSC 物体运行,则其轨迹相对于母体 J2000 赤道定义。在 Celestia v1.5.0 或更新版本中,您还可以选择在 SSC 目录 中指定许多其他 参考系 之一。这些新的轨道和参考系指令尚未在 STC 文件 中识别。

以下是 SSC 文件中识别的轨道和轨迹指令列表。更多信息可在页面 Celestia/SSC File 上找到。

FixedPosition

[编辑 | 编辑源代码]

需要 Celestia 1.5.0

FixedPosition 轨迹类型使物体中心在其 参考系 中保持静止。

用法

FixedPosition [ <x> <y> <z> ]

坐标单位对于绕恒星或重心运行的物体为天文单位,对于所有其他物体为公里。

替代用法 (需要 Celestia 1.6.0)

使用球面坐标而不是直角坐标来指定固定位置可能很方便,因此 Celestia 提供了 FixedPosition 的另一种形式

FixedPosition
{
    Planetographic [ <longitude> <latitude> <altitude> ]
}

经度和纬度以度为单位;高度是高于母体表面以公里为单位的高度。

EllipticalOrbit

[编辑 | 编辑源代码]

EllipticalOrbit 可以用于 SSC 文件STC 文件 中。

用法

EllipticalOrbit
{
    Period <number>

    SemiMajorAxis <number>
    PericenterDistance <number>

    ArgOfPericenter <degrees> 
    LongOfPericenter <degrees> 

    MeanAnomaly <degrees> # default: 0
    MeanLongitude <degrees>

    Eccentricity <number> # default: 0

    Inclination <degrees> # default: 0.0

    AscendingNode <degrees> # default = 0.0 

    Epoch <date> # default: J2000.0
}

有效的 EllipticalOrbit 需要指定 PeriodSemiMajorAxis(或 PericenterDistance)。所有其他属性都有默认值,是可选的。

对于绕恒星或重心运行的物体,轨道周期以地球年为单位给出,对于所有其他物体,以地球太阳日为单位给出。

一些轨道参数可以用两种不同的方式指定。

SemiMajorAxis

[编辑 | 编辑源代码]

轨道的大小可以用 SemiMajorAxisPericenterDistance 来给出。后者对于双曲线轨道更直观。如果同时指定 SemiMajorAxisPericenterDistanceSemiMajorAxis 将覆盖 PericenterDistanceSemiMajorAxisPericenterDistance 的单位对于绕恒星或重心运行的物体为天文单位,对于所有其他物体为公里。

ArgOfPericenter

[编辑 | 编辑源代码]

近心点角由 ArgOfPericenterLongOfPericenter 给出。ArgOfPericenter 从升交点测量,而 LongOfPericenter 从基本方向测量。如果同时指定 ArgOfPericenterLongOfPericenterArgOfPericenter 将覆盖 LongOfPericenter

MeanAnomaly

[编辑 | 编辑源代码]

物体在 Epoch 时的轨道位置由 MeanAnomalyMeanLongitude 给出。MeanAnomaly 从近心点角测量,而 MeanLongitude 从基本方向测量。如果同时指定 MeanAnomalyMeanLongitudeMeanAnomaly 将覆盖 MeanLongitude

偏心率

[编辑 | 编辑源代码]

决定轨道的形状。事实上,名称 EllipticalOrbit 有点误导,因为轨道可能是圆形、椭圆形、抛物线形或双曲线形,具体取决于偏心率

  • 偏心率 = 0 – 圆形
  • 0 < 偏心率 < 1 – 椭圆形
  • 偏心率 = 1 – 抛物线形
  • 偏心率 > 1 – 双曲线形

如果没有提供 Eccentricity,则假设为圆形。

可选地用于指定轨道相对于其参考平面的倾斜程度。默认情况下,该平面是对于绕恒星或重心运行的物体的黄道面,以及对于所有其他物体的母体赤道。从 Celestia v1.5.0 开始,可以指定许多不同的参考平面。有关详细信息,请参见 参考系。如果没有指定 Inclination,则假设值为 0 度。

升交点

[编辑 | 编辑源代码]

可选地定义轨道中物体穿过参考平面“向上”或“向北”运动时的经度。它从基本方向以度为单位测量。如果没有指定 AscendingNode,则假设值为 0 度。

可选地指定这些参数有效的日期。它可以以数字或引号字符串的形式提供。数字被解释为儒略日。引号字符串被解释为格里高利日期,格式为“<year> <month> <day> <hours>:<minutes:<seconds>”,例如“2007 10 09 12:13:14”。如果省略 Epoch,则假设日期为 2000 年 1 月 1 日。

从 Celestia v1.5.0 开始,Epoch 必须以 TDB 指定。有关 TDB 和 UTC 的更多信息,请参见 Celestia/时间尺度

CustomOrbit

[编辑 | 编辑源代码]

CustomOrbit 是 Celestia 中内置的轨道计算。所有主要行星和大多数较大卫星的轨道理论都可用。有效的标准 CustomOrbit 名称列在下面。从 Celestia v1.5.0 开始,可以提供 JPL DE405 星历。有关详细信息,请参见 JPL 星历CustomOrbit 优先于 EllipticalOrbit,但指定了无法识别的名称的 CustomOrbit 将被忽略。

用法

CustomOrbit <name>

示例

CustomOrbit "vsop87-venus"

以下列表列出了 Celestia 1.5.0 中所有可用的 CustomOrbit

VSOP87(Variations Séculaires des Orbites Planétaires)是 P. Bretagnon 等人提出的主要行星轨道理论。Celestia 并未使用所有项。作为 VSOP87 的更高精度替代方案,可以使用JPL 星历表 来模拟主要行星、冥王星、月球和太阳的轨道。

  • vsop87-mercury
  • vsop87-venus
  • vsop87-earth
  • vsop87-mars
  • vsop87-jupiter
  • vsop87-saturn
  • vsop87-uranus
  • vsop87-neptune
  • vsop87-sun(太阳绕太阳系质心运行的轨道)

需要参考文献

  • pluto

伽利略卫星

[编辑 | 编辑源代码]

来自 J. H. Lieske 在 Jean Meeus 的《天文算法》中提出的“E5”理论,第 301-315 页。

  • io
  • europa
  • ganymede
  • callisto

土星卫星

[编辑 | 编辑源代码]

来自 Gérard Dourneau (1987) 的“土星八颗主要卫星的观测和运动研究”。

  • mimas
  • enceladus
  • tethys
  • dione
  • rhea
  • titan
  • hyperion
  • iapetus

天王星卫星

[编辑 | 编辑源代码]

来自 Laskar 和 Jacobson (1978) 的“天王星卫星的解析星历表”。

  • miranda
  • ariel
  • umbriel
  • titania
  • oberon

需要参考文献

  • moon

SampledTrajectory

[编辑 | 编辑源代码]

此功能仅在 Celestia v1.5.0 或更高版本中可用。

SampledTrajectory 用于导入包含时间戳和位置列表(或可选地,包含速度的位置)的 ASCII 文件。通常,此类文件由轨迹建模和分析软件生成。

SampledTrajectory
{
    Source <filename>
    DoublePrecision <boolean>
    Interpolation <string>
} 

Source 属性是必需的,而其他属性是可选的。Source 文件的内容与 SampledOrbit 文件相同。当前,插值的有效值为“linear”和“cubic”,默认值为 cubic。DoublePrecision 默认值为 true。以下两个轨迹是等效的

SampledTrajectory
{
    Source "file.xyz"
    DoublePrecision false
    Interpolation "cubic"
}
SampledOrbit "file.xyz"

只要精度很重要,就应使用 DoublePrecision 为 true 的 SampledTrajectory。单精度浮点数的精度只有大约八百万分之一;对于外太阳系的星际轨迹,这意味着数百公里的误差。

采样轨迹文件是时间和位置记录的列表。以下是伽利略轨迹文件的摘录

2447818.615972 134114700.2612462193 64912642.6984842718 39861.799941
2447819.615972 133153386.7785827518 66969511.3118158504 237125.784089
2447820.615972 132137795.3581911474 69024279.8844281882 418499.867572
2447821.615972 131079666.1268854141 71061806.8872888833 596914.157647

每行上的第一个值是儒略日(TDB),最后三个值是公里为单位的位置。位置的参考系在 ssc 文件中给出。默认情况下,Celestia 使用一种称为三次埃尔米特插值的技巧来实现点之间平滑的运动。


Celestia 1.6.0 添加了对位置和速度轨迹文件的支持。这些文件扩展名为 xyzv,并且可以像 xyz 文件一样在 SampledTrajectory 中使用

SampledTrajectory { Source "trajectory.xyzv" }

xyzv 文件中的记录与 xyz 文件中的记录具有相同的布局,只是在每个位置后附加了三个速度值。速度单位是公里每秒。对于给定的文件大小,xyzv 文件提供了更准确的物体定位。因此,如果可以获得物体的速度和位置,则始终应首选 xyzv 文件而不是 xyz 文件。

HORIZONS 的 Web 接口可用于生成具有速度和位置的轨迹。Celestia 还提供了一个名为 spice2xyzv 的新工具,它可以根据一个或多个 SPICE 内核生成 xyzv 文件。

SampledOrbit

[编辑 | 编辑源代码]

SampledOrbit 已被弃用;SampledTrajectory 更灵活,并提供相同的功能。

SampledOrbit 用于导入时间和相关坐标文件。

用法

SampledOrbit <name>

示例

SampledOrbit "galileo.xyz"

该文件必须位于与物体关联的名为data的目录中。

该文件必须包含 4 个数字值的集合,这些集合定义了物体轨迹上的位置。各个值必须用空格、制表符或行终止符分隔。Celestia 读取每组的 4 个值,并且不关心用于分隔它们的“空白”是什么。该文件每行可以包含一个数字,或者该文件中的所有数字都可以位于同一行上。

每组数字由一个TDB 儒略日和以公里为单位的 x、y 和 z 位置组成。它们是在与物体关联的坐标系内的位置。例如,默认情况下,绕太阳运行的宇宙飞船的 SampledOrbit 将包含日心黄道 J2000 坐标。在 Celestia v1.5 中,可以指定各种参考系。有关详细信息,请参见Celestia/Reference_Frames

局限性

尽管可以以任何精度提供 x、y 和 z 坐标,但 Celestia 将它们存储为单精度(32 位)浮点数。Celestia 的 V1.5.0 版本将双精度实现为单独的选项。请参见上面的 SampledTrajectory。

SpiceOrbit

[编辑 | 编辑源代码]

需要 Celestia 1.5.0

SpiceOrbit 用于将来自 NASA SPICE 航天器信息系统的轨迹导入 Celestia。并非所有版本的 Celestia 都支持 SPICE。

用法

SpiceOrbit
{
    Kernel <filename>
    Target <ID string>
    Origin <ID string>
    Beginning <date>
    Ending <date>
    BoundingRadius <number>
    Period <number>
}

Kernel 属性指定要加载的 SPICE 内核 (SPK) 文件的名称。Celestia 预计内核文件位于加载项的数据目录中。

Target 是您要在 Celestia 中放置的物体的 NAIF ID 代码。代码列表可以在此处找到:http://www.gps.caltech.edu/~marsdata/req/naif_ids.html

可以使用整数 ID 或名称。如果内核文件不包含指定物体 ID 的轨迹,则将忽略 SpiceOrbit。轨迹坐标相对于 Origin 物体的坐标,由另一个 NAIF ID 代码指定。它必须与参考系的原点匹配。SpiceOrbit 的坐标系是 J2000 平均黄道和春分点。这与 Celestia 用于绕太阳运行的物体的默认参考系相匹配,但不与其他物体的参考系相匹配。对于不绕太阳运行且其轨迹由 SpiceOrbit 定义的物体,您必须显式指定黄道参考系

OrbitFrame
{
    EclipticJ2000 { Center <object name> }
}

BeginningEnding 限定了 SPICE 轨迹有效的时段。这些值可以是数字儒略日或公历日期字符串。这些时间必须在 SPICE 内核中指定的边界时间内。

为了使剔除工作正常,需要提供轨道的 BoundingRadiusPeriod 是可选的;Celestia 仅将它用于轨道路径渲染。如果将其设置为零或根本没有给出,则假定轨道是无周期轨迹。BoundingRadiusPeriod 的单位是 AU 和年(对于直接绕恒星运行的物体),以及公里和地球太阳日(对于其他物体)。使用两种不同的单位是为了与其他 Celestia 轨迹类型保持一致。

示例:冥王星

[编辑 | 编辑源代码]

此示例使用冥王星轨道的 SPICE 内核。请注意,原点“SUN”与参考系的中心匹配,此处由父物体给出。

"Pluto" "Sol"
{
    SpiceOrbit
    {
         Kernel "de403_2000-2020.bsp"
         Target "Pluto Barycenter"
         Origin "SUN"
         Beginning "2000 1 1"
         Ending "2020 1 1"
         BoundingRadius 40
         Period 248.0
    }
}

ScriptedOrbit

[编辑 | 编辑源代码]

需要 Celestia 1.5.0

ScriptedOrbit 用于使用 Lua 脚本创建自定义轨迹函数。

用法

ScriptedOrbit
{
    Module <string>
    Function <string>

    ...additional properties...
}

Module 给出了将通过 Lua 的 require 方法加载的包的名称。它在标准路径列表中搜索具有指定名称的脚本文件。加载项的 ScriptedOrbit 的 Module 文件应位于加载项主目录中的名为 celxx 的目录中。Function 是一个工厂函数的名称,该函数生成一个包含轨道属性的表,包括一个返回特定时间位置的函数。除 ModuleFunction 之外的所有 ScriptedOrbit 属性都将传递给 Lua 函数以创建轨道对象。函数名称是唯一必需的参数。

要创建自己的 ScriptedOrbit,您需要对 Celestia 的 celx 脚本中使用的 Lua 脚本语言有所了解。ScriptedOrbit 定义中指定的 Lua 函数是一个工厂函数,在解析 ScriptedOrbit 后立即调用该函数。工厂函数接受一个包含来自 ScriptedOrbit 定义的所有属性的单个表参数。该函数必须返回一个 Lua 轨道对象,它只是一个包含几个标准字段的表。它们是

  • boundingRadius - 一个表示轨迹到原点的最大距离的数字;必须存在,并且必须是正值。
  • period - 一个表示轨道周期的数字。如果不存在,则假定轨道是无周期的。轨道周期仅用于绘制轨道路径。
  • beginDate, endDate - 可选值,用于指定轨道有效的时段。如果没有给出,则假设轨道在任何时间都可用。如果 end < begin,则轨道无效。
  • position(time) - 位置函数接收一个时间值作为输入(TDB 儒略日),并必须返回三个值,分别为 x、y 和 z 坐标。位置的单位为公里。

ScriptedOrbit 有一些限制。唯一允许的参数是简单类型:字符串、数字和布尔值。数组和属性列表等复杂类型不会传递给 Lua 工厂函数。此限制可能会在 Celestia 的未来版本中消失。此外,Celestia 预计位置函数对于相同的时间值始终返回相同的位置。

ScriptedOrbit 示例

[编辑 | 编辑源代码]

以下是在 .ssc 文件中使用 ScriptedOrbit 的示例。

"Scripted" "Sol/Test Object"
{
    Radius 500

    ScriptedOrbit
    {
        Module "orbits"
        Function "lissajous"

        PeriodX 1
        PeriodY 3.1
        PeriodZ 2.4
        PhaseX 0.5
        PhaseY 0.2
        PhaseZ 0.0
        AmplitudeX 1000
        AmplitudeY 800
        AmplitudeZ 540
    }
}

上面的 ssc 代码片段告诉 Celestia 加载名为 orbits.lua 的文件并调用函数 lissajous 创建一个新的脚本轨道对象。其余属性将作为表的字段全部传递给 lissajous 函数。接下来,实际的 Lua 函数

function lissajous(t)
   -- Create a new table
   local orbit = {};

   -- Save the parameter list 
   orbit.params = t;

   -- Set the required fields boundingRadius and position; note that position is actually a function

   -- Compute the bounding radius from the amplitudes
   orbit.boundingRadius =
       math.sqrt(t.AmplitudeX * t.AmplitudeX +
                 t.AmplitudeY * t.AmplitudeY +
                 t.AmplitudeZ * t.AmplitudeZ)

   -- The position function will be called whenever Celestia needs the position of the object
   function orbit:position(tjd)
       local t = tjd - 2451545.0
       local pi2 = math.pi * 2;
       local x = self.params.AmplitudeX * math.sin((t / self.params.PeriodX + self.params.PhaseX) * pi2)
       local y = self.params.AmplitudeY * math.sin((t / self.params.PeriodY + self.params.PhaseY) * pi2)
       local z = self.params.AmplitudeZ * math.sin((t / self.params.PeriodZ + self.params.PhaseZ) * pi2)

       return x, y, z
    end

    return orbit
end 

Lissajous 函数可以使用不同的 ScriptedOrbit 属性反复使用。只要您知道预期哪些参数,您就可以使用其他人编写的轨道脚本,而无需自己编写任何代码。

华夏公益教科书