ROS2 草刈りロボットの最近のブログ記事

ROS2 自作 Turtlebot3 による 草刈りロボット開発。#14 屋外走行ロボット。

--- そろそろ、屋外で走行させられる自作ロボットがほしい。-----

一応、ロボットの要件定義をしてみた。
RCカー 1/10 か 1/12 相当のサイズで、タイヤを大きなものにする。
電子部品は、クローズされた箱に収める。
サイズは、30 X 30 [cm] で、図面を手書きしてみた。
これだと、机の PC の隣に置ける。
あとは、これに従って、DCモーター、タイア、アンプ、ロボット本体のケース 等を集めるだけじゃ。
だが、肝心の Mony がどうか?.....
神様、どうか恵みのマニーを...

Android スマホを、インターネットのGateWay にする。

ROS2 自作 Turtlebot3 による 草刈りロボット開発。#13 robot_localization ukf を試してみる の続きです。

屋外で、GNSS-RTK をするには、インターネットに接続する必要があるが、そのときに、Android スマホ をインーネットのGateWay できればかんたんじゃ。

早速 google で、"Android を gateway にできるのか" で検索してみた。
結果は、
デザリング、他できるそうだ。
再度 google で "android スマホ テザリングのやり方" を検索する。
ふむふむ!


最終的になにがしたいのかと言うと、以前も下記ページで試したが、
自作 Turtlebot3 自律走行に向けたプログラム。#15
要は、自作Trutlebot3(foxbot_cor3_r2) を、屋外で走行させたいのじゃ。
しかも、今度は、GNSS-RTK を使うから、インターネットにつながった環境にしないといかん。
なので、今回は、Android のスマホで、自作ロボットの Start、Stop のみを操作するだけ。
本当は、部屋の中で、LG290 で、みちびきのL6 が受信できればわざわざ屋外に持ち出す必要はないが、
L6 受信は、屋外でないと無理なきがするので、屋外での方法を考えてみただけじゃ。
また、もし L6 受信ができて、7[cm] 級の精度がでれば、GNSS-RTK も使わないのだが。

ROS2 自作 Turtlebot3 による 草刈りロボット開発。#13 robot_localization ukf を試してみる。

robot_localization の ukf_localization_node を使って、
foxbot_core3 for ros2 を走行させてみる。
ロボット走行には、UKF: Unscented Kalman Filter が向いているそうなので、試してみた。
Ekf 版の launch.py があるので、その中の、ekf_localization_node 向け を ukf_localization_node 向けに変えるだけで、OK だった。

とおもったが、勘違いで、ukf用のパラメータの設定が必要じゃ。
今は、まだ動作してないぞね!!
Quectel LG290P を試す方が先だから、この記事は、少し保留じゃ。by nishi 2025.7.14

環境:
実機ロボット:foxbot_core3 for ros2
OrangePi 5 and Armbian 24.04
OAK-D Lite depth Camera
ROS2 Jazzy Navigation2
Launch: OAK-D Lite Depth Camera , GPS navsat_transform_node and ukf_node
foxbot_nav2_oak-d_depth_gps_ukf.launch.py
C++ 自動走行プログラム:multi_goals4_nav2.launch.py

ROS2 自作 Turtlebot3 による 草刈りロボット開発。#12 床が高低差がある場所での走行。
環境:
実機ロボット:foxbot_core3 for ros2
OrangePi 5 and Armbian 24.04
OAK-D Lite depth Camera
ROS2 Jazzy Navigation2
Launch: OAK-D Lite Depth Camera and Rtabmap_ros による、Active SLAM
rtabmap_oak-d_rgb_depth.launch.py
C++ 自動走行プログラム:multi_goals4_nav2.launch.py

BNO086 DMP でなんとか、走行できるようになったので、
Rtabmap_ros の 2D で、床が高低差がある場所でロボットを走行させて、2D Mapping が精度よく取れるかためしてみた。

おんちゃんの部屋は、畳で、床の高さが一定でない。以前は、それでも、そのままRtabmap_ros の 2D Mapping を行っていたが、
なんとなく、高低差が気になりだした。

ずっと以前も試したが、BNO086 DMP で安定して IMU が取れだしたので、再度、IMU の Pitch を使って、床の高さを使ってみようと思う。

