見出し画像

Python Panda3DライブラリでSLIMの軌跡を再現

この記事は、日経ソフトウエアの承諾を得て掲載しています。

小型月着陸実証機SLIM

2024年1月20日、日本の小型月着陸実証機「SLIM」が月面に着陸し、日本は世界で5番目にこの快挙を成し遂げました。この歴史的な瞬間を祝して、今回はPythonのPanda3Dライブラリを使って、地球から月への旅を壮大な3Dアニメーションで再現する方法を紹介します。このシミュレーターでは、惑星や衛星を球体で表現し、その移動の軌跡を線で描き出します。特に、SLIMの特徴的な3D軌跡もこのシミュレーターで再現できます。

日経ソフトウエア2024年3月号特集記事「太陽系シミュレーター」のコードをベースに、少しの修正で地球と月の関係を描くシミュレーターを実現できることが、この記事の中心です。あなたのパソコンで、「月の公転」、そして「SLIMの月への旅」をリアルに体験することができます。

↓↓↓特集3 Pythonで「太陽系シミュレーター」を作る↓↓↓

本記事の構成

この記事は以下の3つのパートから構成されます。

Part1: 地球から月への旅について、その基本的な説明と、なぜ月への興味が再び高まっているのかを探ります。

Part2: Horizons Systemを使って、天体のHorizons IDを調べる方法を、ウェブページのスクリーンショットとともに詳しく説明します。

Part3: 「地球と月のシミュレーター」を実装する方法を、具体的なコードの修正箇所を示して、解説します。

この記事は、日経ソフトウエア2024年3月号特集記事「太陽系シミュレーター」のPart4 太陽系シミュレーターの完成(ハレー彗星の再現)まで作業が終わっていることを前提にしています。この段階まで、作業を進めてからお読みください。なお、この記事は天体現象の再現を扱っていますが、あくまでプログラミング技術の説明を主としています。そのため、天体現象の説明や各種数値において厳密性や正確性が欠ける点があるかもしれません。また、シミュレーターを見やすくするために、一部の数値を調整しています。その点はご了承ください。

Part1 地球から月への旅

地球から月への旅は、現代科学技術の一つの頂点を象徴しています。約38万キロメートルの距離を、現在の宇宙船は数日で旅することができます。月は地球の唯一の自然衛星であり、その地理的な特徴や資源は、将来の宇宙開発にとって重要なカギを握っています。

1960年代のアポロ計画以降、一時は衰えていた月探査への関心が、21世紀に入って再燃しています。これにはいくつかの理由があります。科学技術の進歩により、月面での長期滞在が現実的になりつつあり、月は人類がさらなる宇宙へ進出するための「足がかり」と見なされています。月の土壌に含まれるヘリウム3は、将来の核融合エネルギー源として非常に価値が高いとされ、エネルギー資源としての潜在力も注目されています。

また、中国やインドなどの新興宇宙国が宇宙開発に力を入れ始め、アメリカやロシアといった従来の宇宙強国との間で新たな競争が生まれています。これらの国々は、科学技術の進展を示す指標として、また国威発揚の手段として、月探査計画に投資しています。

日本の「SLIM」プロジェクトの成功は、精密な月面着陸技術の実証に他なりません。この技術は、将来的に月面での資源採掘や基地建設のための足掛かりを提供することが期待されています。

以上で、地球から月への旅が持つ科学的な価値と、宇宙開発の未来に対する解説を終わります。

次のパートでは、天体(惑星、衛星、探査機など)の正確な位置と時間を取得し、「地球と月のシミュレーター」を実現する準備をします。アメリカ航空宇宙局NASAが無料で公開している「Horizons System」で天体の識別子(Horizons ID)を調べる方法を詳しく説明します。

Part2: Horizons Systemを使って天体のHorizons IDを調べる方法

Horizons Systemは、NASAが運用する太陽系内の天体に関するデータベースです。このシステムは、惑星、衛星、小惑星、彗星、宇宙探査機など、様々な天体の軌道要素や物理パラメータを提供しており、科学者やエンジニアはもちろん、教育目的や個人の研究にも広く用いられています。Horizons Systemにアクセスすることで、天体の位置や動きを正確に計算するためのデータを入手することができます。

