RaspberryPi[12] でRTK
RTK
「RTK」とは『リアルタイムキネマティック』の略で、地上に設置した「基準局」からの位置情報データによって、高い精度の測位を実現する技術のことです。こんかいは、最終的にラズパイで基地局と移動局を作りたいと思っています。今まで、言葉ではGPS、GNSS、Diffrential GPSやRTTKという言葉は知っていましたが、どんな構成になっているのかは全く分からずに、想像で始めたので結構つまずきました。使用したGNSS受信機はu-blox「ZED-F9P」です。
ServerとCaster
想像では、基準局のデータを何らかの方法で移動局に送るんだろうなという考えはあったのですが、調べてみると二つの方法があるようです。一つは、移動局に直接データを送り込む方法。もう一つは、Casterという配信サーバーを介して移動局に送る方法です。Casterは無料で公開しているところがあるので、Casterに自分で作った基地局のデータを登録し、データを送り込めば、自分の移動局で使用することができるようです。この時、基地局をサーバー、移動局をクライアントと呼ぶようですが、Casterを使用した場合は、Casterがサーバーになり、基地局もクライアントとしてCasterに接続に行きます。前者の場合はCasterがないので、基地局サーバーに対して移動局クライアントがRTKデータをもらいに行くので、多分、ここから基地局はサーバーと呼ぶようになったのかなと思います。今回はこの二つの方式を構築することが目的です。まずは、移動局はPC上で動かし、ソフトは有名な u-center を使うことにしました。
まずは、前者のCasterを使わない方式から構築します。当然、サーバーとクライアントなのでIP上でお互いが認識できないといけません。そのためには、ラズパイで構築する基地局とPCで構築する移動局はお互いのIPが認識できる環境が必要です。これを構築するには、三つの方法があると思います。
1.グローバルIPを使用する。
2.ローカルIPを使用する。
3.仮想HUBでローカルIPを使用する。
1番目は、まず現実的にではないでしょう。2番目は自宅や企業内で構築することできますが、実際は移動局と基地局は距離があるので現実的には無理でしょう。3番目は仮想HUBをクラウド上に於けば基地局と移動局はWiFiルータを用意するだけでお互いが見えるローカルIPネットワークが構築できます。なので、この3番目を狙います。既に過去ブログで仮想HUBの構築はできているので、まずは机上で基地局と移動局を作ります。
ラズパイを基地局にするには、「ZED-F9P」をUSBポートに刺します。ラズパイには、RTKLIBをインストールします。./makeall.sh install で /usr/local/bin 配下にインストールされます。
git clone https://github.com/tomojitakasu/RTKLIB.git
cd RTKLIB/app
chmod +x makeall.sh
./makeall.sh clean
./makeall.sh
sudo ./makeall.sh install基地局として動かすには下記のコマンドを打ち込みます。バッチファイルにしておくのが楽だと思います。IPアドレスはラズパイのIPアドレスです。クライアント(移動局)がこのIPアドレスとポートにアクセスします。仮想HUB動かす場合は、仮想HUB上のIPアドレスになります。
/usr/local/bin/str2str -in serial://ttyACM0:230400#rtcm3 -out tcpsvr://192.168.X.X:2101これだけで、基地局のサーバーは完成です。起動すると以下のようなメッセージが出ます。まだ、誰もつないでいないので、waiting... が出るだけです。
stream server start
2022/09/02 05:17:22 [CW---] 0 B 0 bps
2022/09/02 05:17:27 [CW---] 50087 B 79466 bps (1) waiting...
2022/09/02 05:17:32 [CW---] 99826 B 80732 bps (1) waiting...
2022/09/02 05:17:37 [CW---] 150177 B 82248 bps (1) waiting...ここに移動局を接続します。まずは、PC上で構築するので、PCのUSBポートに「ZED-F9P」を刺して、u-center を起動します。u-center でGPSが接続されているポートを設定して、とBaudrateを240300bpsにします。GPSのデータが受信できれば大丈夫です。
次に reciever → Diffrencial GNSS Interface を開きます。
Internet connectionの Serverに ラズパイのIPアドレス、Portに2102と入れます。OKを押すとそれで終わりです。先に基地局のRTKLIBを起動しておかないとエラーが出ます。
ラズパイのメッセージに移動局(PC)のアドレスが表示され、u-center のFix Mode に TIME/DGNSS と出れば完成です。
2022/09/02 05:30:56 [CW---] 270747 B 88091 bps (1) waiting...
2022/09/02 05:31:01 [CC---] 324814 B 85490 bps (1) 192.168.1.6 (u-centerが動いているPCのアドレス)
2022/09/02 05:31:06 [CC---] 379917 B 86705 bps (1) 192.168.1.6
2022/09/02 05:31:11 [CC---] 434192 B 86723 bps (1) 192.168.1.6Caster
次に、Casterを使用したRTKを作ってみます。
CasterはさくらネットのVPSサーバーで構築しました。Casterは NtripCaster を使用します。フリー版は ntripcaster0.1.5 になります。有料版は2.0.x まであるようですが、1000ユーロもするみたい。
インストールは、「自分用のNTRIP caster をたてる」というサイトに詳しく書かれているのでそれを参考にしてください。Casterの場所を忘れるので転記しておきます。
git clone https://github.com/thpe/ntripcaster.git
cd ./ntripcaster/ntripcaster0.1.5
./configure –prefix=/usr/local
make
sudo make install
注意としては、さくらネットは2101ポートがデフォルトでは閉じているので開けないと動きません。これを見つけるのに時間がかかりました。VPSコンソールのぐオーバルネットワークの場所にパケットフィルターを設定というところがあるので、これで開けてください。
自動起動
サービスで動かすように変更しました。
[Unit]
Description=BKG NtripCaster Service
After=network.target
[Service]
ExecStart=/usr/local/ntripcaster/bin/ntripcaster -c /home/xxxx/ntripcaster.conf
WorkingDirectory=/home/xxxx/work/
Restart=always
User=root
[Install]
WantedBy=multi-user.targetntripcaster の設定を忘れるので、書いておきます。
############### Server Location and Resposible Person ##########################
# Server meta info with no fuctionality.
location YTL
rp_email userName@xxx.co.jp
server_url http://www.xxx.co.jp
########################### Server Limits ######################################
# Maximum number of simultaneous connections.
max_clients 100
max_clients_per_source 100
max_sources 40
######################### Server passwords #####################################
# The "encoder_password" is used from the sources(基地局) to log in.
encoder_password PASSWD
#################### Server IP/port configuration ##############################
# The server_name specifies the hostname of the server and must not be set to
# an IP-adress. It is very important that server_name resolves to the IP-adress
# the server is running at.
# For every port, the server should listen to, a new port line can be added.
server_name FQDN
port 2101
######################## Main Server Logfile ##################################
# logfile contains information about connections, warnings, errors etc.
logdir /usr/local/ntripcaster/logs
logfile ntripcaster.log
############################ Access Control ###################################
# Here you specify which users have access to which mountpoints,
# one line per mount.
#
# Syntax: /<MOUNTPOINT>:<USER1>:<PASSWORD1>,<USER2>:<PASSWORD2>,...,<USERn>:<PASSWORDn>
#
# /<MOUNTPOINT>: name of the mountpoint. Must start with a slash.
# <USERi>: name of the user that has access to <MOUNTPOINT>.
# <PASSWORDi>: password of <USERi>.
#
# example:
/MNT0:for_rover_usrname:for_rover_passwd
#/mount0:user0:pass0,user1:pass1,user2:pass2
#/BUCU0:user1:password1,user2:password2
基地局ラズパイからのアクセス
RTKLIBはインストールしておくこと。ttyUSB0:9600は基準局につながっているGPSのデバイス名と速度です。
pi@pi-rtkB-150:~ $ /usr/local/bin/str2str -in serial://ttyUSB0:9600#rtcm3 -out ntrips://:encoder_password@FQDN:2101/マウントポイント名うまくつながるとこんな感じ
stream server start
2025/11/05 06:09:46 [C----] 0 B 0 bps
2025/11/05 06:09:51 [CC---] 4318 B 6564 bps (1) FQDN/マウントポイント
2025/11/05 06:09:56 [CC---] 8707 B 6564 bps (1) FQDN/マウントポイント
移動局ラズパイからのアクセス
※ 必ず、 gpsdとgpsd.socket は止めておいてください。USBからのGPS受信ができません。
i@pi-rtkR-151:~ $ sudo systemctl stop gpsd.socket
pi@pi-rtkR-151:~ $ sudo systemctl stop gpsd
pi@pi-rtkR-151:~ $ sudo systemctl disable gpsd
Removed /etc/systemd/system/multi-user.target.wants/gpsd.service.
Removed /etc/systemd/system/sockets.target.wants/gpsd.socket.
pi@pi-rtkR-151:~ $ sudo systemctl disable gpsd.socket
pi@pi-rtkR-151:~ $
移動局もRTKLIBを使ってアクセスします。ただ、記述は変わります。ここに記述する緯度経度高さは最終的にRTKが計算するので、多少の誤差があっても問題になりません。
usr/local/bin/str2str -in ntrip://ログイン名:ログインPW@FQDN:2101/NTSEL p 基準局の緯度 基準局の緯度 基準局高さ -out serial://ttyACM0:115200パスワードの関係
ここまでで、ログイン名とパスワードが出てきますが、わかりにくいので書いておきます。
| 動作 | 誰がログインする? | 何を使う? | 設定場所 | 使用例 |
|---|---|---|---|---|
| 基準局 → Caster に「補正データを送る」 | ユーザー名は不要 | encoder_password | ntripcaster.conf | -out ntrips://:encoder_password@caster:2101/MOUNT |
| 移動局 → Caster から「補正データを受け取る」 | マウントポイントごとに決まるユーザー名/パスワード | /MOUNTPOINT:user:pass | ntripcaster.conf | -in ntrip://user:pass@caster:2101/MOUNT |


