【Mosaic-HAT】Raspberry Pi+RTKLIBでRTK基準局を作ってみよう

これまで、パソコンでMosaic-HATを動かしてきましたが、いよいよラズパイに搭載です。
Mosaic-HATをRTK基準局モードにし、RTKLIBのstr2str経由でRTK2goに配信します。
先行事例がなく、試行錯誤です。
※移動局の作成はこちら<https://qiita.com/KIT-tokunaga/items/f9a7249bdba8b1aceb3b>

#１．工作

まず、Mosaic-HATの工作です。
図面を入手しましょう。GitHubにmosaicHAT_schematic.pdfがあります。
<https://github.com/septentrio-gnss/mosaicHAT>
ラズパイとの接続は、
- 5V給電x2
- リセット
- LEDx2
- シリアル(RX/TX)
の7本と、8本のGND。
ボード付属の40pinコネクターを全ピンハンダ付けで問題ありません。
<img width="250" alt="ラズパイに載せた図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1255232/3373d921-4d96-2fa1-6b0a-3fcbff236fc2.jpeg">
コネクタだけだと片持ちになるので、反対側はスペーサでラズパイ基板と固定しますが、ケースによっては干渉します。そもそもMosaic-HATはラズパイボードと同じ幅で、これを収める小型ケースはなかなか見つかりません。
とにかくこれでラズパイの電源を入れると、Mosaic-HATのLEDが光り、準備OKです。

#２．リセット

ラズパイのGPIO5をLowにすることで、Mosaic-HATをリセットできます。
Pythonで書くとこんな感じ。

```python3:mosaicReset.py
import RPi.GPIO as GPIO
#Module Reset
print("Module Reset")
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)

GPIO.setup( 5, GPIO.OUT, initial=GPIO.LOW)
sleep(1)
GPIO.output( 5, GPIO.HIGH)
GPIO.setup( 5, GPIO.IN)
sleep(10)
```

#３．COMの設定

Mosaic-HATのコマンドインタフェース仕様が必要になります。
SeptentrioのプロダクツサイトからD/Lできます。
<https://www.septentrio.com/en/supportresources/mosaic/mosaic-x5>
メルアド入力すると入れますので、mosaic-X5 Firmware v4.10.0 Reference Guideを入手します。
ラズパイと通信するシリアルは、Mosaic-HATとしてはCOM1に割り当てられ、初期設定は115200baud, 8bit-data, no-parity, 1-stop bit, no flow-controlです。設定はsetCOMSettingコマンドで変えられますが、まずは初期設定にラズパイ側を合わせます。

```python3:mosaicCOMset.py
import serial
#COM Initialize
print("COM Initialize")
ser = serial.Serial('/dev/ttyS0', 115200)
sleep(1)        # wait for connection
```
なお、ラズパイの拡張コネクタのシリアルポートは、通常Disableですので、これをEnableにする必要があります。GitHubに書いてありますが、抜粋すると、

- `sudo raspi-config`　でConfigメニューに入る 
- `Select Interfacing Options` で `Serial` を選択
- `Would you like a login shell to be accessible over serial?` はNo
- `Would you like the serial port hardware to be enabled?` はYes

設定を更新するとリブートします。以後、シリアルポートは有効のままとなります。

#４．RTK基準局の設定

Mosaic-HATは、Sの連打でコマンドモードに入るそうです。Pythonで書くと、
`ser.write(b'SSSSSSSSSSSSS\n')`
という書き方になります。
以下、ser.write(b'<シリアルコマンド>\n')の書き方でRTK基準局に必要な設定をラズパイから送信していきます。ありがたいことに、Reference Guideの1.5.1に、RTK基準局に必要なコマンド設定が、解説つきで書いてあります。このコマンドを入れていけば、RTK基準局として必要な情報がCOM1から得られるというわけです。
ただし一点注意。ser.writeでコマンドを書き連ねても受け入れてくれません。1コマンドごとにser.readlineでコマンドのリターンを受けてから次のコマンドを投げるようにします。以下、アンテナ位置を現在地に合わせ、RTCMv3フォーマットでほしいメッセージ内容に変えたコマンド一式の設定スクリプトです。最後にシリアルの転送速度を19200に落としています。これは次のRTKLIBのためです。

