Allystar HD9310オプションCを用いたみちびきCLAS補強情報抽出

category: gnss
tags: clas hd9310 madoca

Allystar HD9310オプションCは、みちびきの送信する補強信号のCLASまたはMADOCAのいずれかの情報を受信できます。これを使って、みちびき3号機が放送する新しいCLAS情報であるサブタイプ12メッセージを確認しました。

Allystar HD9310オプションCは、みちびき1号機から4号機までのCLAS情報をまとめてシリアルポートに出力します。新しいサブタイプ12を含むCLAS情報は、現在は試験的にみちびき3号機のみから放送されていますので、Pythonプログラムでみちびき3号機のPRN(pseudo random noise、衛星を識別するための番号)199のみを抽出するプログラムを作成しました。

#!/usr/bin/python3
# ref: https://www.thecombineforum.com/threads/how-to-use-zed-f9p-as-a-base-station-for-trimble.331721/

import sys

while True:
    data = sys.stdin.buffer.read(1)
    if (data != b'\xf1'): continue
    data = sys.stdin.buffer.read(1)
    if (data != b'\xd9'): continue
    data = sys.stdin.buffer.read(1)
    if (data != b'\x02'): continue
    data = sys.stdin.buffer.read(1)
    if (data != b'\x10'): continue
    len_palyload  = sys.stdin.buffer.read(2)
    svn           = sys.stdin.buffer.read(2)
    freqid        = sys.stdin.buffer.read(1)
    len_data      = sys.stdin.buffer.read(1)
    i_len_data    = int.from_bytes (len_data, byteorder='little') - 2
    gps_week      = sys.stdin.buffer.read(2)
    gps_time      = sys.stdin.buffer.read(4)
    snr           = sys.stdin.buffer.read(1)
    flag          = sys.stdin.buffer.read(1)
    data          = sys.stdin.buffer.read(i_len_data * 4)
    checksum      = sys.stdin.buffer.read(2)
    i_svn         = int.from_bytes (svn,      byteorder='little')
    i_gps_week    = int.from_bytes (gps_week, byteorder='big')
    i_gps_time    = int.from_bytes (gps_time, byteorder='big') // 1000
    i_snr         = int.from_bytes (snr,      byteorder='big')
    print ("prn={} GPSW={} GPST={} SNR={}".format(i_svn-700, i_gps_week, i_gps_time, i_snr), file=sys.stderr)
    if (i_svn-700 == 199): sys.stdout.buffer.write(data)
    sys.stdout.flush()

固定ワード0xf1 0xd9 0x02 0x10を見つけたら、HD9310の仕様書に従い情報をデコードして、PRN 199のCLAS補強情報のペイロードを取り出すプログラムです。このファイルを、例えばhd9310.pyという名前で保存します。マイコンRaspberry PiのUSBポートにHD9310を接続して(認識されたポートは/dev/ttyUSB3)、socat /dev/ttyUSB3,b115200,raw - | ./hd9310.py > 20200923a.l6とすると、ほぼリアルタイムに受信したみちびきのPRN番号と信号強度が表示され、それと同時にファイル20200923a.l6にみちびき3号機のCLAS補強情報が保存されます。

# socat /dev/ttyUSB3,b115200,raw - | ./hd9310.py > 20200923a.l6
...
prn=193 GPSW=2124 GPST=262821 SNR=0
prn=194 GPSW=2124 GPST=262822 SNR=37
prn=195 GPSW=2124 GPST=262822 SNR=43
prn=199 GPSW=2124 GPST=262822 SNR=42
prn=193 GPSW=2124 GPST=262822 SNR=0
prn=194 GPSW=2124 GPST=262823 SNR=37
prn=195 GPSW=2124 GPST=262823 SNR=43
prn=199 GPSW=2124 GPST=262823 SNR=42
prn=193 GPSW=2124 GPST=262823 SNR=0
prn=194 GPSW=2124 GPST=262824 SNR=37
prn=195 GPSW=2124 GPST=262824 SNR=43
prn=199 GPSW=2124 GPST=262824 SNR=41
prn=193 GPSW=2124 GPST=262824 SNR=0
prn=194 GPSW=2124 GPST=262825 SNR=37
prn=195 GPSW=2124 GPST=262825 SNR=43
prn=199 GPSW=2124 GPST=262825 SNR=42
prn=193 GPSW=2124 GPST=262825 SNR=0
prn=194 GPSW=2124 GPST=262826 SNR=37
prn=195 GPSW=2124 GPST=262826 SNR=43
prn=199 GPSW=2124 GPST=262826 SNR=41
...

