宙畑 Sorabatake

衛星データ入門

人工衛星の最期の仕事とは?運用終了した「つばめ(SLATS)」の成果を振り返る

宇宙での仕事を終えた人工衛星は最期にはどうなるのでしょうか。2019年10月1日超低高度衛星技術試験機「つばめ(SLATS)」の運用が終了しました。そこで今回は、つばめ最期の仕事とつばめがこれまで観測してきたデータの見方をご紹介します。

2019年10月1日、JAXAが運用していた超低高度衛星技術試験機「つばめ(SLATS)」が運用を終了しました。

つばめは、「超低高度衛星技術試験機「つばめ (SLATS)」-超低高度軌道の課題と期待」でも紹介しているように、地上から200 kmほどの超低高度を周回した技術実証衛星でした。

今回は衛星の運用終了とは何か?と「つばめ」がこれまで観測したデータの見方をご紹介します。

運用が終了する衛星最期の仕事とは

多くの地球観測衛星は、その種類に応じて似た軌道を周回しています。そのため、衛星はその役目を終えると他の衛星との衝突を回避するために、可能な限り早く軌道離脱することを求められます。

軌道離脱とは、例えば低軌道を周回する衛星の場合によく利用される高度400-600 kmの高度を外れて、より低い軌道へと移動することを意味します。最終的には、地球の大気圏に突入し、衛星自体は燃え尽きます。

また、衛星が利用できる通信の周波数帯は限られていることから、運用を終了した衛星が無用に周波数帯を占拠することを防ぐために、電波の利用を停止(停波)する、かつ通信機が作動しないように電源を落とすことが求められます。

携帯電話に例えるなら、利用しなくなった番号を個人で占有し続けることなく、利用しなくなったらその電話番号を他の人も使えるように契約を終了させましょう、ということになるでしょうか。

以上をまとめると、地球観測衛星は最期の仕事として、1.軌道を離脱し、2.電波を停波する(電源を遮断する)、ことが必要になります。

「つばめ」は、最終的には200 km程度と超低軌道を周回していたため、停波後すぐに大気圏に突入し、燃えつきたものと思われます。

SLATSの軌道推移 Credit : JAXA|宇宙航空研究開発機構

Tellusでは「つばめ」のデータを56地点267シーン提供!

「つばめ」は半年間で日本だけでなく様々な地点を観測してきました。Tellusでは2019年10月23日に新たにデータが追加され、56地点(267シーン)のデータを提供しています。

「つばめ」の観測点 Credit : 宙畑-sorabatake-

「つばめ」が見つめてきた地表の様子がどのようなものだったのか、Jupyter Labを使って確認してみましょう(Tellus OSでも「つばめ」が撮ったシーンを確認することができます。観測点のGeoJSONをインポートし、ピンの範囲でメタ検索を実行してみてください)。

TellusでJupyter Lab(Jupyter Notebook)を使う方法は、「Tellusの開発環境でAPI引っ張ってみた」をご覧ください。

import os, json, requests
from skimage import io
from io import BytesIO
%matplotlib inline


TOKEN = 'ここには自分のアカウントのトークンを貼り付ける'

def search_tsubame_scenes(min_lon, min_lat, max_lon, max_lat, v='', debug=False):
    """
    経度緯度の範囲でシーンを取得

    Parameters
    ----------
    min_lon : number 
        シーン取得範囲の最小経度(-180 - 180)
    min_lat : number 
        シーン取得範囲の最小緯度(-90 - 90)
    max_lon : number 
        シーン取得範囲の最大経度(-180 - 180)
    max_lat : number 
        シーン取得範囲の最大緯度(-90 - 90)
        
    Returns
    -------
    content : json
        結果

    """
    url = 'https://gisapi.tellusxdp.com/api/v1/tsubame/scene'
    headers = {
        'X-Data-Version' : str(v),
        'Authorization': 'Bearer {}'.format(TOKEN)
    }
    payload = {'min_lat': min_lat, 'min_lon': min_lon,
               'max_lat': max_lat, 'max_lon': max_lon}

    r = requests.get(url, params=payload, headers=headers)
    if r.status_code is not 200:
        raise ValueError('status error({}).'.format(r.status_code))

    if debug:
        return r.headers, r.json()
    else:
        return r.json()
    
