Gazebo turtlebot3 waffle Depth Camera Slam and real time Mapping.

Gazebo turtlebot3 waffle Depth Camera Slam and real time Mapping です。

Gazebo turtlebot3 burger Depth Camera plugin で、 Depth カメラ プラグインが使えるようになったので、
Slam and Mapping ができないかグーグルで検索していたら、
http://wiki.ros.org/rtabmap_ros が在ったので、試してみました。

それに続いて、出来上がったMap を使って、
Depth Camera (Rgb-d Camera) による、Navigation にもチャレンジしてみました!!

開発環境
OS: Ubuntu Mate 18.04
ROS: melodic
開発ツール: Visual Studio Code
Gazebo/Turtlebot3 waffle
注) waffle には、最初から Depth Camera プラグインが、入っていました。

上記 wiki ページを読みながらパッケージ導入、起動へと進みます。

1. パッケージの導入。
https://github.com/introlab/rtabmap_ros に記述があります。
  Installation > ROS distribution > Melodic
  $ sudo apt install ros-melodic-rtabmap-ros

2. Gazebo/Turtlebot3 の実行は、同じく wiki の、
  2. Tutorials > 7. Mapping and Navigation with Turtlebot に記述があります。

  上記ページの
  6.Simulation (Gazebo)
  ...
   6.1 Turtlebot3 On Melodic を行えば起動できます。

     $ export TURTLEBOT3_MODEL=waffle
     $ roslaunch turtlebot3_gazebo turtlebot3_world.launch

     $ export TURTLEBOT3_MODEL=waffle
     $ roslaunch rtabmap_ros demo_turtlebot3_navigation.launch

3. Active Mapping and Navigation の確認。
ここで、従来であれば、turtlebot3_teleop_key.launch で、 waffle を 動かして、
マップ作成、保存するのですが、今回は、そのまま、Navigation が実行できます。

Rviz の アイコン: 2D Nav Goal をクリックして、地図上の目的地をクリックします。
これで、 waffle が自動で目的地まで、移動します。

4. ある程度、地図が完成したら、MAP を保存。
$ rosrun map_server map_saver -f ~/map
で、~/map.yaml, ~/map.pgm が保存できて、
次回からは、ナビゲーションが即実行できると思います。

5. Navigation の実行。
 注) ここでは、レーザーセンサーでの実行です。
 2. の起動プログラムをすべて終了させる。
 $ export TURTLEBOT3_MODEL=waffle
 $ roslaunch turtlebot3_gazebo turtlebot3_world.launch

 $ export TURTLEBOT3_MODEL=waffle
 $ roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map.yaml

これで、Rviz の アイコン: 2D Nav Goal をクリックして、地図上の目的地をクリックすれば、waffle が自動で動くと思います。

ただし、こちらだと、新たな障害物が在っても、避ける事ができないので、どうなのか?

注1) この部分は、誤りなので、訂正します。
turtlebot3_navigation.launch でも、レーザーによる障害物の判定と、回避が行われる。とのことです。
障害物の判定の設定は、costmap の設定で、
burger であれば、
turtlebot3_navigation/param/costmap_common_params_burger.yaml
で、できるみたいです。

注2) Rviz で アイコン: 2D Nav Goal をクリックして、地図上の目的地をクリックすると、
トピック /move_base_simple/goal (geometry_msgs/PoseStamped) がパブリッシュされて、ロボットがそこへ移動する。
との事なので、プログラムから同じようにパブリッシュすれば、ロボットを動かせる気がします。

$ rostopic pub /move_base_simple/goal geometry_msgPoseStamped '{header: {stamp: now, frame_id: "map"}, pose: {position: {x: -1.36, y: 2.75, z: 0.0}, orientation: {w: 1.0}}}'

move_base に関しては、下記ページに記述がありました。
wiki.ros.org/move_base
ROS講座92 move_baseで移動する
Navigation スタックの中心パッケージとの事。

6.感想。
Turtlebot3 の 機能を、自作の車(Raspberry Pi + 3輪車)に組み込めば、かんたんに、ここまでの機能が、
実現できると言うことか?