Horizons Systemから天体のデータを取得するには、対象の天体の識別子(Horizons ID)とデータの取得期間(開始日時、終了日時)、そしてデータの取得間隔(年、日、時、分など)が必要です。

SLIMのような特定の探査機のHorizons IDを調べる方法はいくつかありますが、今回は公式のウェブアプリを使う方法を紹介します。(★別の方法としてtelnetを使ったWeb APIがありますが、telnetのインストールが必要なため、説明はまたの機会といたしましょう)

では、Horizons IDの調べ方を詳しく説明します。
次のURLをWebブラウザに入力して、Horizons Systemのウェブアプリにアクセスします。

▲図1▲ Horizons Systemのウェブアプリにアクセスする

Horizons Systemのウェブアプリにアクセスしました(▲図1▲)。対象の天体(Target Body)を変更する「Edit」ボタンをクリックしてください。次の画面に進みます。

▲図2▲ 対象の天体を選ぶ

対象の天体を探す「検索ウインドウ」が開きます(▲図2▲)。検索バーに「slim」と入力してください。「Search」ボタンをクリックすると、Hoizons Systemに登録してある「すべての天体(available bodies)」の中から条件にあった天体が検索されます。検索結果が複数あるときは、その中からもっとも適した天体をクリックします。結果が1件の場合は、検索ウインドウが閉じて、元の画面(▲図1▲)に戻ります。「SLIM」のケースでは、検索結果は1件で、元の画面に自動で戻りました。次に進みます。

▲図3▲ SLIM (spacecraft)が選択できた

Target Bodyに「SLIM (spacecraft)」が選ばれました(▲図3▲)。次のステップは、Horizons Systemからデータを取得する日時の設定を行います。

Horizons Systemでは、対象の天体データを保存している日時があらかじめ決まっており、それ以外の日時を選ぶとエラーになってしまいます。このエラーを防止するために、データ保存期間を調べる必要があります。時間指定(Time Specification)の「Edit」ボタンをクリックしてください。

▲図4▲ Horizons Systemからデータ取得する日時を設定する

時間指定のウインドウが開きます(▲図4▲)。このウインドウで重要なのは、データを保存している期間を示す青背景の文字です。SLIMのデータが保存されているのは、2023年9月7日0時31分50.325秒から、2024年2月1日0時1分09.184秒であることがわかります(この数字は次のPart 3で使用します)。
次の作業は、開始日時、終了日時を決めることです。データ保存期間であれば、どの日付でも構いませんが、この例では「2023年9月7日午前1時から2023年9月8日」までをテキストフィールドに入力しています。「Use Specified Time Span」ボタンをクリックして、次に進みます。

▲図5▲ 日時指定が行われた

データ検索のための日付指定が正しく設定できました(▲図5▲)。これで準備完了です。「Generate Ephemeris」ボタンをクリックして、Horizons IDを確認できます。

▲図6▲ Horizons IDが示された

画面が切り替わって、SLIMについての各種データが表示されます(▲図6▲)。画面をスクロールして、「SLIM (spacecraft) (-240)」の表示を確認できます。この表記は、SLIMのHorizons IDが「-240」であることを示しています。以上で、Horizons IDの調べ方の説明を終わります。

同様の手順でHorizons IDを調べて、地球(399)、月(301)であることを確認できます。以上で、必要なHorizons IDはすべて準備できました。次は、これらのデータを使って、地球から月への旅を再現する3Dシミュレーターを実装します。

Part3: 地球と月のシミュレーターの実装

私たちがこれまでに学んだ知識を活かし、いよいよPythonのPanda3Dライブラリを用いて地球と月のシミュレーターを実装していきます。シミュレーターは、地球を中心に月が周回する様子を動的に描き出し、さらに日本の「SLIM」の軌道も加えて、よりリアルな宇宙の様子を再現します。

この記事は、本編である「Pythonで太陽系シミュレーターを作る」の応用編である位置付けです。太陽系シミュレーターの完成(Part4)まで作業が終わっていることを前提として説明を続けます。

では、地球と月のシミュレーターを実装していきましょう。
作業量は多くありません。主要なコードはそのまま流用できます。25行(ファイル数4つ)を修正するだけです。

