Pocket SDRすごい(リアルタイム測位機能)

category: gnss

はじめに

東京海洋大学の高須知二先生が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

Pocket SDRソフトウェアのコンパイルと設定

ここでは、PCとして、バージョン0.13にて正式対応したmacOS(Macbook Air, Apple Silicon M2)とRaspberry Pi 5 (8GB, SC1112) を利用しました。

はじめに、macOSにPocket SDRソフトウェアを設定しました。このMacbook Airにてuname -aneofetchを実行した結果は次のとおりです。

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

netfetch

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...ColorsColor Presets...Light Backgroundにて一時的にライトモードに変更できます。

LinuxやRaspberry PiでのPocket SDRハードウェア利用の際には、管理者権限が必要なので、コマンド先頭にsudoをつける必要があります。一方、Macではsudoの付加は不要でした。しかし、Pocket SDRをUSBポートに接続するときに、アクセサリの使用許可を与える必要があります。

Mac requires hardware usage grant to a hardware

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日にこれを注文し、楽しく利用してきました。

Pocket SDR FE4CH

この製品では、あらかじめファームウェアも書き込まれていました。嬉しいです。また、ショートピンが添付されていましたが、通常の利用時には使わず、ファームウェア書き換えのときに使いますので、大切に保存します。ショートピンのオン・オフが、従来の2チャネル版と4チャネル版とで逆になっていますので、昔からのPocket SDRユーザは注意が必要です。

Pocket SDRのtestディレクトリにあるシェルスクリプトpocket_trk_ALL_test.shは、最大の48 MHz標本化にて、このFE4CHの全機能を活用するものです。このシェルスクリプトを実行したら、たくさんの信号を受信することができました!

Pocket SDR ver.0.13

このシェルスクリプトでは、みちびきの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のハードウェアも市販されるようになり、超高性能受信機が身近になりました。嬉しいです。


関連記事