2024年1月29日月曜日

ZED-F9P 2台とpygpslientを利用してntripのserverかつcasterとclientとして動かしてRTKで位置を推定


背景

RTKとは基地局の情報を元に移動局の位置を補正して数cmの精度の位置情報を取得する仕組みです。
pygpsclientは有志が開発しているZED-F9PでRTKを実現するためのプログラムです。
ZED-F9Pという装置を利用すればRTKの基地局も移動局も作れるということで、取り組んでみました。
備忘録として取り組んだ内容を記事に残します。

使ったもの

  • ZED-F9Pピッチ変換基板 x2
    ZED-F9Pを搭載した基板なら基本的にこの記事の内容で動かせると思います。
    注意点として、型番が似ていて安いNEO-M9NモジュールはRTKに対応していないのでこの記事の内容を試せません。
    ZED-F9Pが載ったものをご用意ください。
  • L1 L2 対応アンテナ x2
    ZED-F9PはL1とL2という種類の電波を受信できるので、それに対応したアンテナを利用します。
  • アンテナ変換コネクタ x2
    今回利用するZED-F9P基板には上記のアンテナを直接は付けられないので、変換コネクタ(SMA -> u.FL)を利用します。
  • USB typeCケーブル x2
    ZED-F9Pの基板をPCにUSB接続するのに使います。
  • Ubuntu 22.04をインストールしたPC x1
    今回はlinuxでも動くプログラムを利用してRTKを構築します。

Windowsを持っている人向け: ファームウェア更新の勧め

記事を書いている時点でZED-F9P向けの最新のファームウェアは2022年5月12日に公開された「HPG1.32」です。
この記事の内容は更新前の「HPG1.13」でも動きましたが、新しいファームウェアの方が性能向上や不具合改善を見込めるので、WindowsのPCを持っている方はu-centerを利用してファームウェアを更新をお勧めします。

ファームウェア更新は下記のページが参考になります。

ZED-F9Pファームウェアのバージョンアップ

PCにpygpsclientをインストール

今回はubuntuで動かすため、windows専用のu-blox公式プログラムではなく、有志が作ったpygpsclientというプログラムを使います。

pipで動かすのでpythonをインストールしてからpygpsclientをインストールします。
sudo apt update
sudo apt upgrade
sudo apt install -y python3-pip
pyton3 -m pip install pygpsclient

インストールしたらpygpsclientをコマンドとして呼べるようになります。
pygpsclient -h

インストールしたのにpygpsclientを呼べない場合はpython3の実行可能ファイルへのパスが通っていない可能性があるので、.bashrcに下記の行を追加すると多分実行可能になります。
~/.bashrc
export PATH=$PATH:$HOME/.local/bin

bashrcを書き換えたら下記のコマンドで再読込できます。
source ~/.bashrc


インストールできたらコマンドを実行してpygpsclientを起動します。
pygpsclient

起動するとこのような窓が表示されます。


pygpsclientを利用したF9Pの設定値変更: CFG-NMEA-SVNUMBERINGを有効にしてみちびきを利用

F9Pに接続してUBX Configurationで設定値を参照

公式のu-centerで行うような値の設定変更をpygpsclientでもできます。
ここではF9Pが観測対象の衛星でF9Pが利用中のNMEAで定義されてないの情報も利用する「CFG-NMEA-SVNUMBERING」を有効にする方法を例にして設定方法を解説します。

F9Pが標準設定で利用するNMEA 4.10ではBeiDouやZQSS(みちびき)の情報が定義されてないので、これを有効にすると利用されます。
F9Pの説明書の「2.2 NMEA protocol configuration」の「CFG-NMEA-SVNUMBERING」に説明があります。
(CFG-NMEA-PROTVを42にするとみちびきが定義済みのNMEA4.11を利用可能な装置もあるようなのですが、どうなったらみちびきが利用されている状態なのかデータの見方がまだ分からないので、一旦「CFG-NMEA-SVNUMBERING」で対応しています。)

設定を変更するためにまずはF9Pと接続状態にします。
右上のSerial Portに注目し、対象のポートを選んでUSBマークを押します。
pygpsclientを起動後にF9Pを接続してシリアルポートに表示されてない時は、シリアルポートの右下の更新ボタンを押すと出てきます。

