RaspberryPi[12] でRTK

RTK

「RTK」とは『リアルタイムキネマティック』の略で、地上に設置した「基準局」からの位置情報データによって、高い精度の測位を実現する技術のことです。こんかいは、最終的にラズパイで基地局と移動局を作りたいと思っています。今まで、言葉ではGPS、GNSS、Diffrential GPSやRTTKという言葉は知っていましたが、どんな構成になっているのかは全く分からずに、想像で始めたので結構つまずきました。使用したGNSS受信機はu-blox「ZED-F9P」です。

RTKは基準局を用いて、補正データを移動局に送り精度上げる仕組みです。RTKLIBをラズパイにインストールするので、RTKLIBが補正データを計算するのかと思っていましたが、実際は補正計算はすべてF9Pが行います。RTKLIBは基準局の場合はCasterへの送信と移動局の場合はCasterからの受信にしか用いられません。移動局と基準局が近ければCasterはいらないということにもなります。

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.6

Caster

次に、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.target

ntripcaster の設定を忘れるので、書いておきます。


############### 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

基地局ラズパイからのアクセス

※ 必ず、 gpsdとgpsd.socket は止めておいてください。USBからのGPS受信ができません。

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_passwordntripcaster.conf-out ntrips://:encoder_password@caster:2101/MOUNT
移動局 → Caster から「補正データを受け取る」マウントポイントごとに決まるユーザー名/パスワード/MOUNTPOINT:user:passntripcaster.conf-in ntrip://user:pass@caster:2101/MOUNT

F9Pの設定

F9Pはu-bloxのGPSのモジュールでGPS受信機では多く使われていますし、機能も豊富です。ここでは、F9Pの設定を書きたいと思います。繰り返しになりますが、ここで書いているRTKの機能はF9Pの機能によるもので、RTKLIBやCasterは単に通信の土管としてして機能しています。なので、近くでRTKするなら、CasterもRTKLIBもいらないことになります。

私はAS-RTK2B-F9P-L1L2-NH-02を使用していますのでそれを前提に話を進めます。

AS-RTK2B-F9P-L1L2-NH-02

u-center

u-centerはF9Pを使うに必要なソフトウエアです。https://www.u-blox.com/en/product/u-center からダウンロードできます。u-center と u-center2 があるので、対応モジュールでどちらかを選択してください。私はF9なので、u-center(Ver 25.06) を使用しています。インストール自体は説明いらないでしょう。

使い方

このモジュールは複数のインターフェースを持っていますが、今回はUSB接続するので、UBSケーブルでPCと接続します。u-center を立ち上げると、上のメニューバーに Reciever と言うのがあるので、これを選択してプルダウンメニューを出します。Connectionを選択してしばらく待ちます。ちょっと時間かかります。マウスを動かさないように。COMポートの拙宅画面が現れるので、接続しているCOMポートの番号を選択します。ちゃんと接続できると、左上にあるコネクタが緑に変わります。ボーレートは何にしても接続できるみたいです。今回はラズパイと接続するので、115200bps を前提に話します。もしかすると、なんでもいいかもしれませんが。str2str にもボーレートを書くので。

とにかく、u-center はわかりにくいです。設定が色なところからできるみたいでちゃんと設定できたのかどうかが非常にわかりにくい。設定には、view から行ける Configration View, Message View と Generation 9 Configration Viewがあります。このうち設定に使うのは、Generation 9 Configration ViewとMessage Viewの2つです。

Generation 9 Configration View では、受信する衛星を選択します。

図 Generation 9 Configration View

設定できる衛星全てにチェックした後、Write to layer もすべてチェックを入れて、SendConfgurationを押すとFlashにまで書き込まれます。

あとは、Message Viewから設定していきます。

基準局の設定

1.Message View-UBX-CFG-DGNSS を選択します。

Diffrencial mode を 3= RTK fixed: Ambiguities are field fixed whenever possible に設定
下にある「Send」を押す。

2.Message View-UBX-CFG-MSG(Message) を選択します。

Message に 01-35 NAV-SAT を選択して、同じく「Send」を押す。

同じように、

F5-05 1005 基準極座標

F5-4D 1077 GPSの観測データ

F557 1087 GLONASSの観測データ

F5-61 1097 Galileoの観測データ

F5-7F 1127 BeiDouの観測データ

F5-E6 1230 GLONASSの補正データ

も設定します。

観測メッセージの種類によって RTCM のデータ量は大きく変わる。特に上の MSM(107x 系)には「重いものと軽いもの」がある。

MSM番号の意味(他の衛星も同じ)
メッセージ例 内容 データ量
1077 MSM7 (full: code + phase + Doppler + lock + C/N0 + 他) 重い / 精度高い / 伝送量多い
1074 MSM4 (medium: code + phase + C/N0 など簡略) 軽い / 必要最低限
1071 MSM1(最軽量、コードのみなど) 超軽いが使いにくい。

なので、データ容量が多く、SIMが早くなくなってしまう場合には、 MSM4 を選択すると良いです。

3.View-Packet Console でメッセージg出ているか確認できます。

4.Message View-UBX-CFG-NAV5

Navigation Mode:

Dynamic Model「2-Stationary」

Fix Mode 「3-Auto 2D/3D」

UTC Standard 「Automatic」

あとはこんな感じです。設定したら Send を忘れないように。

図 Message View-UBX-CFG-NAV5

5.Message View-UBX-CFG-PRT

Target: USB

in out とも、0+1+5UBX+NMEA-RTCM3

USBにボーレートはありません。で、また、 「Send」

6.Message View-UBX-CFG-TMODE3

Mode 「2-Fixed Mode」

Fixed Position は Use Lat/Lon Alt Postion にチェックと入れると緯度経度で入れられます。

緯度経度とアンテナ座標を入れます。

Survey-In を選択することもできます。

Survey-In は F9P を基準局(Base)として使います。
一定時間・一定精度で平均測位して、位置を固定させる機能です。

設定はこの 3点だけ を押さえればOK:

Survey-In 有効化

観測時間(Min Duration)→ 300~600 秒

位置精度(Accuracy Limit)→ 2.0 m ~ 1.0 m (精度高くすると時間かかります。)

6.Message View-UBX-CFG-CFG

設定をF9PのFlashに書き込みます。Save Current Congiguration にチェック、Device は0と1を選択して「Send」です。

移動局の設定

▶ Configuration → PRT(Ports)

USB IN:RTCM3

USB OUT:NMEA

UART出力

UARTに出力したい場合、このボードのUARTはオープンコレクタらしく、マニュアルに以下の文面があります。

「If you are connecting your own hardware to UART1 or UART2, it is mandatory to connect IOREF pin to the voltage required by your hardware, otherwise you may experience problems.」

なので、IOREF ピンにラズパイから3.3Vを供給しました。繋がないと問題を起こすと書くより、出力されないと書いてほしいけど。

PORTの設定は

USB in  RTCM3

USB out NMEA

UART1 in  none

UART1 out UBX