2D Rtabmap_ros でも、ロボットの tf-basefoot_print の pose.pose.position.z に、高低値を入れてみると、一応加味して、動作するみたい。
ここで、出てくるのは、あくまでも 2D Mapがでてくる。
3D Map は必要ないので、これで十分じゃ。

ただし、どこまで正確に、pose.pose.position.z を出せるかがもんだいじゃが。

注) RTK-GNSS(GPS) を使う場合、RTK-GNSS(GPS) を使って、予め Map 作成すれば良いので、Rtabmap_ros 自体出番がないのだが。

ROS2 自作 Turtlebot3 による 草刈りロボット開発。#11 ロボットの走行方向がずれる。

SBC: Orange pi 5 Armbian Ubuntu 24.04
ROS2: Jazzy

Jazzy 版にして、rtabmap_ros_my/foxbot_nav2_oak-d_depth_gps.launch.py で、自作 Turtlebot3 を動かしたら、最近どうも、ロボットの向きがずれる気がする。

Rviz2 の画面上は、ロボットは、目的地にちゃんと到達しているが、実機のロボットは、結構ずれた位置に行ってしまう。

1. EKF の設定が変わったのかと、いろいりためしていたが、
どうやら、原因は、 IMU ボードの取り付け向きが、ロボットの進行方向にから少しずれているみたいじゃ。
今まで、あまり気にしていなかったが、もしかしたら、DMP 9 の場合の、IMU のキャリブレーションを取っ払ってしまっていたかも知れない。

もとい、これは、単純に、IMU ボードの向きを正すしかない。

あと、ICM-20948 の接続ケーブルの接触が、時々不良になるみたい。そのせいで、急に Device ID が取れなくて、初期化処理でずっこける。
以前は、電源電圧が低下している所為と思っていたが、単純に、接触不良みたいじゃ。

ROS2 自作 Turtlebot3 による 草刈りロボット開発。#10 走行開始時のロボットの向き。
--- ros2 nav2_gps_waypoint_follower_demo autonomous は、できるか検討する。 ---

ROS2 自作 Turtlebot3 による 草刈りロボット開発。#9 LSTM で経路計画をする。
が出来たので、自分の部屋で、実機を Auto Mower で走らせている。
その中で、気になりだしたのが、ロボットの開始時の向きのズレが気になる。

Auto Mower で走行するときは、予め作成した、Static Map をベースに走行している。
この時、Static Map 作成時の、ロボットの向きと、 Auto Mower 走行時のロボットの向きがずれていると、具合が悪い。
1度ずれていると、数十メートルそうこうすると、かなりのズレが生じてしまう。
やはり、みちびき等の GNSS でロボットの位置を補正するしかないのかも。

その前に、予備知識として、ekf-localization 、navsat_transform を使ったロボット位置推定の場合の話だが、

robot_localization/navsat_transform_node を使った場合、
navsat_transform.yaml
の、datum: [38.161491, -122.4546443, 0.0] # pre-set datum if needed, [lat, lon, yaw] で、tf-map の原点の緯度、経度と、x 軸の向きを指定する。
yaw (X 軸の方向)は、通常 東=0 [radian] になるみたい。
通常は、X軸の+方向が、東としているので、地図の X軸の+ 方向を変えたければ、ここで指定する。
Navigating Using GPS Localization
によると、robot_localization は、WGS84(世界測地系) を使うとのこと。
与えられた、GPS の lat,logi から、地表上の平面地図上の距離に変換する処理をしてくれる。
つまり、GPS の lat,logi の現在値から、起点となる、datum からの、地表面上の距離をWGS84を使って、算出して、
それは、tf-map(0,0) からのX軸[M]、Y軸[M] の値として教えてくれる。
結構便利なツールじゃ。
地図から、Map に変換する場合は、この WGS84 の地図を使えば良い。

出力は、odometry/gps で得られる。
$ ros2 topic echo /odometry/gps
で、tf-map からの距離が得られる。だから、 GNSS の値が正確であれば、この odometry/gps だけで、ロボットの正確な位置がわかる。
だから、本来は ekf-localization、ukf-localization は必要がない。必要がなければ、無理して使うこともない。

すでに作成された、Static Mapは、作成時に使用した、datum をnavsat_transform_node に与えれば良い。
ロボットの向きも、Static Map 作成時の向きにあわせる。
手作業で、Static Map を作成した時は、そのマップの起点と X軸(+方向)方向 を、datum を使って、navsat_transform_node に与えれば良い。

