準天頂衛星みちびきの測位ライブラリCLASLIBの利用(その2:ssr2osr)
状態空間表現(SSR)
前回のCLASLIB構成の理解の続きです。今回は、CLASLIBのssr2osrを試します。
SSRとは、状態空間表現(state space representation)のことです。これは、衛星測位に関する状態を、例えば衛星内部時計誤差をより正確に表現することにより、測位精度を高める方法です。今回の精密単独測位(PPP: precise point positioning)はこのSSRに分類されます。
一方、OSRは、観測空間表現(observation space representation)のことであり、信頼できる別の観測所での観測データに対する補正値を利用者が得ることにより、利用者側での測位精度を高める方法です。かつてのDGPS(differential GPS)や、近年、期待されているRTK(realtime kinematic)は、このOSRに分類されます。
SSRを実現する具体的なプログラムとして、ssr2osr(SSR-to-OSR conversion)があります。CLASLIBでのssr2osrは、利用者側において利用するソフトウェアであり、CLAS信号のSSR補正により利用者の観測データをOSRに変換します。そのOSRを用いて、別のソフトウェアにて測位計算を行います。Geo++社Dr. Martin Schmitzのスライドの11ページにあるように、ssr2osrは、補正情報作成側で実行しても、利用者側で実施しても良いのです。最終的には、利用者側が、ssr2osrを実行することなく、このSSRを直接的に解釈することが望ましいとされています。CLASLIBでのrnx2rtkpは、このSSRの直接解釈を行うものだと思います。
自らの観測データを使ったCLASLIB ssr2osrの実行
ここでは、CLASLIBにて実現されるssr2osrを使います。
はじめに、CLASLIBをダウンロードして、そのutilsディレクトリ下のssr2osrディレクトリにてmake
を実行して、アプリケーションプログラムssr2osr
を作成します。以下の作業は、このssr2osrディレクトリで行います。私は、LinuxのDebian 10(buster)ディストリビューションを利用しました。
次に、RINEX(ライネックス)ファイルである、衛星信号の観測擬似距離(OBS: observation)データファイルと、衛星軌道(NAV: navigation)データファイルを用意します。これらを国土地理院の電子基準点データ提供サービスから取得しても良いのですが、今回は私のRTK基準局データを利用しました。NTRIP Casterからインターネット経由でこのRTK基準局のRTCM3ファイルを取得し、そのRTCM3ファイルからRINEXファイルに変換します。このデータ取得と変換のためにRTKLIBを使います。
RTKLIBのソースコードをダウンロードして展開します。そして、そのappディレクトリでmake
を実行して、コマンドラインツールstr2str
を作成します。このstr2str
をこのssr2osr
ディレクトリにコピーした上で、
./str2str \
-in ntrip://ntrip.phys.info.hiroshima-cu.ac.jp:80/F9P \
-out file://%Y%m%d%H.rtcm3::S=1 -f 30
を実行すると、カレントディレクトリに年月日と時刻コードを表すファイルが作成されます。拡張子はrtcm3
です。この時刻コードは、0時から23時までの時刻をaからxまでの英子文字で表したものです。str2strのオプションS=1 -f 30
は、前後30秒間の余裕を持って1時間ごとに別のファイルを作成するものです。ここでは、RTK基準局で観測した2020年5月5日の3時から4時までのデータ20200505d.rtcm3(約3.8 MB)を用います。ここでの時刻表現は、UTC(世界標準時)でして、JST(日本標準時)よりも9時間だけ遅れています。したがって、このデータは、JSTでは12時から13時までのものです。
次に、このRTCM3ファイルからOBSファイルとNAVファイルを作成します。この変換にもRTKLIBにあるconvbin
を利用します。
./convbin 20200505d.rtcm3 -v 3.02 -os -o 20200505d.obs -n 20200505d.nav
オプション-v 3.02
はRINEXファイルバージョン3.02形式で出力することを(これを指定しないとバージョン2.11形式になります)、また-os
は信号対雑音電力比(SNR: signal-to-noise power ratio)を結果に含めることを表します。CLASLIB利用時には、電波強度が一定以下の衛星信号を利用しないように設定するため、RINEXファイル作成時にこのオプション指定が必要です。オプション-o
は、出力OBSファイル名指定のための、また、-n
はNAVファイル名指定のためのものです。
なお、RTKLIBは、このような変換後のgzip圧縮ファイル(例えば、20200505d.obs.gzや20200505d.nav.gz)も、そのまま読み込めます(2021-03-19追記)。
次に、その日時に対応するCLASデータをダウンロードします。CLASアーカイブにて、UTCでの日時を選択して、ダウンロードします。CLASアーカイブでのファイル名は、年、1月1日からの日数、および時間コード(ただし、先の小文字を大文字で表す)からなります。この日付2020年5月5日は1月1日から数えて126日目なので、そのファイル名は2020126D.l6
です。アーカイブページから日付を選択してファイル名をクリックしてそのファイルを取得する代わりに、cURLコマンド
curl https://sys.qzss.go.jp/archives/l6/2020/2020126D.l6 -o 2020126D.l6
にてそのファイルを取得しても良いでしょう。
そして、次のようなssr2obs設定ファイルosr.conf
を用意します。
元のサンプル設定ファイルからの変更点は、(1) 受信アンテナ形式指定をしないこと、(2) このRTK基準局の受信周波数帯に合わせて2周波数(L1帯とL2帯)にしたこと、(3) 出力ファイルをNMEA形式でなく緯度経度楕円体高(LLH: latitude longitude height)形式にして結果をわかりやすく表示したこと、の3点です。
そして、ssr2osrを実行します。
./ssr2osr -k osr.conf 20200505d.obs 20200505d.nav 2020126D.l6 -o 20200505d.llh
結果
作成された出力ファイル20200505d.llhの内容は次の通りです。このファイルには多くの情報が並ぶので、その最初の部分のみを抜粋します。
% program : RTKLIB ver.2.4.2
% inp file : 20200505d.obs
% inp file : 20200505d.nav
% inp file : 2020126D.l6
% obs start : 2020/05/05 02:59:12.0 UTC (week2104 183570.0s)
% obs end : 2020/05/05 04:00:11.0 UTC (week2104 187229.0s)
% pos mode : ssr2osr
% solution : forward
% elev mask : 15.0 deg
% dynamics : off
% tidecorr : on
% tropo opt : off
% ephemeris : broadcast+ssr apc
% navi sys : gps galileo qzss
% antenna1 : ( 0.0000 0.0000 0.0000)
%
% (lat/lon/height=WGS84/ellipsoidal,Q=1:fix,2:float,3:sbas,4:dgps,5:single,6:ppp
,ns=# of satellites)
% UTC latitude(deg) longitude(deg) height(m) Q ns sdn(m
) sde(m) sdu(m) sdne(m) sdeu(m) sdun(m) age(s) ratio
2020/05/05 02:59:12.000 34.440129246 132.414755496 233.7646 5 9 4.776
4 3.5026 7.3992 -1.7312 -3.5717 3.4371 10000.00 0.0
2020/05/05 02:59:13.000 34.440130299 132.414757135 233.3983 5 9 4.775
8 3.5023 7.3982 -1.7303 -3.5711 3.4354 10000.00 0.0
... snip ...
これは、UTC時刻、緯度、経度、楕円体高、品質(5はPPP単独測位)をそれぞれ表します。品質が6(PPP)にならない理由はわかりません。(2022-04-01更新)
その第14列目のage(s)
は、補強データが届いてからの経過秒数が記述されています。CLAS補強情報は5秒ごとに送信されますので、この結果の14列目の値が0, 1, 2, …5の範囲であるならば、CLASによる継続的なPPP測位が行われたことになります。この列の値が最大値の1000であれば、CLASによる測位の補強がなされなかったことになります。この結果から、時刻、緯度、経度、楕円体高、経過秒数のみを抽出するために、awk
を用います。
awk '{print $2 "\t" $3 "\t" $4 "\t" $5 "\t" $14;}' 20200505d.llh
このCLAS情報ファイル2020126D.l6
は、UTC時刻03:00:00から04:00:00までのものです。この時刻範囲で補強されれば、CLAS-PPP測位ができたといえます。
UTC latitude(deg) longitude(deg) height(m) age(s)
02:59:12.000 34.440129246 132.414755496 233.7646 10000.00
02:59:13.000 34.440130299 132.414757135 233.3983 10000.00
... snip ...
02:59:57.000 34.440126204 132.414755699 235.2483 10000.00
02:59:58.000 34.440127141 132.414755420 235.3133 1.00
02:59:59.000 34.440128971 132.414755250 235.2460 2.00
03:00:00.000 34.440131533 132.414754938 235.1163 3.00
03:00:01.000 34.440133495 132.414752663 235.4649 4.00
03:00:02.000 34.440134454 132.414753118 235.1127 5.00
03:00:03.000 34.440133393 132.414753927 234.9894 1.00
03:00:04.000 34.440134986 132.414753337 234.8666 2.00
03:00:05.000 34.440134555 132.414752899 234.7548 3.00
... snip ...
03:59:31.000 34.440113440 132.414782134 234.0389 4.00
03:59:32.000 34.440113328 132.414782015 234.2112 0.00
03:59:33.000 34.440113661 132.414782142 234.2457 1.00
03:59:34.000 34.440115799 132.414783428 234.1545 2.00
03:59:35.000 34.440116548 132.414784360 234.0657 3.00
03:59:36.000 34.440115588 132.414785932 234.2324 4.00
03:59:37.000 34.440114654 132.414787330 234.3477 0.00
03:59:38.000 34.440112902 132.414788481 234.3745 1.00
03:59:39.000 34.440112801 132.414785697 234.0207 2.00
03:59:40.000 34.440112910 132.414783535 233.6221 3.00
03:59:41.000 34.440113235 132.414783618 233.7450 4.00
03:59:42.000 34.440112895 132.414782548 234.0283 5.00
03:59:43.000 34.440112306 132.414782202 233.9166 6.00
03:59:44.000 34.440111882 132.414781813 233.8585 7.00
03:59:45.000 34.440110743 132.414781648 233.8334 8.00
03:59:46.000 34.440112951 132.414781696 233.9538 9.00
03:59:47.000 34.440111518 132.414779590 233.8481 10.00
03:59:48.000 34.440110554 132.414779131 233.9800 11.00
03:59:49.000 34.440110254 132.414777619 234.0704 12.00
03:59:50.000 34.440113086 132.414777736 233.5080 13.00
... snip ...
結果は、予想よりも2秒早い02:59:58から補強開始され、予想よりも24秒早い03:59:37の補強を最後に補強信号が利用されていないことを示しています。UTC時刻03:59:37以降は、その時刻での補強情報が利用され続けていることを表しています。
経度1度の差は約111キロメートルに相当します。静止しているRTK基準局のデータを処理した結果は、緯度の小数点以下5桁目まで固定されていますので、数十センチの精度と見積もることができます。この結果はあまり良いものではありませんが、このCLAS測位方法がPPP-RTKではなくPPPなので、そのようなものなのかもしれません。
これらの手順をシェルスクリプトにしました。下記をclas.sh
などの名称でssr2osr
ディレクトリに保存し、実行属性をつけます(chmod 755 ./clas.sh
)。また、このディレクトリにRTKLIBのconvbin
を置きます。このclas.sh
を実行すると、上述の結果が得られるはずです。
#!/bin/bash
CLASF=2020126D
GNSSF=20200505d
# configuration file download
curl -s https://gist.githubusercontent.com/yoronneko/430ad5519e0d30a503eb643b349b8796/raw/4e5b7a0cbb1c703046e9ca97bd210c2bcb92b105/osr.conf -o osr.conf
# RTCM3 file download
curl -s https://s-taka.org/img/$GNSSF.rtcm3 -o $GNSSF.rtcm3
# CLAS augmentation file download
curl -s https://sys.qzss.go.jp/archives/l6/2020/$CLASF.l6 -o $CLASF.l6
# extraction of the observation and navigation files from the RTCM file
./convbin $GNSSF.rtcm3 -v 3.02 -os -o $GNSSF.obs -n $GNSSF.nav
# execution of CLAS PPP positioning
./ssr2osr -k osr.conf $GNSSF.obs $GNSSF.nav $CLASF.l6 -o $GNSSF.llh
awk '{print $2 "\t" $3 "\t" $4 "\t" $5 "\t" $14;}' $GNSSF.llh
次回は、CLASLIBを用いたVRS(仮想基準局: virtual reference station)によるRTK測位を報告します。
関連記事
- CLASLIBによる高精度GPS測位 25th July 2024
- 準天頂衛星みちびきの測位ライブラリCLASLIBの利用(その3:ssr2obsによるVRS-RTK測位) 10th May 2020
- 準天頂衛星みちびきの測位ライブラリCLASLIBの利用(その1:構成の理解) 7th May 2020