この記事はSSSRC Advent calender 2023 19日目として書かれています.

 

お久しぶりです.B4の池野です.最近全然アメブロ書いていなかった気がする.

 

今日はアマチュア無線ミッションのSSTVについてちょこっとお話しつつ先日走ったマラソンについてお話しようかなと思います.

 

SSTVについて

ご存じの方もたくさんおられると思いますが,一応基本的なところから.
 
SSTVとはSlow Scan Televisionの頭文字で短波帯などの狭帯域幅で画像をやり取りするために用いられる伝送方式です.基本的にはFM,つまり,キャリア波の周波数を上下にシフトさせて送信したい情報を伝送します.その中でも送信方式は様々ありますが,周波数の高低が画素の明暗に対応しています.RGB(赤,緑,青)の輝度情報を順に送信し,地上にて一行ずつ組み合わせていくというのが一般的です.
他にも人間の網膜の色覚の特徴を利用してうまいこと輝度を調整して送信したりする手法(計算が早くなったりするのかな?)もあるようですが,開発中の衛星には使わない方式なので割愛します.
変調周波数は1500Hz~2300Hzの間にします.また,人間の色彩感覚的に100~110分割くらいでしか輝度を判別できないらしく,128通りの輝度を用意することにします.つまり,最も低い周波数を黒として(2300-1500)/128=6.25Hzごとに輝度情報を上げていくことで2300Hzは白を表すことになるというわけです.256通りの輝度だと3.125Hz刻みになるため,干渉などによって正確な復調が難しくなるという問題が生じます.64通りだと12.5Hz刻みですね.もしかしたらこれでも良いかもなあと思い始めてきた.
幅256pxの画像の場合,RGBの輝度情報が256サンプルずつ送信されたあと,1200Hz×5msの水平同期パルスでライン終端が通知され,一行の描画が終了します.画像前にはヘッダが送信され,1900Hz×300msのリーダートーン,1200Hz×10msのブレーク,1900Hz×300msのリーダートーン,伝送モードを識別するVISコードで構成されています.Martin M1では44なので0101100と並ぶわけです.
 
おおざっぱですが,SSTVの概要はこの程度で良いですかね.
 
ちなみに,今回のミッションではMartin M1を使うので以降はMartin M1での実装だと思っておいてください.他のモードのことはわかりません.
 

SSTV実装に向けて

私はひとまず,pysstvというオープンソースのソフトを拾ってきて適当な画像を変調してみました.MMSSTVというSSTV用通信ソフトを使ってデコードしてみることにしました.当初はマイクとスピーカーから音声を流してデコードを試みていましたが,なぜかうまくいかないなといきなり立ち止まりました.
通信系の後輩に聞いてみるとVB-audioの仮想オーディオインターフェースを使ってみてはとのこと.パソコンの音声出力をループ回して直接MMSSTVに入れているらしい.その辺疎いから非常に助かった.これが実際使用した写真とMMSSTVのインターフェース.音声は載せられないのかな.pysstvの中に界隈で有名な外国人の写真が入ってた気がするのでそちらで.
SSTVのなんとなくの流れとコードの仕様を大まかに理解したところでc++で書き始めてみました.そこでようやく気が付いたのですが,pysstvって結構洗練された仕様になっていました.jpgやpngなどの圧縮形式からrowデータに近いppmなどの形式まで殆どの画像ファイルをwavファイルにすることができていたのです.
 
大体,やり始めた当初,画像の形式とか全く興味もないし困りました.
人工衛星に積むカメラの仕様や画像の保存形式などのレギュレーションが決まっていなかったので,とりあえず,簡単そうなpgm(白黒)でコードを書いてみました.これは案外すぐにできたのでppm(カラー)を試みました.ppmは指定した最大値までの数値でRGBの順に10進数のテキストで格納されています.
 