```python3:mosaicRTKBASEset.py
from time import sleep
#Module Initialize
def PutCmd(command) :
        ser.write(command)
        while 1 :
                msg = ser.readline().decode()
                if '$R' in msg :
                        print(msg)
                        break

print("Module Initialize")
ser.write(b'SSSSSSSSSSSSS\n')   # push MOSAIC to run in command mode
sleep(1)
PutCmd(b'setStaticPosGeodetic, Geodetic1, 36.317118439, 136.376642485, 59.5925\n')
PutCmd(b'setPVTMode, Static, , auto\n')
PutCmd(b'setRTCMv3Interval, RTCM1005|6, 10\n')
PutCmd(b'setRTCMv3Interval, RTCM1033, 10\n')
PutCmd(b'setRTCMv3Formatting, 496\n')
PutCmd(b'setRTCMv3Output, COM1, RTCM1006+RTCM1033+RTCM1074\n')
PutCmd(b'setDataInOut, COM1, , RTCMv3\n')

ser.write(b'setCOMSettings, COM1, baud19200\n')
sleep(1)

print("Finish")
ser.close()
```
説明のために分割しましたが、ここまでのスクリプトを全て繋げて1ファイルにしておけばワンタッチでMosaic-HATの設定は完了です。

#５．RTKLIBを使ったRTK2go配信の設定

PCでは、RxToolやWebアプリでインタラクティブな設定が出来ましたが、ラズパイにはそういったアプリが用意されていません。なので、オープンソースであるRTKLIBを使います。
ラズパイへのRTKLIBインストールについては、他の人の情報を参考にしてください。

今回は、RTKLIBの中のstr2strというコマンドライン版ストリームサーバを使います。Mosaic-HATから受けた基準局データを、Ntripサーバに配信する機能です。Ntripサーバには、RTK2go<http://www.rtk2go.com/>を使います。
str2strは、RTKLIB/app/str2str/gccにあります。実行オプションは、str2str -hで見ることが出来ます。最低限のオプションとして、以下4つを指定します。

-in : シリアルポートの設定と読み込みフォーマットの指定
-out: Ntripサーバの設定と配信フォーマットの指定
-msg: 配信するメッセージタイプの指定
-p  : アンテナ位置

シェルスクリプトの例を示します。PASSWD, MOUNTPTには、RTK2goにマウントポイントを登録した際のパスワードとマウントポイント名を、DESCRIPTIONは、<http://www.rtk2go.com:2101/>を真似て説明を、LAT/LONG/HEIGHTは、Mosaic-HATのアンテナ位置(deg, m単位)を、それぞれ入れてください。

```sh:base.sh
! /bin/sh
cd /home/pi/myRTKLIB/RTKLIB/app/str2str/gcc
./str2str -in serial://ttyS0:19200:8:n:1:off#rtcm3 \
          -out ntrips://:PASSWD@rtk2go.com:2101/MOUNTPT:"DESCRIPTION"#rtcm3 \
          -msg "1006(10),1033(10),1074(1)" \
          -p LAT LONG HEIGHT
```
なお、-inオプションにいれた19200は、Mosaic-HATの設定の最後に入れた通信速度の変更後に合わせています。Mosaic-HATの初期値である115200に合わせればよい、と思いがちですが、どうもstr2strの処理の関係で、高い転送レートだとエラーになるようです。

ひとまずこのスクリプトを実行すると、
`2021/07/24 01:26:29 [CC---]    1242115 B    1626 bps (1) rtk2go.com/MOUNTPT`
のような表示が出力され、配信できていることがわかります。
しばらくしたのち、<http://www.rtk2go.com:2101/>をアクセスし、自身のマウントポイントが表示されていれば、Ntripサーバにまで届いていることがわかります。


次回は、もう1台のMosaic-HAT＋Raspberry-Piを組み立てて、Rover設定です。RTKのfix安定度や精度が評価できるようになります。