準天頂衛星みちびきの測位ライブラリCLASLIBの利用(その1:構成の理解)

categories: gnss
tags: clas qzss

センチメートルオーダ測位計算を行う参考実装CLASLIB

日本の内閣府が運用する測位衛星「みちびき」(QZS: quasi zenith satellite)は、GPSと同様の信号フォーマットでの測位信号だけでなく、測位精度を高める3種類の補強信号をも送信しています。その補強信号の一つであるCLAS(centimeter level augmentation service、シーラスと読む)信号を活用するために、公開ソフトウェアライブラリCLASLIB(CLAS library、シーラスリブ)のプログラム構成の理解を試みました。

GPSやQZSの測位信号を受信して、現在位置を表示する電波受信モジュールは、市場に多くあります。その受信モジュールの多くは、L1帯と呼ばれる、1575.42 MHz付近の電波を受信します。CLASを利用するためには、L1帯だけでなく、L2帯(1127.60 MHz)またはL5帯(1176.45 MHz)の測位信号も同時に受信でき、測位結果を得る前の内部情報(観測擬似距離データと航法データ)を外部に出力できる受信モジュールが必要です。また、この補強信号はL6帯(1278.75 MHz)で送信されていますので、この補強信号を受信して内容を復号できる受信機が必要です。さらに、復号された補強信号を解釈して、その測位内部情報を用い測位計算を行う測位ソフトウェアが必要です。これまで、CLAS信号を利用するのは、とても難しいことでした。

しかし、受信モジュールの課題は解決されつつあります。スイスのu-blox社が発売したu-blox ZED-F9Pは、安価でありながらも、L1帯とL2帯を同時受信して、その内部情報も出力できます。また、昨年、中国のAllystar社が発売したHD9310オプションCは、みちびきのL6信号を受信して復号できます

測位ソフトウェアに関しても、内閣府のみちびきホームページにて、CLASLIBが公開されました。現在では、CLASを試すためには、良い状況になりました。現在のところ、CLAS信号は無料で利用できます。また、CLASデータはみちびきホームページからダウンロードできますので、L6帯受信機がなくてもCLASの実験は可能です。

CLASLIBの構成

CLASLIBは、高須知二先生が公開されているRTKLIBと、国土地理院GSILIBを拡張して作られたものです。その拡張部分には、三菱電機株式会社の著作権表示があります。私がダウンロードしたCLASLIBのバージョン表示はVer. 0.71でした。

このCLASLIBは、CLAS測位計算を行うライブラリソフトウェアと、次の3アプリケーションソフトウェアからなります。

  1. ssr2osr (state space representation to observation state representation)
  2. ssr2obs (state space representation to observation)
  3. rnx2rtkp

これらのうち、ダウンロード版にrnx2rtkpは含まれていません。rnx2rtkpのコンパイル済みアプリケーションソフトウェアや、そのソースコードを入手するためには、電子メールによる申請が必要です。

ssr2osrは、与えられた観測情報とCLAS補強情報を用いて、精密単独測位(PPP: precise point positioning)計算を行い、その結果を出力するプログラムです。

ssr2obsは、PPPに加えて、CLAS補強情報に含まれる格子点での情報を用いて、事実上の仮想基準局VRS(virtual reference station)での観測擬似距離データを作り出すプログラムです。ssr2obsには、観測情報、CLAS補強情報、そして、VRSを作成したい空間座標の3点を与えます。すなわち、ssr2osrと比較して、ssr2obsは、より複雑な計算を行います。

rnx2rtkpは、同名のアプリケーションソフトウェアがRTKLIBに存在することから、観測者の大まかな位置を計算し、ssr2obsでその位置でのVRSを作成して、RTK測位を行うプログラムであると推測しています。手順が増えますが、ssr2obsでもCLASLIBでのrnx2rtkpと同様の結果を得ることができるかもしれません。

ソースコード由来の調査

CLASLIBを理解するため、ダウンロードしたソースコードを、CLASLIBでの拡張部分、RTKLIB部分、そしてGSILIB部分のソースコードに、それぞれ分離します。

上述のCLASLIBのページからZIPアーカイブをダウンロードして展開すると、ライブラリのあるsrc、CLAS測位グリッドデータやアンテナ特性データや測位サンプルデータのあるdata、そしてssr2obsとssr2osrの含まれるutilディレクトリが現れます。

はじめに、srcディレクトリにあるソースコードを、CLASLIB、RTKLIB、GSILIBのそれぞれのディレクトリに配置しました。これは、CLASLIB、RTKLIB、そしてGSILIBそれぞれのソースファイルをダウンロードして、diff -q claslib/src rtklib/srcなどのコマンドを用い、それぞれのライブラリに含まれる同名ファイルを探すことにより行いました。

./src/claslib/

clasgrid.h  cssr.h      grid.c     ssr2osr.c      stec.c
cssr.c      cssr2osr.c  ssr2obs.c

./src/gsilib/

isb.c

./src/rtklib/

convkml.c    geoid.c    postpos.c  rcvraw.c  rtcm3e.c  sbas.c
convrnx.c    ionex.c    ppp.c      rinex.c   rtkcmn.c  solution.c
datum.c      lambda.c   ppp_ar.c   rtcm.c    rtklib.h  stream.c
download.c   options.c  preceph.c  rtcm2.c   rtkpos.c  streamsvr.c
ephemeris.c  pntpos.c   qzslex.c   rtcm3.c   rtksvr.c  tle.c

./src/rcv/

binex.c     gw10.c   novatel.c  rcvlex.c  septentrio.c  ss2.c
crescent.c  javad.c  nvs.c      rt17.c    skytraq.c     ublox.c

