2020年夏はUAE、中国、アメリカが火星探査機を打ち上げました。どうしてこう、集中して打ち上げたのでしょうか。
それは、火星と地球が接近する時期に火星探査機を打ち上げると効率よく地球から火星に向かうことができるからです。でも、ロケットは地球上でボールを投げるように飛ばすことはできません。物理法則に従ってはいますが、
地球と火星の公転、使用するロケットの出せる出力... etc いろんなことを考えていかなければなりません。
複数回に分けて地球から火星へ行くために必要な計算をpythonを使用して計算してみます。
初回の今回は地球と火星の公転軌道を見てみましょう。
実行環境
実行している環境、使用するモジュールとかをまとめておきます。
基本、dockerでanaconda環境を作って作業しています。
OS: Amazon Linux 2
conda: 4.8.2
python: 3.8.5
jupyter: 1.0.0
astropy: 4.0.1.post1
poliastro: 0.14.0
地球と火星の公転軌道を図示する
まずは、地球と火星がどれくらい遠いのか、どんな公転軌道をグルグル回っているのか図示してみます。 火星と地球の基本情報はwikipediaでも読んでください。
astropyとpoliastroモジュールを使用すると太陽系惑星の位置を計算するできます。
今回はjupyter notebookでコードを書きました。とりあえず最初に今回のコードを眺めてください。
少しずつ解説していきます。
from astropy.utils.data import conf
'http://data.astropy.org/'より軌道計算、天文計算に必要なデータを取ってきます。 astropyのドキュメント を読むとダウンロードしたデータはキャッシュとして保持してくれているようで、毎回叩く必要はなさそう。 jupyter notebook上のチェックポイントを作って毎回叩かなくて済むよにすればいいんじゃないかな。
続いて必要なモジュールをロードしていきます。
from astropy import units as u from astropy.time import Time, TimeDelta from astropy.coordinates import solar_system_ephemeris solar_system_ephemeris.set("jpl") #惑星がclassオブジェクトとして定義されている from poliastro.bodies import Sun, Earth, Mars from poliastro.ephem import Ephem from poliastro.frames import Planes from poliastro.twobody import Orbit from poliastro.plotting import StaticOrbitPlotter from poliastro.plotting.misc import plot_solar_system from poliastro.util import time_range, norm
すみません。この辺多いですが、参考文献のコピペのママを残してあったりして多いです。
poliastroのモジュールの名前が頻繁に?変わることがあるようなので記事執筆で使用したバージョン0.14.0以外では動かない可能性があります。
少なくともバージョン0.11.0でモジュールの名前が違うらしいことを確認しています。
うまく行かない場合はエラーの内容調べてください。
計算したい時刻を指定します。 2020年の火星大接近は10月4日らしいので、その日を設定しました。
EPOCH = Time("2020-10-04 00:00:00", scale="tdb")
poliastroは各惑星をclassモジュールとして定義されているので便利です。
惑星名と計算したい日付をplot_body_orbitに入れると、あとは計算してくれます。
中身はmatplotlibなので、matplotlibが詳しい人は色々いじれると思います。
plotter = StaticOrbitPlotter(plane=Planes.EARTH_ECLIPTIC) plotter.plot_body_orbit(Earth, EPOCH, label="Earth") plotter.plot_body_orbit(Mars, EPOCH, label="Mars")
内側の青線が地球、赤線が火星です。火星って地球よりも離心率が高い軌道なんですね。
地球と火星の距離を計算する
ここまでできたので、この時の火星と地球の距離を計算してみます。
distance = norm(mars.rv(EPOCH)[0] - earth.rv(EPOCH)[0]) distance.to(u.km)
62074610 km
国立天文台のサイトによると2020年の火星接近は6207万 kmとあるのでだいたい合っているようです。
参考文献
Catch that asteroid! — poliastro 0.15.2 documentation
Astropy Core Package Utilities (astropy.utils) — Astropy v4.2.1