Celestia/轨迹
Celestia 中对象的轨道和轨迹是预定义的。它们定义在 Celestia 启动时加载。
Celestia 不计算任何引力效应。所有引力效应都必须包含在轨道和轨迹定义中。引力效应已包含在 Celestia 的 VSOP87 CustomOrbits 和 JPL DE405 星历文件中,这些文件可用于 CustomOrbits,以及 NASA 的 SPICE 星历文件中,这些文件可用于 SpiceOrbits,以及 Celestia 中包含的航天器的 SampledOrbits。
在许多情况下,Celestia 假设一个物体将始终在同一时间处于同一位置。周期性轨道为它们绘制了轨道路径。
CustomOrbit、EllipticalOrbit 和 SampledOrbit 指令被所有版本的 Celestia 识别。FixedPosition、SpiceOrbit 和 ScriptedOrbit 是新的指令,需要 Celestia v1.5.0 或更高版本。
默认情况下,如果 SSC 或 STC 物体绕恒星或 STC 重心运行,则轨迹相对于我们太阳系的 J2000 黄道面定义。如果 SSC 物体绕另一个 SSC 物体运行,则其轨迹相对于母体 J2000 赤道定义。在 Celestia v1.5.0 或更新版本中,您还可以选择在 SSC 目录 中指定许多其他 参考系 之一。这些新的轨道和参考系指令尚未在 STC 文件 中识别。
以下是 SSC 文件中识别的轨道和轨迹指令列表。更多信息可在页面 Celestia/SSC File 上找到。
需要 Celestia 1.5.0
FixedPosition 轨迹类型使物体中心在其 参考系 中保持静止。
用法
FixedPosition [ <x> <y> <z> ]
坐标单位对于绕恒星或重心运行的物体为天文单位,对于所有其他物体为公里。
替代用法 (需要 Celestia 1.6.0)
使用球面坐标而不是直角坐标来指定固定位置可能很方便,因此 Celestia 提供了 FixedPosition 的另一种形式
FixedPosition { Planetographic [ <longitude> <latitude> <altitude> ] }
经度和纬度以度为单位;高度是高于母体表面以公里为单位的高度。
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 需要指定 Period 和 SemiMajorAxis(或 PericenterDistance)。所有其他属性都有默认值,是可选的。
对于绕恒星或重心运行的物体,轨道周期以地球年为单位给出,对于所有其他物体,以地球太阳日为单位给出。
一些轨道参数可以用两种不同的方式指定。
轨道的大小可以用 SemiMajorAxis 或 PericenterDistance 来给出。后者对于双曲线轨道更直观。如果同时指定 SemiMajorAxis 和 PericenterDistance,SemiMajorAxis 将覆盖 PericenterDistance。SemiMajorAxis 和 PericenterDistance 的单位对于绕恒星或重心运行的物体为天文单位,对于所有其他物体为公里。
近心点角由 ArgOfPericenter 或 LongOfPericenter 给出。ArgOfPericenter 从升交点测量,而 LongOfPericenter 从基本方向测量。如果同时指定 ArgOfPericenter 和 LongOfPericenter,ArgOfPericenter 将覆盖 LongOfPericenter。
物体在 Epoch 时的轨道位置由 MeanAnomaly 或 MeanLongitude 给出。MeanAnomaly 从近心点角测量,而 MeanLongitude 从基本方向测量。如果同时指定 MeanAnomaly 和 MeanLongitude,MeanAnomaly 将覆盖 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 是 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
此功能仅在 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 已被弃用;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。
需要 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> } }
Beginning 和 Ending 限定了 SPICE 轨迹有效的时段。这些值可以是数字儒略日或公历日期字符串。这些时间必须在 SPICE 内核中指定的边界时间内。
为了使剔除工作正常,需要提供轨道的 BoundingRadius。Period 是可选的;Celestia 仅将它用于轨道路径渲染。如果将其设置为零或根本没有给出,则假定轨道是无周期轨迹。BoundingRadius 和 Period 的单位是 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 } }
需要 Celestia 1.5.0
ScriptedOrbit 用于使用 Lua 脚本创建自定义轨迹函数。
用法
ScriptedOrbit { Module <string> Function <string> ...additional properties... }
Module 给出了将通过 Lua 的 require 方法加载的包的名称。它在标准路径列表中搜索具有指定名称的脚本文件。加载项的 ScriptedOrbit 的 Module 文件应位于加载项主目录中的名为 celxx 的目录中。Function 是一个工厂函数的名称,该函数生成一个包含轨道属性的表,包括一个返回特定时间位置的函数。除 Module 和 Function 之外的所有 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 预计位置函数对于相同的时间值始终返回相同的位置。
以下是在 .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 属性反复使用。只要您知道预期哪些参数,您就可以使用其他人编写的轨道脚本,而无需自己编写任何代码。