中国の測位衛星BeiDou(北斗)のB2b信号 その2

category: gnss

はじめに

中国の測位衛星システムBeiDouは、中高度軌道(MEO)、静止軌道(GEO)、傾斜対地同期軌道(IGSO)のすべての軌道を利用しています。私は、特に、BeiDou第3世代(BDS-3)シリーズGEO衛星が放送するPPP-B2bに着目しています。これは、B2b信号上で配信される、測位精度を高める情報メッセージです。

公開されているPPP-B2bの仕様書BDS-SIS-ICD-PPP-B2b-1.0をもとにして、PPP-B2bメッセージ内容を読み出すコード(bdsb2read.py)を書きました。これを用いて、実際のPPP-B2bメッセージ内容を観測します。

B2b信号受信機

BeiDouの高精度単独測位(PPP: precise point positioning)メッセージPPP-B2bを観測するためには、B2b信号の電波を受信、復調、そして、誤り訂正を行い、仕様書の手順にてその内容を復号することになります。

B2b信号を受信し、誤り訂正までを行って、その生データを出力できる受信機は、私の知る限り、オープンソースソフトウェア無線Pocket SDR受信機と、Septentrioのmosaic-go X5受信機だけです。私は、この両方の受信機を所有しています。

特に、Pocket SDRは、生データ出力までの難関の一つである64値LDPC誤り訂正を簡潔な形で実現しています。すごいです。私も、このLDPC復号に挑戦してきましたが、今までにできませんでした。私自身は、B2b信号以外の受信を含めて、Pocket SDR受信機を毎日楽しく利用しています。

一方、mosaic-go X5受信機にも、64値LDPC誤り訂正が実装されています。Septentrio mosaic-X5 Firmware v.4.14.4のZIPファイルに含まれるmosaic-X5 Firmware v4.14.4 Reference Guide.pdfの276ページには次のように書かれています。

The receiver attempts to correct bit errors using the LDPC parity bits, but unrecoverable errors are still possible at low C/N0. It is therefore always needed to check the CRC status before using the navigation bits.

常時観測に利用しているmosaic-go X5受信機の出力を一般公開しています。インターネット経由でアクセスできるライブストリームには、私のmosaic-go X5受信機で観測したB2b生データや、そのアーカイブも含みます。これらの公開データは、どなたでも、事前連絡なしに、無料でご利用いただけます。

B2b信号の観測

RTKLIB ver.2.4.3 b34に含まれるstr2strと、QZS L6 Toolを用いて、B2b信号ライブストリーム情報を観測してみます。

このライブストリームは、Septentrio受信機の生データ形式にて出力されます。ここでは、str2strとともに、QZS L6 ToolのSeptentrio受信機デコーダーseptread.pyを用います。

$ str2str -in ntrip://ntrip.phys.info.hiroshima-cu.ac.jp:80/B2B 2> /dev/null | septread.py