接続ボタンを押して何か情報が流れる状態になったら、右側下部のUBX Configボタンを押します。

UBX Configuratonの窓の右上に注目します。
左下や中央でも一部の値を閲覧や設定できますが、同様のことを右上でも行えるのと、右上でしか確認できない値があるので、この記事では右上の操作のみ解説します。

今回設定したいのは「CFG-NMEA-SVNUMBERING」なので、Categoryを「CFG-NMEA」にし、Keynameを「CFG-NMEA-SVNUMBERING」にします。

Layerを「RAM」にして、トグルボタンを「CFG-VALGET」に合わせた状態で矢印ボタンを押すと、Valueに現在の値が表示されます。
値が表示されない場合はpygnsclientが不具合を起こしている可能性があるので、pygnsclientを再起動してください。(F9PのUSB抜き差しはしなくても直ることが多いです。)

現在の「CFG-NMEA-SVNUMBERING」が0だと分かりました。

一時的な設定変更はRAMを書き換える

値を変えたい場合はトグルボタンを「CFG-VALSET」にして、Valueを書き換え、矢印ボタンを押すと変わります。

書き換えた後にCFG-VALGETにして読み込むと、書き換え後の値を取得できます。
Layerが「RAM」の場合は、起動中のみ値が書き換わり、F9Pの電源を入れ直すと書き換え前の値に戻ります。

恒久的な設定変更はFLASHを書き換える(FLASHが無い設定もある)

Layerとして「FLASH」を使える設定の場合はFLASHの値を書き換えると起動後のRAMの値がFLASHに書き込んだ値になります。
「CFG-NMEA-SVNUMBERING」は「FLASH」に対応しているため、Layerを「FLASH」にして、CFG-VALGETやCFG-VALSETが可能です。

「CFG-NMEA-SVNUMBERING」の1つ上にある「CFG-NMEA-PORTVER」はFLASHに対応していないため、FLASHにしてCFG-VALGETを実施すると赤いびっくりマークが出て何も表示されません。

CFG-NMEA-SVNUMBERINGを常時有効にしたいのでFLASHを1にします。
CFG-NMEA-SVNUMBERINGを選んだ状態で、Layerを「FLASH」にし、CFG-VALSETを選び、Valueを1にして矢印ボタンを押します。

これによりCFG-NMEA-SVNUMBERINGが起動時から有効になり、みちびきの情報を利用可能になりました。

CFG-NMEA-SVNUMBERINGのFLASHを1にする設定は、基地局用も移動局用もみちびきを利用するために、どちらのF9Pにも施すのが良いです。

ntripのserver + casterを起動

ntripの基地局を起動します。
pygpsclientにはserverと同時にcasterを動かす仕組みがあるので、今回はそれを利用します。
どこかのcasterサーバーや、自分で立てたcasterサーバーを利用する場合は、Modeを「SOCKET SERVER」にして動かしてください。(しかしながら、SOCKET SERVERモードで Configure Base Stationを選べないのは不便なので、何かの手違いな気がします。)

右下の表示のModeを「NTIRP CASTER」にします。
これを選ぶと表示情報が増えるので、スクロールバーを操作して下の方の情報を表示します。

基地局の設定に合わせてF9Pの設定を書き換えてほしいので、Configure Base Station左側のチェックを有効にします。
また、手動で座標を指定したいので、Configure Base Stationを「FIXED」にします。
正確さが不要でとりあえずRTKを試したい場合はConfigure Base Stationを「SURVEY IN」にすればF9Pが単独で推測した位置情報が使われます。

今回指定する座標は株式会社レグミンが入居している建物の駐車場の真ん中の車の上にします。
座標は大体36.17609700, 139.29287333です。
欲しい座標はgoogle mapで目星の場所を表示して右クリックすると出せます。

海抜は国土地理院の地図情報からm単位で把握できます。
それによると、今回の場所の標高は約53mと分かります。
車の上に基地局のアンテナを置くので、2m足してアンテナの位置は海抜55mとします。

