概要
u-blox ZED-F9Pを2つ使ってRTK測位をします。設定はWindows上のソフトウェアu-centerを使いますが、最終的にはLinux上で動かすためRTKLIBの力を借ります。ただ、楽をしたいので測位エンジンはZED-F9P内部のエンジンを使います。(RTKLIBの測位エンジンは使わない)
前書き
u-bloxのZED-F9Pを使ってRTK測位をする方法はweb上に専門家が書いた日本語記事が何本も出てきて非常にありがたいんですが、u-bloxのソフトウェアが更新されて内容が古くなっていたり、求める測位方式が違ったりして思い通りに動かなかったので、私がうまくいった方法を書き残しておこうと思いました。
準備するもの
- 高精度GNSSモジュール u-blox ZED-F9P 搭載ボード - 2枚
- 色々種類はあるんですが、私はGNSSストアのものを買いました。一番安かったので。インタフェースとかメモリ保護用の電池有無とか違いがあるので、そこは用途に合わせて。SMA端子が、小型で扱いやすいし色々なアンテナに繋ぎやすいんじゃないかと思っています。
- 2周波GNSSアンテナ
- ZED-F9Pは豪華にも2周波対応しているので、せっかくなのでアンテナのほうも合わせましょう
-
Beitian BT-200
- 広島市大の高橋先生が低価格4周波数帯GNSSアンテナと紹介してくださっていたので買いました。思ったより大きかった(直径20cmくらい)。アンテナの大きさは正義!なので、これを基地局に使うことにしましょう。
-
u-blox ANN-MB-00-00
- u-blox用のアンテナと言えばこれ!というかんじの定番小型パッチアンテナ。軽くて小さくて持ち運びやすいし(ここは後に議論対象になります)、底板に磁石がついているので色々なところに張り付けやすかったり、5mものケーブル(端はSMA端子)がついてて引き回しやすかったり、1つ持ってて損はないです。前はGNSSストアでも売ってたんだけどな。。今、GNSSストアでは、互換品?が売られてますね。
- BT-200を固定する台
- ここで棒と台だけ買いました
- BT-200の出力コネクタTNC-KをSMAコネクタに変換するコネクタ
- あれ?これでいいんだっけ??千石で買ったのは覚えてるけど。。
- BT-200とZED-F9Pをつなぐ同軸ケーブル
- これとか。
- ミニUSBケーブル
- 最近ほとんど見なくなったけど、このGNSSモジュールはミニなんですよね~
- 方位磁石
- 基準局のアンテナ設置時に使う
- 自宅サーバー(Linux)
- ラップトップPC(Windows)
- 屋根裏に登る手立て
- 梯子とかヘルメットとかライトとかマスクとか。
手順
- ZED-F9PとBT-200でRTKする設定をする
- BT-200を屋根裏の良い位置に設置する(基準局)
- 自宅サーバー上でRTKLIBのstr2strでZED-F9Pのプロキシを立てる
- 基準局と近所の電子基準点の間で基線解析をして、自前基準局の精密測位をする
- 天井裏のZED-F9Pに基準局の設定を入れる
- もう一つのZED-F9PとANN-MB(移動局)で自前基準局基準でRTKする設定をする
ZED-F9PとBT-200でRTKする設定をする
この手順を最後までやってようやくRTKできるようになるはずなのに、初手RTKってどういうこと?!ってかんじだと思うんですが、基準局を設置するのに良い位置(電波をよくとらえられる位置)を見つけるため、ここでできればRTKしたい。。ここでは善意の基準局がRTKできる距離にあることを期待しているんですが、それはなかなか厳しい話なので、これが難しい場合はできるだけ見通しの良い、周囲に高い建物のない場所のできるだけ高い位置にアンテナを設置するしかないと思います。
BT-200とZED-F9PとWinラップトップをつなぐのは説明なしでOKでしょうか?
ラップトップにはu-centerをインストールしてください。u-center2という最新版っぽい名前のソフトウェアもありますが、そちらは色々機能が足りてないので、u-centerのほうを選ぶのが正解です。
u-centerを起動したら、Receiver -> Connection -> COM〇 から、ZED-F9Pがつながっているポートを選択してください。何か色々動き出してテンション上がってくると思います。まだ先はだいぶ長いですが。
最初にやるべきは、ボーレートの変更です。最初は Receiver -> Baudrate が 9'600 になっていることが多いと思いますが、 460'800 を選択してください。ボーレートが変更されます。
u-centerを使ってRTKをしたい場合、Receiver -> NTRIP Client を選択し、NTRIP caster settingsのところに、善意の基準局で調べた最寄りの基準局のIPアドレスとポート番号、ユーザ名とパスワードを入力しましょう。入力したら下の「Update source table」をクリックすると、使用可能なマウントポイントが下のプルダウンメニューから選べるようになります。
CQ出版の基準局で設定した例はこちらになります。
この状態でOKを押すと、指定したNTRIP casterから引っ張ってきたRTCM3データをZED-F9Pに入力することになり、F9P内部でRTK測位が開始されます。うまくいくとしばらくして、Data Viewの中のFix Modeの値にFLOATやFIXが現れると思います。
これがRTK Float解やRTK Fix解というやつです。Fix解のほうが精度が高く、出すのが難しいです。Fix解を出すためには時間が必要な場合があります。すぐにFixが出なくても、しばらく5分くらいそのまま静置しておくとFixするかもしれません。このときアンテナは手で支えるんじゃなく・エンジンふかしっぱなしの車に固定するんじゃなく、三脚など安定した場所に固定しておきましょう。どうしてもFixが見られない場合は空の見通しの良い場所に移動してみましょう。
Fix ModeのところにFLOATやFIXが出ない場合は、メッセージが一部Disableされている可能性があります。View -> Message View を開いたら、GxGGAを右クリックしてEnable Messageをしてみましょう。
RTKのやり方が分かったところで次に進みます。
BT-200を屋根裏の良い位置に設置する(基準局)
屋根裏に前の手順で使った道具一式を持って登ります。脚立に登る際は十分に気を付けましょう。天井裏は思わぬところから釘が出ていたりするので、長そで長ズボン、ヘルメットの装着を推奨します。また、ホコリが多いのでマスクをしておくのをオススメです。昼間でも暗いので、懐中電灯などライトが必須です。
屋根裏に登ったら、前項のやり方でRTK測位をします。そして屋根裏の中で安定してFix解が取得できる場所を探し、そこにアンテナを設置します。設置したアンテナからケーブルを伸ばし、自宅サーバーのところまで引っ張っていきましょう。これは実際は、RTK Fixできる場所とサーバーまで伸ばせるケーブルの長さの制約の両方を満たす場所を探さなければなりません。難しい場合はサーバーを屋根裏に設置し、通信はWifiで飛ばすことなども検討したほうが良いかもしれません。ただしその場合でも、天井裏にコンセントがない場合は多い(テレビのアンテナやブースターが天井裏に設置されている場合はコンセントが設置されていることがある)ので、その場合は電気工事を発注するか、自分で資格を取るなどして施工しましょう。
私の家の屋根裏にアンテナを設置した様子はこちらです。
ここから同軸ケーブルをサーバー用の電気配線と同じ経路で通し、サーバーのところまで引っ張りました。(簡単そうに言ったけど、実際は何度も天井裏と居室を行き来して大変だった)
またこのとき余裕があれば、アンテナを設置する方位角についても気にしてください。高橋先生の記事によると、センチメートル級の測位精度を求めるためには、アンテナの電気的中心位置を考慮する必要があるそうです。BT-200についてはNGSのアンテナ校正のページにデータはなかったのですが、Beitianの他のアンテナは全てコネクタが北方向らしいので、BT-200もそうだろうと検討をつけて北向きに設置することにしました。
自宅サーバー上でRTKLIBのstr2strでZED-F9Pのプロキシを立てる
ZED-F9Pの設定はWindowsで動くu-centerでしかできません。しかし設定変更のたびにサーバーのところまでWindows機を持って行くのはたいへん面倒です。これを解決してくれるのが、東京海洋大学の高須先生が作ったRTKLIBのstr2strです。RTKLIBはこの機能以外にもこれから沢山お世話になります。
まずは、RTKLIBをサーバー上にgit cloneしてきてLinux用のバイナリをビルドしましょう。Linux向けはCLI版しかないです。こちらの記事に詳しく書いてあります。感謝。RTKLIB/lib/iers/gcc/
以下と RTKLIB/app/consapp
以下でmakeして、consappのほうで make installすれば良いそうです。
ビルドしたら、以下のようなスクリプトを書いてZED-F9Pのプロキシサーバーを起動しておきます。
#!/bin/sh
str2str \
-in serial://ttyF9P:460800 \
-out tcpsvr://:2000 \
-b 1 \
> /dev/null 2>&1 &
ttyF9P
のところは /dev
以下のZED-F9Pがつながっているデバイス名に書き換えてください。460800はボーレートです。また、この例では2000番ポートにプロキシを立てていますが、他のポートのほうが都合が良ければ変更してください。
私はF9Pがいつも /dev/ttyF9P
のところに配置されるよう、udevのルールを記述して /etc/udev/rules.d/99-ublox.rules
に配置しました。
# u-blox ZED-F9P
KERNEL=="ttyACM*",\
ATTRS{idVendor}=="1546", ATTRS{idProduct}=="01a9",\
SYMLINK+="ttyF9P"
このプロキシサーバーを立てておくと、別のPCでu-centerを起動して、Receiver -> Connection -> Network connection から、以下のようにサーバーのIPアドレス(ここでは192.168.0.2)を指定してOKすることで、サーバーに接続されたZED-F9Pとu-centerをネットワークごしに接続することができるようになります。
基準局と近所の電子基準点の間で基線解析をして、自前基準局の精密測位をする
前項の方法で屋根裏のアンテナとZED-F9Pに接続しメッセージの出力設定を変更します。
まずは、 View -> Configuration View を開いて、NMEAを選択したら、Mode Flagsの High precision mode にチェックを入れます。これで出力されるNMEAの桁が2つ増加しセンチメーター級測位の準備ができます。この状態で、 Consider mode にもチェックが入っていると思いますが、これに何の効果があるのかはちょっとまだ分かっていません。
次に、同じConfiguration Viewの中で NAV5 を選択し、Dynamic Model を 2-Stationary にします。
次に、同じConfiguration Viewの中で RATE を選択し、Measurement period を 1000 [ms] にします。
次に、同じConfiguration Viewの中で VALSET を選択し、Group から CFG-NMEA を選んで、 CFG-NMEA-SUBNUMBERING を 選んだら、右の「Add to list」をクリックします。すると、下のリストに値が追加されるので、それをクリックして選択。下のValueのウィンドウから 1-Extended を選んで、Sendしてください。これでみちびき衛星の結果を出力させることができるようになります。
ここまでできたら、設定した内容をZED-F9Pに書き込みます。同じConfiguration Viewの中で CFG を選択し、「Save current configuration」のラジオボタンにチェックが入っていることを確認して、左下の書類が右に飛んでいくアイコンをクリックしてください。これで書込みになります。念のため、何回か押しておくと良いでしょう。
次は出力するメッセージの取捨選択をします。
View -> Message View を開いて、大元の NMEA を右クリックし、Disable Child Message してしまい、NMEA関連のメッセージを一旦止めてしまいましょう。Data ViewやSatelite Signalなど、これまで賑やかだった表示が一斉に沈黙します。
次に、UBX -> RXM と開き、 RAWX と SFRBX を右クリックして Enable Message します。これで出力は開始されているのですが、表示がないとよくわかりませんよね。View -> Packet Console を開くと、現在ZED-F9Pから出てきているメッセージが見られるので、ここでRAWXとSFRBXが出力されていることを確認してください。他に、GxTXTが出力されていることがあります。出力バッファがあふれているときによく出るので、ボーレートが460'800になっていること、RATEが1000になっていることを確認してください。それでも出る場合はやむを得ないので、RATEをもっと大きな値にしましょう。
以上で精密測位に必要なデータの出力設定は完了です。
それでは、この出力を長時間保存しましょう。
そうそう。この時は、どこかの基準局とRTK測位はしないようにしましょう。後で近所の電子基準点とポストRTK測位を行うことになるので、ここでRTKしてしまうと基にした基準局の誤差を取り込んでしまうことになります。
そのままu-centerでRecordすることもできます。ただ、Windows機を使わず、サーバー側で保存させることもできます。その場合は、u-centerを一度Disconnectもしくは閉じた上で、サーバー上のプロキシを停止し、以下のスクリプトを動かします。
#!/bin/sh
nohup timeout 43200 \
str2str \
-in serial://ttyF9P:460800 \
-out file:///tmp/`date +%s`.ubx \
> /dev/null 2>&1 &
このスクリプトは、起動後12時間のZED-F9Pの出力をユーザーがログアウト後も /tmp/`date +%s`.ubx に保存します。(dateの部分は日付・時刻が入ります)
こうして手に入れたZED-F9Pのログを使って基線解析をするのですが、ここの内容は、「DG-PRO1RWS 高精度スタティック測位をする」の記事に譲ります。
私の場合は、近所の3か所の電子基準点を使って基線解析をしたところ、東西方向±8cm、南北方向は±7mmの中に納まったので、結果全体の中央値の値を自宅基準局の精密位置として採用することにしました。
天井裏のZED-F9Pに基準局の設定を入れる
再度、サーバーでプロキシを立てて、基準局F9Pの設定をu-centerでしていきます。
ジオセンスさんの記事の 4.基地局としての設定 の項を参考に、RTCM3の1005, 1077, 1087, 1097, 1127, 1230の各メッセージを出力させるようにします。これは、Configuration ViewのVALSETのところからGroupで CFG-MSGOUT を選び、それぞれの設定値に1を入力して書き込むか、Configuration ViewのMSGのところから、それぞれのRTCMのメッセージについてUSBからの出力にチェックを入れるか、どちらかの方法で設定します。下のほうの「Set value in layers」のところ、FlashとBBRにもチェックを入れ、電源遮断後も設定が記憶されるようにしておきましょう。
VALSETから設定したときの画面を以下に示します。
設定後にSendしてデバイスに書き込むのを忘れずに行ってください。
次に、前項で求めた基準局の座標を設定します。
引き続きVALSETのところから CFG-TMODE のGroupを選び、CFG-TMODE-LAT, CFG-TMODE-LAT_HP CFG-TMODE-LON, CFG-TMODE-LON_HP, CFG-TMODE-HEIGHT, CFG-TMODE-HEIGHT_HP を Add to list します。
そして、LATには基準局の緯度を小数点以下7桁まで(小数点は入力しない)、LAT_HPには残りの2桁、LONには基準局の経度の小数点以下7桁まで(小数点は入力しない)、LON_HPには残りの2桁、HEIGHTには楕円体高を小数点以下2桁まで(小数点は入力しない)、HEIGHT_HPには残りの2桁を入力します。
例として、緯度:35.786464645、経度:140.02476405、高度:69.685569833(白井電子基準点の座標)を入力してみた結果はこんなかんじです。
ここで設定する基準局の座標、どの電子基準局と基線解析をした結果を入れるべきなのか、そもそも高度は標高なのか楕円体高なのか(楕円体項が正解らしい)・・など色々と悩みたくなると思いますが、他の地図との整合性を気にせず私的利用するだけであれば、ぶっちゃけどうでもいいです。この基準局を基準にする移動局のRTK測位結果が全部一様にズレるだけなので。
こちらも設定後にデバイスに書き込むのを忘れずに。
次は、基準局から出力される座標を精密測位した座標に固定します。
VALSET の CFG-TMODE から CFG-TMODE-MODE, CFG-TMODE-POS_TYPE, CFG-TMODE-FIXED_POS_ACC を Add to listしてください。
そして以下のように設定します。
これをデバイスに書き込んだら、DATA ViewでLongitudeとLatitudeの値が、先ほど設定した精密測位の結果に固定されたことがわかるかと思います。
追記:CFG-TMODE-FIXED_POS_ACC の値、ここでは10にしてましたが、「mm scaled 0.1」と書いてあるので、1cmくらいの精度と考えると100にしといたほうが良かったですかね・・。
設定後、Message Viewを開いて出力されているメッセージを確認すると、以下のようになっています。
ここで、GxRMCをEnableにする必要はないのですが、ここをEnableにしておくとData Viewの表示が更新されてデバイスが動作していることが(Packet consoleを開かなくても)分かりやすいので、私はEnableにしています。
追記:これ、NMEA-GxRMCを出力設定時に基地局の出力をそのまま(フィルタせずに)移動局に流していると、移動局からGxTXTでエラーメッセージ(「知らないフォーマットのメッセージが来てるよ」)が出力されてしまい、そのせいで他のデータについてもレートが下がるという現象が出たので、最終的にDisableにしました。
また、RATEについては、GxTXTで怒られない程度の短い周期にしておきます。(500[ms] くらい)
これで基地局の設定は完了です。
基線解析のときはUBX-RAWXやUBX-SFRBXを出力させたのですが、実のところZED-F9Pの内部解析エンジンを使う場合、これらのデータは必要ないです。RTCM3を食わせるたけでRTK演算してくれます。逆に、RAWデータはZED-F9Pは食えないらしいです。
Web上の専門家の方が書いた記事では、どこもRAWデータを出力すべし!と書いてあって疑問だったのですが、どうやらRTKLIB等を使って自前でRTK解析をする場合にはRAWデータが必須なので出力させているらしいです。
ただ、今回私はRTK解析はZED-F9Pの内部解析エンジンを使うことにしたのでRAWは必要ありませんでした。
追記:RAWデータを出力させているとけっこう出力時間を食うので、出力レートを上げられなくなる気がします。必要ないデータは出力させないことがレートを高速化する基本です。
もう一つのZED-F9PとANN-MB(移動局)で自前基準局基準でRTKする設定をする
さて!ようやくここまでたどり着きました!
もう1つのZED-F9Pとアンテナの準備に取り掛かりましょう。
ボーレートは460'800、Configuration Viewから、NMEAはHigh precision mode、NAV5のDynamic modelは 1-Portable に設定してください。RATEもできるだけ早め。
Message ViewでEnableするメッセージは、GxGSVとGxRMCだけでOKです。Data ViewでFLOAT/FIXを確認したい場合は、あとGxGGAも。
一応、GxRMCでもこちらのMode indicatorを見れば、FixかFloatかは確認できます。
設定ができたら、ZED-F9Pに基準局からのRTCM3を食わせます。
u-centerで結果を見る
最初は、u-centerを使ってみましょう。u-centerでRTKするためには、基準局のデータをNTRIP casterで配信する必要があります。
これにはRTKLIBのSTRSVRを使います。STRSVRを開き、InputにTCP Client(サーバーで動いているプロキシ)、OutputにNTRIP Casterを設定します。
それぞれのOptのところをクリックすると、オプションが設定できるので、以下のように設定します。(以下の192.168.0.2というアドレスは、基準局を動かしている自宅サーバーのアドレス)
この状態でPlayボタンを押すと、ローカルの2001番ポートでNTRIP Casterが動きます。ここにu-centerを接続するわけです。
u-centerを起動し、USBでつなげっているZED-F9Pと接続したら、Ntrip clientで今度はローカルの2001番ポートに接続します。
これで実際にRTKした結果が以下です。
RTK Fix中はほとんど真ん中から動きません。ただ、Float解になると50cm以上けっこう値が飛びました。
Fix中のX方向の変位を表示させたのがこちらです。こちらは±1cm以内程度に入っていることが分かります。
RTKLIBのRTKNAVIで結果を見る
次にRTKNAVIでも同様にRTKの結果を見てみましょう。
またSTRSVRを使います。ただし今度は、InputにTCP Client(サーバーで動いているプロキシ)、OutputにはSerial(移動局のZED-F9Pがつながっているシリアルポート)を設定しましょう。Inputのオプションはさっきと同じで、Outputのオプションは以下にします。
ここではCOM7に接続していますが、このポート番号は各自の番号に変えてください。このとき、 Output Received Stream to TCP Port の設定をするのが大事で、ここで設定したポートにRTKした結果が出力されます!
この結果を見るために、RTKNAVIを起動してください。RTKNAVIのConnection Settingをひらき、Optから先ほどRTKの結果を出力させたポートを設定します。
こうすることで、ZED-F9P内部の解析エンジンで計算されたRTKの結果がRTKNAVIで見られるようになります。最初は線がオレンジ色(Float解)ですが、ちゃんとFixすると線が緑色になって安定した出力になります。
まとめ
これで、自宅半径10km圏内を1cm以下の精密測位可能領域に納めた。
屋根にアンテナを設置するとなると、施工時の事故や施工後も落下事故などが怖い。今回、屋根裏でもRTK Fixできるということが分かったので、基準局設置のハードルが下げられそう。
最初、屋根にアンテナを設置するつもりでデカい脚立を買ったのに必要がなくなった。家の中でとても邪魔。
おまけ
移動局について
出すところがなかった移動局。
ANN-MBは小さくて軽くて持ち運びやすい!・・と書いたんですが、どうやらグランドプレーンがあること前提の精度らしい・・。しかもこのグランドプレーンは、大きければ大きいほど精度が上がるとか。。
SLAS
いつもRTK Fixできれば必要ないんですが世の中そう甘くはないので、RTKできなかったときのため、単独測位で1m以下の精度が出せる日本の衛星(みちびき)の力を借りられる設定も入れておきましょう。くまはちさんによると、以下の設定を入れておくとZED-F9PでSLASの力を手に入れることができるそうです。ただし、FW 1.00 HPG 1.13以降。
Timepulseについて
宅内でZED-F9Pを常時稼働していると、寝るときとかTimepulseのLED点滅がうるさいな・・と思うんですが、Configuration ViewのTimepulse 5の設定で Active のチェックを外したら消せました。
グランドプレーンの効果
ANN-MB-00-00に直径180mmのグランドプレーンを取り付けたときの効果を検証してみました。実験条件は、地上高580mm(上の写真の三脚)でRTKなし(単独測位)SLASなしです。5分間ほど静置したときの値の振れ幅で比較しました。
どちらもほぼ半径1m以内に入っているので、SLASなしでここまでできたのは観測条件が良すぎたんですかね。でも、ありのほうがなしよりも振れ幅が半分くらいになっているので、やはり効果はありそうです。
実はこのグランドプレーン、3Dプリンターで作った板の裏にアルミホイルを貼っただけなんです。本当は、アルミ板で作ったグランドプレーンと比較してアルミホイルの場合との比較もしたかったんですが、それはまた時間のあるときに。
u-bloxから出力されるNMEAの接頭辞を変える
GPSモジュールから出力されるNMEAメッセージを受信できるシステムが世の中に色々あります(Velodyneとか)。ただ、それらの中には $GPRMC など、$GP から始まるメッセージしか受信できないものもあります。GNSはGPS+GLONASS等他の新しめの測位システムまで含めた総称なので、古くからあるシステムはGPSのほうにしか対応してないってことですね。
こういったシステムにu-bloxのNMEAメッセージを送る場合には、接頭辞をいじる必要があります。
これはu-blox側に設定があって、Configuration ViewのVALSETから CFG-NMEA -> CFG-NMEA-MAINTALKERID を選び、そのValueの中で 1 - Set main Talker ID to 'GP' を選んでセットすると、以降出力されるメッセージは接頭辞が $GP に変わります。
実際の設定画面はこちらで、Velodyneに設定してみた図が以下です。
Velodyneは $GPRMC のメッセージを受け取れるのですが、u-bloxの設定がデフォルトだと出力されるのが $GNRMC なので、設定画面で見てもGPS Positionの部分が更新されていません。ですが、上記で述べたように接頭辞を $GPRMC に設定すると、以下のようにGPS Positionが出てくるようになりました。