本当は、測位受信機バイナリファイル読み込みプログラムはRTKLIBのものなので、ディレクトリrcvはディレクトリrtklibの下に配置すべきでした。ここでは、ソースコードのディレクトリを浅くするために、ディレクトリrcvを、ディレクトリsrcの下に配置しました。

コンパイルオプションの整理

次に、ssr2obsやssr2osrのMakefileを読み、ソースコードの コンパイルに使われていないオプションを削除しました。

はじめに、オプションDLLについて考えます。RTKLIBでは、アプリケーションプログラムごとに、次の3つのエラー表示サブルーチンを配置することになっています。

extern int showmsg(char *format, ...)
extern void settspan(gtime_t ts, gtime_t te)
extern void settime(gtime_t time)

ssr2osr.cには、これらのサブルーチンがあります。一方、ssr2obs.cにこれらのサブルーチンはなく、DLLのコンパイルオプションでRTKLIBのエラー表示サブルーチンを無効にしています。 私は、ssr2osr.cのこれらのサブルーチンをコメントアウトした上で、コンパイルオプションDLLを使うことにしました。本当は、DLLオプションを外し、ssr2obs.cに中身が空のこれらのサブルーチンを記述すべきかもしれません。 これらはエラー表示のためのものなので、ssr2osr.cのこれらのサブルーチンをssr2obs.cにコピーして、MakefileのDLLオプションを外します(2020年6月13日訂正)。

また、ssr2osr.cには、解析開始時刻と解析終了時刻を表すオプション-ts-teの初期値がともに2020年1月1日 00:00:00に固定されていました。このままでは、解析結果を出力するために、毎回、時刻指定をしなければなりません。一方、RTKLIBのアプリケーションやssr2obsにて、これらのオプションが指定されないときには、観測ファイルの全時刻について解析するようになっています。そこで、ssr2osr.cの77行目を

    double tint=1.0,es[]={2020,1,1,0,0,0},ee[]={2030,12,31,23,59,59},pos[3];

に書き換えて、開始時刻を2020年1月1日に、終了時刻を2030年12月31日にしました。これで、毎回、時刻指定をしなくてもすみます。es[6]={0}, ee[6]={0}でも良いかもしれません。

RTKLIB由来のソースコードrtkcmn.cがCLASLIB用に修正されています。RTKLIB部分のみを最新版に差し替えるときに注意が必要です。

ssr2obsのMakefileにあるコンパイルオプションのうち、DECODE_CSSRUSR_CSSRは使われていませんでしたので、削除しました。また、ssr2obsは、RTKLIBにあるstream.cを含んでいますが、どこからも参照されていませんでしたので、これもMakefileから削除しました。 また、ssr2osrではRTKLIBの受信機ファイルseptentrio.cを含んでいませんでした。ssr2osrのMakefileにseptentrio.cを書き忘れたようですので、追加しました。これで、Septentrio社受信機のバイナリーファイルをssr2obsでも解釈できるようになりました。 RTKLIBでは、様々な受信機固有の生データをrcvraw.cのinput_raw()で管理しています。CLASLIBに含まれていたrcvraw.cには、Septentrio社受信機生データを扱うinput_sbr()がありませんでした。そのため、septentrio.cもMakefileから削除します(2020年6月13日訂正)。

私は、RTKLIBの行列計算部分にライブラリLAPACKを利用しています。Debian Linuxでは、rootアカウントにてapt instll liblapack-devを実行すればLAPACKライブラリをインストールできます。測位計算にLAPACKを利用するためには、コンパイルオプションにLAPACKを追加します。結局、ssr2obsとssr2osrとで共通に使うコンパイルオプションは、DLL ENAGAL ENAQZS LAPACK NFREQ=3 TRACEになりました。

ssr2osrに比べて、より複雑な動作をするssr2obsには、コンパイルオプションとして、さらに CSSR2OSR_VRS ENAGLO ENA_SSR2OSR NEXOBS=2が追加されています。ssr2obsとssr2osrとで、GLONASS衛星群利用の有無が異なる理由はわかりませんでした。みちびきFAQの「CLASに含まれる、補強対象衛星について教えてください」によりますと、これらの両方ともに、GLONASS衛星を測位に使わない(オプションENAGLOを削除する)のが正しいと思います。

Makefile記述の共通化

そして、utilディレクトリにあるアプリケーションコードssr2obs.cとssr2osr.cを./src/claslib/に移動しました。これらはCLASLIBオリジナルのものだからです。

最終的に、ssr2obsを作成するMakefileを次のように作り替えました。プラットフォームはDebian Linuxです。

また、ssr2osrを作成するためのMakefileを次のようにしました。

また、データファイルのファイル名を日付と時刻コードに統一しました。

ssr2obsとssr2osrとで、コンパイルオプションと設定ファイル以外は、Makefileを共通化できました。この2つのプログラムは、RTKLIBの機能を用いて、拡張子でデータファイル種別を判定しますので、与えるデータファイルの順序は任意です。

また、CLAS Subtype 12でのサンプル観測ファイルはBINEX形式です。このBINEX形式ファイルには、OBSファイルとNAVファイルとの両方の情報を含みます。したがって、ssr2osrでの2019年12月15日分のNAVファイルは、指定しなくてもても動作します。これもRTKLIBの機能です。

それぞれのMakefileのコメントに書き込んだ通り、ssr2obsとssr2osrとで互いに相手のコンパイルオプションでコンパイルすると動作しません。オブジェクトを共通化して、オリジナルプログラムを作成したければ、コンパイルオプション部分を中心に、ソースコードを丁寧に読まなければなりません。gdbも活用して、ソースコードを追いかけてみようと思います。

次回は、CLAS測位の最初のステップである精密単独測位(PPP: precise point positioning)を試します。


この記事には一連の関連記事があります。