これはF9P内部処理の問題だと自分は思うのですが、設定したい高さを入力しても38mほど低い値になってしまいます。
これはNMEA GNGGAで示される「ジオイド高」という楕円体高から海抜高を引いた高さを扱う設定値(下記データのsep)があり、その値がF9Pの内部処理で固定した高さから引かれて結果の高さ(alt)になってしまいます。
<NMEA(GNGGA, time=05:54:30, lat=36.176097, NS=N, lon=139.2928733333, EW=E, quality=2, numSV=12, HDOP=99.99, alt=55.0, altUnit=M, sep=38.5, sepUnit=M, diffAge=, diffStation=0)>
参考: NMEAセンテンスについて

これを補正するため、altの値分高くした値をアンテナの高さとして指定します。
今回の場合55mにしたいので、55+38.5 = 93.5 を固定の高さにします。
どなたか海抜高の適切な対応方法が分かる方がいらっしゃれば、コメント欄などで助言していただけると嬉しいです。

ということで、上記の情報を入力します。
基準局が認識している座標を確認するため、最初は「Disable NMEA」は空欄にして動かすのが良いです。

設定できたら「Socker Server / NTRIP Caster」を有効にするとserverとcasterが動きます。

標準設定で動かしているので、接続情報はこうなります。
IP: PCのIP
Port: 2101
Mountpoint: pygnssutils
User: anon
Password: password

ntrip clientを起動

今度はもう一台のF9Pをntripのclientとして動かし、RTKのFIXを狙います。
まず、コマンドを実行してpygpsclientをclient用に起動します。
pygpsclient

ntrip serverとして使ってない方のF9Pに接続します。

動かせたらntrip clientを選択してserverへの接続設定を行います。

Server, Port, Mountpoint, User, Passwordを設定して接続ボタンを押します。
今回は同じPCでcasterを動かしているため、ServerのIPは0.0.0.0で良いです。
UserとPasswordはpygnssclientの標準値で既に入力済みです。

接続するとConnectedとログが出ます。
右下のボタンや右上の閉じるを押しても、サーバーと切断することなく設定用の窓を閉じれます。

pygpsclientの表示がRTK FIXEDになれば、RTKによる位置推定成功です。

位置推定できているか大まかに確認

駐車場の車の上に基地局のアンテナを置き、車から数m離れたところに移動局のアンテナを置いてFIXEDの時の位置関係を見てみます。

その時の結果がこちらです。

基地局
lat: 36.17609700
lon: 139.29287333
alt: 55.0

移動局
lat: 36.17613133
lon: 139.29287950
alt: 53.2

移動局が建物側に数m近づき、高さは基地局に比べて1.8mほど低くなり、大体期待通りの位置を得られていました。

おわり

ZED-F9P 2台とpygpsclientを利用してntripのserver(基準局)+caster(情報仲介サーバー)とclient(移動局)を起動し、clientでRTK FIXED状態の情報を取得して、それらしい位置情報を得られました。
pygpsclientは目下開発中なのか、serverをclient無しで動かそうとすると位置情報を固定する設定項目が消えたり、F9Pと通信できなくなるとプログラムの再起動が必要だったりと、不備や不具合らしき挙動を見かけましたが、ubuntuでRTKの仕組みをGUIを通して構築できて良かったです。

この記事でGUIで行ったことをコマンド(CLI)で行う方法も解説しようと思いましたが、GUI専用で便利な処理が組まれていてコマンドで再現するには専用のpythonプログラムの作成が必要そうだったので、今回はGUIの操作方法の説明で終わります。

ジオイド高によって固定した高さが下がってしまう問題の解決方法をご存知でしたら、コメント欄などでご助言いただけると嬉しいです。

参考

pygpsclientのリポジトリです。
pygpsclient

参考にした農研機構のRTKの解説です。
活用しよう! 農業で利用する 低コスト RTK-GNSS 導入マニュアル 2023年3月(Ver.1.00) 岩手県農業研究センター 生産基盤研究部生産システム研究室

ZED-F9Pのファームウェアバージョン HPG 1.32の説明書です。
u-blox F9 HPG 1.32 u-blox F9 high precision GNSS receiver Interface Descriptio

ファームウェア更新方法解説記事です。
ZED-F9Pファームウェアのバージョンアップ

0 件のコメント :