DINOv2 を使って、ROS2 SLAM(自己位置推定)に役立てる。
前回、フィジカルAi で ROS2 自立走行ロボットを動かす。#2
で、Diffusion policy の input に、DINOv2 を使った model を試したが、
"DINOv2 の input 画像に何か入れると、特徴量を返してくる" 特性を活かすと、
一度通った場所のランドマークを記憶させられる様じゃ。
これを使えば、SLAM(自己位置推定)が、行える。もう、Static Map を予め作る必要がない。
Google Ai に色々訪ねていたら、教えてくれた。
なんとも便利な Model を、Meta(旧 Facebook)が作ってくれたもんじゃ!!
1. 概略は、
1.1 SLAM データ作成。
1) 屋外で、ロボットの走行コース上で、10[M] ごとに、RGB Camera の画像と、その時の、gnss-rtk から求めた、緯度、経度と、ロボットの向きのデータを集めて回る。
この時、no を順に割り当てて行く。
2) 上記データの画像をDINOv2 の feed させて、その特徴データを、Faiss( ベクトルデータが扱える DB) に、順に登録する。
以上で、 今回の、SLAM コース情報の出来上がり。
1.2 ROS2 diff car ロボットでの利用。
3) ROS2 diff car ロボットで、RGB カメラの画像を、DINOv2 の feedさせて、
出てきた特徴量で、Faiss の検索をかける。
特徴量が見つかると、Faiss は、登録時の no を返してくるので、
先に集めた、data の no と一致する、緯度、経度から、今の 位置を得る。
しかし、gnss-rtk があれば、必要が無いが!!
gnss-rtk が使えない、室内だと使えるかも。
検証コードは、python pytorch で、簡単に書ける。
Googl Ai に聞けば、コードを教えてくれる。
このページの 1.概略 の部分を Google Ai に聞けば教えてくれる。
コード自体は、簡単だから、試してみては?
ただし、Inference 時のハードのリソースが、結構要求される。
ROS2 実機 Diff Drive Car で実装、テストするには、ここが難問か!!
以前、SLAM でランドマークを使う方法を模索していたが、
ROS2 自作 Turtlebot3 による 草刈りロボット開発。#15 Robot Localization
これが、上記の、回答になりそう。
ROS2の最近のブログ記事
フィジカル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 データを採る時は、障害物から少しゆとりをもって離れた場所を走行させた方がよいぞね!!
フィジカルAi で ROS2 自立走行ロボットを動かす。
Google Ai に、質問していたら、ROS2 自作 Turtlebot3 で色々走行させて、データを取れば、
それを、フィジカルAI の 適当な model(ここは、Lerobot ACT、diffusion etc) に学習させれば、自立走行させられそう!!
フィジカルAI の学習は、エピソード単位でさせる!!
ので、基本、目的地は、1箇所。
しかし、これをベースにして、目的地を告げて、複数ヶ所へ到達させることも出来るとの事じゃ!!
ここにきて、やっと、フィジカルAi と ROS2 自立走行ロボットの勉強がつながったぞね!!
ちょっと、ROS2 Jazzy Tugbot の Gazebo で、学習data を作ってためしてみます。
開発環境:
Ubuntu Mate 24.04
ROS2: Jazzy
Gazebo
Tugbot wearhouse
Navigation2 with AMCL front rgb camera, front scan
Model:
LeRobot ACT
注) ROS2 の環境と、virtual_env で作った、torch、lerobot の環境の2 を、使い分けます。
lerobot_env: virtual_env で作ります。
lerobot_env で、
$ python -m pip install mcap mcap-ros2-support opencv-python numpy [torch] [lerobot]
1. Gazebo Tugbot wearhouse を、Navi2 で動かして、bag data を保存します。
ROS2 環境が必要なので、下記をターミナルからたたく
$ source /opt/ros/jazzy/setup.bash
$ source ~/colcon_ws-jazzy/install/local_setup.bash
$ export ROS_DOMAIN_ID=30 #TURTLEBOT3
$ export TURTLEBOT3_MODEL=waffle
$ export GZ_SIM_SYSTEM_PLUGIN_PATH=/opt/ros/jazzy/lib
下記、launch で、 Gazebo Weahouse Tugbot が Nav2 で、操作出来ると思う。
最新版を、up しているか、自信がないが!!
tosa-no-onchan/turtlebot3_navi_my/launch/tugbot_amcl_scan.launch.py
すでに、SLAM で、map が作成されていると思うので、その Map を使います。
上記、 launch.py の上部の起動手順に従って、Rviz2 で、Nav2 操作が出来る状態にします。
# 2.2 navigation
の部分。
ROS2 Gazebo for Tugbot を作ってみた。
3D LiDAR の SLAM サンプルの、
@fishros/LeGO-LOAM-ROS2
Gazebo で試せないかと思ったので、作って見ました。
一応出来たのだが、3D LiDAR の PointClouds2が、Rviz2 でうまく確認できない。--> 一応対応した。
作るにあたっては、下記の2サイトを参考にさせてもらったぞね。ありがとう!!
@ROBOTIS-GIT/turtlebot3_simulations
@/porizou/tugbot_ros2_pkgs
turtlebot3_simulations/turtlebot3_gazebo が、Gazebo 利用の FrameWork みたになっているので、これのファイル構成を流用させてもらいました。
tugbot_ros2_pkgs は、urdf sdf を参考にさせて貰いました。
開発環境
PC: Ubuntu Mate 24.04
ROS2 Jazzy
Gazebo Hramonic
github に公開しました。
@tosa-no-onchan/tugbot_my
ROS2 Jazzy + Turtlebot4 + Gazebo Ionic warehouse Simulation.
Ubuntu Mate 24.04 にしてみたら、Gazebo が、新しくなっていて、今まで使っていた、
Hose World が使えなくで、困っていたら、
パッケージを新しくすると、Turtlebot4 + Gazebo Ionic warehouse Simulation がかんたんに使えた。
All In One みたい。
参考は、
TurtleBot3 + Gazebo + Navigation2 (ROS 2 Jazzy)
ros-navigation/nav2_minimal_turtlebot_simulation
1. git clone
$ cd ~/colcon_ws-jazzy/src
$ git clone -b jazzy https://github.com/ros-navigation/nav2_minimal_turtlebot_simulation.git
$ cd ..
$ rosdep update --rosdistro=${ROS_DISTRO} && rosdep install --from-path src/nav2_minimal_turtlebot_simulation -r -s
必要な、パッケージが一覧ででてくるので、
$ sudo apt install xxxxx
ソースビルドして、
2. build
$ colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release [--packages-select nav2_minimal_turtlebot_simulation]
$ . install/setup.bash
3. run
$ ros2 launch nav2_bringup tb4_simulation_launch.py headless:=False
で一応、Gazebo 画面と、Rviz2 画面は、でてきた。
しかし、Rviz2 画面で、Navigation の操作ができない。
ROS2 自作 Turtlebot3 による 草刈りロボット開発。#6 Nav2 Planner を替えてみる。
副題: ROS2 C++ 自立走行ロボットによる草刈りロボット開発
---- 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
副題: ROS2 C++ 自立走行ロボットによる草刈りロボット開発
----- 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 では、どうなのか?
|
新品価格 |
ROS2 C++ rclcpp::Node を継承した、Sub class で、親の nodeポインタがほしい。
忘れないように、書いておきます。
/opt/ros/humble/include/rclcpp/rclcpp/node.hpp
enable_shared_from_this
を見ると、shared_from_this() 親メソッドが使えるみたい。
OAK-D-Lite を ROS2 Humble で、再度試してみた。
以前、OAK-D-Lite を試して、サンプルプログラムがさんざんだったので、ほったらかしていたのですが、
あれから、2年ほどたって、少しは、改善されたのか、確認のため試してみました。
以前より、改善されたみたいぞね!!。
github に公開しちょります。
tosa-no-onchan / depthai_ros_my
電源容量に注意。
USB 3.x ケーブルを使って、USB3.x ポートを使ってください。
by nishi 2024.9.9
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 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
実際にサーバーに接続するは、下記、情報を指定しないといかんぞね。
ROS2 自作 Turtlebot3 による 草刈りロボット開発。#3
副題: ROS2 C++ 自立走行ロボットによる草刈りロボット開発
-- - 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 C++ 自立走行ロボットによる草刈りロボット開発
ROS2 自作 Turtlebot3 による 草刈りロボット開発。 の続き。
7. 屋外での Map II。
結局、今は、GPS(みちびき級) を使って、畑の外周の、各頂点でGPSデータを採取して、
それを、順に線分で結んで、
畑の図形に使う事にしました。
はーー、しかし面倒くさい、誰か替わりに、此処のシステムを作ってくれないじゃろうか?
システム構成のラフは、ノートに手書きで出来あがっています。誰か、これを実際に作ってくれないだろうか?
替わりに、もし実際に出来上がたっら、システムとして自由に販売もOKにするのだが!!
仕方がないので、自分で作っています。
いまは、 ESP32 bluetooth で、GPSデータが、PCで採取できるところまで出来ています。by nishi 2023.5.6
Gazebo ROS2 Humbleで、My ワールドを追加する。
下記、ページを参考に、自分で使いたいワールドを追加する方法を考えてみる。
ROS2 Gazebo に world を追加できるか。
1) useful-world-files-for-gazebo-and-ros-2-simulations
2)
CustomRobots / car_junction
3) automaticaddison /
two_wheeled_robot
4) how-to-load-a-urdf-file-into-rviz-ros-2
ROS2 自作 Turtlebot3 による 草刈りロボット開発。
副題: ROS2 C++ 自立走行ロボットによる草刈りロボット開発
--- 屋外走行 ---
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 自作 Turtlebot3(foxbot_core3_r2) Rtabmap_ros with Stereo rgbd and GPS. by T100TA #2
--- GPS を付けて、robot_localization ekf で試すを、T100TA から操作。#2 ---
ROS2 自作 Turtlebot3(foxbot_core3_r2) Rtabmap_ros with Stereo rgbd and GPS. by T100TA の続きです。
ubuntu 20.04 galactic 版へ移行しての再テスト。
ここでの動作を試す前に、ROS2 自作 Turtlebot3(foxbot_core3_r2) Rtabmap_ros with Stereo rgbd. #2 を終わらせて下さい。
上記ページで、 WiFi Lan の安定が重要だと判ったので、その点に注意して、T100TAを使っての走行テストを行います。
1. 環境。
1) Remote PC / T100TA
Ubuntu Mate 20.04
ros2: galactic
navigation2, Rviz2, multi_goals4_nav2
Wi-Fi: 2.4 [GHz]
2) SBC
Jetson Nanao 2G
Jet Pack4 .x and Ubuntu 20.04
ros2: galactic
micro-ROS Agent
Single USB Stereo Camera
GPS: AE-GYSFDMAXB
rtabmap_ros
Wi-Fi dongle: TP-Link 2.4[GHz] 150[Mbps]
USB SSD Stick
3) SOC
ESP32 Arduino
micro-ROS
IMU
4) Wi-Fi portable router
ELECOM WRH-300BK3-S
5) 自動走行プログラム。
turtlebot3_navi_my / multi_goals4_nav2
ROS2 自作 Turtlebot3(foxbot_core3_r2) Rtabmap_ros with Stereo rgbd and GPS. #2
--- GPS を付けて、robot_localization ekf で試す。続き ---
ROS2 自作 Turtlebot3(foxbot_core3_r2) Rtabmap_ros with Stereo rgbd and GPS. の続きです。
自作 Turtlebot3 自律走行に向けたプログラム。#14 の ROS2版です。
1. 環境。
1) Remote PC
Ubuntu Mate 20.04
ros2: galactic
rtabmap_ros, navigation2, Rviz2
2) SBC
Jetson Nanao 2G
Jet Pack4 .x and Ubuntu 20.04
ros2: galactic
micro-ROS Agent
Single USB Stereo Camera
GPS: AE-GYSFDMAXB
USB SSD Stick
3) SOC
ESP32 Arduino
micro-ROS
IMU
4) 自動走行プログラム。
turtlebot3_navi_my / multi_goals4_nav2
5) lanuch ファアイル。
rtabmap_ros_my/launch/ratbmap_stero_rgbd_gps.launch.py
1. galactic 版へ移行しての再テスト。by nishi 2023.3.2
galactic だと、 foxy版で出た、navigation2 の不具合などは、まるきりでなくて、すんなり動いた。
ちょと、走行テストをしていたら、たまに、 navigation2 を動かしている Remote PC と、foxbot_core3_r2 の通信が切断されるようです。
これは、改善しないと、まともにテストできましぇん。
方法は、Remote PC 上で、navigation2 を動かす時は、 heart beat を出すプログラムを同時に動かして、foxbot_core3_r2 からこの、
heart beat を取れなくなったら、モータドライブを止めて、heart beat が回復するのを待つ。
ROS2 自作 Turtlebot3(foxbot_core3_r2) で、Rtabmap_ros with Stereo rgbdを試す。#2
------ Jetson Nano 2G の SDCHが壊れたので、新しいカードへ移したら、問題がでた。 --------
ROS2 自作 Turtlebot3(foxbot_core3_r2) で、Rtabmap_ros with Stereo rgbdを試す。 の続きです。
1. 環境
1) SBC
Jetson Nano 2G
Jetpack 4.x and ubuntu 20.04
ROS2: Galactic
2) Remote PC
Ubuntu Mate 20.04
ROS2:Galactic
3) lanuch ファイル。
rtabmap_ros_my/launch/ratbmap_stero_rgbd.launch.py
Jetson Nano 2G の Micro SDHC を新しくして、同じ様に、 rtabmap-ros-with-stereo-rgbd が動作するようにしたのですが、
何故か、リモートPC から、/cloudXYZ(rtabmap_ros/point_cloud_xyz /cloud) が、以前のように安定して受信出来なくなりました。
$ ros2 topic hz /cloudXYZ
で、最初の30件から40件くらいは、15[hz] で受信できるのに、その後が、殆ど受信出来なくなってしまいました。
おまけに、 /disparity (stereo_image_proc.launch.pyの出力) に至っては、Remote PC からまるっきり受信できません。
どちらも、local の SBC(Jetson Nano 2G) 上では、問題なく受信できています。どちらも、
15[hz] 位、出ています。
ROS2 自作 Turtlebot3(foxbot_core3_r2) Rtabmap_ros with Stereo rgbd and GPS. by T100TA
--- GPS を付けて、robot_localization ekf で試すを、T100TA から操作。 ---
ROS2 自作 Turtlebot3(foxbot_core3_r2) Rtabmap_ros with Stereo rgbd and GPS. の続きです。
前回、SBC(Jetson Nano 2G) で、全て起動して、Remote PC からは、ssh2 で、SBCにログインして、launch の起動と、Rviz2の表示だけを行いましたが、
Remote PC を、ASUS Tablet(T100TA) に変えて同じ操作を行いました。
一応、ロボットは、完走できましたが、navigation2 のログ表示に、結構 ERROR、WARN がでているので、それの考察です。
しかし、T100TA にすると、このようになるのか? 疑問ぞね。

