QZS L6 ToolのHASメッセージ対応

category: gnss

はじめに

準天頂測位衛星みちびきは精度を高める情報(補強メッセージ)を放送しています。この補強メッセージは、CSSR(compact state space representation)形式で表されます。このCSSR形式のメッセージを表示するQZS L6 Tool(キュー・ズイ・エス・エルシックスツール、quasi-zenith satellite L6 band tool)を公開しています。

一方、ヨーロッパの測位衛星Galileoの補強メッセージは、HAS(ハス、high accuracy service)形式にて放送されます。このHASメッセージ解読準備をしていました(Galileo HASその1Galileo HASその2)。やっと、QZS L6 ToolにてHASメッセージが解読できるようになりました。

QZS L6 Tool: quasi-zenith satellite L6-band tool

git clone https://github.com/yoronneko/qzsl6tool -b 20230305upd

Galileo HASの利用には5衛星程度の同時受信が必要

Galileo HASの一つのメッセージ単位は、MID(message identification)にて表されます。このメッセージは、複数衛星と連続時間とで時空間分割されて、伝送されます。同時に受信できる衛星数は、受信者の環境に依存します。すべての分割メッセージを受信できなくてもよく、より多くの複数衛星からの信号を同時受信できれば短時間でメッセージが復元できます。

メッセージ復号には、はじめに、Maskと呼ばれる、補強対象の衛星と信号を定義するメッセージの受信が必要です。動画の最初の方では、「padding bit」に0と1の交番符号以外があります。これは、補強対象が未知であるため、受信メッセージが破棄されているからです。HASメッセージには、Mask以外に、Orbit correction、Clock full-set、Clock subset、Code bias、Phase biasの種類があります。Maskをより早く知るためにも、より多くの衛星信号が必要です。先の動画では、E6B信号を放送している5衛星を利用しています。

意図的に、受信できる衛星数を5から3に減らしたHASメッセージ復号例を次の動画に示します。この例では、この3分間にMaskを発見できず、そのためにOrbitCode biasなどの補強メッセージを復号できませんでした。

測位を行うためには、受信点で未知な、緯度、軽度、楕円体高、そして時刻の4変数の値を得るために、同時に4衛星からの受信が必要です。測位ができる程度の衛星数があれば、HASメッセージもまた受信できるといえます。

比較のために、みちびきCSSRメッセージの復号例を示します。みちびきでは、すべての衛星から同一内容のCSSRメッセージが放送されますので、一つの衛星のみの受信で補強メッセージ受信が達成できます。しかし、CSSRでは、Maskメッセージ(CSSRではサブタイプ1メッセージ)は30秒に1度しか送信されないので、最悪条件では復号開始までに30秒の時間がかかります。L6E信号にて放送されるMADOCA-PPP(マドカ・ピーピーピー、multi-GNSS advanced orbit and clock augmentation - precise point positioning)を例に、CSSRを復号してみます。

ここでは、受信開始から5秒程度でMaskメッセージを発見でき、Clock full-setに相当するサブタイプ3メッセージなどが復号できました。

Pocket SDRによるGalileo E6B信号の受信

今回、作成したHASメッセージ解読コードは、ソフトウェア定義無線(SDR: software defined radio)Pocket SDRにて受信したGalileo E6B信号ログファイルを処理するものです。このSDRは、東京海洋大学の高須知二先生が公開されているオープンソースのものです。

Windows PCにPocket SDRを接続し、Galileo E6B信号を放送している衛星を探索しました。

pocket_dump.exe -c pocketsdr/conf/pocket_L1L6_12MHz.conf /dev/null - | pocket_trk -sig e6b -prn 1-32

Galileo E6B signal search on Pocket SDR

このPRN欄から、E10 E12 E18 E24 E31の、5衛星が受信可能であることがわかります。このすべての衛星からのE6B信号を探索している状態では、PCの負荷が高すぎて、すぐに信号受信ができなくなりました。

そこで、この5衛星に限定して、信号受信します。さらに、そのログ出力をTCPポート2000番に出力するようにします。このようなことが簡単にできて、Pocket SDRすごいのです。

pocket_dump.exe -c pocketsdr/conf/pocket_L1L6_12MHz.conf /dev/null - | pocket_trk -sig e6b -prn 10,12,18,24,31 -log :2000

Galileo E6B signal reception with Pocket SDR

一方、私の普段使いのMacから、そのPCのTCP 2000番ポートの値を読み出して、QZS L6 Toolのpksdr2has.py(Pocket SDR logfile to HAS)に供給すると、最初の動画のようになります。

nc (win-pc host name) 2000 | pksdr2has.py -t 2

-tオプションは詳細表示(trace)のためのもので、1ではメッセージ内容表示を、2では内容表示とビットイメージ表示を行います。

Galileo E6B信号サンプル

Pocket SDRがなくてもHAS復号を試せるよう、QZS L6 Toolのsampleディレクトリに、E6B信号受信ログファイルのサンプルを置きました。QZS L6 Toolのpythonディレクトリから、次のようにしてHAS復号を試せます。

./pksdr2has.py -t 2 < ../sample/20230305-063900pocketsdr-e6b.txt

HAS復号のセルフテスト

Galileo HAS仕様書には、テキスト形式でのHAS復号例が添付されています。pksdr2has.pyでは、そのGalileo-HAS-SIS-ICD_1.0_Annex_D_HAS_Message_Decoding_Example.txtに記載されている例を実行できます。

python
>>> import pksdr2has
>>> pksdr2has.icd_test()

ここで、>>>はPythonのプロンプトです。この結果が仕様書のHAS復号例と一致することを確かめています。

おわりに

QZS L6 ToolにHASメッセージ復号機能を実装しました。HAS利用には、5衛星程度の同時受信が必要です。また、メッセージ末尾の余剰ビットには、0と1からなる交番符号がパディングされていました。この16進表記はaaです。また、現時点では、Phase biasに関する補強メッセージは放送されていないようでした。

CSSRとHASとの両方のデコーダを作成した際の、たくさんの気づきは、のちにまとめます。

QZS L6 ToolによりHASやMADOCA-PPPを利用した測位補強を行えるようにしたいです。


関連記事