実装してみたのですが3点のミスによりうまくいきませんでした.1点目は凡ミスなのですが,SSTVではR,G,Bの輝度を一行ずつ切り替えているのに対して,ppmではピクセルごとにRGBの輝度を記載していた点にありました.2点目は,SSTVはRGBの順に送られるのではなくGBRの順に送られているという点でした.2点目に関しては抜け穴でしたね.RGBの順になっていると普通は思いませんか.どうやら白黒画像の輝度は基本的に0.30R+0.59G+0.11Bで作られているみたいなのでこれが関係してたりするのかな.でも大事な順ならGRBだよな~とか思っていました.最後に3点目なんですが,各波形のオフセットを考慮していなかったという点です.一番致命的でした.今回も間違いに気づいてくれた後輩に感謝です.ppmではメモリを圧迫してしまうと思ったので画像と音声データを圧縮しようと考えていました.jpgに圧縮することは簡単なのですが,それを改めてppmにするためにはOpenCVとかを使わないといけないのではないかということになり,よりメモリを圧迫しそうになったのでppmで進めることになりました.wavもなんらかの理由で圧縮しないのかな?ちょっと忘れました.
 
SSTVは現在,RGBデータを取得してそれをもとに取られた写真が地球側を向いているのか判断させるコードを書いているところです.これによって地上局と通信できるようになってから次に通信できるようになるまでに最善のショットをSSTVを用いて地球に送ることができるのではないかと考えています.
 
ざっくりとSSTVの話をしましたが日本語大丈夫かな.わかりにくかったらすみません.
 
アマチュア無線ミッションとして行うので,アマチュア無線家の方,興味があれば衛星運用中にデコードしてください!!
 

マラソンについて

もうマラソン書かなくても良いかなと思い始めたんですけど折角なので.
12/10に奈良マラソンを走ってきました.大学院入試直後から練習を始めて3か月程度練習してきました.
 
結果から言うと何とか完走することができました.ただ,残念なのが目標としては4時間以内にゴール(サブ4というらしい)を目指して練習してきたのに,4時間20分と少しオーバーしてしまいました.自分の実力不足を感じつつも,コース悪すぎないかと不満が溜まりました.
 
序盤の方の6キロ程度以外はすべて上り坂か下り坂だったため足への疲労が物凄く溜まります.そんな悪路の中でしたが,30キロ地点までは余裕の走りで予定より3分くらい巻いて到達しました.
しかし,そこから10キロにわたって厳しい坂道の連続が待ち受けていました.31キロ地点では足が止まってしまい,ついに歩いてしまいました.心肺は十分に余裕があるのに足が重くて走れないのです.こんな経験は初めてでした.私は比較的筋肉質な方ですし,ここ半年以上毎日のようにジムに通い大分筋肉を蓄えていたため自分の肉体に限界はないと思っていました.少なくとも42キロ程度なら余裕で走破できると信じていました.30キロ地点まではバナナがおいてあったりしても時間ロスになるため食べようとも思いませんでした.しかし,何か食べないとエネルギー不足で走り切れないと思ったため給水所にある食べ物は片っ端から食べました.もちろん,20キロ地点と30キロ地点でアミノ酸のジェルを口にしていましたが,それだけでは足りない状況だったので.坂道だけではなく,その日は12月にしては異例の20℃まで気温が上がったせいで水分もどんどん奪われていきました.
 
私は問題なかったのですが,終盤の6, 7キロ地点から給水所の水も不足していたらしく,自販機で水を購入しながら走った人もいたとのこと.残り3キロ地点で沿道に立っていた人のプラカードに「お前が申し込んだんだろ!」って書かれていて笑ってしまいました.
 
マラソンは今回限りと思っていましたが,目標タイムを切れなかったため来年も走ろうかなと思っています.もちろん奈良マラソン以外のマラソンを笑.研究にも体力は必要ですし,もしよければ皆さんもマラソンを初めてみてはいかがですか.