2024-04-08 00:15:26 BDSRawB2b C35 eb908d078554847730480cdafebfec2e800f1e3fc3d4969affc103828001ffd20010518877203dc080001fdc360c945aa202a57fff08747bfdc122d8e06c94d497c0e39bea2feae75f9264acb6ad443b660b26edd283939c686def490e73bcf1d50d9b0e41f0e12ca0bebace651b4343f8a587a37154021aa906df00e7
2024-04-08 00:15:26 BDSRawB2b C26 eb9069078554847730483704d71ff430800ef23fc3d4969affc103828001ffd20010518877203dc080001fdc360c945aa202a57fff08747bfdc122d8e03ce0760e3196795eb1e4bcca31ac826274f033268ee0fd28d4dc3558525025c68e476d1691c1b4dc4f48994059548f16bbe9816aeccbb34b2216f80cac411c88
2024-04-08 00:15:26 BDSRawB2b C44 eb90b1078554847730480e527d60190c000f2f3fc3d4969affc103828001ffd20010518877203dc080001fdc360c945aa202a57fff08747bfdc122dfe03aaa42cc17bfbb390e645933645023c1cbc4deefe02b10b9b3acc79068b8a9d26bfe59fb3021512fcf415bc53aefe01b369cc31329365713d4d1e042b875095b
2024-04-08 00:15:26 BDSRawB2b C45 eb90b52285548609060037e780136f0a665ffc1d97e17602c007186c40c02d95a04f5329b89af87c05dab004468013003700403400205780f1000345209ec3bde00df0e2469cf8bdf50dd14d1a488dd5295673fbd5a8e9c26e98809e258fe2ad72b4d6d71dd8bea1c1e44148fd820b5f839cc081e023360c148fdfa5e7
2024-04-08 00:15:26 BDSRawB2b C39 eb909c078554847730483fbe097fffb1000f283fc3d4969affc103828001ffd20010518877203dc080001fdc360c945aa202a57fff08747bfdc122dfe032646fbe9b41f2734e36d8da429acfcfae7b06a34cdbeed11d8d6dc3dc6c2b20bd620078decaaf984396bf1f95d776f8df1da3da714960b9e871ceec012fbd7c
2024-04-08 00:15:26 BDSRawB2b C40 eb90a0078554847730483de38e5ffc08800f1b3fc3d4969affc103828001ffd20010518877203dc080001fdc360c945aa202a57fff08747bfdc122dfe015d8096da97986ca877d9e7d70c3920fa7b09d3ebc0ef346a5546b8cd1be15888790ffd2d37e0f34a8d4fb65177630d2db3188e3d2a93e18ecb5c59769d0bdb8
2024-04-08 00:15:26 BDSRawB2b C59 eb90ec01007344908400110004400110004400110004826ba000040011000440019fefc40010000000000000000000000000000000000000000000000002f8b5f9926de359888ef5aceedd27e5bba028504f6e099ce6e11c8ca102d639724cd9c7639231195ba460d87d7fcc3f606c2ae03c054556435277e9cbf57d3f
2024-04-08 00:15:26 BDSRawB2b C62 eb90fbf1007345188400110004400110004400110004827cbfb2840011000440019fe2c400100000000000000000000000000000000000000000000000006f4a22f0ffe7ced4b870f4e033822573fb43faf005c8fe6297dcb90ba955d37fc56de39aa5113cb6d76c8935ce964ba26ec40b6f035dd37b50ee2a86f6a294
...

この出力は、日付と時刻(UTC)、mosaic-X5受信機の生データメッセージ名BDSRawB2b、衛星名(C35など)、16進表記の生データ、からなります。

PPP-B2bメッセージはBDS-3 GEO衛星から放送されます。候補衛星は、C59C60C61C62ですが、後2者はIn testing状態です。BDS-3 MEO衛星からは、新しい航法メッセージB-CNAV3が放送されます。PPP-B2bとB-CNAV3とは、同一フォーマットを用いています。

はじめに、衛星指定せずに、すべてのB2b信号メッセージを観測します。str2strで生データを取得し、QZS L6 Toolのseptread.py-bオプションでB2bメッセージを抽出し、bdsb2read.pyにてそのメッセージを復号します。

