MADOCALIBバージョン1.4
はじめに
準天頂衛星みちびきの高精度測位メッセージの一つであるMADOCA-PPP(muti-GNSS advanced orbit and clock augmenttion)メッセージを扱うソフトウェアMADOCALIB (MADOCA-PPP test library)バージョン1.4が公開されました。バージョン1.2についてはMADOCALIBによる高精度GPS測位にて扱いました。この新しいバージョンでは、位相情報の扱いや、複数の広域電離層情報を扱えるように改良されています。
さらに、新しいバージョンでは、サンプルとして、高精度単独測位(PPP: precise point positioning)、PPPにコードと位相との関係の曖昧さ解決(AR: ambiguity resolution)を解決するPPP-AR、さらに今後打ち上げ予定のみちびき6号機と7号機から放送される予定の広域電離層情報を扱うバッチファイルが添付されました。
このMADOCALIBはWindows向けのアプリケーションですので、今回は、このバージョン1.4をMacにてビルドし、このサンプルを実行します。そのままで、Linux PCやRaspberry Piでも利用できるものと思います。
rnx2rtkpのビルド
はじめに、後処理専用プログラムrnx2rtkp
をビルドします。MADOCALIBをgit
などにてダウンロードし(git clone https://github.com/QZSS-Strategy-Office/madocalib
)、すでにあるmakefile
を修正した次のファイルを作成します。先頭がスペースから始まる行について、そのスペースはすべてタブ文字です。パスを修正し、Windowsに関するDefineを削除しています。
app/consapp/rnx2rtkp/gcc_mingw/makefile.linux
# makefile for MADOCALIB rnx2rtkp.exe
# Rev.2024/07/01
BINDIR = ../../../../bin
SRC = ../../../../src
CC = gcc
OPTS = -DTRACE -DENAGLO -DENAQZS -DENAGAL -DENACMP -DENAIRN -DNFREQ=5 -DNEXOBS=5
CFLAGS = -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I$(SRC) $(OPTS) -g
LDLIBS =
OBJS = rnx2rtkp.o rtkcmn.o rinex.o rtkpos.o postpos.o solution.o lambda.o geoid.o sbas.o preceph.o pntpos.o ephemeris.o options.o ppp.o ppp_ar.o ppp_iono.o rtcm.o rtcm2.o rtcm3.o rtcm3e.o ionex.o tides.o mdccssr.o mdciono.o
rnx2rtkp : $(OBJS)
$(CC) -o rnx2rtkp $(OBJS) $(LDLIBS)
rnx2rtkp.o : ../rnx2rtkp.c
$(CC) -c $(CFLAGS) ../rnx2rtkp.c
rtkcmn.o : $(SRC)/rtkcmn.c
$(CC) -c $(CFLAGS) $(SRC)/rtkcmn.c
rinex.o : $(SRC)/rinex.c
$(CC) -c $(CFLAGS) $(SRC)/rinex.c
rtkpos.o : $(SRC)/rtkpos.c
$(CC) -c $(CFLAGS) $(SRC)/rtkpos.c
postpos.o : $(SRC)/postpos.c
$(CC) -c $(CFLAGS) $(SRC)/postpos.c
solution.o : $(SRC)/solution.c
$(CC) -c $(CFLAGS) $(SRC)/solution.c
lambda.o : $(SRC)/lambda.c
$(CC) -c $(CFLAGS) $(SRC)/lambda.c
geoid.o : $(SRC)/geoid.c
$(CC) -c $(CFLAGS) $(SRC)/geoid.c
sbas.o : $(SRC)/sbas.c
$(CC) -c $(CFLAGS) $(SRC)/sbas.c
preceph.o : $(SRC)/preceph.c
$(CC) -c $(CFLAGS) $(SRC)/preceph.c
pntpos.o : $(SRC)/pntpos.c
$(CC) -c $(CFLAGS) $(SRC)/pntpos.c
ephemeris.o: $(SRC)/ephemeris.c
$(CC) -c $(CFLAGS) $(SRC)/ephemeris.c
options.o : $(SRC)/options.c
$(CC) -c $(CFLAGS) $(SRC)/options.c
ppp.o : $(SRC)/ppp.c
$(CC) -c $(CFLAGS) $(SRC)/ppp.c
ppp_ar.o : $(SRC)/ppp_ar.c
$(CC) -c $(CFLAGS) $(SRC)/ppp_ar.c
ppp_iono.o : $(SRC)/ppp_iono.c
$(CC) -c $(CFLAGS) $(SRC)/ppp_iono.c
rtcm.o : $(SRC)/rtcm.c
$(CC) -c $(CFLAGS) $(SRC)/rtcm.c
rtcm2.o : $(SRC)/rtcm2.c
$(CC) -c $(CFLAGS) $(SRC)/rtcm2.c
rtcm3.o : $(SRC)/rtcm3.c
$(CC) -c $(CFLAGS) $(SRC)/rtcm3.c
rtcm3e.o : $(SRC)/rtcm3e.c
$(CC) -c $(CFLAGS) $(SRC)/rtcm3e.c
ionex.o : $(SRC)/ionex.c
$(CC) -c $(CFLAGS) $(SRC)/ionex.c
tides.o : $(SRC)/tides.c
$(CC) -c $(CFLAGS) $(SRC)/tides.c
mdccssr.o : $(SRC)/mdccssr.c
$(CC) -c $(CFLAGS) $(SRC)/mdccssr.c
mdciono.o : $(SRC)/mdciono.c
$(CC) -c $(CFLAGS) $(SRC)/mdciono.c
rnx2rtkp.o : $(SRC)/rtklib.h
rtkcmn.o : $(SRC)/rtklib.h
rinex.o : $(SRC)/rtklib.h
rtkpos.o : $(SRC)/rtklib.h
postpos.o : $(SRC)/rtklib.h
solution.o : $(SRC)/rtklib.h
lambda.o : $(SRC)/rtklib.h
geoid.o : $(SRC)/rtklib.h
sbas.o : $(SRC)/rtklib.h
preceph.o : $(SRC)/rtklib.h
pntpos.o : $(SRC)/rtklib.h
ephemeris.o: $(SRC)/rtklib.h
options.o : $(SRC)/rtklib.h
ppp.o : $(SRC)/rtklib.h
ppp_ar.o : $(SRC)/rtklib.h
ppp_iono.o : $(SRC)/rtklib.h
rtcm.o : $(SRC)/rtklib.h
rtcm2.o : $(SRC)/rtklib.h
rtcm3.o : $(SRC)/rtklib.h
rtcm3e.o : $(SRC)/rtklib.h
ionex.o : $(SRC)/rtklib.h
tides.o : $(SRC)/rtklib.h
mdccssr.o : $(SRC)/rtklib.h
mdciono.o : $(SRC)/rtklib.h
install :
cp rnx2rtkp $(BINDIR)
clean :
rm *.o
rm rnx2rtkp
実際のビルドは、make
コマンドにこのファイルを引数として与えます。この実行により、bin
ディレクトリにrnx2rtkp
が生成されます。
make -f makefile.linux
make -f makefile.linux install
cssr2ssrのビルド
次に、MADOCA-PPPのメッセージ形式CSSR(compact state space representation)から、広く用いられるRTCM(Radio Technical Commission for Maritime Services)SSR(state space representation)形式に変換するプログラムcssr2ssr
をビルドします。rnx2rtkp
と同様に、すでにあるmakefile
をコピーし、次のように修正します。
app/consapp/cssr2ssr/gcc_mingw/makefile.linux
# makefile for MADOCALIB cssr2ssr.exe
# Rev.2024/09/03
BINDIR = ../../../../bin
SRC = ../../../../src
CC = gcc
OPTS = -DTRACE -DENAGLO -DENAQZS -DENAGAL -DENACMP -DENAIRN -DNFREQ=5 -DNEXOBS=5
CFLAGS = -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I$(SRC) $(OPTS) -g
LDLIBS =
OBJS = cssr2ssr.o cssr.o rtkcmn.o rtcm.o rtcm2.o rtcm3.o rtcm3e.o
cssr2ssr.exe : $(OBJS)
$(CC) -o cssr2ssr $(OBJS) $(LDLIBS)
cssr2ssr.o : ../cssr2ssr.c
$(CC) -c $(CFLAGS) ../cssr2ssr.c
cssr.o : ../cssr.c
$(CC) -c $(CFLAGS) ../cssr.c
rtkcmn.o : $(SRC)/rtkcmn.c
$(CC) -c $(CFLAGS) $(SRC)/rtkcmn.c
rtcm.o : $(SRC)/rtcm.c
$(CC) -c $(CFLAGS) $(SRC)/rtcm.c
rtcm2.o : $(SRC)/rtcm2.c
$(CC) -c $(CFLAGS) $(SRC)/rtcm2.c
rtcm3.o : $(SRC)/rtcm3.c
$(CC) -c $(CFLAGS) $(SRC)/rtcm3.c
rtcm3e.o : $(SRC)/rtcm3e.c
$(CC) -c $(CFLAGS) $(SRC)/rtcm3e.c
cssr2ssr.o : $(SRC)/rtklib.h
cssr.o : $(SRC)/rtklib.h
rtkcmn.o : $(SRC)/rtklib.h
rtcm.o : $(SRC)/rtklib.h
rtcm2.o : $(SRC)/rtklib.h
rtcm3.o : $(SRC)/rtklib.h
rtcm3e.o : $(SRC)/rtklib.h
install :
cp cssr2ssr $(BINDIR)
clean :
rm cssr2ssr
rm *.o
rnx2rtkp
のビルドと同様に、make
コマンドにこのファイルを引数として与えます。この実行により、bin
ディレクトリにcssr2ssr
が生成されます。
make -f makefile.linux
make -f makefile.linux install
サンプルの実行
このようにして作成したrnx2rtkp
をMADOCALIBによる高精度GPS測位のときと同様にコマンドライン引数にて実行してもよいのですが、ここではsample_data
ディレクトリにあるバッチファイルをbashシェルスクリプトに変換して実行します。
sample_data
ディレクトリに移動し、exec_ppp.bat
、exec_pppar.bat
、exec_pppar_ion.bat
のそれぞれに対応するexec_ppp.sh
、exec_pppar.sh
、exec_pppar_ion.sh
を次のように作成します。アンテナ位相中心ファイルigs20.atx
の指定のないシェルスクリプトについては、-ant
オプションでそのファイル指定を追加しています。
sample_data/exec_ppp.sh
#!/bin/bash
# This is a sample BAT file that executes ppp from 00min00sec to 59min30sec every hour
BIN=../bin/rnx2rtkp
CONF=../app/consapp/rnx2rtkp/gcc_mingw/sample.conf
OBS=./TSK200JPN_S_20241620000_01D_30S_MO.rnx
NAV=./TSK200JPN_S_20241620000_01D_MN.rnx
L6E=./2024162all.204.l6
ANT=./igs20.atx
OUT=./result
mkdir -p $OUT
for H in {00..23}; do
$BIN -k $CONF -ts 2024/06/10 $H:00:00 -te 2024/06/10 $H:59:30 $OBS $NAV $L6E -o $OUT/ppp_20240610$H.pos -ant $ANT -x 2
done
sample_data/exec_pppar.sh
#!/bin/bash
# This is a sample BAT file that executes ppp-ar from 00min00sec to 59min30sec every hour
BIN=../bin/rnx2rtkp
CONF=../app/consapp/rnx2rtkp/gcc_mingw/sample_pppar.conf
OBS=./TSK200JPN_S_20241620000_01D_30S_MO.rnx
NAV=./TSK200JPN_S_20241620000_01D_MN.rnx
L6E=./2024162all.204.l6
ANT=./igs20.atx
OUT=./result
mkdir -p $OUT
for H in {00..23}; do
$BIN -k $CONF -ts 2024/06/10 $H:00:00 -te 2024/06/10 $H:59:30 -ant $ANT $OBS $NAV $L6E -o $OUT/pppar_20240610$H.pos -x 2
done
sample_data/exec_pppar_ion.sh
#!/bin/bash
# This is a sample BAT file that executes ppp-ar with ionospheric correction
# from 00min00sec to 59min30sec every hour
BIN=../bin/rnx2rtkp
CONF=../app/consapp/rnx2rtkp/gcc_mingw/sample_pppar_iono.conf
OBS=./TSK200JPN_S_20241620000_01D_30S_MO.rnx
NAV=./TSK200JPN_S_20241620000_01D_MN.rnx
L6E=./2024162all.204.l6
ANT=./igs20.atx
OUT=./result
# for Japan and Eastern Australia Region
L6D2=./2024162all.201.l6
# for Southeast Asia and Western Australia Region
L6D1=./2024162all.200.l6
mkdir -p $OUT
for H in {00..23}; do
$BIN -k $CONF -ts 2024/06/10 $H:00:00 -te 2024/06/10 $H:59:30 $OBS $NAV $L6E -mdciono $L6D1 -mdciono $L6D2 -ant $ANT -o $OUT/pppar_ion_20240610$H.pos -x 2
done
これらのファイを作成後、chmod 755 exec_ppp.sh exec_pppar.sh exec_pppar_ion.sh
を実行して実行権限を与えます。それぞれを、例えば./exec_ppp.sh
などと実行すると、result
ディレクトリに結果が出力されます。
もう一つのアプリケーションcssr2ssr
も試してみました。このサンプルにあるCSSRファイル2024162all.204.l6
をRTCM SSRファイル2024162all.rtcm
に変換してみます。
../bin/cssr2ssr 2024162all.204.l6 -o 2024162all.rtcm
cssr2ssr (0487):
reading... 2024162all.204.l6
finished
はじめに、ここにある衛星軌道ファイルTSK200JPN_S_20241620000_01D_MN.rnx
と観測ファイルTSK200JPN_S_20241620000_01D_30S_MO.rnx
を用いて単独測位してみます。
../bin/rnx2rtkp -p 0 TSK200JPN_S_20241620000_01D_*
% program : rnx2rtkp ver.2.4.3 b34
% inp file : TSK200JPN_S_20241620000_01D_30S_MO.rnx
% inp file : TSK200JPN_S_20241620000_01D_MN.rnx
% satantfile:
% rcvantfile:
% obs start : 2024/06/10 00:00:00.0 GPST (week2318 86400.0s)
% obs end : 2024/06/10 23:59:30.0 GPST (week2318 172770.0s)
%
% (lat/lon/height=WGS84/ellipsoidal,Q=1:fix,2:float,3:sbas,4:dgps,5:single,6:ppp,ns=# of satellites)
% GPST latitude(deg) longitude(deg) height(m) Q ns sdn(m) sde(m) sdu(m) sdne(m) sdeu(m) sdun(m) age(s) ratio
2318 86400.000 36.105582210 140.087105580 87.6496 5 12 4.4032 3.7796 10.3945 0.4904 -2.0305 -4.8329 0.00 0.0
2318 86430.000 36.105576871 140.087101426 89.7484 5 12 4.4158 3.7734 10.4132 0.4356 -1.9986 -4.8626 0.00 0.0
...
単独測位はできました。次に、ここで作成したRTCM SSRファイル2024162all.rtcm
を用いて、PPP測位を実行してみます。
../bin/rnx2rtkp -k ../app/consapp/rnx2rtkp/gcc_mingw/sample.conf -ant igs20.atx -p 6 -x 2 TSK200JPN_S_20241620000_01D_* 2024162all.rtcm
processing : 2024/06/10 00:00:00 Q=0
2 no ssr orbit correction: 2024/06/10 00:00:00 sat= 2
2 no ssr orbit correction: 2024/06/10 00:00:00 sat= 3
2 no ssr orbit correction: 2024/06/10 00:00:00 sat= 7
...
2 no ssr orbit correction: 2024/06/10 00:00:00 sat=102
2 00:00:00.00: point pos error (lack of valid sats ns=5)
processing : 2024/06/10 00:00:30 Q=0
2 no ssr orbit correction: 2024/06/10 00:00:30 sat= 2
...
RTCM SSRファイルを作成して実行したPPP測位については、解が出ませんでした。RTCM SSRファイルが正しく読み込まれていないようです。さらに検討してみます。
また、QZS L6 Toolのrtcmread.py
でこの2024162all.rtcm
を読み込む過程で、rtcmread.py
のバグを見つけました。これについても修正する予定です。
まとめ
MADOCALIBバージョン1.4をMacにてビルドし、rnx2rtkp
を実行しました。また、サンプルの実行も行いました。PPPのみならず、PPP-ARや広域電離層情報を用いたPPPも実行できることを確認しました。cssr2ssr
については、今後、使い方を調べてみます。