Galileo HAS(high accuracy service)その3
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を復号しようとしたら、ランク落ちが検出されました。
原因と対策
ランク落ちした理由は、同一内容メッセージを複数回、受け取ったからでした。このMID(message ID)23においては、MS(message size)の11だけの異なるPID(encoded page ID)を持つメッセージの受信が必要です。この過程で、E13
がPID 3と2を、また、E26
がPID 2と3を送ってきたので、さらにE31
とE09
が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
コードを修正しました。.
関連記事
- Galileo HAS(high accuracy service)その2 20th February 2023
- Galileo HAS(high accuracy service)その1 7th February 2023