USRP B205mini-iとGNSS-SDRを用いた衛星測位
はじめに
GPS (Global Positioning System) をはじめとする測位衛星システムGNSS(Global Navigation Satellite System)の信号をソフトウェアで処理して、測位を行うソフトウェア無線(SDR: software defined radio)のプロジェクトとして、GNSS-SDRがあります。これに付属するサンプルデータを用いた測位ではすぐに座標が表示されるのですが、自らのSDRを用いた測位では衛星探索をくり返して座標が特定できませんでした。
今回、10万円程度で購入できるSDR受信機Ettus Rearch USRP B205mini-i(以下B205
と略します)を用い、やっとGNSS-SDRでの測位に成功しました。
これはB205の表面です。写真左側に3つのSMAコネクタがあり、上から外部クロック入力端子REF
、受信端子RX2
、送受信端子TRX
です。このSDRを受信専用に用いるときは、RX2
かTRX
ですが、GNSS-SDRではRX2
を用いるようになっています。
裏面はJTAG端子のみのシンプルな構造になっていました。
準備
B205をパソコンに接続し、パソコンにドライバソフトウェアとGNSS-SDRをインストールする一方、B205にGNSSアンテナを接続します。GNSSアンテナには、低雑音増幅器(LNA: low noise amplifier)が内蔵されていることが普通です。このLNAへの電源供給のため、アンテナ端子への3.5ボルトから5ボルトの電源供給が必要です。私は、電源通過型のRFスプリッタ(Mini-Circuits ZAPD-2DC-S+)を用いて、電源通過端子にGNSS受信機u-blox ZED-F9Pを使ってアンテナに電源供給しました。
パソコンとして、Latte Panda Alpha 800sにM.2 SSDを取り付け、Ubuntu 20.04.3 LTSをインストールしたものを用いました。このパソコンにsshにてログインして、管理者でGNSS-SDRとB205のドライバソフトウェアをインストールしました。
apt update; apt -y upgrade
apt install -y gnss-sdr uhd-host
aptコマンドにてインストールされたGNSS-SDRのバージョンは0.0.11であり、現行の0.0.15に対して、やや古いものでした。GNSS-SDRのホームページのGetting Startedに書かれた、Quick-Start GuideからMy first position fixまでの手順を済ませます。
測位
B205はGNSS-SDRの公式サポートハードウェアですが、実際に動作させるまでには苦労しました。
公開されている設定ファイル例から、B205にて利用するためにSignalSource.subdevice
を変更します。また、この設定ファイルでは多くのオプション設定がされているのですが、そのままでは衛星探索をくり返して、座標が得られませんでした。
そこで、このサンプル設定から、信号捕捉(ACQUISITION GLOBAL CONFIG)の誤警報などのオプションを外し、測位状態をモニタするオプション(MONITOR CONFIG)を追加しました。フィルタの設定は変更していません。これを、例えばuhd.conf
などのファイルに保存します。
[GNSS-SDR]
;######### GLOBAL OPTIONS ##################
GNSS-SDR.internal_fs_sps=4000000
;######### SIGNAL_SOURCE CONFIG ############
SignalSource.implementation=UHD_Signal_Source
SignalSource.device_address=
SignalSource.sampling_frequency=4000000
SignalSource.freq=1575420000
SignalSource.subdevice=A:A
;######### SIGNAL_CONDITIONER CONFIG ############
SignalConditioner.implementation=Signal_Conditioner
;######### DATA_TYPE_ADAPTER CONFIG ############
DataTypeAdapter.implementation=Pass_Through
DataTypeAdapter.item_type=cshort
;######### INPUT_FILTER CONFIG ############
InputFilter.implementation=Fir_Filter
InputFilter.input_item_type=cshort
InputFilter.output_item_type=gr_complex
InputFilter.taps_item_type=float
InputFilter.number_of_taps=11
InputFilter.number_of_bands=2
InputFilter.band1_begin=0.0
InputFilter.band1_end=0.48
InputFilter.band2_begin=0.52
InputFilter.band2_end=1.0
InputFilter.ampl1_begin=1.0
InputFilter.ampl1_end=1.0
InputFilter.ampl2_begin=0.0
InputFilter.ampl2_end=0.0
InputFilter.band1_error=1.0
InputFilter.band2_error=1.0
InputFilter.filter_type=bandpass
InputFilter.grid_density=16
InputFilter.sampling_frequency=4000000
InputFilter.IF=0
;######### RESAMPLER CONFIG ############
Resampler.implementation=Pass_Through
;######### CHANNELS GLOBAL CONFIG ############
Channels_1C.count=8
Channels.in_acquisition=1
;######### ACQUISITION GLOBAL CONFIG ############
Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition
Acquisition_1C.item_type=gr_complex
Acquisition_1C.coherent_integration_time_ms=1
;######### TRACKING GLOBAL CONFIG ############
Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking
Tracking_1C.item_type=gr_complex
;######### TELEMETRY DECODER GPS CONFIG ############
TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder
;######### OBSERVABLES CONFIG ############
Observables.implementation=Hybrid_Observables
;######### PVT CONFIG ############
PVT.implementation=RTKLIB_PVT
PVT.iono_model=Broadcast
PVT.trop_model=Saastamoinen
PVT.flag_rtcm_server=false
PVT.flag_rtcm_tty_port=false
PVT.rtcm_dump_devname=/dev/pts/1
PVT.rtcm_tcp_port=2101
PVT.rtcm_MT1019_rate_ms=5000
PVT.rtcm_MT1077_rate_ms=1000
;######### MONITOR CONFIG ############
Monitor.enable_monitor=true
Monitor.decimator_factor=50
Monitor.client_addresses=127.0.0.1
Monitor.udp_port=1234
GNSS-SDR.telecommand_enabled=true
GNSS-SDR.telecommand_tcp_port=3333
そして、GNSS-SDRモニタプログラム作成の手順により、プログラムmonitoring-client
をコンパイルし、シェルスクリプトgnss-sdr-harness.sh
を準備します。
ここまでできたら、GNSS-SDRを一般ユーザのバックグランドで実行します。座標が特定できるまでの長い時間の間にsshのセッションが終了しても受信を継続させるためと、可視衛星探索のメッセージ(Tracking...
とLoss...
)除いて重要なメッセージを見逃さないためです。
nohup ./gnss-sdr-harness.sh gnss-sdr -c uhd.conf &
tail -f nohup.out | grep -v Tracking --line-buffered | grep -v Loss
私の場合、プログラム開始から約2時間46分後に、座標が特定できました(自宅で実験していますので、座標の部分は伏せ字にしています)。
Initializing GNSS-SDR v0.0.11 ... Please wait.
Logging will be written at "/tmp"
Use gnss-sdr --log_dir=/path/to/log to change that.
[INFO] [UHD] linux; GNU C++ version 9.2.1 20200304; Boost_107100; UHD_3.15.0.0-2build5
[INFO] [B200] Detected Device: B205mini
[INFO] [B200] Operating over USB 3.
[INFO] [B200] Initialize CODEC control...
[INFO] [B200] Initialize Radio control...
[INFO] [B200] Performing register loopback test...
[INFO] [B200] Register loopback test passed
[INFO] [B200] Setting master clock rate selection to 'automatic'.
[INFO] [B200] Asking for clock rate 16.000000 MHz...
[INFO] [B200] Actually got clock rate 16.000000 MHz.
[INFO] [B200] Asking for clock rate 32.000000 MHz...
[INFO] [B200] Actually got clock rate 32.000000 MHz.
Sampling Rate for the USRP device: 4000000.000000 [sps]...
UHD RF CHANNEL #0 SETTINGS
Actual USRP center freq.: 1575420000.000297 [Hz]...
PLL Frequency tune error 0.000297 [Hz]...
Actual daughterboard gain set to: 50.000000 dB...
Setting RF bandpass filter bandwidth to: 2000000.000000 [Hz]...
Check for front-end LO: locked ... is Locked
...(snip)...
Current receiver time: 1 min 21 s
Loss of lock in channel 0!
Tracking of GPS L1 C/A signal started on channel 0 for satellite GPS PRN 01 (Block IIF)
New GPS NAV message received in channel 4: subframe 2 from satellite GPS PRN 16 (Block IIR)
...(snip)...
Current receiver time: 2 h 45 min 58 s
First position fix at 2021-Dec-06 15:15:30.500000 UTC is Lat = 34.41xx [deg], Long = 132.44x [deg], Height= xx.xxx [m]
Position at 2021-Dec-06 15:15:30.500000 UTC using 4 observations is Lat = 34.41xxxxxxx [deg], Long = 132.44xxxxxxx [deg], Height = xx.xxx [m]
測位できている間、ターミナル画面には、6秒ごとにNew GPS Nav message...
のメッセージが、また、1秒ごとにPosition...
のメッセージが、それぞれ表示されました。
別ターミナルを開き、./monitoring-client 1234
を実行すると、測位状態をモニタできます。
また、nc -C localhost 3333
を実行してもGNSS-SDRの状態を観測できます。この-C
オプションは、改行コードを「CR・LF」にするためのものです。コマンドとして、status
と入力すると、外部からUTC時刻、座標、移動速度、移動方向をモニタできます。exit
を入力すると、終了します。この他のコマンドとしては、reset
、standby
、coldstart
、warmstart
、hotstart
があります。
おわりに
とても苦労しましたが、やっと自前のSDRでGNSS測位できました。動作させてみた感想は、確かに2,500円程度の安価な受信機と比較して随分と感度が悪いのですが、受信機パラメータを自らで調整できることで測位の理解が深まり楽しく、市販受信機が対応していないような新信号確認の可能性に将来性を感じました。
GNSS-SDRのSDR受信機として、Nuand bladeRFも試しましたが、issueにも報告されているように、利得調整に難があるようです。bladeRF-cli
コマンドを用いてマニュアルで利得設定を行い、受信データをファイルに保存してGNSS-SDRで測位を試みましたが、今度はバッファオーバーフロに悩まされました。また、B205とRaspberry Pi 3Bで動作させたGNSS-SDRでも、バッファーオーバーフロが多発しました。
しばらくGNSS-SDRを楽しんでみようと思います。
関連記事
- VMware Playerで実行したDebian上のGNSS-SDRによるGPS測位(失敗) 19th February 2020
- GNSS SDRを用いたGPS信号の受信 11st December 2019