def get_tsubame_scene(id, v='', debug=False):
    """
    IDからシーンを取得

    Parameters
    ----------
    id : str 
        シーンID
        
    Returns
    -------
    content : json
        結果

    """
    url = 'https://gisapi.tellusxdp.com/api/v1/tsubame/get_scene/{}'.format(id)
    headers = {
        'X-Data-Version' : str(v),
        'Authorization': 'Bearer {}'.format(TOKEN)
    }

    r = requests.get(url, headers=headers)
    if r.status_code is not 200:
        raise ValueError('status error({}).'.format(r.status_code))

    if debug:
        return r.headers, r.json()
    else:
        return r.json()

上記のサンプルコードで「つばめ」が撮影したシーンの情報を取得することができます。
画像(地図タイル)の取得方法は 【ゼロからのTellusの使い方】Jupyter Notebookで「つばめ」(SLATS)による高解像度画像を取得する をご覧ください。

トークンはマイページのAPIアクセス設定(要ログイン)から取得してください。

定期観測が行われていた4都市のシーンの取得

「つばめ」は世界各地を観測していましたが、その中でも東京、ワイキキ、クウェート、ニース(フランス)の4地点は定期的に観測が行われていました。

東京は赤坂迎賓館周辺と小石川周辺が観測対象となっており、以下のように範囲を絞り込んで取得することができます。

# 赤坂迎賓館周辺
# 範囲を指定してシーン情報を取得し個数を表示
tokyo_scenes1 = search_tsubame_scenes(139.72, 35.67, 139.73, 35.68)
print(len(tokyo_scenes1))

# 代表的なシーンのサムネイルを表示
time0200303698_num02_scene24 = get_tsubame_scene('Time0200303698_Num02_SCENE24_RSVLAT2')
io.imshow(io.imread(time0200303698_num02_scene24['thumbs_url']))
Source : JAXA|宇宙航空研究開発機構

赤坂迎賓館周辺を撮影しているシーンは20枚あります。サムネイルでは皇居や国立競技場が確認できます。

# 小石川周辺
# 範囲を指定してシーン情報を取得し個数を表示
tokyo_scenes2 = search_tsubame_scenes(139.74, 35.72, 139.75, 35.73)
print(len(tokyo_scenes2))

# 代表的なシーンのサムネイルを表示
time0200044317_num02_scene62 = get_tsubame_scene('Time0200044317_Num02_SCENE62_RSVLAT1')
io.imshow(io.imread(time0200044317_num02_scene62['thumbs_url']))
Source : JAXA|宇宙航空研究開発機構

小石川周辺を撮影しているシーンは19枚あります。下の方に光る白い半円は東京ドームの一部です。

同様に他の3地点も取得してみましょう。

# ワイキキ
# 範囲を指定してシーン情報を取得し個数を表示
waikiki_scenes = search_tsubame_scenes(-157.8561, 21.2579, -157.7961, 21.3179)
print(len(waikiki_scenes))

# 代表的なシーンのサムネイルを表示
time0198385582_num01_scene38 = get_tsubame_scene('Time0198385582_Num01_SCENE38_RSVLAT1')
io.imshow(io.imread(time0198385582_num01_scene38['thumbs_url']))
Source : JAXA|宇宙航空研究開発機構

# クウェート 港湾部
# 範囲を指定してシーン情報を取得し個数を表示
kuwait_scenes1 = search_tsubame_scenes(47.9, 29.293, 47.93, 29.323)
print(len(kuwait_scenes1))

# 代表的なシーンのサムネイルを表示
time0196866935_num02_scene28 = get_tsubame_scene('Time0196866935_Num02_SCENE28_RSVLAT1')
io.imshow(io.imread(time0196866935_num02_scene28['thumbs_url']))
Source : JAXA|宇宙航空研究開発機構

# クウェート 市街地
# 範囲を指定してシーン情報を取得し個数を表示
kuwait_scenes2 = search_tsubame_scenes(47.91, 29.333, 47.94, 29.363)
print(len(kuwait_scenes2))

# 代表的なシーンのサムネイルを表示
time0196866935_num02_scene29 = get_tsubame_scene('Time0196866935_Num02_SCENE29_RSVLAT2')
io.imshow(io.imread(time0196866935_num02_scene29['thumbs_url']))
Source : JAXA|宇宙航空研究開発機構

# ニース コートダジュール空港
# 範囲を指定してシーン情報を取得し個数を表示
nice_scenes1 = search_tsubame_scenes(7.197, 43.645, 7.227, 43.675)
print(len(nice_scenes1))

# 代表的なシーンのサムネイルを表示
time0197050489_num02_scene41 = get_tsubame_scene('Time0197050489_Num02_SCENE41_RSVLAT2')
io.imshow(io.imread(time0197050489_num02_scene41['thumbs_url']))
Source : JAXA|宇宙航空研究開発機構