初めに、見通しを良くするために、シミュレーター改造の方針を示します。

  1. 表示する対象(球体モデル)を「地球、月、SLIM」だけにする

  2. 中心の天体(固定されている)を太陽(Sun)から地球(Earth)に変更する

  3. 代表の天体(データ数の確認等で使用)を水星(Mercury)から月(Moon)に変更する

  4. 天体間の距離をシミュレーターの表示範囲に合わせて、拡大する

  5. シミュレーターの再現日付を秒単位まで正確に表示する

改造方針を確認できたので、実際にコードを修正していきます。
初めに、カメラを実装したcamera.pyを開いてください。次のリストに示す1箇所を修正します。

# ▲リスト1▲ camera.pyを修正する(1箇所)

    # self.referenced_planet_name = 'Sun'
    self.referenced_planet_name = 'Earth'

太陽系シミュレーターのsrcフォルダーに含まれるcamera.pyを開きます(▲リスト1▲)。カメラの注視点(視線の先を示す点のこと)を定義するself.reference_planet_nameを「Earth」に変更してください。この変更は、上記の改造方針2に基づいています。以上で修正は完了です。

次は、srcファルダーに含まれるdatabase.pyを開いて ください。


# ▲リスト2▲ database.pyの修正(2箇所)

          # inserts = (
          #   name, vector['datetime_str'].split()[1],
          #   vector['x'], vector['y'], vector['z'])
          inserts = (  # ここから(1)
            name, vector['datetime_str'],
            vector['x'], vector['y'], vector['z'])  # ここまで(1)

中略

    # self.db_cursor.execute(
    #   f'SELECT count(*) from {self.table_name} WHERE name="Mercury"')
    self.db_cursor.execute(  # ここから(2)
      f'SELECT count(*) from {self.table_name} WHERE name="Moon"')  # ここまで(2)

▲リスト2▲は、データベースを管理するDatabaseクラスの修正箇所です。(1)で、31行目の保存するデータを定義するinsertsを修正して、より正確な日時が保存できるようしました(改造方針5より)
そして、41行目の保存したデータ数を数えるコードを(2)のように修正してください。これで、Moonとして保存したデータの数がカウントされるようになります(改造方針3より)。

次は、srcフォルダーに含まれるhorizons_settings.pyを開いてください。

# ▲リスト3▲ horizons_settings.pyを修正する(1箇所)

SLIM_DICT_LIST = [
  dict(name='SLIM', radius=0.1, orbit_radius=0, orbit_period=1,
       color=(1, 1, 1), line_color=(1, 0.5, 0), heading=None, id=-240),
  dict(name='Moon', radius=0.186, orbit_radius=0, orbit_period=1,
       color=(1, 1, 1), line_color=(1, 1, 0), heading=None, id=301),
  dict(name='Earth', radius=1.000, orbit_radius=1.000, orbit_period=1.000,
       color=(0, 0, 1), line_color=(0, 1, 1), heading=100.469, id=399),
]
SLIM_SETTINGS = {
  'start_time': '2023-09-07 01:00',  # 打ち上げ日
  'stop_time': '2023-12-25 23:30',  # 月への到達
  'step_size': '30m'  # データを取得する間隔(時=h, 分=m, 秒=s)
}

▲リスト3▲で、Horizons Systemからデータを取得する設定値を追加しています。horizons_settings.pyの末尾にSLIM_DICT_LISTとSLIM_SETTINGSを書き加えます。SLIM_DICT_LISTは、シミュレーターに表示する天体のデータをまとめたリストです。地球、月、SLIMの半径(radius)などを定義しています。SLIMは地球に対して小さすぎるため、地球の0.1倍にして、シミュレーター上で確認できるようにしています。
そして、SLIM_SETTINGSは、Horizons Systemからデータを取得する日時を定義する辞書です。先ほどのPart2でSLIMのデータ保存期間が確認できましたので、その数値を開始日時(start_time)に使用します。終了日時(stop_time)は、月と平行移動を開始した日時を指定します。2023年12月26日以降は、位置を正確に取得できないバグがあり、25日一杯でデータ取得を終えています(原稿執筆時2024年1月31日時点)。そして、データ取得の間隔は30分にして、軌跡が滑らかに描かれるようにしました。

