Day After Day
tsurezure naru mamani...
ANOTHER DECADE

from 2021 when it's begining after/with CORONA Virus.

衛星追尾データ TLE のチェックサム

8月
23
2025
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ヶ所設定を確認してください。

[起動時の設定]
  1. [メモ帳の起動時] → [ 新しいセッションを開始し未保存の変更を破棄]
  2. [最近使ったファイル] → [オフ]


Back
Alt+HOME