ROS2のWebotsでTurtlebot3のNavigationをする

# はじめに

Gazeboの代わりにROS2で使えるシミュレータを検討していたところWebotsというロボットシミュレータを知り、
ROS2のパッケージやドキュメントも充実していたので、ROS2 Foxyにインストールしてチュートリアル通りにTurtlebot3のNavigationをしてみた


# Webotsについて

Webots自体についてはこちらの記事が詳しく書かれているので参照してください

https://qiita.com/fudekun/items/680d726ad936ea299f1f

# 動作環境

この記事は以下の環境で実行しています


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



# Webotsのインストール

こちらの通りにインストールする。
aptで一発で最新のWebots本体とROS2パッケージが入るので簡単。


https://github.com/cyberbotics/webots_ros2/wiki/Getting-Started


## インストール

```bash
$ sudo apt install ros-foxy-webots-ros2
```

Galacticの場合（動作未確認）

```bash
$ sudo apt install ros-galactic-webots-ros2
```

## デモの実行

```bash
$ ros2 launch webots_ros2_demos armed_robots.launch.py
```

以下のようにアームロボットが動いているシミュレーションが実行できたら成功

![Screenshot from 2021-08-23 22-04-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/41d9b461-a7a2-f8cf-7f03-28f2f0f8df7d.png)


# Turtlebot3のNavigation

以下のチュートリアル通りに進める

https://github.com/cyberbotics/webots_ros2/wiki/Navigate-TurtleBot3

### turtlebot3_navigation2のインストール

```bash
$ sudo apt install ros-foxy-turtlebot3-navigation2

$ sudo sed -i 's/nav2\_bringup\_launch.\py/bringup\_launch.\py/g' /opt/ros/foxy/share/turtlebot3_navigation2/launch/navigation2.launch.py
```

ソースからビルドする場合

```bash
$ source /opt/ros/foxy/local_setup.bash

$ cd /path/to/ros2_ws
$ git clone -b foxy-devel https://github.com/ROBOTIS-GIT/turtlebot3.git src/turtlebot3

$ rosdep update
$ rosdep install --from-paths src --ignore-src --rosdistro foxy

$ colcon build --packages-up-to turtlebot3_navigation2
$ source install/local_setup.bash
```


### Webotsの実行

```bash
$ ros2 launch webots_ros2_turtlebot robot_launch.py
```

Turtlebot3 Burgerが現れる
この状態で`/cmd_vel`トピックを送るとTurtlebot3が動く


![Screenshot from 2021-08-23 22-25-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/4f900799-fb33-1fb3-895e-d7a57d1b2f44.png)


### Navigation2の実行

```bash
$ export TURTLEBOT3_MODEL='burger' 
$ ros2 launch turtlebot3_navigation2 navigation2.launch.py \
    use_sim_time:=true \
    map:=$(ros2 pkg prefix webots_ros2_turtlebot --share)/resource/turtlebot3_burger_example_map.yaml
```


以下のコマンドでamclの`initialpose`を初期化、
またはrviz2の`2D Pose Estimate`ボタンをクリックして初期位置を指定。

```bash
$ ros2 topic pub --once /initialpose geometry_msgs/msg/PoseWithCovarianceStamped '{
    "header": { "frame_id": "map" },
    "pose": {
        "pose": {
            "position": { "x": 0.0, "y": 0.0, "z": 0.0 },
            "orientation": { "x": 0.0, "y": 0.0, "z": 0.0, "w": 1.0 }
        }
    }
}'
```

あとはrviz2の`Navigation2 Goal`をクリックしてマップ上のゴールを指定を指定するとTurtlebot3が指定した位置に向かって動き出す。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Webots上のTurtlebot3をNavigation2で動かす<br>tutorial通りに実行するだけなので簡単<a href="https://twitter.com/hashtag/webots?src=hash&amp;ref_src=twsrc%5Etfw">#webots</a><a href="https://twitter.com/hashtag/ROS2?src=hash&amp;ref_src=twsrc%5Etfw">#ROS2</a><a href="https://twitter.com/hashtag/Navigation2?src=hash&amp;ref_src=twsrc%5Etfw">#Navigation2</a><a href="https://t.co/FVbraTssxG">https://t.co/FVbraTssxG</a> <a href="https://t.co/vbux1cVZc3">pic.twitter.com/vbux1cVZc3</a></p>&mdash; porizou (@porizou1) <a href="https://twitter.com/porizou1/status/1429782708905938950?ref_src=twsrc%5Etfw">August 23, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>























# 参考

webots_ros2

https://github.com/cyberbotics/webots_ros2

Webots公式サイト

https://cyberbotics.com/