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 か?
但し、その時に、草が、障害物として判定されるので、将来的には、
rtabmap_ros/point_cloud_xyz -> local_costmap、global_costmap も止めてしまい。
本当の障害物、人、物の判定は、別の方法を使う。
または、local_costmap、global_costmap も自分で作成して、草は除外し、本当の障害物のみ、障害物として渡す。
窪地、先の崖は、障害物として渡す。
もっと将来的には、巡回コースを走らせて、その回りの草を見つけては、草刈りをして、またもとの巡回コースに復帰する。
こんな動きができれば、完成か!!
結局、巡回コースの Plan(位置情報) だけがあれば、良いのではないか?
農家のビニールハウスの中を、巡回させるだけなら、簡単か?
2. local_costmap、global_costmap の作成。
機械学習で、草の領域か、Object detection で障害物(人、物、木)を判定させて、草の領域は、pointClouds からデータを間引くか、
local_costmap 、global_costmap から取り除くか?
注1) 領域判定(Segmentation) は、負荷が大きい。
ROSに入る前に、機械学習を勉強したが、その時は、まだ、使える代物ではなかった気がする。
いまは、改良されたのだろうか?
Orange Pi 5 で使えれば、よいのだが。
Jetson nano 2G で、試しが、下記にあった。
Jetson Nano で物体検知時にセマンティックセグメンテーションを試してみた
動画となると、やはり、 Jetson Orin Nano クラス、だろう。
3. Gazebo Turtlebot3 で、以前試した方法。
因みに、以前、python で試した、草刈りロボットの走行方法は、
1) 手動で、Turtlebot3 を動かして、 Map を作成する。
2) 保存された、Map から、草刈りを行う閉領域の走行可能領域を、ロボット幅で、縦、又は横のラインで分割して、
そのライン上を、隈無く走行する。
まあ、普通に思い浮かぶ方法では、ある。
4. 実走行テスト。
今回は、走行可能領域のみの、空白の Map を用いて、GPS と Robot wheel の robot_localization/ekf_node
と Stereo Camera からの rtabmap_ros/point_cloud_xyz から作成した、 local_costmap、global_costmap を、
navigation2 に与えて、目的地へ到達できるか試してみます。
launch ファイル:
rtabmap_ros_my/launch/foxbot_nav2_stereo_gps.launch.py
手始めに、ROS2 自作 Turtlebot3(foxbot_core3_r2) Rtabmap_ros with Stereo rgbd and GPS. #2 を使って、部屋の中を、
C++プログラム で走行させた後、Map を保存して、
それを、上記 ROS Map Editor で、余分な、障害物を消して使いました。
この記事を掲載したときは、
PC: Ubuntu 20.04 ROS2 Galactic
SBC: Jetson Nano 2G
でしたが、最新版は、下記です。
PC: Ubuntu 22.04 ROS2 Humble
SBC: Orange PI5 Armbian
ロボットを、プログラムで移動させるに連れて、global_costamp が更新されて行くみたいです。これだと、navigation2 で、
未踏の場所へ行けそうです。
しかし、global_costamp から、障害物を消すと言うのは出来るのだろうか?
5. teb local planner を使ってみる。
DWB Local planner を使っていたが、久しぶりに、teb local planner を使って見ることにした。
rst-tu-dortmund / teb_local_planner
branch: ros2-master
ブランチに、humble が無い。おまけに、最近更新されていないのが気になる。もう、開発をやめてしまったのか
とりあえず、ビルドして走らせてみた。
最初の、左に90度ずつ、4回で、360度1回転のところで、動きが変。
その場で、一旦、後ろに下がって、前進しながら向きを変えながら、もとの位置に戻ってくる動作で、90度ずつ 回転している。
この動きって、ハンドル操作での方向転換ではないのか?
どうやら、 differential drive robots の制御になっていない気がする。
これのパラメータはどこなのか?
以前、eband local planner のソースを見ていたときに、この指定があったのを記憶している。
さて、 teb local planner では、指定は、どこじゃ?
~/colcon_ws/src/teb_local_planner/ で、
teb_local_planner/src/optimal_planner.cpp:358 を見てみる。
cfg_->robot.min_turning_radius == 0 || cfg_->optim.weight_kinematics_turning_radius == 0
と言うことなので、
yaml ファイルの中の、
weight_kinematics_turning_radius: 1.0 -> 0.0
に変えてみる。
robot.min_turning_radius は、どこなのか判らないので、これは、そのままにする。
しかし、回転するとき、前後する動作は、少しのこるみたい。他のパラメータか?
パラメータの記述があった。
Step 5-C : Controller - Teb Local Planner Tuning Guide
後退速度の指定が出来るみたい。
max_vel_x_backwards: 0.0
min_turning_radius: 0.0 # diff drive の指定。
6. おんちゃんのメモ。
1) ekf robot_localization の設定に関して、ずっと不明だった事が、やっと判った事。
このページに関して、 Configuring robot_localization
ROSCon 2015 Hamburg: Day 2 - Tom Moore: Working with the robot localization Package
The order of the boolean values are (X, Y, Z, roll, pitch, yaw, \dot{X}, \dot{Y}, \dot{Z}, \dot{roll}, \dot{pitch}, \dot{yaw}, \ddot{X}, \ddot{Y}, \ddot{Z})
の記述の意味が、さっぱり分からんかったが、ビデオを見たら。
下記だそうだ!!
\dot{}: velocity --> これは、距離の微分?
\ddot{}: accel. --> これは、速度の微分? --> 距離の微分の微分?
さいしょから、こう書いてくれれば、もっと早くに、理解できたのに。
これで、理解できたぞね。
2) 草刈りロボット向けの local planner について。
Navigation2 Tuning Guide の "Controller Plugin Selection" を見ていたら。
Plugin Name | Supported Robot Types | Task
RPP controller | Differential, Ackermann, Legged | Exact path following
の記述があった。
Task: Exact path following
これって、草刈りロボット向きではないじゃろか?
Regulated Pure Pursuit
navigation2/nav2_regulated_pure_pursuit_controller/README.md
早速、試してみました。
これは、草刈りロボット向きだと思う。
i) static map だけを参照するのだろうか? local_costmap 参照みたいだ。
ii) 未踏破の場所も行けるみたい。
iii) /cmd_vel の操作も出来る。
これは、非常にありがたい。遠い場所へは、navigation2 で行って、その近辺は、/cmd_vel で、ロボットを動かせる。
3) costmap_converter と言うのがある。
teb_local_planner で使っているみたいだが、これだと、local_costmap (nav_msgs/OccupancyGrid) を利用するのに役立ちそう。
注) stanalone node でも使えるとのこと。
変換形式が4つある。
i)CostmapToPolygonsDBSMCCH
ii)CostmapToPolygonsDBSConcaveHull
iii)CostmapToLinesDBSMCCH
iv)CostmapToLinesDBSRANSAC
どれか、使えそう。
4) rtabmap_ros / point_cloud_xyz 出力の 'cloud' を、local_costmapで使うときの注意。
この場合の /cloud topic を、local_costmap で使うときは、obstacle_layer を使わないと良くないみたい。
voxel_layer だと、うまく取れないみたい。コッホ!!
yaml ファイルの抜粋。
7. メモ。
前回までの記事