跳轉到內容

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/

華夏公益教科書