ROS2 LC29H-EA GPS RTK を作る。

ROS2 LC29H-EA GPS RTK を作る。

最終目的は、LC29H-EA で、RTK を使うのが目標です。
が、その前に、勉強を兼ねて、
SparkFun_u-blox_GNSS_Arduino_Library/examples/ZED-F9P/Example15_NTRIPClient を試してみます。

QUECTEL LC29H GNSS L1 L5 Receiver 使えるのか検討してみた。 で、C++ で、GPS データの受信ができたので、
これを、 RTK 対応にするには、どうするか、
勉強を兼ねて、RTCM3 をクライアントとして受信するサンプルがあったので、試してみます。

ZED-F9P の場合は、RTCM をサーバーから受信して、それをそのまま ZED-F9P に送れば、RTK Fix するみたいぞね。
ただし、問題は、近くにフリーのサーバーが無い事だが。

だが、実際は、PC から試せるさんぷるがあったので、こちらを試してみました。

sevensx/ntrip
examples/ntrip_client_exam.cc

実際にサーバーに接続するは、下記、情報を指定しないといかんぞね。

QUECTEL LC29H GNSS L1 L5 Receiver 使えるのか検討してみた。
のデモで試した、main.py の値を参考にしました。

1. rtk 対応の gnss で、RTK を使うまでの処理の流れ。
RTCM Version3 プロトコルを使うみたい。

1) HTTP クライアントで、サーバーの mountpoint に、GET リクエストをする。
GET http://server-ip:port/mountpoint
注1) サーバーによっては、basic 認証をする。

2) サーバーから、HTTP/1.1 200 OK か、 ICY 200 OK が返されると、
3) 自分の位置を示すGGAレコードを送る。
自分の場所の、latitude、longitude、height を渡す。
gnss のデバイスから、GxGGA レコードを受信して、サーバーにおくる。

4) これのレスポンスとして、サーバーから、RTCM データ(0xD3)が送られてくる。
5) RTCM データを受信したら、これをそのまま、gnss デバイスに転送する。
6) そうすると、gnss デバイス からは、RTK 補正された、GxGGA が上がってくる。

7) 後は、定期的に、3) - 5) を行って、自分の位置の最新値を反映させる。

注) ちょっと冷静に考えてみる、この仕組みは、今のセキュリティーの観点から言えば、大変問題かも。
自分の居場所を常に他者に教えている事になる。誰が、考案したんじゃ、こんなへぼい仕組みを?
サーバーと基地局を自前にしないと、セキュリティーは低いか。
そう言う意味では、みちびきのL6 を使ったほうがよっぽどセキュリティー上は安全じゃ。

2. examples/ntrip_client_exam.cc を参考に、https://github.com/tosa-no-onchan/lc29h_gps へ組み込んでみました。

フリーの基準局は、下記を使わせてもらいました。
善意の基準局掲示板

一覧の中から、自分の位置になるべく近い基準局をつかわせもらいました。
ありがとう、善意の基準局掲示板 さん。

ros2 のノードにしたので、確認は、
$ ros2 topic echo /fix
で出来ます。
結構 latitude、longitude は、安定しているみたい。ただしGPS を移動させていないのに、時々、横飛びすることがある。

あとは、ROS2 自作 Turtlebot3 による 草刈りロボット開発。屋外走行 の実ローバーで試してみないといかんぞね。

今までは、ekf の設定ファイルで、GPS の x,y は無視していたので、これが実際使えれば、屋外走行もできるぞね。
ただし、いまは、インターネットに繋がないと行かないので、屋内でのテストです。

注1) やはり、走行テストは、屋外がよさそうです。雨の日に、部屋の奥のほうになると受信状態が悪くなって、NGです。
窓際だとOKですが、2[M] ほど奥に入るともうNG です。
アンテナの感度:38[db] だとOKかもしれません。
LC29H-EA rtk も屋外だと、問題なく使えるみたいです。

屋外となると、みちびきの L6 を受信して、LC29H へ渡す構成にしないといかんぞね?