GPSWはGPS(Global Positioning System)の週番号を表し、1980年1月6日世界協定時(UTC: Coordinated Universal Time)0時0分からその時までの週数を、またGPSTはGPS時刻を表し、閏秒を含まないその年の1月1日からその時までの秒数です。

このようにして生成したL6ファイルを、CLASLIBのssr2obsコマンドのダンプオプションを使ってダンプしました。

$ ./ssr2obs -k obs.conf -dump 20200923a.l6
$ ls parse_cssr_type*
parse_cssr_type1.csv        parse_cssr_type2.csv  parse_cssr_type6.csv
parse_cssr_type11.csv       parse_cssr_type3.csv  parse_cssr_type7.csv
parse_cssr_type12_grid.csv  parse_cssr_type4.csv  parse_cssr_type8.csv
parse_cssr_type12_stec.csv  parse_cssr_type5.csv  parse_cssr_type9.csv
$

設定ファイルobs.confの内容や、コマンドssr2obsのコンパイル方法は準天頂衛星みちびきの測位ライブラリCLASLIBの利用(その3:ssr2obsによるVRS-RTK測位)をご参照ください。

この中のparse_cssr_type12_grid.csvは次の通りです。

Message Number,Message Sub Type ID,GNSS Epoch Time 1s,SSR Update Interval,Multiple Message Indicator,IOD SSR,Compact Network ID,Network SV Mask,No. of Grids,[Grid Number],Troposphere Hydro-Static Vertical Delay,Troposphere Wet Vertical Delay,[GNSS ID],[Satellite Number],STEC Residual Correction[TECU]
4073, 12, 259170, 5, 0, 8, 12, 0x1f7eb, 2, 1, 2.560, 0.264, 0, 3, 33.2300
,,,,,,,,,,,, 0, 4, 31.0300
,,,,,,,,,,,, 0, 9, 37.1700
,,,,,,,,,,,, 0, 17, 20.9600
,,,,,,,,,,,, 0, 19, 18.6000
,,,,,,,,,,,, 0, 28, 19.4600
,,,,,,,,,,,, 2, 4, 19.8400
,,,,,,,,,,,, 2, 11, 16.6600
,,,,,,,,,,,, 2, 12, 9.8300
,,,,,,,,,,,, 2, 19, 16.2700
,,,,,,,,,,,, 2, 24, 76.1100
,,,,,,,,,,,, 2, 33, 13.8900
,,,,,,,,,,,, 4, 195, 19.9400
,,,,,,,,,,,, 4, 199, 8.3500
,,,,,,,,, 2, 2.556, 0.260, 0, 3, 33.0700
,,,,,,,,,,,, 0, 4, 31.2700
,,,,,,,,,,,, 0, 9, 37.2900
,,,,,,,,,,,, 0, 17, 20.3600
,,,,,,,,,,,, 0, 19, 18.2400
,,,,,,,,,,,, 0, 28, 18.7400
,,,,,,,,,,,, 2, 4, 19.3200
,,,,,,,,,,,, 2, 11, 15.9400
,,,,,,,,,,,, 2, 12, 9.6300
,,,,,,,,,,,, 2, 19, 16.0700
,,,,,,,,,,,, 2, 24, 76.2300
,,,,,,,,,,,, 2, 33, 13.8100
,,,,,,,,,,,, 4, 195, 19.8600
,,,,,,,,,,,, 4, 199, 7.9100
4073, 12, 259170, 5, 0, 8, 2, 0x1b5f7, 11, 1, 2.656, 0.272, 0, 3, 22.4400
,,,,,,,,,,,, 0, 4, 21.8000
,,,,,,,,,,,, 0, 17, 8.2500
,,,,,,,,,,,, 0, 19, 5.5400
...

サブタイプ12メッセージの一部が復号できました。いつか、RTKLIBを用いて、リアルタイムでCLASを利用できたら楽しいだろうと想像しています。

みちびき1号機から4号機までのそれぞれのリアルタイムCLAS補強情報をNTRIP Casterに転送したら、自宅でもプログラム開発ができ、さらに、他の方々のCLAS利用プログラム開発にも役立つと思いますが、…いけないものでしょうかね。


関連記事