おんちゃんの最終目標は、自動走行 の 草刈りロボットを作りたいのだが?
やはり入力センサーは、Depth カメラになると思うけど。

あと、実機では、Gazeboのシュミレーション と違って、Odometry の算出がうまく行かないと思う。
なので、マップ使用自体が、期待できないかも!!

7. Navigation のセンサー入力に関して。
http://wiki.ros.org/navigation/Tutorials/RobotSetup
の 1.3 Sensor Information (sensor sources) に、
The navigation stack uses information from sensors to avoid obstacles in the world, it assumes that
these sensors are publishing either sensor_msgs/LaserScan or sensor_msgs/PointCloud messages over ROS.
とありました。
Depth Camera(openni kinect) の sensor_msgs/PointCloud2 でも OK なのだろうか?

8. Depth Camera による、 costmap の設定。
Laser Scan Sensor に替えて Point Cloud Sensor (Depth Camera) の設定方法がありました。
wiki.ros.org/ja/navigation/Tutorials/RobotSetup
 2.3.1 Common Configuration (local_costmap) & (global_costmap)

早速、 Gazebo/Turtlebot3 Burger に取り込んでみます。

turtlebot3_navigation/param/costmap_common_params_burger.yaml

注)
sensor_frame:frame_name に何を設定するかは、camera_macro.xacro と一致させます。
  ↓
turtlebot3/turtlebot3_description/urdf/camera_macro.xacro

9. Depth Camera(Rgb-d Camera) による、Navigation の実行。
1) 起動
 $ export TURTLEBOT3_MODEL=burger
 $ roslaunch turtlebot3_gazebo turtlebot3_world_nav_nishi.launch

 $ export TURTLEBOT3_MODEL=burger
 $ roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map.yaml

2) Gazebo の画面で、通り道に、Cinder Block を置く。
Insert > Cinder Block
3) Rviz で、
 Add > By Topic > camera > depth > points > PoinCloud2
アイコン: 2D Nav Goal で目的地をクリック。

何回かぶつかるけど、なんとか、避けて動くみたい。
障害物を検知すると、青い領域が表示されるぞね!!
OK じゃ!!

注) 今日、再度試してみました。
障害物に近づいても、青の警告領域が表示されずに、障害物を回避できません。
Laser に戻して、試すと、こちらは、ちゃんと青の警告領域が表示されて、回避できます。
これは、なぜか!!

10. 再度、costmap_common_params_burger.yaml を見直しました。
turtlebot3_navigation/param/costmap_common_params_burger.yaml

 data_type: PointCloud2 にしたら、
障害物検知の青の領域がでるようになりました。
しかし、障害物を避ける動作には、もう少し改善の必要がある気がします。

注1) もう一つ、収穫がありました。
Turtlebot3 が、障害物にぶつかって、新たなルートを検出する際に、車体をくるくる、その場所で回る動作をします。
なので、実際の車体も、角のない丸い車体にしないと、この動作を妨げると思います。

注2) 更にもう一つ、発見しました。
コースに拠っては、バーガーが、バックで目的地まで進むときがありました。
これでは、進行方向が、Depth カメラに映らないので、問題か?
もっと、ナビゲーションをうごかして、このプログラムの癖を把握しないと、いけないぞね!!

ナビゲーションプログラム改善が、将来は必要になるのか?
やはり、レーザーセンサーが必要なのか!!
これは、後ろへ向かうときは、 /move_base_simple/goal (或いは、/cmd_vel) に先に向きを変えるメッセージを送って、
その後、目的地の位置データを送れば良い。のかも!!

11. Navigation を使えば、後は、 /move_base_simple/goal へ目的地の位置情報を送れば、良い。だけなので、
後は、この目的地情報をどのように決めればかの問題になりそうです。
後、実機では、位置情報の算出の問題が出てきそうです。

このブログ記事について

このページは、おんちゃんが2020年11月20日 16:13に書いたブログ記事です。

ひとつ前のブログ記事は「Gazebo turtlebot3 burger Depth Camera Program」です。

次のブログ記事は「Gazebo turtlebot3 waffle Depth Camera SLAM」です。

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

カテゴリ

ウェブページ

サイトナビ