注2) どうしても屋内でのテストをしたいので、横飛びのデータを無視するフィルターを入れました。--- これは、不要です。
ロボットでは、瞬時に移動する事はないので、ロボットの運動能力を超えた移動のデータは、無視するように、フィルターを入れました。
これが、超微調整が必要ぞね。できれば使いたくない。

注3) 解決しました。
$GNGGA レコードの測位ステータスをチェックすれば、問題解決しました。
NMEAセンテンスについて
GGA
測位ステータス : 0=測位不能、1=単独測位、2=DGPS、4=RTK fix、5=RTK float
をチェックすれば、解決しました。
ちゃんと 5=RTK float が上がって来ていました。そして、横飛びするときは、
2=DGPS が上がってきていました。

屋内で、一緒に買ったアンテナ(多分 28[db]) でも、ちゃんと、測位ステータス:5=RTK float が上がってきて、RTK が使えています。
テストの時に、測位ステータス:1=単独測位 -> 5=RTK float に変わった時は、感激しました。なみだがちょちょ出ました。

これで、部屋の中で、GPSを使った、実機ロボットの走行テストが存分に行えるぞね!!
でも、やはり屋外の方をおすすめします。屋内だと電波状況によっては、RTK float でも横飛びします。
どうやら、本来なら、RTK Fix にるみたいです。
おんちゃんは、まだ、RTK Fix になったことがない。
今使っている基地局が、もっと近くないといかんみたいぞね。

RTK float のときは、GGA[7] の受信衛星数が、30 個位になると大丈夫みたいです。それ以下だと、横飛びします。
それまで、じっと待つしか無いか?
屋内だと、本当にちょっとずつ増えてくるみたい。30分ほど掛かるかも。だめなときもある
こういうときに、アンテナの性能が影響してくるのかも。

窓際だとすぐに、30個の衛星は捉えられるが、2[m] も部屋の奥になると、天候の条件が良くならなければ、30個は無理みたい。
今までの現象と一致する。なるほど!!
でも、部屋の奥で、17-18個、21個しか補足できない時でも、そのまましばらく待っていると、RTK float でも安定するみたい。
そうなると横飛びもなくなります。それから、ロボットを動かし始めると問題ないみたい。
ただし、RTK float では、やはり精度が良くても、1[M] ほどか? やはり RTK Fix になってから使ったほうが良い。
屋外での使用、アンテナの能率の改善、RTK ベースステーションのより近い場所を選ぶなどの改善が必要か。

結論は、
LC29H-EA と、NTRIPClient(RTK) は、問題なく使えます。しかも安価に、アンテナを含めて、10,000円ほどで、 by nishi 2024.4.18

3. github に公開しました。
tosa-no-onchan/lc29h_gps_rtk

4. 実際のロボットで使ってみて。
ROS2 自作 Turtlebot3 による 草刈りロボット開発。屋外走行 で屋内で試してみて、
天候と衛星の位置の条件が揃えば、部屋の中でも走行できるので、その時の感想。
やはり、RTK が使えると信頼感が上がる。
上記、ロボットは、 robot_localization/ekf_node を使っていて、入力は、GPS 以外に、 ロボットの wheel からの位置と、
IMU の向きも、フージョンさせているので、GPS のデータがまるっきりなくて、ちゃんと走行できる。
しかし、RTKがちゃんと取れれば、精度が上がるみたいぞね、
これが、屋外で走行距離が 100[M] 、 1000[M] となってくるとなおさら変わってくると思う。

参考。
【追加検証】GPS測位ユニット・ネットワークRTKの性能を発揮する利用条件とは?

このブログ記事について

このページは、おんちゃんが2024年4月13日 18:36に書いたブログ記事です。

ひとつ前のブログ記事は「ROS2 自作 Turtlebot3 による 草刈りロボット開発。#3 Auto Mower」です。

次のブログ記事は「ROS2 GPS Localization の時のスタティックマップの東西南北の決め方。」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

カテゴリ

ウェブページ

サイトナビ