RTKLIB rtkrcv でログのプレイバックを利用してみる

## はじめに

RTKLIBのrtkrcvを改良していたころは、プレイバックのやり方がわからず、実際で計測しつつデバッグをするというあほなことをしていたのですが、ログファイルを使ってプレイバックモードでrtkrcvを動かす方法をみつけました。

## rtkrcv のプレイバックデータ取得

rtkrcv を実行するときのもともとrtk.conf設定ファイルを以下の用に変更したrecord.confを作成します。。手元にgnss モジュールがなくても計測データを使えるよう、静岡大学が公開している [ntripサービス](https://hamamatsu-gnss.org/) からデータを取得するよう設定しています。基準局データだけでなく、移動局のログも公開して頂いてるので rtk の実験には大変ありがたいサービスです。

プレイバック用のログファイルを作るためには、「::T」をログファイルパスに「::T」をつけておきます。

```record.conf

inpstr1-type       =ntripcli     # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,7:ntripcli,8:ftp,9:http)
inpstr2-type       =ntripcli     # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,7:ntripcli,8:ftp,9:http)

inpstr1-path       =guest:guest@ntrip.hamamatsu-gnss.org:80/SU_ROVER1
inpstr2-path       =guest:guest@ntrip.hamamatsu-gnss.org:80/SU_RTCM3

inpstr1-format     =ubx       # (0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:sp3)
inpstr2-format     =rtcm3       # (0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:sp3)

logstr1-type       =file        # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
logstr2-type       =file        # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)

logstr1-path       =rov_%Y%m%d%h%M.log.ubx::T
logstr2-path       =ref_%Y%m%d%h%M.rtcm3::T

pos1-navsys        =57         # (1:gps+2:sbas+4:glo+8:gal+16:qzs+32:comp)

ant2-postype       =rtcm        # (0:llh,1:xyz,2:single,3:posfile,4:rinexhead,5:rtcm)

```

record.conf を指定してrtkrcv を起動します。

```
[~/works/RTKLIB/app/rtkrcv/gcc] $ ./rtkrcv -o record.conf 

** rtkrcv ver.2.4.2 console (h:help) **
rtkrcv> start 
statup script ok
rtk server start
rtkrcv> status 

Parameter                   : Value
rtklib version              : 2.4.2
rtk server thread           : -761297152
rtk server state            : run
processing cycle (ms)       : 10
positioning mode            : kinematic
frequencies                 : L1+L2
accumulated time to run     : 00:00:25.2
cpu time for a cycle (ms)   : 7
missing obs data count      : 0
bytes in input buffer       : 0,0
# of input data rover       : obs(24),nav(10),gnav(0),ion(0),sbs(0),pos(0),dgps(0),ssr(0),err(0)
# of input data base        : obs(24),nav(14),gnav(12),ion(0),sbs(0),pos(8),dgps(0),ssr(0),err(0)
# of input data corr        : obs(0),nav(0),gnav(0),ion(0),sbs(0),pos(0),dgps(0),ssr(0),err(0)
# of rtcm messages rover    : 
# of rtcm messages base     : 1006(2),1008(3),1013(2),1019(28),1020(24),1033(3),1074(24),1084(25),1094(25),1114(25),1124(24),1230(2)
# of rtcm messages corr     : 
solution status             : fix
time of receiver clock rover: 2018/07/22 12:51:50.999834439
time sys offset (glo-gps)(s): 0.000000000
solution interval (s)       : 1.000
age of differential (s)     : 2.019
ratio for ar validation     : 537.365
# of satellites rover       : 23
# of satellites base        : 19
# of valid satellites       : 11
GDOP/PDOP/HDOP/VDOP         : 6.1,4.9,1.4,4.7
# of real estimated states  : 3
# of all estimated states   : 245
pos xyz single (m) rover    : -3882584.278,3530638.951,3613035.493
pos llh single (deg,m) rover: 34.72659769,137.71809598,97.377
vel enu (m/s) rover         : -0.021,0.005,0.085
pos xyz float (m) rover     : -3882584.271,3530638.944,3613035.490
pos xyz float std (m) rover : 0.026,0.028,0.018
pos xyz fixed (m) rover     : -3882584.278,3530638.951,3613035.493
pos xyz fixed std (m) rover : 0.025,0.027,0.017
pos xyz (m) base            : -3882623.621,3530650.325,3613008.962
ant type rover              : 
ant delta rover             : 0.000 0.000 0.000
ant type base               : 
ant delta base              : 0.000 0.000 0.000
pos llh (deg,m) base        : 34.72621238,137.71829310,112.475
vel enu (m/s) base          : 0.000,0.000,0.000
baseline length float (m)   : 48.802
baseline length fixed (m)   : 48.797
monitor port                : 0

```
30秒もしないうちにfix していますが、デバッグ用データを作るためもう少し動かした後、shutdownコマンドで終了させます。

```
rtkrcv> shutdown 
shutdown rtkrcv process ? (y/n): y 
shutdown script ok
```

ログファイルを確認すると、ログファイル名.tag というファイルがログと一緒に作成されていることが分かります。

```
ls -l 
-rw-rw-r-- 1 user user  24K  7月 22 21:45 ref_201807221212.rtcm3.tag
-rw-rw-r-- 1 user user  1.7M  7月 22 21:45 ref_201807221212.rtcm3
-rw-rw-r-- 1 user user  53K  7月 22 21:45 rov_201807221212.log.ubx.tag
-rw-rw-r-- 1 user user 6.0M  7月 22 21:45 rov_201807221212.log.ubx
```

## rtkrcv のプレイバック

record.conf を変更して、play.conf  を作成します。入力を先ほど取得したログファイルに変更し、ログ出力を止めておきます。

```play.conf
inpstr1-type       =file     # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,7:ntripcli,8:ftp,9:http)
inpstr2-type       =file     # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,7:ntripcli,8:ftp,9:http)

inpstr1-path       =./rov_201807221212.log.ubx::T
inpstr2-path       =./ref_201807221212.rtcm3::T

logstr1-type       =off        # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
logstr2-type       =off        # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
```

play.conf を使って、rtkrcv を起動するとプレイバックが開始されます。

```
[~/works/RTKLIB/app/rtkrcv/gcc]$ ./rtkrcv  -o play.conf 

** rtkrcv ver.2.4.2 console (h:help) **
rtkrcv> start 
statup script ok
rtk server start
rtkrcv> status 

Parameter                   : Value
rtklib version              : 2.4.2
rtk server thread           : -562563328
rtk server state            : run
processing cycle (ms)       : 10
positioning mode            : kinematic
frequencies                 : L1+L2
accumulated time to run     : 00:00:05.2
cpu time for a cycle (ms)   : 8
missing obs data count      : 0
bytes in input buffer       : 0,0
# of input data rover       : obs(224),nav(23),gnav(0),ion(83),sbs(0),pos(0),dgps(0),ssr(0),err(0)
# of input data base        : obs(230),nav(14),gnav(11),ion(0),sbs(0),pos(68),dgps(0),ssr(0),err(0)
# of input data corr        : obs(0),nav(0),gnav(0),ion(0),sbs(0),pos(0),dgps(0),ssr(0),err(0)
# of rtcm messages rover    : 
# of rtcm messages base     : 1006(23),1008(23),1013(23),1019(299),1020(253),1033(22),1074(228),1084(230),1094(230),1114(230),1124(230),1230(23)
# of rtcm messages corr     : 
solution status             : fix
time of receiver clock rover: 2018/07/22 12:17:41.999684444
time sys offset (glo-gps)(s): 0.000000000
solution interval (s)       : 1.000
age of differential (s)     : 1.018
ratio for ar validation     : 999.900
# of satellites rover       : 23
# of satellites base        : 19
# of valid satellites       : 11
GDOP/PDOP/HDOP/VDOP         : 4.8,3.8,1.5,3.5
# of real estimated states  : 3
# of all estimated states   : 245
pos xyz single (m) rover    : -3882584.260,3530638.939,3613035.491
pos llh single (deg,m) rover: 34.72659779,137.71809595,97.358
vel enu (m/s) rover         : -0.020,-0.010,0.009
pos xyz float (m) rover     : -3882584.261,3530638.941,3613035.493
pos xyz float std (m) rover : 0.019,0.022,0.012
pos xyz fixed (m) rover     : -3882584.260,3530638.939,3613035.491
pos xyz fixed std (m) rover : 0.019,0.022,0.012
pos xyz (m) base            : -3882623.621,3530650.325,3613008.962
ant type rover              : 
ant delta rover             : 0.000 0.000 0.000
ant type base               : 
ant delta base              : 0.000 0.000 0.000
pos llh (deg,m) base        : 34.72621238,137.71829310,112.475
vel enu (m/s) base          : 0.000,0.000,0.000
baseline length float (m)   : 48.813
baseline length fixed (m)   : 48.813
monitor port                : 0
```

## まとめ
ログデータを使って最適な設定を探るには、後解析の rnx2rtkp を使えばよく、あまり rtkrcv に手を加える方はいらっしゃらないかもしれませんが、この方法を使えば、実際にアンテナやモジュールを使わなくても、rtkrcv の改良ができるようになり、デバッグをずっと簡単にすすめることができると思います。2年前に知りたかった...。

## 参考文献
トランジスタ技術 2018年 1月号
https://www.amazon.co.jp/dp/B0772SZX5K/

トランジスタ技術 サポート記事 全国で1cm測位！RTK-GPS
http://toragi.cqpub.co.jp/tabid/865/Default.aspx