このページを書いた時は、予備知識として、navsat_transform この知識がなっかたまま書いたので、書き直しが必要みたい。by nishi 2025.8.10
注1) 部屋の中で、GPS を使わない時は、開始時のロボットの向きが、+X に、必然的になる。
以上が、予備知識である。

ROS2 自作 Turtlebot3 による 草刈りロボット開発。#9 LSTM で経路計画をする。

--- ROS2 ロボット自律走行の経路計画の補助に、機械学習(Transformer、LSTM)を使う。 ----

ROS2 自作 Turtlebot3 による 草刈りロボット開発。#8 Transformer で経路計画をする。 の続きです。

Transformer で、学習データ 1000個作って、学習させてみたが、1000個では、まるっきり足りないようで、 train loss = 0.7 を切らない。

業を煮やして、それならと、 Speech to text の LSTM を同じ様に学習させてみました。

こちらは。1000件ほどのデータで、うまく学習できました。
これは、凄い!!
こんなにうまく行くとは、予想できませんでした。
本当に、うまく予測できているのか、今も、半信半疑です。
余りの感激に、涙がちょちょでるぞね!!

github に公開しました。
tosa-no-onchan/opp_with_lstm

1. 開発環境
PC: Ubuntu Mate 22.04
Python 3.10.12
virtual_env
tensorflow 2.16.2
keras 3.6.0

ROS2 自作 Turtlebot3 による 草刈りロボット開発。#8 Transformer で経路計画をする。

--- ROS2 ロボット自律走行の経路計画の補助に、機械学習(Transformer、LSTM)を使う。 ----

ROS2 自作 Turtlebot3 による 草刈りロボット開発。#6 Nav2 Planner を替えてみる で、ThetaStarPlanner を使って、Auto Mower 時の走行の直進性の改善がみられた。

しかし、まだおんちゃんが望む直進性能には、足りない。
そこで、ThetaStarPlanner の経路プランの一部補正として、機械学習が使えないか、無い知恵を絞って、考えてみた。

1. 概要
結論を先に言ってしまえば、経路プランに、Transformer、Lstm による、Speech To Text モデルのロジックを使えないだろうか? と言う話じゃ。

下の画像だと、赤線の経路を、青線の様にしたい。
障害物の手前まで真っ直ぐ進んで、障害物をなぞるように進んで、再度、スタートとストップの直線上に戻る、走行が欲しい。


2024-09-30 14-25-56-1.jpg

ROS2 自作 Turtlebot3 による 草刈りロボット開発。#7 障害物からの脱出に機械学習を使う。

---- Auto Mower で、障害物に囲まれた際の脱出方向の算出に、機械学習の画像分類 (Image Classify) を使ってみる。-----

Auto Mower で、ロボットを動かして、目的地に到達させた場合に、障害物に近づき過ぎる場合がある。
そうすると、navigation2 で、その場所から抜け出せずに、エラー終了してしまう。

これを、防ぐ為に、static map 上で、障害物に囲まれた際に、脱出方向を計算して、cmd_vel モードで、ロボットを少し遠ざけている。

2024-09-30 17-04-16-1.jpg
現状は、ProControl::obstacle_escape() で処理を行っています。
処理概要は、
Static Map から、ロボットの周りを、OpenCV の cv::Mat に取りこんで、8方向のMaskを用意して、Mask と AND を取って、障害物の Dot を取得した後、
それぞれの方向で、一番障害物が少ない(Dot が少ない)方向に、cmd_vel を使って動かす。
注) 今は、Local Cost Map(static_layer + obstacle_layer) を、resolution: 0.01 の解像度で使っています。

これって、画像(2値画像か、グレースケール画像)を取りこんで、その画像パーターン(黒い部分が障害物、白が空きスペース)から、8クラス(クラス=方向) に分類する、
Image Classify ではないじゃろか?

Image Classify だったら、Orange Pi 5 の NPUでも使えそうじゃ!!。
少し、試してみないといかん。

ROS2 自作 Turtlebot3 による 草刈りロボット開発。#6 Nav2 Planner を替えてみる。

---- Ros2 Navigation2 Planner を、NavfnPlanner から、ThetaStarPlanner に替えてみた。 ----

nav2.org / tuning を見ていたら、

