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

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

プログラムとしては、大体、できているので、後日 github にでも公開します。

github に公開しています。
tosa-no-onchan/turtlebot3_navi_my

具体的には、AutoMower の中に組み込んでいます。
go_auto_mower.cpp -> pro_control_mower.cpp

turtlebbot3_amcl_scan.launch.py で実行できる。
上部のコメント行に従って起動すれば、OK
  ---> go_auto_mower.launch.py

AutoMower で、障害物がない場合は、cmd_vel モードで走行して、障害物が現れたら、navi モードで走行します。
具体的には、ProControl::move_abs_auto_select() をコールして処理しています。

mulit_goals4_nav2.cpp の方にも組み込んでいます。
こちらは、navi モードと、cmd_vel モードの自動選択になります。

上記、コマンドで、自動で切りかわります。

multi_goals4_cmd_vel.cpp の方にも組み込みました。
こちらは、cmd_vel モードのみの組み込みになります。

set dumper ON を発行したあとに、RobotDriveCmd_Vel::go_abs() を実行すると、local costmap を、逐次チェックするようになります。
注) ただし、今は、このときに、障害物が現れたら、そこで、走行を終了させてしまうので、注意が必要です!!

結論を言えば、RobotDriveCmd_Vel::go_abs() で、一括して処理しています。
ここで、local costmap をチェックする thread を起動して、ロボットの進行方向にobstacle の点 が検出されたら、go_abs() を stop させます。
これだけです。

下記が、AutoMower で実行中の、Rviz2 の画像ぞね。
i) mat_bin_map: local costmap を、cv::Mat で、Binary 画像で取りこんだもの。上下逆になる。
注) resolution:0.01 -> 1 [dot] = 1[cm]
ii) mask: ロボットの前方の障害物をチェックするMask。
iii) result2: i) と ii) の And の結果。障害物が検知できたら、白dot が出てくる。

2024-09-30 17-59-18-1.jpg

このブログ記事について

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

ひとつ前のブログ記事は「市民目線の兵庫県知事のパワハラ問題について。」です。

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

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

カテゴリ

ウェブページ

サイトナビ