MADOCALIBバージョン1.4

category: gnss

はじめに

準天頂衛星みちびきの高精度測位メッセージの一つである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

サンプルの実行

このようにして作成したrnx2rtkpMADOCALIBによる高精度GPS測位のときと同様にコマンドライン引数にて実行してもよいのですが、ここではsample_dataディレクトリにあるバッチファイルをbashシェルスクリプトに変換して実行します。

sample_dataディレクトリに移動し、exec_ppp.batexec_pppar.batexec_pppar_ion.batのそれぞれに対応するexec_ppp.shexec_pppar.shexec_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については、今後、使い方を調べてみます。