ROS2 Foxy環境にTurtleBot3のGazeboシミュレーションをインストールしてNavigation2を動かすまで


はじめに

ROS2 Foxy環境でTurtleBot3のGazeboシミュレーションパッケージをインストールしてNavigation2を動かしたのでその手順のメモ

動作環境

項目
CPU Ryzen5
OS Ubuntu20.04.02LTS
ROS2 Foxy Fitzroy

TurtleBot3の環境構築

Gazebo関係パッケージのインストール

$ sudo apt install gazebo11 ros-foxy-gazebo-ros-pkgs

ワークスペースの作成とTutleBot3関係パッケージのインストール

$ mkdir -p ~/turtlebot3_ws/src
$ cd ~/turtlebot3_ws
$ sudo apt install python3-vcstool
$ wget https://raw.githubusercontent.com/ROBOTIS-GIT/turtlebot3/ros2/turtlebot3.repos
$ vcs import src < turtlebot3.repos

パッケージのビルド

$ colcon build --symlink-install

ビルドに失敗したら以下でdynamixel_sdkパッケージをインストールしてください

$ sudo apt install ros-foxy-dynamixel-sdk

ワークスペースの環境設定

$ echo 'source ~/turtlebot3_ws/install/setup.bash' >> ~/.bashrc

TurtleBot3のモデルの環境変数を~/.bashrcに記述
TURTLEBOT3_MODEL=にはburger, waffle, waffle_piのいずれかを指定
とりあえずburgerを使用

$ echo 'export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:~/turtlebot3_ws/src/turtlebot3/turtlebot3_simulations/turtlebot3_gazebo/models' >> ~/.bashrc
$ echo 'export TURTLEBOT3_MODEL=burger' >> ~/.bashrc
$ source ~/.bashrc

Gazeboシミュレーションの実行

以下で実行、Gazeboが起動するまで最初は時間がかかります。

$ ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

以下の用にGazeboワールドとロボットのモデルが表示されれば成功

TurtleBot3のモデルが簡単な形状になっていますがこれでいいらしいです。

Navigation2のインストール

以下でインストール

$ sudo apt install ros-foxy-navigation2
$ sudo apt install ros-foxy-nav2-bringup 

ソースからビルドする場合(最新版を使う場合こちら推奨)

$ cd ~/ros2_ws/src
$ git clone https://github.com/ros-planning/navigation2.git
$ cd navigation2
$ git checkout foxy-devel
$ cd ~/ros2_ws
$ colcon build --symlink-install

Navigation2の実行

TurtleBot3 シミュレーションを起動

$ ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

Navigation2の実行

$ ros2 launch turtlebot3_navigation2 navigation2.launch.py

rviz2が起動し、以下のような画面が表示されます。

まずrviz2上の2D Pose Estimateをクリック、地図上の初期位置をドラックして初期位置を設定します。
次にNavigation2 Goalをクリックして移動させたい位置と姿勢をドラックしてゴールを指定するとGazebo上のTurtlebot3が指定した位置に向かって動き出します。

おわりに

最初はこちらのNavigation2ドキュメントを参考にTurtleBot3パッケージをaptから取ってきてやったのですがうまくいきませんでした。

今後はNavigation2について理解していきたいと思います。

(2021/05/03 追記:最新版で上のNavigation2ドキュメント通りの方法で動くようになっていました。)

参考

おまけ

Navigation2実行時のrqt_graphやトピックを見てみます。

トピック一覧

$ ros2 topic list
/amcl/transition_event
/amcl_pose
/bt_navigator/transition_event
/clicked_point
/clock
/cmd_vel
/controller_server/transition_event
/cost_cloud
/downsampled_costmap
/downsampled_costmap_updates
/evaluation
/global_costmap/costmap
/global_costmap/costmap_raw
/global_costmap/costmap_updates
/global_costmap/footprint
/global_costmap/global_costmap/transition_event
/global_costmap/published_footprint
/global_costmap/voxel_marked_cloud
/goal_pose
/imu
/initialpose
/joint_states
/local_costmap/clearing_endpoints
/local_costmap/costmap
/local_costmap/costmap_raw
/local_costmap/costmap_updates
/local_costmap/footprint
/local_costmap/local_costmap/transition_event
/local_costmap/published_footprint
/local_costmap/voxel_grid
/local_costmap/voxel_marked_cloud
/local_plan
/map
/map_server/transition_event
/map_updates
/marker
/mobile_base/sensors/bumper_pointcloud
/odom
/parameter_events
/particle_cloud
/particlecloud
/plan
/planner_server/transition_event
/received_global_plan
/recoveries_server/transition_event
/robot_description
/rosout
/scan
/tf
/tf_static
/transformed_global_plan
/waypoint_follower/transition_event
/waypoints

ノード一覧

$ ros2 node list
/amcl
/amcl_rclcpp_node
/bt_navigator
/bt_navigator_rclcpp_node
/controller_server
/controller_server_rclcpp_node
/gazebo
/global_costmap/global_costmap
/global_costmap/global_costmap_rclcpp_node
/global_costmap_client
/lifecycle_manager_localization
/lifecycle_manager_localization_service_client
/lifecycle_manager_navigation
/lifecycle_manager_navigation_service_client
/local_costmap/local_costmap
/local_costmap/local_costmap_rclcpp_node
/local_costmap_client
/map_server
/planner_server
/planner_server_rclcpp_node
/recoveries_server
/recoveries_server_rclcpp_node
/robot_state_publisher
/rviz2
/rviz2
/rviz2
/rviz2
/transform_listener_impl_558dfb1ede70
/transform_listener_impl_55c19cce39e0
/transform_listener_impl_561e7b781750
/transform_listener_impl_5625557a28c0
/transform_listener_impl_564441e1cea0
/turtlebot3_diff_drive
/turtlebot3_imu
/turtlebot3_joint_state
/turtlebot3_laserscan
/waypoint_follower
/waypoint_follower_rclcpp_node

rqt_graph

$ rqt_graph

ROS1のNavigationではmove_baseノードにまとめられていた機能が個別のノードに分かれているためかなり複雑になっています。