Planner Plugin Selection
NavFn will typically make broad, sweeping curves; Theta* prefers straight lines and supports them at any angle;
and Smac 2D is essentially a classical A* algorithm with cost-aware penalties.

と記述があったので、
Theta を使えば、少しは、ロボットを直線的に走らせられるのではないか?
と思ったので、早速試してみた。

具体的には、xxx.yaml の中の、
planner_server:
で指定するので、ここを変更すれば良い。

ROS2 自作 Turtlebot3 による 草刈りロボット開発。#5 C++ cmd_vel 走行で障害物をよける方法。

今回は、ROS2 自作 Turtlebot3 や、Gazebo Turtlebot3 で、C++ cmd_vel でコントロールしているときに、障害物を検知する機能を組み込んでみました。

方法としては、Stero Camera、Lidar、Depth Camera を入力として、Local Costmap に 障害物が、Topic として出てくるので、
それを、定期的(1 [sec]) に取りこんで、ロボットの前方に障害物が投影されたら、ロボットの方で、なんらかの対応処理をする。

Navigation2 を使えば、かんたんですが、 rpp 等を使うと、まずロボットがまっすぐ走行しません。

草刈りロボットとしては、障害物が無い間は、常に直線上を走行させたいので、cmd_vel で走行させています。
この時に、障害物が現れたら、Nav2 走行に切り替わって、障害物を避ける動きを組み込んでみました。

cmd_vel 走行のみの場合は、そこで、障害物がなくなるのを待つか、走行処理を終了させる か、どちらかになります。

ROS2 OAK-D-Lite で、Stereo depth と Mobilenet object detection を同時に動かす。

Sub Title: Does an OAK-D run Stereo depth and Mobilenet object detection at the same time?

ROS2 自作 Turtlebot3 による 草刈りロボット開発。#4 草むらの判定 で、Stereo Camera Depth と、
Object Detection を同時に実行できるハードを検討しないと行けないので、
とりあえず、OAK-D Lite で試してみた。

なんか、同時に動くみたいぞね。
google で検索したけど、該当記事がないので、できないかと思ったが、
なぜか動くみたいぞね。
後で、github に上げちょきます。
tosa-no-onchan / depthai_ros_my
rgb_stereo_mobilenet_node_my.cpp

ただし、今は、Mobilenet で試しただけで、Tiny YOLOv4 では、どうなのか?

『新世紀エヴァンゲリオン』+『ヱヴァンゲリヲン新劇場版』+『シン・エヴァンゲリオン劇場版』 Full Complete Blu-ray BOX[初回限定版](Blu-ray 4K Ultra HD Blu-ray) [Blu-ray]

新品価格
¥85,167から
(2025/7/28 19:10時点)

(広告)

ROS2 自作 Turtlebot3 による 草刈りロボット開発。#4 草むらの判定。

一連の、ROS2 草刈りロボット の開発で、 GPS を使って畑を走行させる事は実現できそうだと、判った。
最後に残った懸案は、

1. 草むらを障害物とせずに、どうやってロボットを進めるか?
しかし、これも、
Keras V3 Object detection with Vision Transformers を試す。 で、最近の、Object Detection を体感する事で、解決策が浮かんできた。
今は、単なる思いつきじゃが、
YOLOx、Transformer Object detection で草むらを判定させて、それを Local CostMap に取り込めば良い。

Local CostMap での障害物の判定は、
obstacle_layer の plugins で行っている。
実際のプログラムは、plugin: "nav2_costmap_2d::ObstacleLayer" で、
こいつで、入力を、/scan:"LaserScan" か、 /cloudXYZ:"PointCloud2" のどちらかを取り込んで、障害物と判定している。

ROS2 GPS Localization 時のスタティックマップの東西南北、に関する、おんちゃんの勝手な解釈。
大学、高専でロボット関連の授業を受けていれば当たり前の事かも知れないが、
なにせ、おんちゃんは独学なので、知識のなさを露呈しちょります。

もし間違っていたら、勘弁しとうせ。

ROS2 LC29H-EA GPS RTK を作る。
で、GPS RTK を使って、部屋の中でロボットの走行テストをしているときに、ふと湧き上がってきた疑問な点を、
おんちゃんながらの、勝手な解釈を書いてみました。

