LoginSignup
6
4

More than 3 years have passed since last update.

RTK基地のハンドリングに使っているスクリプト

Last updated at Posted at 2020-09-19

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を使う。

/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もちゃんと書く。

/usr/local/bin/ntripcaster/bin/ntripcaster.conf
抜粋
encoder_password pass
/myrtk

最下部に追記

/etc/rc.local
screen -AmdS ntrip-myrtk str2str \
-in serial://ttyACM0:115200 \
-out ntrips://:pass@localhost:2101/myrtk &

exit 0

データ取り

後処理したいubxのデータを、自動でファイルに保存する方法。

/dev/ttyACM0に接続されていて、1時間ごとに前後30秒プラスして、国土地理院風のファイル名にして分ける場合。

/etc/rc.local

# 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ポートを固定する

F9PにはUARTがせっかく2つあるので使いたい

USBケーブル増えるのでこれオススメ。
https://strawberry-linux.com/catalog/items?code=50028

F9PのUART2には制約があります

  • UART2にUBXは出ない
  • 38400bps以下にしちゃダメ。

SimpleRTK2Bの場合

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
6
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4