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

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でも使えそうじゃ!!。
少し、試してみないといかん。

1. 学習データの用意。
機械学習の一番の手間は、学習データを揃えることじゃ。

これは、本来なら、Gimp などを使って、画像ファイルを作るのだが、これが面倒くさい。
そこで、おんちゃんは、現在の、ProControl::obstacle_escape() を少し改造して、
これが、コールされた際に、その時のロボットの周囲の画像と、その際の 判定結果をファイルに保存するようにして。

Auto Mower を実際に動かしながら、学習画像と教師 class id を自動で作成する。
Gazebo House で、Auto Mower を走らせれば、自動でできそう。

注1) class id は、8方向 + 障害物無し + 退避不可 の 10 class にします。
注2) 退避不可の画像は、自分で、Gimp で作る必要がありそう。
注3) 画像形式は、ProControl::obstacle_escape() は、2値画像だが、学習用には、8bit グレー 形式がよさそう。
注4) これが、一番懸案事項だが、画像サイズは、使うロボットのサイズに合ったものが必要な気がする。
ロボットサイズが異なれば、それ毎の学習 model が必要になりそう。
画像サイズは、不統一でも、学習時にリサイズして同一サイズにして学習させられるので、気にしなくても、OKか。
だから、学習済モデルは、1個で、OKじゃ。
いろんなサイズのロボットのデータを集めなければいかん。
Gimpで手作業で作成するときは、大きな画像でも、OKか。

注5) Local Cost Map(static_layer + obstacle_layer) を、resolution: 0.01 の解像度で、使います。
50 x 50 [cm] の範囲で、50 x 50 [pixel] の画像サイズになりそう。
MNISTの手書き数字の画像セットで、28 x 28 みたいだから、どうするか?
5種類の花の画像分類アプリを実装してみた
で、リサイズして 64 x 64 か。最終的には、model input size になるか。

注6) Local Cost Map を、cv::Mat に変換するときは、上下が反転します。
もしかしたら、学習画像として保存する場合は、cv::Mat を更に上下反転させたほうが良いのかも。

さらに、Local Cost Map の向きは、xxx.yaml の指定で変わります。

通常は、下記で、ロボットの向きに関係なく、常に tf-map と同じ向きになります。


下記の指定にすると、tf-base_footprint と同じ向きになって、カメラの向きがロボットの向きと同じになります。

こちらも、上下が反転して、ロボットの向きによっては、映像の向きも変わります。一応ロボットの前面を映しています。

ただし、こちらを使うと、navigation2 が、時々エラーになって、ロボットが止まります。
どこか、設定不良があるのかも。

2. Image Classify Model の選定。
Image Classify Model は、世の中にいっぱいあるが、Orange Pi 5 NPU で使うのが前提なので、Orange Pi 5 NPU の
学習済み Image Classify Model をベースに、転移学習させるべきか?。

多分、PC 上で、torch 辺りで、転移学習させて、学習が終わったら、 Orange Pi 5 NPU 用の model 形式に変換する流れだと思う。

しかし、PC上で、Gazebo でもテストしたいのを考慮すると、Tensorflow Lite のほうが無難かも。
しかし、先の Transformer で、PyTorch 向けの GPUを設定したので、PyTorch の Image Classify を使うことになりそう。

要件を定義しているうちに、なんとか出来そうな気がしてきたぞね。

このブログ記事について

このページは、おんちゃんが2024年9月24日 12:04に書いたブログ記事です。

ひとつ前のブログ記事は「ROS2 自作 Turtlebot3 による 草刈りロボット開発。#6 Nav2 Planner を替えてみる。」です。

次のブログ記事は「ROS2 自作 Turtlebot3 による 草刈りロボット開発。#8 Transformer で経路計画をする。」です。

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

カテゴリ

ウェブページ

サイトナビ