部屋の中で、LC29H-EA + RTK で地球上の位置を取得して、ロボットをうごかしているけれど、GPS だと、東西南北があるよね?
これは、スタティックマップでは、どっちら方になるのじゃろ?

申し訳ありません。これにかんする解答は、
ROS2 自作 Turtlebot3 による 草刈りロボット開発。#10 走行開始時のロボットの向き。
の "その前に、予備知識として、ekf-localization 、navsat_transform を使ったロボット位置推定の場合の話だが、" の箇所に書きました。
上記を参照してください。
よって、これ以降の記述は、とんちんかになっています。by nishi 2025.8.14

ROS2 自作 Turtlebot3 による 草刈りロボット開発。#3 - Auto Mower

自作 Turtlebot3 自律走行に向けたプログラム。#12 AutoMap II で、Gazebo House での自動 Mapping ができるので、
今回は、その作成されたマップを使って、Auto Mower を作ってみました。

Auto Mower を試す前に、Auto Map II で、マップを作っておいとうせ。
手動操作で、teleop-keyboard で動かして作っても、OK です。

1. 開発環境
PC
  Ubuntu Mate 22.04
  ROS2:humble
  Gazebo Turtlebot3 with Depth Camera、Rtabmap_ros
  GPU: Gazebo で試すなら、GPU が必要みたい。無いと、rtabmap-ros が良く狂って、TF-Map - TF-Odom がぶっ飛ぶみたい。

2. Auto Mower コース計画のアルゴリズム。
1) Static Map を取り込んで、ロボットがいる自由領域(White) の領域を最初に求めます。
2) その自由領域を、ロボットの走行サイズに合わせて、スライスして、そのスライス線に従って、ロボットを走行させる。
以上です。

考えかたは、ずっと以前、ROS and Python で試した方法のままです。
ただし今回は、場所が、 Gazebo House と、 C++ で作成します。

3. 技術的検証。
じっさいに、Auto Mower のプログラムを作る前に、クリアしなといけない技術的問題点を検討します。

ROS2 自作 Turtlebot3 による 草刈りロボット開発。#2

ROS2 自作 Turtlebot3 による 草刈りロボット開発。 の続き。

7. 屋外での Map II。
結局、今は、GPS(みちびき級) を使って、畑の外周の、各頂点でGPSデータを採取して、 それを、順に線分で結んで、
畑の図形に使う事にしました。

はーー、しかし面倒くさい、誰か替わりに、此処のシステムを作ってくれないじゃろうか?
システム構成のラフは、ノートに手書きで出来あがっています。誰か、これを実際に作ってくれないだろうか?
替わりに、もし実際に出来上がたっら、システムとして自由に販売もOKにするのだが!!
仕方がないので、自分で作っています。
いまは、 ESP32 bluetooth で、GPSデータが、PCで採取できるところまで出来ています。by nishi 2023.5.6

ROS2 自作 Turtlebot3 による 草刈りロボット開発。-- 屋外走行

ROS2 自作 Turtlebot3(foxbot_core3_r2) rtabmap_ros も一応完成したので、
草刈りロボットとしての、屋外での走行にチャレンジします。

1. 屋外でのMap
屋外での走行で、 そもそも、Static Map 作成をどうするのか?
map 自体は、 画像ソフト(Gimp等) で作成できるとのこと。
Creating map with paint(or any other image editor)
Youtube
ROS Map Editor と言うのもある。
こちらが簡単。git clone して、python3 で、そのまま起動できる。
例) ~/map4.pgm ~/map4.pgm.yaml があったら。
$ python3 MapEditor.py ~/map4

だとしたら、ただ走行可能領域のみの、空白の Map だけで良いのでは?

その状態で、GPS を元にした、robot_localization/ekf_node で、自己位置を特定して、Stereo Camera からの
rtabmap_ros/point_cloud_xyz で、 local_costmap、global_costmap に障害物情報を与えてやるだけで、
navigation2 で、1[m] 先の位置、2[m] 先の位置と、順々に走行できるのでは、ないじゃろか?
10[m] 先も、1[m] 毎に区切って行けば、OK か?

このアーカイブについて

このページには、過去に書かれたブログ記事のうちROS2 草刈りロボットカテゴリに属しているものが含まれています。

前のカテゴリはROS2 機械学習です。

次のカテゴリはTurtlebot3です。

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

カテゴリ

月別 アーカイブ

ウェブページ

サイトナビ