最後に、srcフォルダーと同じ階層にあるdraw_planets_with_horizons_api.pyを開いてください。

# ▲リスト4▲ draw_planets_with_horizons_api.pyの修正(5箇所)

# table_name = 'HALLEY'
table_name = 'SLIM'  # (1)

中略

    # MakePlanets.__init__(self, PLANET_DICT_LIST + dict_list_to_add)
    MakePlanets.__init__(self, dict_list_to_add)  # (2)

中略

      # if name != 'Sun':
      if name != 'Earth':  # (3)

中略

          # position = Point3(x, y, z) * BASE_ORBIT_RADIUS
          position = Point3(x, y, z) * BASE_ORBIT_RADIUS * (10 ** 4)  # (4)

中略

          # if name == 'Mercury':
          if name == 'Moon':  # (5)

▲リスト4▲は、srcフォルダー内のモジュールをまとめて、シミュレーターを実行するファイルの修正箇所です。
(1)は、読み込むデータベースのテーブル名を定義しています(5行目)。テーブル名を「SLIM」に変更してください。
(2)は、惑星を表現する球形モデルを作成するMakePlanetsクラスの初期化コードです(16行目)。球形モデルを作成するリストをdict_list_to_addのみに変更してください(改造方針1より)
(3)は、name変数の値によって惑星を移動するかどうかを判定するコードです(28行目)。中央に表示して動かさない天体は地球ですから、条件式の値を「Earth」に変更します(改造方針2より)
(4)は、天体の位置を計算しています(33行目)。太陽系の大きさは半径約50億キロメートルに対して、地球と月の距離は38万キロメートルであり、距離の計算式に1万倍(10の4乗)を追加します(改造方針4より)。
最後の(5)は、日付を示すテキスト(左上)を更新するかどうかを判定するコードです(45行目)。水星(Mercury)を月(Moon)に変更します(改造方針3より)。以上で、すべてのコードの修正が完了です。

地球と月のシミュレーターを実行しましょう。cdコマンドでDocumentsフォルダー内の「solar_system」フォルダーに移動してから、次のコマンドを実行してください。シミュレーターが実行され、次の画面が得られます(▲図7▲▲図8▲▲図▲9)。

python draw_planets_with_horizons_api.py
▲図7▲ 地球から楕円軌道でテイクオフするSLIM(SLIM=オレンジ色の軌跡)

地球から楕円軌道でテイクオフしたSLIMは、地球重力によるスイングバイを繰り返して、速度を上げてきます(▲図7▲)。この加速航法により、燃料を節約しながら目的地(月)に到達できます。

▲図8▲ SLIMが月の軌道と進行方向を合わせる(月の軌跡=黄色)

SLIMは月の軌道に到達したのちに、月の重力を使って、スイングバイにより軌道を大きく変更します。そして、月の進行方向と自身の進行方向を合わせるために、大きな楕円軌道をほぼ1周します。大きな楕円軌道から戻った地点から、SLIMと月は並行してほぼ同じ速度で進行します。そして、各種の観測を開始して月面着陸のタイミングを狙うことになります。

▲図9▲ SLIMと月の軌道を横から見た図

▲図9▲は、▲図8▲のシーンを真横から眺めた図です。太陽系の平面(黄道面)と月の軌道は約5度傾いているため、SLIMを黄道面に対して同じ角度で傾けて、月と平行移動させる必要があります。

結び

2024年1月SLIMの月面着陸の快挙を経て、宇宙探査の新たな章が開かれました。この記事で紹介したシミュレーターは、SLIMのような歴史的ミッションをデジタルの世界で再現するだけでなく、位置データを準備すれば世界各国が現在進めている月探査機の軌道もシミュレートすることが可能です。私たちのパソコン上で展開されるこの宇宙旅行は、月への探査がもたらす無限の可能性を体感させてくれるでしょう。今日の科学技術の成果は、明日の宇宙旅行への足がかりとなり、私たちの想像を超えた未来を約束しています。このシミュレーターを通じて、探査機が月に到達する壮大な旅を体験してください。


前の記事
Python Panda3Dライブラリで太陽系シミュレーターを作成する|creativival (note.com)
次の記事


その他のタイトルはこちら



この記事が気に入ったらサポートをしてみませんか?