フィジカルAi で ROS2 自立走行ロボットを動かす。#2
ACT の sub goal が、芳しくないので、業を煮やして、diffusion の sub goal を試してみた。
まだ、作っている途中だが、簡単に動いた。
こちらは、優秀みたいじゃ。
なんじゃこりゃ、こんなに、簡単にうごくの?
LeRobot ACT sub goal で、使った 同じ ROS2 bag ファイルを使って、 train させました。
ROS2 Gazebo WearHouse Tugbot で、 sub goal node を作って、走行させたら、うまく完走できるようです。
当初、TF 補正ナシで、走行させていましたが、TF 補正有りが必要だとわかって、TF 補正して、走行させたら、うまく完走できるようになりました。
しかし、あまりに、障害物の近くを走行するので、見ていて冷や冷やします。
ROS2 広域 Planner の走行パスを使って、複数のチェックポイントを、 model に入力して、走行させますが、
model は、それを完全になぞることはせずに、自分の学習脳の判断で、あくまで走行します。
ここが、ROS2 Nav2 の走行とちょっと違うかな?
train 用の、ROS2 bag データを採る時は、障害物から少しゆとりをもって離れた場所を走行させた方がよいぞね!!
1. 使った Diffusion Model は、LeRobot Diffusion では無くて、google ai に、一から作ってもらいました。
Dataset は、こちらは、 ROS bag から、LeRobot Dataset に変換して、つかいました。
フィジカルAi の学習 Datasetとしては、LeRobot Dataset は、かなり優秀です。ぜひこれをつかった方が、開発が短縮できます。
後日、GitHub にでも、公開するぞね!!
ただ、ACT での sub goal が、うまくいかなかったのが、残念ぞね!!
2. LeRobot Datasets の作成。
1) Diff Drive roboto を動かして、ROS2 bag ファイルの収集。
i) AMCL 等、Navigation2 を起動して、Diff car robot を動かせるようにしておく。
ii) ros2 bag をスタートさせる。
$ python ros2_bag_start.py
iii) Diff car robot を動き回らせる。
ctl+c で、ros2_bag_start.py を止めて、 ros2 bag を終了させる。
iv) 上記を繰り返して、一杯 走行データを収集する。
2) ROS2 bag を、LeRobot Dataset に変換。
$ python convert_mcap_to_lerobot_3_diff.py
3. train
jupyter notebook で、 train.ipynb を使って、 train を行う。
4. Run
1) ROS2 環境で、
i) TF 補正ができる環境を用意する。
ii) ai_diff_policy_run_about_node_subgoal.py
を走行させる。
github に公開しています。
train 関連
@tosa-no-onchan/lerobot-my/diffusion-ros2-diff
ROS2 関連
@tosa-no-onchan/tugbot_my/tugbot_ai_my_diffusion
5. 今後。
やはり、実機の Diff Drive roboto で、データを収集して、実機で試さないと、なんとも言えない。
シミュレーションと実機では、大きく違う。
その前に、この Diffusion Policy model は、SBC で動くのだろうか?
ここが、問題じゃ!!
Google Ai に聞きながら、 ONNX 変換と、 ONNX model 版での、PC 上での predict を試して、いよいよ、実機の自作 Turtlebot3 で、実環境でためそうと思っていたら、
ここで、不都合な真実が、出てきました。
"ResNet-18 は見た目が変わると全く違う特徴量を出力するため、1D-UNet がパニックを起こして誤った速度(あらぬ方向への大暴走など)を出力する可能性が非常に高いです。"
との事。これは、都合が悪い。おんちゃんの目指しているのは、はじめての場所でも、目的地(targte-x, target-y) を渡せば、進んでくれる model じゃ。
じゃが、とりあえず、 torch -> onnx 変換じゃ。
$ python conv-torch2onnx.py
これで、2 つの onnx ファイルが、作成される。
この、2 onnx ファイルを使って、onnx-runtime で、Ros2 inference node を作る。
@tosa-no-onchan/tugbot_my/tugbot_ai_my_diffusion_sbc/tugbot_ai_my_diffusion_sbc/diff_car_inference_node_onnx.py
5.1 DINOv2(凍結)
ここで、Google Ai との押し問答で、同じ class DiffCarPolicy で、Resnet-18 を、DINOv2(凍結) に替えたら、目的の model になりそう。
ただし、この場合、SBC ではなくて、Mini-PC での運用になる。
これは、仕方がないことじゃ!!
Mini-PC は、
🌟 推奨スペック
CPU: AMD Ryzen 7 7840HS / 8845HS またはそれ以上
内蔵GPU: Radeon 780M (Ryzen 7 に内蔵されている、現役最強クラスのグラフィックスコア)
メモリ(RAM): 32GB (DINOv2 と ROS 2 を同時に安定して動かすため、16GBより32GBが安全)
OS: Ubuntu 22.04 LTS (ROS 2 Humble がネイティブで動く環境。Windowsモデルを買って自分でUbuntuを入れ直します)
なんと、AMD じゃ。時代も進んだもんじゃ!!
注) これも、まだ、難易度が高いかも? Google Ai を鵜呑みにしては、まずいかも!!
AMDの内蔵GPU Radeon 780Mで動くPytorchの環境を作る
上記、DINOv2(凍結) を使った、class DiffCarPolicy を屋外で摂った走行データを少し使って train させれば、屋外での走行用 diffusion model が、できるとの事。
これの、Loss の目安は、0.005以下( 0.001 から 0.002 辺りが実用的) だそうじゃ。
5.2 DINOv2(凍結) + LoRA Fine tunning
DINOv2(凍結) の先は、DINOv2 の部分に、LoRA(Low-Rank Adaptation / 低ランク適応)で、Fine tunning ができるみたい。
本当に、Google Ai は、小出しにするから、けしからん!!
Diffusion DINOv2(凍結) + LoRA Fine tunning 版の train と、 ROS2 sub-goal node での走行テストを試してみました。
train-dinov2-lora.ipynb
注) input 画像は、アスペクト比無視で、そのまま、224x224 にリサイズして、ノーマライズして、feed させてください。
結構いいみたい。
少し、走行速度が遅い気がするけど、ちゃんと障害物は避けるし、Navi2 の 広域パスプランを、なるだけ、トレースしてくれます。
あとは、実機向けに、屋外で走行データを収集して、 train させれば、使えそう。
ただ、 Mini PC を実装しないといけないので、どうするか?
最初は、PC 側で、ROS2 diffusion の node を走らせれば、いいが、最終的には、ロボット側に搭載しないといかん!!
5.2.1 実機走行じゃ
DINOv2(凍結) + LoRA Fine tunning を、Gazebo WearHouse Tugbot で、収集した Datasets で学習した model で、いきなり、実機の 自作 ROS2 Diff Drive car で、走行させてみた。
Ros2 diffusion node は、 リモート PC 側で使う。
1 地点移動の Ros2 diffusion node で、部屋の中で、2[M] 先へ走行させてみた。
スピードが、かっとびなので、遅くして試したら、うまく 2[M] 移動して、停止した。
これなら、実環境で使えそう。
あとは、実機でいろんな場所で収集したデータを学習させれば、草刈りロボットで、使えそうじゃ。
しかし、久しぶりに、実機環境での作業に戻ってこれた。
やっぱり、実機で動いてやっと、確認 OK となる。
5.2.2 ONNX 版の ROS2 node を、Orange Pi 5 Armbian 上で走らせる。
その後、DINOv2(凍結) + LoRA Fine tunning 版の onnx への変換を、Google Ai に教えてもらって、onnx 版を、Orange Pi 5 Armbian で、
走行させてみました。
うまく動く様です。これなら、SBC での利用で問題ないと思うぞね!!
あと、DINOv2 の input 画像ですが、Google Ai に確認したら、アスペクト比無視で、
そのまま、224x224 にリサイズして、feed させないといかんそうです。
再度、こちらに統一して、 train から inference コードをしゅうせいしないといかんぞね!!
また、train からやり直しじゃ!! やれやれじゃ。