Galileo HAS(high accuracy service)その3

category: gnss

QZS L6 ToolのHAS復号が強制終了

欧州の測位衛星Galileoは、高精度補強信号HAS(ハス)を放送しています。QZS L6 Toolでも復号できるようにしましたが、なぜか、復号が強制終了するようになりました。

HAS復号の際には、受信データに応じて、ガロア体の逆行列を計算しなければなりません。このとき、ランク落ちにより、逆行列が計算できなかったのが原因でした。

ランク落ちのチェック

そこで、HAS復号コードlibgale6.pyに、チェックコードを追加して、ランク落ちの際にはその旨を表示するようにします。

--- a/python/libgale6.py
+++ b/python/libgale6.py
@@ -382,6 +382,13 @@ class GalE6():

     def decode_has_message(self):
         d = GF(g[np.array(self.hasindx[:self.ms])-1, :self.ms])
+        if np.linalg.matrix_rank(d) != self.ms:
+            disp_msg = 'decode failure --- ' + \
+                f'rank deficient when solving inverse matrix:\n{d}\n' + \
+                f'the reduced matrix is:\n{d.row_reduce()}'
+            if self.fp_disp:
+                print(disp_msg, file=self.fp_disp)
+            return
         w = GF(self.haspage[:self.ms])
         m = np.linalg.inv(d) @ w
         has_msg = bitstring.ConstBitStream(m.tobytes())

そして、Galileo HASを復号しようとしたら、ランク落ちが検出されました。

Rank deficient in decoding HAS with QZS L6 Tool

原因と対策

ランク落ちした理由は、同一内容メッセージを複数回、受け取ったからでした。このMID(message ID)23においては、MS(message size)の11だけの異なるPID(encoded page ID)を持つメッセージの受信が必要です。この過程で、E13がPID 3と2を、また、E26がPID 2と3を送ってきたので、さらにE31E09がPID 155を送ってきたので、この行列はあわせて3ランク落ちました。

Galileo運用者は、PIDを255通り選択できるので、重複したPIDを放送する動機はないはずです。私は油断して、QZS L6 Toolにて、PIDの重複チェックをしませんでした。しかし、なぜHASで重複したPIDを放送するのでしょうか。このような運用をすると、HPVRS(high parity vertical Reed-Solomon)の効果が低減します。技術大好きな私にとって、これは悔しい気持ちでいっぱいです。

PIDの重複チェックを行い、MSだけの相異なるPIDメッセージを集めれば、復号が強制終了することはことはなくなるはずです。近いうちにコード修正します。 update on 2023-11-21 コードを修正しました。.


関連記事