衛星追尾データ TLE のチェックサム
Back
Alt+HOME
リーマンサットがいよいよ明日宇宙へ、データ受信の準備中起動データが現時点で公開されていないので ISS のデータを使おうとして気付いたチェックサムについて、その計算をやり直してくれるプログラムと供に理解を深める。
This image made by ChatGPT
仮データとして ISS の起動データを使う
SatNOGS DB
に記述されている最新のデータは
TLE Updated 2025-08-21 10:11:05 UTC
TLE Set 1 25544U 98067A 25232.79082775 .00012706 00000-0 22974-3 0 9992
2 25544 51.6357 346.8656 0003381 246.2794 113.7840 15.50060649525187
ついついやってしまうのが、ISS を表す Norad ID 25544 を RSP-03 を表す 98654 に置換え使ってしまうことです。
1 98654U 98067A 25232.79082775 .00012706 00000-0 22974-3 0 9992
2 98654 51.6357 346.8656 0003381 246.2794 113.7840 15.50060649525187
ISS から放出される衛星は、少しずつ離れては行くものの、しばらくは ISS に追従します。従って、ISS にアンテナを向けておけば RSP-03 を追尾できると言うことです。
ここで問題が発生します。SatPC32 のようなデータに厳しいアプリケーションにおいては、データを提供しているのに RSP-03 を表示せず、選択できないのです。
答えは、TLE (Two Line Elements) 一行ごとにチェックサムが取られていて、Norad ID を書き換えたのだから当然違ってきていて、それをアプリが認識していると言うことです。
下記は修正済みの TLE
1 98654U 98067A 25232.79082775 .00012706 00000-0 22974-3 0 9994
2 98654 51.6357 346.8656 0003381 246.2794 113.7840 15.50060649525189
そのチェックサムの実態は
言葉で言うと、各行の先頭文字 (1 or 2) から 68文字中の数値の合計に、ハイフン (-) の数を足した合計値、これを 10 で割った余りを、チェックサムとして末尾 (69文字目)
に加えて、1 又は 2 から始まる一行 69 文字の Two Line Elements を作成すると言うことになります。
これを利用して、Norad ID を書き換えたテキストファイルのデータを、チェックサムを取り直して、
末尾を変更したテキストファイルを作成するアプリが次に示す Python スクリプトです。
スクリプトをコピーし、適当なファイル名 (main.py) で保存します。
python main.py で起動します。
ファイルを保存するとき Shift-JIS + CRLF になっていると起動しません。
UTF-8 (Non-BOM) + LF で保存してください。
"""
衛星軌道 TLE を理解するための Python アプリケーション
"""
import os
import subprocess
from pathlib import Path
from PIL import Image
# 1行ごとに Checksum を計算する関数
def compute_checksum(line: str) -> int:
s = 0
for ch in line[:68]:
if ch.isdigit():
s += int(ch) # 数値の合計に
elif ch == "-": # - の数を加え
s += 1
return s % 10 # 合計を10で割った余り
# TLE 以外を除く各行の最前から68文字分のチェックサムを68文字目に追加
def fix_tle_line(line: str) -> str:
line = line.rstrip()
# 行が空の場合、1 又は 2 で始まっていない場合パスする
if not line:
return line
if not (line.startswith("1") or line.startswith("2")):
return line
# TLE であった場合、68文字をチェックサム関数に渡す
body = line[:68].ljust(68) # 左揃え
checksum = compute_checksum(body)
return body + str(checksum) # チェックサムを末尾に加え69文字とする
# メインプログラム
def main():
infile = Path("input.txt")
outfile = Path("out_fixed.txt")
# 1. エディタで input.txt を開く(無ければ新規作成)
if not infile.exists():
infile.write_text("", encoding="utf-8")
print("\ninput.txt をエディタで開きました。編集して保存してください...")
subprocess.call(["notepad", str(infile)]) # Windows のメモ帳を使用
# 2. 編集後の内容を読み込み
content = infile.read_text(encoding="utf-8", errors="ignore").splitlines()
if not any(line.strip() for line in content):
print("\ninput.txt が空なので終了します。\n")
return
# 3. TLEを修正
fixed_lines = [fix_tle_line(line) for line in content]
# 4. out_fixed.txt に保存 (Windows版である SatPC32 用に Shift_JIS + CRLF とする)
with outfile.open("w", encoding="cp932", newline="\r\n") as f:
for line in fixed_lines:
f.write(line.rstrip() + "\r\n")
print(f"\n...修正完了: {outfile} を開きました。\n")
# 5. 出力ファイルをエディタで開く
subprocess.call(["notepad", str(outfile)])
# 6 出力ファイルを閉じた時点で、入・出力ファイルを削除する。
if os.path.exists(infile):
os.remove(infile)
if os.path.exists(outfile):
os.remove(outfile)
if __name__ == "__main__":
main()
notepad をエディターとして使用していますが、notepad の右上「ギア」マークの設定から、2ヶ所設定を確認してください。
[起動時の設定]
- [メモ帳の起動時] → [◎ 新しいセッションを開始し未保存の変更を破棄]
- [最近使ったファイル] → [オフ]
Back
Alt+HOME

この 作品 は
クリエイティブ・コモンズ 表示 - 非営利 - 改変禁止 4.0 国際 ライセンス
の下に提供されています。
English
Powered by