$ str2str -in ntrip://ntrip.phys.info.hiroshima-cu.ac.jp:80/B2B 2> /dev/null | septread.py -b | bdsb2read.py
C39 MT5  URA   03:03:41 IODSSR=1 IODP=5 IODSSR mismatch
C40 MT5  URA   03:03:41 IODSSR=3 IODP=9 IODSSR mismatch
C59 MT4  CLOCK 00:29:28 IODSSR=1 IODP=2 IODSSR mismatch
C62 MT4  CLOCK 00:29:28 IODSSR=2 IODP=3 IODSSR mismatch
C60 MT4  CLOCK 00:29:28 IODSSR=1 IODP=2 IODSSR mismatch
C35 MT10 EPH  00:29:35+1 TOE=288 sattype=3
C26 MT10 EPH  00:29:35+1 TOE=288 sattype=3
C44 MT10 EPH  00:29:35+1 TOE=288 sattype=3
C24 MT10 EPH  00:29:35+1 TOE=288 sattype=3
C45 MT30 CLK  2024-04-08 00:29:31
C39 MT30 CLK  2024-04-08 00:29:31
C40 MT10 EPH  00:29:35+1 TOE=288 sattype=2
C59 MT4  CLOCK 00:29:28 IODSSR=1 IODP=2 IODSSR mismatch
C62 MT4  CLOCK 00:29:28 IODSSR=2 IODP=3 IODSSR mismatch
C60 MT4  CLOCK 00:29:28 IODSSR=1 IODP=2 IODSSR mismatch
C35 MT30 CLK  2024-04-08 00:29:32
C26 MT5  URA   03:03:42 IODSSR=1 IODP=14 IODSSR mismatch
C44 MT30 CLK  2024-04-08 00:29:32
C24 MT30 CLK  2024-04-08 00:29:32
C45 MT10 EPH  00:29:36+1 TOE=288 sattype=3
C39 MT10 EPH  00:29:36+1 TOE=288 sattype=2
C40 MT30 CLK  2024-04-08 00:29:32
C59 MT63 NULL
C62 MT63 NULL
C60 MT63 NULL
C35 MT10 EPH  00:29:37+1 TOE=288 sattype=3
C26 MT10 EPH  00:29:37+1 TOE=288 sattype=3
C44 MT10 EPH  00:29:37+1 TOE=288 sattype=3
C24 MT10 EPH  00:29:37+1 TOE=288 sattype=3
C45 MT30 CLK  2024-04-08 00:29:33
C39 MT30 CLK  2024-04-08 00:29:33
C40 MT10 EPH  00:29:37+1 TOE=288 sattype=2
C59 MT63 NULL
C62 MT63 NULL
C60 MT63 NULL

この出力は、衛星名、メッセージタイプ(MT)、MTメッセージ名、内容概要、からなります。

内容概要には、IODSSR(構成管理番号、issue of data - state space representation)の不整合により、PPP-B2bメッセージが復号できないことが示されています。このコードでは、PPP-B2bで最初に受信すべき「マスクメッセージMASK」を発見すると、そのIODSSRを保持して、それに続く「時刻補正CLOCK」や「軌道補正ORBIT」に記述されたIODSSRとの一致を確認しています。

上述の例において、衛星C62IODSSRは、C59C60IODSSRとは異なりました。また、この例では、C59C60とで、衛星番号(PRN: pseudo random noise)マスク変更を管理するIODP(issue of data - PRN)も異なっていました。

補強放送衛星を指定したPPP-B2bメッセージ観測

たとえば、PPP-B2bメッセージを放送するC59衛星に限定して、PPP-B2bメッセージを復号します。bdsb2read.py-p 59オプション指定して衛星を限定し、さらに、-t 1オプションをつけて、詳細内容も表示します。

補強メッセージ放送衛星を指定することにより、メッセージを復号できました!マスクメッセージを受信してから補強情報の復号を開始しますので、復号開始までに少々の時間がかかります。このようなタイムラグの発生は、みちびきのCLASやMADOCA-PPP、GalileoのHASなどのほかの高精度測位でも同様です。

$ str2str -in ntrip://ntrip.phys.info.hiroshima-cu.ac.jp:80/B2B 2> /dev/null | septread.py -b | bdsb2read.py -p 59 -t 1
C59 MT4  CLOCK 00:51:28 IODSSR=1 IODP=2 IODSSR mismatch
C59 MT63 NULL
C59 MT63 NULL
C59 MT63 NULL
C59 MT4  CLOCK 00:51:34 IODSSR=1 IODP=2 IODSSR mismatch
C59 MT4  CLOCK 00:51:34 IODSSR=1 IODP=2 IODSSR mismatch
C59 MT4  CLOCK 00:51:34 IODSSR=1 IODP=2 IODSSR mismatch
C59 MT63 NULL
...
C59 MT63 NULL
C59 MT1  MASK  00:51:58 IODSSR=1 IODP=2 (updated)
 C19 C20 C21 C22 C23 C24 C25 C26 C27 C28 C29 C30 C32 C33 C34 C35 C36 C37 C38 C39 C40 C41 C42 C43 C44 C45 C46 G01 G02 G03 G04 G05 G06 G07 G08 G09 G10 G11 G12 G13 G14 G15 G16 G17 G18 G19 G20 G21 G22 G23 G24 G25 G26 G27 G28 G29 G30 G31 G32
