2025年9月23日火曜日

F9PでRTKの基準局を立てる


背景

ublox ZED-F9P(以後F9P)は基準局の情報で移動局の位置情報を補正するRTKに対応する装置です。
web検索するとF9PでRTKの基準局を立てる方法がいくつか見つかるので、立て方を把握しました。

RTCM3を配信する基準局を立て、移動局としてのF9PでRTK測位できたのですが、自分が試した設定ではubloxの独自情報を扱うRTCM3の4072の配信が移動局のF9PのRTK測位に必要でした。
そのため、ublox以外の(4072に対応してない)製品を移動局としたときにRFK測位するかは不明ですが、把握したF9Pの設定方法や関連情報を備忘録として記事に残します。

使ったもの

装置
ソフトウェア
  • pyubx-config-setコマンド
    以前作成したコマンドです。
    これでF9Pの設定を変更して基準局として動かします。
    下記のコマンドで関連プログラムのインストールとgitprojectディレクトリへの配置ができます。
    sudo apt install pip3 git
    pip3 install serial pyubx2 click
    mkdir ~/gitprojects
    git clone https://github.com/asukiaaa/scripts-pyubx-config.git
    設定変更はwindowsならu-centerでのマウス操作でも行えます。
  • str2str
    RTKに必要な情報をやりとりできる便利コマンドです。
    ntripでの配信や受信に使います。
    下記コマンドでインストールできます。
    sudo apt install rtklib
  • pygpsclient
    F9Pが配信するRTCMの確認に利用します。 
    RTCMはバイナリデータ(bit情報が意味を持つ文字ではないデータ)なので、内容の把握に解釈が必要です。
    この記事ではpygpsclientを利用します。
    下記コマンドでインストールできます。
    sudo apt install pip3
    pip3 install pygpsclient

外部サービス
  • geortk.jp
    geosense社が管理しているRTKに必要なntripのcaster(情報仲介サーバー)です。
    インターネットを介してntripを配信したいときに使います。

F9Pを基準局として動かす設定

下記コマンドでsurvey in(自身が測定した位置座標を基準として使う)モードでF9Pを基準局として動かせます。
PORT_SERIAL=/dev/ttyACM0
unset KEY_VALS
declare -A KEY_VALS=(
[CFG_SIGNAL_BDS_B2_ENA]=1 # BeiDou利用
[CFG_USBOUTPROT_NMEA]=0 # NMEA配信無効化
[CFG_USBOUTPROT_RTCM3X]=1 # RTCM3配信有効化
[CFG_MSGOUT_RTCM_3X_TYPE1005_USB]=1 # Stationary RTK reference station ARP
[CFG_MSGOUT_RTCM_3X_TYPE1077_USB]=1 # GPS MSM7
[CFG_MSGOUT_RTCM_3X_TYPE1087_USB]=1 # GLONASS MSM7
[CFG_MSGOUT_RTCM_3X_TYPE1097_USB]=1 # Galileo MSM7
[CFG_MSGOUT_RTCM_3X_TYPE1127_USB]=1 # BeiDou MSM7
[CFG_MSGOUT_RTCM_3X_TYPE1230_USB]=1 # GLONASS code-phase biases
[CFG_MSGOUT_RTCM_3X_TYPE4072_0_USB]=1 # Reference station PVT (u-blox proprietary RTCM Message)
[CFG_MSGOUT_RTCM_3X_TYPE4072_1_USB]=1 # Additional reference station information (u-blox proprietary RTCM Message)
[CFG_TMODE_POS_TYPE]=1 # 1: survey in, 2: fixed
[CFG_TMODE_SVIN_ACC_LIMIT]=50000
[CFG_TMODE_SVIN_MIN_DUR]=60
[CFG_MSGOUT_UBX_NAV_PVT_USB]=1 # 基準局としての情報配信開始
)
for KEY in "${!KEY_VALS[@]}" ; do
# echo $KEY
VAL=${KEY_VALS[$KEY]}
echo $KEY $VAL
~/gitprojects/scripts-pyubx-config/pyubx-cfg-set.py --port $PORT_SERIAL --key $KEY --value $VAL
done

各設定値を解説します。

中国の衛星BeiDouを利用する設定にします。
  [CFG_SIGNAL_BDS_B2_ENA]=1 # BeiDou利用

ntripに必要なRTCM3の配信を有効にし、不要なNMEAの配信を無効にします。
  [CFG_USBOUTPROT_NMEA]=0 # NMEA配信無効化
[CFG_USBOUTPROT_RTCM3X]=1 # RTCM3配信有効化

F9Pで配信可能なRTCM3のうちMSM4以外をUSBに対して有効にします。
MSM4を有効にしないのは、より多くの情報を含むMSM7を有効にするためと、配信量を減らすためです。
F9P同士で基準局と移動局を構成する場合は4072の有効化が重要です。
  [CFG_MSGOUT_RTCM_3X_TYPE1005_USB]=1 # Stationary RTK reference station ARP
[CFG_MSGOUT_RTCM_3X_TYPE1077_USB]=1 # GPS MSM7
[CFG_MSGOUT_RTCM_3X_TYPE1087_USB]=1 # GLONASS MSM7
[CFG_MSGOUT_RTCM_3X_TYPE1097_USB]=1 # Galileo MSM7
[CFG_MSGOUT_RTCM_3X_TYPE1127_USB]=1 # BeiDou MSM7
[CFG_MSGOUT_RTCM_3X_TYPE1230_USB]=1 # GLONASS code-phase biases
[CFG_MSGOUT_RTCM_3X_TYPE4072_0_USB]=1 # Reference station PVT (u-blox proprietary RTCM Message)
[CFG_MSGOUT_RTCM_3X_TYPE4072_1_USB]=1 # Additional reference station information (u-blox proprietary RTCM Message)