# ニース プロムナード・デ・ザングレ
# 範囲を指定してシーン情報を取得し個数を表示
nice_scenes2 = search_tsubame_scenes(7.211, 43.685, 7.241, 43.715)
print(len(nice_scenes2))

# 代表的なシーンのサムネイルを表示
time0197396345_num04_scene03 = get_tsubame_scene('Time0197396345_Num04_SCENE03_RSVLAT1')
io.imshow(io.imread(time0197396345_num04_scene03['thumbs_url']))
Source : JAXA|宇宙航空研究開発機構

変化を観測するためアニメーションを作ろう

上記4地点は、ほぼ同じ位置で定期的に撮影が行われていました。

ワイキキの例

せっかくなのでこれらシーンからアニメーションを作ってみましょう。サンプルコードではシーン情報に含まれるサムネイルからgif動画を作っています。

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import dateutil.parser
sorted_scenes = sorted(waikiki_scenes, key=lambda scene: dateutil.parser.parse(scene['acquisitionDate']))

plt.gray()
fig = plt.figure()
ims = []
for s in sorted_scenes:
    ims.append([plt.imshow(io.imread(s['thumbs_url']))])

ani = animation.ArtistAnimation(fig, ims, interval=1000, repeat_delay=1000)
ani.save('tsubame_scenes.gif', writer='pillow')
plt.close()
from IPython.display import HTML
HTML('<img src="tsubame_scenes.gif">')
ワイキキの29枚のシーンから作ったアニメーション Source : JAXA|宇宙航空研究開発機構

「つばめ」が見つめた世界のランドマークたち

上記の4ヶ所以外にも「つばめ」が撮影したシーンをいくつかピックアップしてご紹介します。

# エジプト ギザ
scene = get_tsubame_scene('Time0201367447_Num02_SCENE42_RSVLAT1')

io.imshow(io.imread(scene['thumbs_url']))
Source : JAXA|宇宙航空研究開発機構

エジプトのギザ上空で2019年5月20日に撮影されたシーンです。画像の中央付近に2つのピラミッドとスフィンクスが写っているのがわかるでしょうか。

# ドバイ The world
scene = get_tsubame_scene('Time0201879426_Num02_SCENE21_RSVLAT1')

io.imshow(io.imread(scene['thumbs_url']))
Source : JAXA|宇宙航空研究開発機構

ドバイ上空で2019年5月26日に撮影されたシーンです。「The world」という人工島の特徴的な形をみることができます。

# 北京 紫禁城
scene = get_tsubame_scene('Time0203508565_Num03_SCENE35_RSVLAT1')

io.imshow(io.imread(scene['thumbs_url']))
Source : JAXA|宇宙航空研究開発機構

北京上空で2019年6月14日に撮影されたシーンです。画像の中央に紫禁城と天安門広場が、そして左側には中南海と呼ばれる人工池の形がくっきりと写っています。

# ニューヨーク ペンシルベニア駅
scene = get_tsubame_scene('Time0204678387_Num04_SCENE09_RSVLAT1')

io.imshow(io.imread(scene['thumbs_url']))
Source : JAXA|宇宙航空研究開発機構

ニューヨーク上空で2019年6月27日に撮影されたシーンです。グリッド状に並び立つNYの摩天楼群が写っています。画面中央付近に見える丸い構造物はペンシルベニア駅です。

軌道高度と撮影範囲、地上分解能の関係は?

衛星の高度と撮影範囲、地上分解能の関係を示すと、下記のようになります。

Credit : 宙畑-sorabatake-

同じ衛星の場合、センササイズと画角は変わらないため、高度が下がることで撮影範囲は狭く、地上分解能は良くなります。

「つばめ」の場合、軌道高度が徐々に下がっていたため、撮影日が新しいほど高度が下がり、撮影している画像の分解能が良くなっているはずです。
また搭載しているカメラの視野角は9.1 mrad(高度 220 kmにて観測幅が2 km)と発表されていることから、何日の画像の撮影範囲と地上分解能はどれくらいだろうか、ということを算出してみるのも面白いかもしれません。

 


以上、衛星の運用終了とは何か?と「つばめ(SLATS)」がこれまで観測したデータの見方をご紹介しました。
「つばめ」は後継機の開発や複数機の同時運用も構想されています。今回の技術実証の成果がどう活かされていくのか、今後の動向に注目しましょう。