C59 MT4  CLOCK 00:51:58 IODSSR=1 IODP=2
SAT IODCorr clock[m]
C20       5   -0.634
C21       3    0.310
C23       3   -0.114
C59 MT4  CLOCK 00:51:58 IODSSR=1 IODP=2
SAT IODCorr clock[m]
C25       3    0.197
C26       7    0.208
C34       3    0.555
C35       4    0.589
C36       4   -0.544
C43       7    1.058
C45       3    0.000
C59 MT4  CLOCK 00:51:58 IODSSR=1 IODP=2
SAT IODCorr clock[m]
G01       0    0.000
G02       0    0.000
G03       0    0.000
G04       0    0.000
G05       0    0.000
G06       0    0.000
C59 MT3  CODE  00:51:12 IODSSR=1 numsat=3
SAT Signal Code   Code Bias[m]
C24 B1I                  1.122
C24 B1C(D)               2.465
C24 B1C(P)               2.482
C24 B2a(D)              -6.341
C24 B2a(P)              -5.559
C24 B2b-I               -5.389
C24 B2b-Q               -4.879
C24 B3 I                 0.000
C26 B1I                 -1.564
C26 B1C(D)              -0.136
C26 B1C(P)              -0.034
C26 B2a(D)              -5.848
C26 B2a(P)              -5.066
C26 B2b-I               -4.709
C26 B2b-Q               -4.148
C26 B3 I                 0.000
C29 B1I                  0.000
C29 B1C(D)               1.088
C29 B1C(P)               1.207
C29 B2a(D)              -5.882
C29 B2a(P)              -5.049
C29 B2b-I               -5.304
C29 B2b-Q               -4.777
C29 B3 I                 0.000
...

この結果は、例えばC20衛星について、時刻に起因する誤差を軽減するためには、衛星と受信機との間の擬似距離に対して-0.634メートルの補正を行えば良いことを表します。

このPPP-B2bメッセージにおいて、GPS衛星すべてのに対する衛星時刻補正量は、常にゼロとなっているようです。GPS衛星の軌道補正量は、衛星ごとに異なる値を示していました。

現在のところ、PPP-B2bの補強対象衛星は、BeiDouとGPSのみのようです。仕様書上は、BeiDouとGPSのほかに、GalileoとGLONASSに対しての補強が規定されています。みちびきに対しては、残念ながら、仕様書上でも補強対象外です。

Linuxディストリビューションの多くに含まれているcURLコマンドなどを用いると、上述のアーカイブにあるデータを処理することも可能です。例えば、2024-04-05 00:00:00 UTCから1時間のPPP-B2bメッセージを表示するためには、次のようにします。

$ curl https://phys.info.hiroshima-cu.ac.jp/gnss/b2b/202404/20240405a.sept | septread.py -b | bdsb2read.py -p 60 -t 1 -c | lv

ここでは、ページャーとしてlvを用いています。bsdb2read.py-cオプションを指定して、カラー出力を得ています。

もちろん、一旦、アーカイブデータをファイルに保存して、そのファイル内容を表示することも可能です。ここでは、アーカイブデータをファイルb2b.septに保存しています。

$ curl https://phys.info.hiroshima-cu.ac.jp/gnss/b2b/202404/20240405a.sept > b2b.sept
$ septread.py -b < b2b.sept | bdsb2read.py -p 60 -t 1 -c | lv

B2bメッセージの復号誤り

B2b信号の64値LDPC誤り訂正によっても、誤りが残留することがあります。そのような誤りを検知できるよう、PPP-B2bメッセージには24ビット長のCRC(巡回冗長検査: cyclic redundancy check)符号が付加されています。上述の1時間観測データをC60に対して処理すると、時々、CRCにより誤りが検出されました。

