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] となってくるとなおさら変わってくると思う。

5. output rate を変えられるみたい。

RTK gps on a budget (Quectel LC29HEA)

May 16
output rate を、[ms] の時間で指定できるみたい。
10 Hz = 100 ms 2 Hz = 500 ms 5 Hz = 200 ms 1 Hz = 1000 ms



ドキュメン
Quectel_LC29H_Series&LC79H(AL)_GNSS_Protocol_Specification_V1.3-1.pdf
注) firmware が新しくないと、いかんみたいぞね。

python で、確認してみる。


$python3 serial_term3.py
下記を入力する。
$PQTMVERNO*58

返事が、
$PQTMVERNO,LC29HEANR11A02S_RSA,2023/02/07,15:24:42*2D

最新の firmware が、2024-05-22 09-03-47.bin みたいだが、どうやって、使うのかがわからん?

PAIR865: PAIR_IO_GET_BAUDRATE
$PAIR865,0,0*31

PAIR864: PAIR_IO_SET_BAUDRATE
$PAIR864,0,0,115200*1B
921600 は?
$PAIR864,0,0,921600*10

lc29haaek.pdf の中に記載があった。
6. Firmware Upgrade
Quectel LC29H module upgrades firmware via the UART interface by using QGPSFlashTool. For more
information about QGPSFlashTool use, see document [3].
Download the QGPSFlashTool from our website Download Zone, or request it from Quectel Technical Support.

との事。
QGPSFlashTool を、Download Zone からダウンロードして使えば良いみたい。
注) 結局、QGPSFlashTool は、必要なかった。

latest L86 firmware こちらにも記載があった。

xxx.cfg ファイルが必要みたい。
The problem with the LC29HEA

Please select flash_download.cfg file for downloading LC29HEA firmware...
https://forums.quectel.com/uploads/short-url/oy7fWudgFj0Jor7o9pQLAyhaDcn.zip

上記リンクから、LC29HEANR11A03S_RSA.zip をダウンロードして、使うみたい。

上記 zip が最新の firmware みたい。

結局、上記の LC29HEANR11A03S_RSA/flash_download.cfg があれば、
QGNSS V1.10 を使えば、firmware を書き込み出来る。

手順
1) Dip SW を確認
USB:1 UART:1

QGNSS.exe を起動
2) Device -> Set Device Information
Model: LC29HEA
Port: COM7
Baudrate: 460800

2) Tools -> Firmware Download
Config File: .../LC29HEANR11A03S_RSA/flash_download.cfg

option -> baudrate;115200 or 921600
注) もし、下の、pin8 ショートで、Reset が認識されない場合は、予め lc29hea の baudrate をどちらかにしておけば良いかも。

グリーンの start をクリックする。

...(Press the module reset button!) が出ている間に、 lc29hea のリセットを行う。

リセット方法は、
RTK gps on a budget (Quectel LC29HEA)
に記載がある。
LC29H DA firmware config file
単純に、ショートでも良いみたい。

Pin8 をショートさせればよいみたいだが、
この人は、テスターの通電ブザーを使用か?こちらが簡単か。1回ブザーが鳴れば、1回リセットOK
テスターの、+ が、pin8、 - が、ケース。

試してみるか?
どうも、リセット状態にならないみたい。
Dip SW が間違っていた。再度、確認
USB:1 UART:1

これで、Windows11 で、QGNSS Firmware Download で、やっと、書き込みができました。
書き込みがおわったら、lc29hea を再起動させます。
再起動後は、Baudrate:460800 に戻っていました。
やれやれぞね。

注1) おんちゃんが持っているボードは、どうやら Mozihao boards と言うらしい。
注2) flash_download.cfg の中を手修正すれば、最新の bin ファイルをつかえるみたい。

Ubutun PC の serial_term3.py で、一応チェックチェック。


すごい!!
Output Rate の変更だけでは、NGで、サンプルのように、保存しないといけないみたいだ!!
lc29hea を、一度 Power OFF して、再度起動すれば、OK でした。
やれやれじゃ。

注) 2024-05-22 09-03-47.bin は、NG みたいじゃ。
LC29HEANR11A03S_RSA.zip のものを使う事。

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

Firmware Request: LC29HEA Adjustable Update Rate for Ardupilot Utilization

このブログ記事について

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

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

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

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

カテゴリ

ウェブページ

サイトナビ