survey inにPOS_TYPEを切り替えると共に、ACC_LIMIT(誤差の許容範囲 0.1mm単位)とMIN_DUR(平滑化の秒数)を設定します。
  [CFG_TMODE_POS_TYPE]=1 # 1: survey in, 2: fixed
[CFG_TMODE_SVIN_ACC_LIMIT]=50000
[CFG_TMODE_SVIN_MIN_DUR]=60

基準局としての情報配信をUSBで行います。
  [CFG_MSGOUT_UBX_NAV_PVT_USB]=1 # 基準局としての情報配信開始

上記の設定でsurvey inモードで基準局として動きます。

参考
ZED-F9Pの設定方法 基準局、移動局ともにF9Pを利用

任意: pygpsclientで配信されるNEMAを確認

pygpsclientで基準局のF9Pが配信している情報を解釈して確認できます。
下記コマンドで起動します。
pygpsclient

シリアルポートを選びます。(pygpsclient起動後にUSB接続して表示されてない場合は一覧の右下の更新ボタンを押します。)
基準局のF9Pを開きます。
RTCMの表示を有効にします。


設定が期待通りに施されていれば、RTCMが表示されます。



pygpsclientとstr2strでポートを同時には開けないので、確認できたらstopを押してポートを閉じます。

    

str2strで基準局の情報を配信

基準局としてRTCMを配信するF9Pからの情報をstr2strでntripとして配信します。
この記事では基準局のF9Pは/dev/ttyACM0として繋がっている想定でコマンドを紹介します。

geortk.jpなどntripのcaster(情報中継サーバー)を利用する場合は宛先をntirpsとして配信します。
宛先に合わせてurl(geortk.jp)、user_name、password、mount_point_nameを書き換えてください。
str2str -in serial://ttyACM0:230400#rtcm3 -out ntrips://user_name:password@geortk.jp:2101/mount_point_name

casterを使わずLANで使えれば良いならtcpsvrで配信します。
str2str -in serial://ttyACM0:230400#rtcm3 -out tcpsvr://:2101

str2strで移動局に情報を入力

先週取り組んだ内容です。
この記事では移動局は/dev/ttyACM1として繋がっている想定でコマンドを紹介します。

casterからの情報をttyACM1に流し込みつつ、ttyACM1が出す情報を5400ポートに配信させます。
str2str -in ntrip://geortk.jp:2101/mount_point_name -out serial://ttyACM1:230400#5400

LANに配信したポートから読み込む場合はtcpcliとして受けます。
str2str -in tcpcli://localhost:2101 -out serial://ttyACM1:230400#5400

別のターミナルで5400ポートを開き、GGAで測位状況を確認します。
nc localhost 5400 | grep GGA

緯度の後の数字が4(RTK Fix)か5(FTK Float)になっていればRTKを利用した測位をしています。
$GNGGA,xxxx,xxxx,N,xxxx,E,4,12,0.56,51.2,M,38.5,M,1.0,0000*xx
^

F9Pの移動局をRTKで測位させれました。

注意: ubloxの独自情報であるRTCM3の4072が無いとF9PがRTK測位できなかった

geortk.jpでの地点登録時はRTCM3.3の配信内容として下記番号が記載されます。
1005(1)
1077(1)
1087(1)
1097(1)
1127(1)
1230(1)

F9Pの説明書の配信可能なRTCM一覧を示す「3.1.5.3 List of supported RTCM output messages」にそれらが含まれており、pyubx-cfg-setで使っているpyubx2もそれらの有効化変数を持っていた(例: 1005)ので、最初は上記のRTCMのみを有効にして基準局を動かしました。
ところが、それらの情報だけでは基準局のF9PがRTK測位にならず頭を抱えました。

以前試したpygpsclientを利用する基準局と移動局の設定だとRTK測位できたので、pygpsclientで設定後のF9PのRTCMの配信内容を調べたところ4072が有効になっているのに気づきました。
それを真似て4072を有効にして基準局を立てたところ、移動局がRTK測位しました。

RTCMの内容として4072が無くてもRTK測位して欲しいところですが、F9Pで基準局と移動局を構成する場合は4072の配信が必要そうです。
F9Pで基準局と移動局を構成する際に4072無しでRTKを実現する設定をご存知の方がいらしたら、コメントなどで教えていただけると嬉しいです。

おわり

ubloxのRTCM3の独自情報4072を配信しないとF9Pを基準局として動かしてもF9Pの移動局がRTK測位してくれないと分かるまでに時間を要しましたが、何とかF9Pで基準局と移動局を構成できて良かったです。

参考

変更すべき設定項目を把握した説明書です。
ZED-F9Pの設定方法 基準局、移動局ともにF9Pを利用

ZED-F9Pの説明書です。
ZED-F9P Integration manual

pyubx-config-setコマンドを管理するリポジトリです。
https://github.com/asukiaaa/scripts-pyubx-config

pyubx-config-setで指定可能な変数を管理しているpyubx2のファイルです。
pyubx2/ubxtypes_configdb.py

pyubx-config-setコマンドを作った時の記事です。
pyubx2を利用してZED-F9Pの設定を変更するスクリプトを作った

前回行ったstr2strで移動局を作る説明です。
str2strの宛先のシリアルポートにポート番号を付与すれば処理結果をtcpポートで見れる 

RTMC3の各番号の役割を説明しているページです。
RTCM 3 Message List

RTCM3.1、3.2、3.3の違いを解説しているページです。
RTK基準局とRTCM
New additions in RTCM-3 and What is MSM

pygpsclientのsurvey inの設定処理です。
pygpsclient/serverconfig_frame.py

0 件のコメント :