CRC error on B2b message decode

この1時間の観測データ中の、誤り検出数を数えてみます。

$ septread.py -b < b2b.sept | bdsb2read.py -p 60 | wc -l
3214
$ septread.py -b < b2b.sept | bdsb2read.py -p 60 | grep CRC | wc -l
142

全3214メッセージ中の142メッセージ(4.4%)に誤りが検出されました。もしかして、mosaic-go X5受信機の誤り訂正が不完全かもしれないと思いました。

そこで、Pocket SDRの64値LDPC誤り訂正コードを活用します。Pocket SDRのPythonソースコードをQZS L6 ToolのPythonソースコードと同一場所におき、QZS L6 Toolのbdsb2read.pyを修正して、この生データに対しさらに64値LDPC誤り訂正を行います。

# change this to 1 if you use 64-ary LDPC function of Pocket SDR (ref.[3])
POCKET_SDR_LDPC = 1

...

try:
    if POCKET_SDR_LDPC:
        import sdr_ldpc
        import numpy as np
except ModuleNotFoundError:
    POCKET_SDR_LDPC = 0

...

        if POCKET_SDR_LDPC:  # if Pocket SDR (ref.[3]) LDPC python module is available
            syms = np.fromstring((b2b_data + b2b_parity).bin, 'u1') - ord('0')
            bits, _ = sdr_ldpc.decode_LDPC_BCNV3(syms)
            b2b_data = bitstring.Bits(bits)[:486]

先と同様に、CRC誤り検出数を求めます。

$ septread.py -b < b2b.sept | bdsb2read.py -p 60 | grep CRC | wc -l
142

その誤り数は、142のままで、追加のLDPC誤り訂正によっても変わりませんでした。mosaic-go X5受信機は完全に誤り訂正をしていました。mosaic-go X5受信機さん、疑ってごめんなさい…。

PPP-B2bメッセージ放送タイミング

この1時間の観測データb2b.septに対して、復号開始時間をそろえてC59衛星とC60衛星のメッセージを比較します。スクリーンショットの左画面はseptread.py -b < b2b.sept | bdsb2read.py -p 59 -c | lvにてC59の結果を、右画面はseptread.py -b < b2b.sept | bdsb2read.py -p 60 -c | lvにてC60の結果を、それぞれ表示しています。

comparison between C59 and C60 PPP-B2b messages

ここでは、IODSSRIODPが両者の間で一致しています。両者のメッセージ内容も同一のようです。しかし、メッセージの放送タイミングが両者で異なり、その時間オフセットも、ばらついています。

BeiDouは複数のBDS-3シリーズのGEO衛星を運用しています。B2b信号を同時受信して処理すれば、より迅速にマスクメッセージを取得でき、短時間での高精度測位ができる可能性があります。その際には、放送タイミング相違の可能性から、IODPの不一致を管理するアルゴリズムが必要です。

おわりに

BeiDouのPPP-B2bメッセージを復号しました。オープンソースソフトウェア無線Pocket SDRの64値LDPC誤り訂正コードのおかげで、PPP-B2bメッセージの理解が深まりました。

現在のところ、C59衛星とC60衛星から放送されるPPP-B2bメッセージが利用できます。仕様書上、PPP-B2bは、BeiDou、GPS、Galileo、GLONASSに対する高精度測位補強情報を提供できます。しかし、私の観測範囲では、補強対象はBeiDouとGPSのみでした。また、GPS衛星に対する時刻補正量が常にゼロになっているようです。複数のBDS-3 GEO衛星からのB2b信号を受信すれば、補強メッセージ復号開始までの時間を短縮できるかもしれません。

日本に住んでいると、

  • みちびきのCLAS、MADOCA-PPP、SLAS、
  • GalileoのHAS
  • BeiDouのPPP-B2b
  • SBAS

の高精度補強情報すべてを利用できます。さらに、みちびきの災害情報伝達や信号認証メッセージ、Galileoの新しい航法メッセージも受信できます。とても恵まれた環境にあり、楽しく思います。


関連記事