##RTK基地のハンドリングに使っている小道具メモ
・まえがき
Raspberry PiにRTKLIBやBKG NtripCasterを入れて、RTKに使うデータをハンドリングするための小道具メモ。
間違え等ありましたら、コメントいただけると助かります。
##前提条件
rtklibやntripcasterのインストールは済んでいる
##apt
$ sudo apt install -y screen
##BKG NtripCasterについて
必要最低限の機能しか無いので、使えるだけマシと諦めるのが大事。
・ntripcaster.confの中身が反映されない。
シェルからの起動パスにある./ntripcaster.confというファイル名を参照している環境もあるようです。なので、$HOMEの場所にコピーするとか、shシェルを起動してcd /usr/local/ntripcaster/bin/にコピーして起動するとかの対策が必要。
・ntripcaster.confに書いたテーブルが表示されない。
自動生成なんて便利なものは無いので、sourcetable.datに定義する必要があります。
・sourcetableが表示されないんだけど。
普通にインストールした場合は、
/usr/local/ntripcaster/conf/sourcetable.dat.dist
に、サンプルがあります。
ファイルをコピーして、中身を自分の環境に合わせて書き換える。
/usr/local/ntripcaster/conf/sourcetable.dat
中身は受信機の出しているRTCM3と仕様を確認しながら書くのが筋だろうけども、面倒なのでrtk2go.comに一旦データを流してソーステーブル表示させてから、コピペという手もあり。
・ブラウザで開いてもsource table見れないんだけど?
http/0.9という太古の昔(Netscapeとかの時代)に使われていたプロトコルを使ってるせい。
srctblbrows.exeではちゃんと表示されます。
Raspberry Pi等で確認したい場合は、古式ゆかしいこんな感じで。
echo -e "GET /\r\n" | nc localhost 2101
IDとPassが必要な場合はこんな感じ。
curl -u user:pass http://ntrip-caster:2101/
##自動起動
・str2strやNtripCasterを自動起動するには?
/etc/rc.localを使う。
/usr/loca/ntripcaster/bin/ntripcaster
exit 0 ←これの前に入れる
ubuntu20の場合はrc.localがない場合があるのでこちら
・Ubuntu 20.04 LTS でも rc.local は使える
##localhostでntripcaster
###ローカルハードウェアは、いったんNTRIP Casterにまとめる
GPS受信機→シリアルUSB→と接続している場合、localにNTRIP Casterを立てて、sourcelist.datもちゃんと書く。
抜粋
encoder_password pass
/myrtk
最下部に追記
screen -AmdS ntrip-myrtk str2str \
-in serial://ttyACM0:115200 \
-out ntrips://:pass@localhost:2101/myrtk &
exit 0
##データ取り
後処理したいubxのデータを、自動でファイルに保存する方法。
/dev/ttyACM0に接続されていて、1時間ごとに前後30秒プラスして、国土地理院風のファイル名にして分ける場合。
# root権限で動かしたくない場合はsu -u pi をscreenの前に入れる。
screen -AmdS log-myrtk str2str \
-in ntrip://localhost:2101/myrtk \
-out file:///mnt/[your-storage-here]/gps/%Y%m%d%H_myrtk.ubx::S=1 \
-f 30 & > /dev/null 2>&1
###ハードウェア構成がカオス化してきた
F9Pだけでも色々実験したくてRTCM3とUBXをUART1,2で出したりしていると、ハードウェアの構成がカオス化しますよね、わかります。
バシッと解決する方法がなかなかありませんが、小技をいくつか貼っておきます。
####USBポートを固定する
https://s-taka.org/identification-of-usb-serial-ports-on-linux/
####F9PにはUARTがせっかく2つあるので使いたい
USBケーブル増えるのでこれオススメ。
https://strawberry-linux.com/catalog/items?code=50028
F9PのUART2には制約があります
- UART2にUBXは出ない
- 38400bps以下にしちゃダメ。
SimpleRTK2Bの場合
- IOREFを3v3に接続する必要があります。
- TXD2とRXD2が刻印とは逆
- 中央にあるコネクタはxbee互換接続っぽいです。
- 参考:http://nanoappli.com/blog/archives/4191
###IPアドレスを固定したい
いくつか方法がありますが、どれも一長一短。
・AWS
Elastic IPで1個タダで使えるので、EC2のt3.nano(Linux約3700円windows約8000円、投稿時の東京リージョン価格。)あたりの仮想マシンに割り当ててNtripcaster動かす。
・myIPでVPN
https://www.interlink.or.jp/service/myip/
一発でうまく動けばいいけれど、ネットワーク設定の周りでハマると泥沼。
・固定IPプロバイダと契約する
高い。プロバイダによってはタダで付いてくる所もありますが、探さないと出てこない。
・DDNS
昔はたくさんあったけれども、最近ほとんど見なくなったような?
netvolante買えばタダで使えます。
AWS以外の方法は自宅鯖運用になるので色々大変。
自宅の電源や回線トラブル等で簡単に落ちるので、運用難易度は高め。
RaspberryPiでシリアルUSBを使う場合、電源容量不足で悩まされるのでPi3,Pi4をオススメします。(強調)
###UBXデータをRTCM3に変換してRTCM1005を混ぜる
Facebookで教えてもらった方法。なぜかF9Pモジュールから出てくるRTCM3の出力にはQZSSが含まれないので、UBXから変換してQZSSのデータをRTCM3に入れこみます。
・ntripcasterでmyrtk-rtcm3を作っておきます。
UBXフォーマットの中にはRTCM1005が含まれないので、-pで付与します。
/str2str -in ntrip://user:pass@localhost:2101/ubxdata:#ubx \
-out ntrips://:pass@localhost:2101/myrtk-rtcm3#rtcm3 \
-msg "1005(10),1019(1),1020(2),1042(2),1044(2),1046(1),1077(1),1087(1),1097(1),1117(1),1127(1),1227(1)" \
-p 42.88 141.61 53.10
一部の人にはRTCM1008が必要。使う人は1005(10)のあとあたりに、1008(10),を書き足してください。
###リバースプロキシ経由にしたい
ネットワークの都合とかでバーチャルホストやhttpsで通したいとかの場合。
https://cpoint-lab.co.jp/article/201711/251/
##「NTRIP Caster」 と 「tcpsvr」 どっちがいい?
結論から言うと自分のおすすめはNTRIP Casterです。
最初から使おうとすると混乱するので、tcpsvrで慣れてからNTRIP Casterをオススメします。
###tcpsvr
良い点 | 悪い点 |
---|---|
str2strで設定するだけで使える | 外部から使おうとすると、ルーターのポート開放が面倒くさい |
LANとかで一時的に実験として使うなら便利ですが、しばらくするとどの番号に何割り振ったのかわからなくなる。 |
###Ntrip Caster
良い点 | 悪い点 |
---|---|
1つのポートで送受信できる | 構築が面倒くさい |
繰り返しになりますが、BKG NtripCasterが必要最低限の機能しか無いので、使えるだけマシ。 | |
str2strにも一応は機能として入っていますが、2ポート使うので微妙に使いにくい。 | |
古いソースの~/RTKLIB/app/str2str/run_cast.shに起動スクリプトあるので、中身見てみると使い方はわかると思います。 | |
(なんだかんだ言っても、SNIPは商用ソフトだけあって流石に便利です。) |
##inject RTCM1008
一部界隈の人には必要なRTCM1008を挿入するプログラム。
上記フォーラムからのコピペ
addrtcm1008.py
#!/usr/bin/python3
import sys
while True:
data = sys.stdin.buffer.read(1)
while (data != b'\xd3'):
data = sys.stdin.buffer.read(1)
length_data = sys.stdin.buffer.read(2)
length = ((length_data[0] & 0b00000011) << 8) + length_data[1]
packet_data = sys.stdin.buffer.read(length)
crc24_data = sys.stdin.buffer.read(3)
if length >= 2:
message_number = (packet_data[0] << 8) + packet_data[1]
message_number >>= 4
sys.stdout.buffer.write(b'\xd3')
sys.stdout.buffer.write(length_data)
sys.stdout.buffer.write(packet_data)
sys.stdout.buffer.write(crc24_data)
sys.stdout.flush()
if message_number == 1005:
# 1008 message: ADVNULLANTENNA (station id =0)
sys.stdout.buffer.write(bytes([0xd3,0x00,0x14,0x3f,0x00,0x00,0x0e,0x41,0x44,0x56,0x4e,0x55,0x4c,0x4c,0x41,0x4e,0x54,0x45,0x4e,0x4e,0x41,0x00,0x00,0x79,0x06,0x89]))
sys.stdout.flush()
使い方はこんな感じらしい。(まだ実験できてないので人柱募集中)
./str2str -in serial://ttyACM0 | ./addrtcm1008.py | ./str2str -out ntrips://:testi@raspberrypi:2101/WITH1008