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

# はじめに

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

# 動作環境


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

# TurtleBot3の環境構築

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

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

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


```bash
$ 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
```

パッケージのビルド

```bash
$ colcon build --symlink-install
```

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

```bash
$ sudo apt install ros-foxy-dynamixel-sdk
```

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

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

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

```bash
$ 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が起動するまで最初は時間がかかります。

```bash
$ ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
```

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

![Screenshot from 2021-03-07 16-51-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/e252739b-5b17-5da6-9ab9-86a5bdd5cb61.png)


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

![Screenshot from 2021-03-01 19-34-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/dc6684a3-375a-e4bd-576b-43b33a0f17ff.png)


# Navigation2のインストール

以下でインストール

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

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

```bash
$ 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 シミュレーションを起動

```bash
$ ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
```

Navigation2の実行

```bash
$ ros2 launch turtlebot3_navigation2 navigation2.launch.py
```

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

![rviz_screenshot_2021_03_06-22_00_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/70aa9c5c-eba5-71d1-0192-439f1b06333f.png)

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

![Videotogif (5)](https://user-images.githubusercontent.com/14184141/110235541-e7b07580-7f73-11eb-9dd7-f8d350f35797.gif)



# おわりに

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

https://navigation.ros.org/getting_started/index.html

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

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



# 参考

https://emanual.robotis.com/docs/en/platform/turtlebot3/simulation/#gazebo-simulation

https://ubuntu.com/blog/simulate-the-turtlebot3

https://navigation.ros.org/getting_started/index.html

# おまけ

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

トピック一覧

```bash
$ ros2 topic list
```

```bash
/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
```

ノード一覧

```bash
$ ros2 node list
```

```bash
/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

```bash
$ rqt_graph
```

![rosgraph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/4cf0b4c8-2246-1764-d2a5-4ef7bd3290ce.png)


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