Pocket SDRすごい(リアルタイム測位機能)
はじめに
東京海洋大学の高須知二先生がGitHubに公開されているPocket SDRは、測位衛星(GNSS: global navigation satellite system)の電波を受信して信号処理するオープンソースソフトウェア無線です。Pocket SDRは、2021年10月にGitHubにて公開されて以来、継続的にバージョンアップが続き、2024年7月にバージョン0.13が公開されました。
私は、いつも利用しているmacOS PCに、Pocket SDRバージョン0.8のPython版をインストールして利用してきました。それまでのバージョンでは、収録した無線信号を処理することに重きが置かれていて、事前には想定できなかった条件をくり返し検証でき、とてもありがたく利用していました。
バージョンアップにより、これまでの機能を維持しながら、PythonからC言語へのソースコード移植、リアルタイム処理、高速化などのチューニング、ドキュメント整備が行われてきたことは知っていました。特に、このバージョン0.13では、Windows PCとLinux PCだけでなく、macOS PCやRaspberry Piにも正式対応し、より簡単にリアルタイム測位ができるようになりました。また、より広い周波数幅の信号を収録できる4チャネル版のハードウェア設計資料やファームウェアソースコードも公開されました。Pocket SDRはGNSS民間信号を全て網羅する最強のSDRであるといえます。
ここでは、すでに所有している2チャネル版と、DATAGNSSから発売された4チャネル版との両方のPocket SDRハードウェアを用いて、バージョン0.13のリアルタイム測位を試してみます。
Pocket SDRソフトウェアのコンパイルと設定
ここでは、PCとして、バージョン0.13にて正式対応したmacOS(Macbook Air, Apple Silicon M2)とRaspberry Pi 5 (8GB, SC1112) を利用しました。
はじめに、macOSにPocket SDRソフトウェアを設定しました。このMacbook Airにてuname -a
とneofetch
を実行した結果は次のとおりです。
sat@mba:~$ uname -a
Darwin mba.tkhs 23.6.0 Darwin Kernel Version 23.6.0: Wed Jul 31 20:53:05 PDT 2024; root:xnu-10063.141.1.700.5~1/RELEASE_ARM64_T8112 arm64 arm Darwin
Pocket SDRのGitHubページにあるインストール方法の手順にしたがうと、bin
ディレクトリ以下にコンパイルされたバイナリファイルが収納されます。Pocket SDRは、ソースツリー以外にファイルを作成しませんので、安心してmake install
を実行できます。
次に、GNSS信号追尾に利用するFFT(fast Fourier transoform)を効率よく実行するための設定をします。bin
ディレクトリにあるfftw_wisdom
を実行し、作成されたファイルをpython
ディレクトリに移動します。Pocket SDRソフトウェアは、python
ディレクトリにあるfftw_wisdom.txt
を参照するからです。
cd bin
./fftw_wisdom
mv fftw_wisdom.txt ../python/
Raspberry Piでも、まったく同じ手順でソフトウェアをコンパイルできました。macOSでのfftw_wisdom
は1秒程度で実行終了したのに対して、私のRaspberry Pi 5では完了までに5分近くの時間が必要でした。
sat@rpi5a:~/works/pocketsdr1/bin$ time ./fftw_wisdom
FFTW wisdom generated as ./fftw_wisdom.txt (N=48000).
TIME(s) = 247.420
real 4m7.421s
user 4m7.403s
sys 0m0.004s
sat@rpi5a:~/works/pocketsdr1/bin$
これで準備ができました。
Pocket SDRとMacによるリアルタイム測位
GPS・みちびきのリアルタイム測位
macOSにPocket SDRハードウェア2チャネル版を接続し、Pocket SDRハードウェアにアンテナを接続して、リアルタイム測位を行います。
これまでは、電波収録に用いた条件をpocket_trk
に設定する必要がありました。バージョン0.13では、電波収録機能がpocket_trk
に統合され、与えた設定ファイルから計算条件が自動設定されるようになりました。さらに、信号名とPRN(pseudo random noise)番号を列挙することにより、複数GNSS信号を同時に解析できるようになり、とても便利になりました。
はじめに、GPSとみちびきのL1C/A信号をリアルタイム測位します。ターミナルで、Pocket SDRのbin
ディレクトリに移動し、./pocket_trk -sig L1CA -prn 1-32,194-199
を実行します。
この引数は、信号L1C/AのPRN 1から32(GPS01からGPS32)と194(みちびき2号機)、195(同4号機)、196(初号機後継機)、199(3号機)を受信することを意味します。高級GNSS受信機で採用されているオールインビュー(あらかじめ候補衛星すべての相関器を用意している受信方式)なので、受信開始から36秒程度で座標が表示されました!
自宅で実験しているため、座標の一部にモザイクをかけています。私は通常、ターミナル画面をダークモードにしていますが、ここでライトモードにしています。iTermでは、ターミナル画面で二本指クリック → Edit Session...
→ Colors
→ Color Presets...
→ Light Background
にて一時的にライトモードに変更できます。
LinuxやRaspberry PiでのPocket SDRハードウェア利用の際には、管理者権限が必要なので、コマンド先頭にsudo
をつける必要があります。一方、Macではsudo
の付加は不要でした。しかし、Pocket SDRをUSBポートに接続するときに、アクセサリの使用許可を与える必要があります。
Galileoのリアルタイム測位
次に、欧州のGalileo衛星だけで測位してみます。実行コマンドは、./pocket_trk -c ../conf/pocket_L1L5_24MHz.conf -sig E1B -prn 1-36
です。
日本では、GPSと比較して、Galileo利用可能衛星数が少なさなどのため、Galileo単独では座標推定までに90秒程度の時間がかかるようです。
みちびきCLASとMADOCA-PPP・Galileo HASのメッセージ受信
次にみちびきとGalileoの高精度測位補強信号を受信してみます。ここでは2チャネル版Pocket SDRを用いていますので、チャネル1をL1周波数帯に、チャネル2をL6周波数帯に設定します。2つのターミナル画面を用意し、上画面ではpocket_trk
を、下画面ではnc
を実行しています。pocket_trk
に設定する引数の意味は次のとおりです。
- -c ../conf/pocket_L1L6_16MHz.conf (L1とL6周波数帯にて16 MHzにて標本化します)
- -sig L1CA -prn 1-32,194-199 (L1C/A信号のGPS01から32、みちびき1, 2, 3, 1Rを受信します)
- -sig E1B -prn 1-36 (Galileo E1B信号のE01からE36を受信します)
- -sig L6D -prn 194-199 (みちびきCLASが放送されるL6D信号を受信します)
- -sig L6E -prn 204-209 (みちびきMADOCA-PPPが放送されるL6E信号を受信します)
- -sig E6B -prn 1-36 (Galileo HASが放送されるE6B信号を受信します)
- -rtcm :2000 (TCP 2000番ポートにPocket SDRログを出力します。ファイル名を記述すればそのファイルに出力されます)
下画面では、nc localhost 2000
にて、Pocket SDRのログ内容を表示しています。
Pocket SDRログ画面には、GPS、Galileo、みちびきの航法メッセージの他、CLAS、MADOCA-PPP、HASのメッセージ、推定した座標や時刻が含まれていました。CLAS、MADOCA-PPP、HASの3者を同時受信できるのは、Pocket SDRのすごいところなのです。CLASやMADOCA-PPPの単独受信ができるのもすごいことなのです。
現在のところ、Pocket SDRではこれらの補強情報は利用されていませんが、内閣府が公開しているCLASLIBやMADOCALIB、JAXAが公開しているMALIBを併用すれば、高精度測位ができます。
私の環境では、-log
オプションでNMEAログが、-nmea
オプションでRTCMメッセージが、-rtcm
オプションでPocket SDRログが、それぞれ出力されました。とても小さな誤りです。
MADOCA-PPPメッセージとHASメッセージの内容確認
次に、Pocket SDRにて受信したMADOCA-PPPとHASの内容をQZS L6 Toolにて確認します。別画面で、./pocket_trk -c ../conf/pocket_L1L6_16MHz.conf -sig L6E -prn 209 -sig E6B -prn 1-36 -rtcm :2000
を実行して、みちびき3号機のMADOCA-PPPメッセージと、複数Galileo衛星のHASメッセージをTCP 2000番ポートに出力します。そして、
nc
とQZS L6 ToolのPocket SDRプラグインpsdrread.py
にて、Pocket SDRログからMADOCA-PPPメッセージとHASメッセージを分離し、qzsl6read.py
でMADOCA-PPPメッセージ内容を表示し、gale6read.py
でHASメッセージ内容を表示します。
MADOCA-PPP受信にて、みちびき3号機に限定したのは、現状のQZS L6 Toolが複数のL6信号入力に対して解析できないためです。
MADOCA-PPPとHASとを比較したとき、方式上、HASの方が補強結果が先に出力される可能性が高いです。MADOCA-PPPは、30秒周期にてメッセージが構成されるため、受信開始から復号開始までに最大30秒かります。一方、HASでは、任意タイミングでマスク情報が伝送されるので、Galileo HASの運用次第で短時間にて復号開始されます。
Pocket SDR 4チャネル版の利用
Pocket SDRハードウェアに4チャネル版が追加されました。このハードウェアバージョンは、無線電波のフロントエンドICであるMAX2771を4個使用し、民間GNSS信号をすべてカバーできます。高精度測位補強信号だけでも、CLAS、MADOCA-PPP、HASに加えて、BeiDou PPP-B2bも同時受信できるようになります!
受信機能が格段と高性能になる一方、この4チャネル版ではパソコンと接続するためのUSBインターフェースがUSB3になり、インターフェースICがFX2LPからFX3になりました。このFX3は、ICピンがBGA(ball gate array)で、手作業による半田付けが極めて困難です。BGAを用いたパソコン基板の製造現場では、その品質検査のためにX線検査装置を利用しているそうです。
しかしながら、DATAGNSSの商号でGNSS受信機を製造・販売しているDATASOURCE社が、高須先生のPocket SDRハードウェア4チャネル版(FE4CH: front-end 4-channel)を製造し、一般販売するニュースを聞きました。私もニュースを聞いてすぐの2024年8月18日にこれを注文し、楽しく利用してきました。
この製品では、あらかじめファームウェアも書き込まれていました。嬉しいです。また、ショートピンが添付されていましたが、通常の利用時には使わず、ファームウェア書き換えのときに使いますので、大切に保存します。ショートピンのオン・オフが、従来の2チャネル版と4チャネル版とで逆になっていますので、昔からのPocket SDRユーザは注意が必要です。
Pocket SDRのtest
ディレクトリにあるシェルスクリプトpocket_trk_ALL_test.sh
は、最大の48 MHz標本化にて、このFE4CHの全機能を活用するものです。このシェルスクリプトを実行したら、たくさんの信号を受信することができました!
このシェルスクリプトでは、みちびきのL6D信号とL6E信号の受信設定がコメントアウトされていましたが、コメントアウトを外して、これらの受信機能をオンにしました。コメントアウト状態で900チャネル同時受信、コメントアウトを外して920チャネル同時受信です。すごい!
Pocket SDRとRaspberry Piによるリアルタイム測位
このPocket SDR 4チャネル版を8ギガバイトメモリー搭載版のRaspberry Pi 5に接続し、このpocket_trk_ALL_test.sh
を実行してみました。
sat@rpi5a:~/works/pocketsdr1/test$ sudo ./pocket_trk_ALL_test.sh
1970-01-01 00:00:00.000 0.0000000 0.0000000 0.00 0/ 0 --- BUFF: 5% SRCH: 6 LOCK: 1/900
CH RF SAT SIG PRN LOCK(s) C/N0 (dB-Hz) COFF(ms) DOP(Hz) ADR(cyc) SYNC #NAV #ERR #LOL FEC
2 1 G02 L1CA 2 5.67 40.3 |||||| 0.9658120 3111.6 17613.4 ---- 0 0 0 0
./pocket_trk_ALL_test.sh: 26 行: 4285 強制終了 ../bin/pocket_trk $L1 $G1 $E1 $B1C $I1 $L1C $L2 $G2 $L5 $E5A $B2A $I5 $L6 $E6 $B3I -c ../conf/pocket_ALL_48MHz.conf -rtcm :10015 -nmea :10016 -log :10017 $@
sat@rpi5a:~/works/pocketsdr1/test$
強制終了…そこでsyslog
を確認すると、Linuxがシステムメモリが足りない時にランダムにプロセスを終了するOOM-Killer(out of memory killer)が発動されていました。Raspberry PiでGNSS民間信号のオールインビュー受信は難しいようです。
2024-10-11T22:40:01.710614+09:00 rpi5a kernel: [ 1572.999321] [ 4285] 0 4285 1673909 503962 8077312 9760 0 pocket_trk
2024-10-11T22:40:01.710615+09:00 rpi5a kernel: [ 1572.999324] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null), cpuset=/,mems_allowed=0,global_oom,task_memcg=/,task=pocket_trk,pid=4285,uid=0
2024-10-11T22:40:01.710616+09:00 rpi5a kernel: [ 1572.999768] Out of memory: Killed process 4285 (pocket_trk) total-vm:26782544kB, anon-rss:8062880kB, file-rss:512kB, shmem-rss:0kB, UID:0 pgtables:7888kB oom_score_adj:0
そこで、GPSとみちびきのL1C/A信号と、みちびきのサブメータ級補強信号(L1S信号)に限定して受信しました。こちらはうまく受信できました。使用したコマンドは、./pocket_trk -sig L1CA -prn 1-32,193-199,120-158 -sig L1S -prn 184-189 -c .../conf/pocket_ALL_48MHz.conf
です。48 MHz標本化なので、大きな負担になっていることにはかわりありません。
まとめ
Pocket SDRバージョン0.13のC言語版アプリケーションの一つpocket_trk
をMacとRaspberry Piにて試しました。あらゆるGNSS信号を受信できて、すごいです。オールインビューにてリアルタイムGNSS測位できるだけでなく、ログ出力も豊富です。
また、Pocket SDRのハードウェアも市販されるようになり、超高性能受信機が身近になりました。嬉しいです。
関連記事
- Pocket SDRを用いたGalileo E6B信号の受信 27th January 2023
- リフローでやらかしました 19th January 2023
- Pocket SDRハードウェア製作(第3報) 30th September 2022
- Pocket SDRハードウェア製作(第2報) 14th September 2022
- Pocket SDRハードウェア製作(第1報) 4th September 2022
- PocketSDRすごい(パーツ購入編) 9th April 2022
- PocketSDR APにてbladeRFを使いたい(その2) 16th March 2022
- PocketSDR APにてbladeRFを使いたい 5th March 2022
- PocketSDRすごい(スナップショット測位編) 23rd February 2022
- PocketSDRすごい(FFTWによる高速化) 19th February 2022
- PocketSDRすごい(L6信号デコード編) 19th January 2022
- PocketSDRすごい(pocket_trk編) 28th December 2021
- PocketSDRすごい(pocket_acq編) 4th December 2021