たぶん動く...

多分GIS系の人。あくまで個人的見解であり、所属団体を代表するものではありません。

pythonで火星まで行ってみる(その1)

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でも読んでください。

地球 - Wikipedia

火星 - Wikipedia

astropyとpoliastroモジュールを使用すると太陽系惑星の位置を計算するできます。
今回はjupyter notebookでコードを書きました。とりあえず最初に今回のコードを眺めてください。

gist.github.com

少しずつ解説していきます。

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")

f:id:TTY6335:20200919230940p:plain
内側の青線が地球、赤線が火星です。火星って地球よりも離心率が高い軌道なんですね。

地球と火星の距離を計算する

ここまでできたので、この時の火星と地球の距離を計算してみます。

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