これまで、パソコンでMosaic-HATを動かしてきましたが、いよいよラズパイに搭載です。
Mosaic-HATをRTK基準局モードにし、RTKLIBのstr2str経由でRTK2goに配信します。
先行事例がなく、試行錯誤です。
※移動局の作成はこちらhttps://qiita.com/KIT-tokunaga/items/f9a7249bdba8b1aceb3b
#1.工作
まず、Mosaic-HATの工作です。
図面を入手しましょう。GitHubにmosaicHAT_schematic.pdfがあります。
https://github.com/septentrio-gnss/mosaicHAT
ラズパイとの接続は、
- 5V給電x2
- リセット
- LEDx2
- シリアル(RX/TX)
の7本と、8本のGND。
ボード付属の40pinコネクターを全ピンハンダ付けで問題ありません。
#2.リセット
ラズパイのGPIO5をLowにすることで、Mosaic-HATをリセットできます。
Pythonで書くとこんな感じ。
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)
#3.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コマンドで変えられますが、まずは初期設定にラズパイ側を合わせます。
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
設定を更新するとリブートします。以後、シリアルポートは有効のままとなります。
#4.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のためです。
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の設定は完了です。
#5.RTKLIBを使ったRTK2go配信の設定
PCでは、RxToolやWebアプリでインタラクティブな設定が出来ましたが、ラズパイにはそういったアプリが用意されていません。なので、オープンソースであるRTKLIBを使います。
ラズパイへのRTKLIBインストールについては、他の人の情報を参考にしてください。
今回は、RTKLIBの中のstr2strというコマンドライン版ストリームサーバを使います。Mosaic-HATから受けた基準局データを、Ntripサーバに配信する機能です。Ntripサーバには、RTK2gohttp://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単位)を、それぞれ入れてください。
! /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安定度や精度が評価できるようになります。