Cube Sat KASHIWA から画像を受信してみる
Back
Alt+HOME
KASHIWA(千葉工業大学「柏」)は衛星からテレメトリーと同様に83バイト(変換後)の信号で画像データを送っている。受信後データを編集してJPEGファイルにする必要は有るが、小さな穴から地球を見ているような画像がとても可愛らしい
千葉工業大学 高度技術者育成プログラム GARDENs @CitGardens 様よりX上でアドバイスを戴きました。
概略の手順(手作業でも可)
- テレメトリー転送用プログラムの生データログを利用します。
図では、BinaryEditor Stirling をインストールして表示するようにしていますのでそのアイコンになっています。
- KISSデータの内、83バイトデータのみ残し他を削除
(83バイトデータの例)
反転部分はデータそのもので、前後にセパレータが付いています。C0 00 ・・・・・ C0
- 最初の 4A から数えて22番目にナンバリングが施されています。(赤枠)
- このナンバーの次の FF D8から最後 07 までが画像データです。(ナンバーは不要)
このデータ以外の最初からナンバーまでを削除する作業を83バイトデータ全てに行います。
- 最も大事なのが次の作業です。上記作業中に Stirling のステータスバーを見ると、83バイトではなく84バイトとなっています。
このような場合、KISS変換されたデータが含まれていますので、逆KISS変換してオリジナルデータに戻す必要が有ります。
DB DD は DB に、DB DC は C0 に書き換えます。勿論これらが両方とも含まれる等のケースも有ります。
- 完了したらこのデータを拡張子 .JPG で保存します。そのファイルをダブルクリックすると画像が表示されます。
手作業はとても大変なので Python で一挙に変換
Pythonスクリプトと同フォルダにKISSファイルを置いて、ファイル名を引数にして実行してください。
=MEMO= Python3の環境の無いWindowsではスクリプトは動きませんので次の項目をご参照ください。
PS X:\>python tlm2img.py 59508_2024-06-13T204223.561Z.kss
JPEGデータの確認テキストファイル: image_hex.txt
JPEGファイルの生成が完了しました: kashiwa_image.jpg
import os
import subprocess
import sys
import time
# hexファイルをデータ部分だけに整形する
def process_line(line):
# hexファイルの行番号とASCII文字部を削除
substring = line[5:28]
substring += " " + line[30:54]
# スペースを取り除く
cleaned_substring = substring.replace(" ", "")
# 値を返す
return cleaned_substring.strip()
# KISS逆変換してナンバリングの次からのイメージデータを抽出
def process_imgdata(element):
# KISS逆変換
string = (element.replace('dbdc', 'c0')).replace('dbdd', 'db')
# ナンバリングの次から取得
img_data = string[44:]
# 値を返す
return img_data
# TELEMETRYから画像ファイル(kashiwa_image.jpg)を作成
def main():
# コマンドライン引数からファイルパスを取得
if len(sys.argv) < 2:
print("ファイルパスを指定してください。")
return
# inputファイル、tmpファイル、outputファイルの定義
kss_path = sys.argv[1] # inputファイルは引数で与える
hex_path = "hexstring.hex"
cln_path = "cleaned.txt"
tmp_path = "image_hex.txt"
img_path = "kashiwa_image.jpg"
try:
# KISS ファイルが存在するか
if os.path.exists(kss_path):
# KISS ファイルの可視化(テキストファイル)
command = ['certutil', '-encodehex', kss_path, hex_path, '11']
# コマンド実行時のメッセージを抑制
subprocess.Popen(command, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
# hexファイルに変換されるのを1秒待つ
time.sleep(1)
# hexファイルを読み込み、データ部だけを抽出し、一旦ファイルに連続した1行で書き込む
with open(hex_path, 'r', encoding='utf-8') as file_hex:
with open(cln_path, 'w', encoding='utf-8') as file_cln:
for line in file_hex:
cleaned_line = process_line(line)
file_cln.write(cleaned_line)
# 連続データを読みtelemetryの区分データ(c0c000)で分割)
with open(cln_path, 'r', encoding='utf-8') as file_cln:
with open(tmp_path, 'w', encoding='utf-8') as file_tmp:
# 連続した1行データを読み込む
long_string = file_cln.read()
# c0c000で区切る
elements = long_string.split('c0c000')
# 区切ったそれぞれを更にふるいに掛ける
for element in elements:
# 83btye パケット(画像データ)以外を排除する
if (len(element) < 80 or len(element) > 170):
continue
# KISS逆変換及び行カウンターまでを削除
img_string = process_imgdata(element)
#print(img_string)
file_tmp.write(img_string)
print(f"JPEGデータの確認テキストファイル: {tmp_path}")
# イメージのテキストデータ(ffd8で始まりffd9で終わる)をバイナリーに変換
with open(tmp_path, 'r', encoding='utf-8') as file_tmp:
with open(img_path, 'wb') as file_img:
hex_data = file_tmp.read()
# バイナリーに返還後バイナリーファイルにする
binary_data = bytes.fromhex(hex_data)
file_img.write(binary_data)
# 作業後一時ファイルを削除する(image_hex.txtのみ確認のため残す)
if os.path.exists(hex_path):
os.remove(hex_path)
if os.path.exists(cln_path):
os.remove(cln_path)
print(f"JPEGファイルの生成が完了しました: {img_path}")
# エラー処理
except FileNotFoundError:
print(f"ファイルが見つかりません: {kss_path}")
except Exception as e:
print(f"ファイルの読み込み中にエラーが発生しました: {e}")
if __name__ == "__main__":
main()
WindowsでPython3の環境が無い普通の場合
LinuxではPython 3 は標準ですが、WindowsではPythonの環境を構築していないと、上のスクリプトは動きません。
そこで単独で動くようにWindows上でコンパイルしましたので、当方のサーバからダウンロードしてお使いください。
- クリックすると開始します。tlm2img.zip
- 展開するとフォルダ内に tlm2img.exe が出来ますので、データファイル(.kss)を同じフォルダに入れます。
- そのエクスプローラーのアドレスバーに cmd と入力すると、そのフォルダでコマンド・プロンプトが開きます。
C:\Users\USER\Desktop\tlm2img>tlm2img 59508_2024-06-13T204223.561Z.kss
JPEGデータの確認テキストファイル: image_hex.txt
JPEGファイルの生成が完了しました: kashiwa_image.jpg
Back
Alt+HOME
この 作品 は
クリエイティブ・コモンズ 表示 - 非営利 - 改変禁止 4.0 国際 ライセンス
の下に提供されています。
English
Powered by