[ROS 2 入門]  ROS 2 Humble を使った TurtleBot3 シミュレーション手順 (Ubuntu 22.04.4 LTS)

# What's ROS?
ROS (Robot Operating System) は、ロボットアプリケーションを
構築するためのソフトウェアライブラリとツールのセットです。

- [ROS2ではじめよう 次世代ロボットプログラミング](https://learn.microsoft.com/ja-jp/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package)

# ROS ディストリビューション
``Foxy`` とか、``Humble`` とか、``Iron`` とか... ROS 2 の情報を検索すると、出てくるコードネームについて。これは、ROS ディストリビューションの名前で、ディストリビューションとはバージョン管理された ROS 2 パッケージのセットです。ROS 2 の ``2`` がバージョンのことだと思っていましたが、ROS 2 の中でも更に細かくバージョンが分かれていて、現状最新リリースは ``Iron Irwini`` のようですが、EOL が 2024/11 になっていて、``Humble Hawksbill`` は一つ前のリリースだけど、2027/5 までサポートされるようなので、これから始める人は ``Humble`` を使うのが良さそう。というか、現在サポートされているのは ``Iron`` か ``Humble`` だけなので、これから勉強するなら ``Humble`` 一択というところでしょうか。ROS 2 初心者なので... 他の開発者の方の温度感は分かりませんが。

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/72e540b7-e22b-e719-77a7-f7042cd37bc8.png)
>
> [ROS 2 Documentation - List of Distributions](https://docs.ros.org/en/foxy/Releases.html) より引用

ちなみに、ROS 2 公式サイトの左下から ROS 2 のディストリビューションを選択できます。

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/bca3648a-4826-1af6-9de4-5437c62718fc.png)

ROS 2 で検索すると、``foxy`` になった状態で引っかかったりするので、ドキュメントを読む場合は ``Humble`` になっているか確認してから進めるよう注意が必要です。検証を始めた段階で ``Foxy`` と ``Humble`` の違いを理解しておらず、``Foxy`` と ``Humble`` のドキュメントを行ったり来たりして、混乱しました。

# 検証環境

本記事の検証環境は以下の通りです。

- 開発PC ( OS: ``Windows 11 Pro`` / OSビルド: ``22631.2861`` )
- WSL2 ( バージョン: ``2.1.5.0`` )
  - Linux ディストリビューション: ``Ubuntu 22.04.4 LTS``
- Visual Studio Code: ``1.88.1``

# ROS 2 環境構築手順
まだ WSL2 (Windows Subsystem for Linux) がインストールされていない場合は、
ROS2 インストール前に WSL2 インストールして Linux 環境を準備します。

## WSL2 & Ubuntu インストール

WSL のバージョンを確認する。

```terminal
> wsl --version

WSL バージョン: 2.1.5.0
カーネル バージョン: 5.15.146.1-2
...
```

- コマンドプロンプト or Powershell を管理者権限で開く
- Windows Subsystem for Linux を有効化、Linux ディストリビューションをインストールします


```terminal
> wsl --install -d Ubuntu
```

上記コマンドを実行すると、Linux ディストリビューション: ``Ubuntu`` がインストールされます。
もし Ubuntu 以外のディストリビューションをインストールする場合は、
``wsl --list --online`` コマンドを実行することで、オンラインストアから
ダウンロード可能な Linux ディストリビューション一覧を取得することができます。

```terminal
> wsl --list --online

インストールできる有効なディストリビューションの一覧を次に示します。
'wsl.exe --install <Distro>' を使用してインストールします。

NAME                                   FRIENDLY NAME
Ubuntu                                 Ubuntu
Debian                                 Debian GNU/Linux
kali-linux                             Kali Linux Rolling
Ubuntu-18.04                           Ubuntu 18.04 LTS
Ubuntu-20.04                           Ubuntu 20.04 LTS
Ubuntu-22.04                           Ubuntu 22.04 LTS
OracleLinux_7_9                        Oracle Linux 7.9
OracleLinux_8_7                        Oracle Linux 8.7
OracleLinux_9_1                        Oracle Linux 9.1
openSUSE-Leap-15.5                     openSUSE Leap 15.5
SUSE-Linux-Enterprise-Server-15-SP4    SUSE Linux Enterprise Server 15 SP4
SUSE-Linux-Enterprise-15-SP5           SUSE Linux Enterprise 15 SP5
openSUSE-Tumbleweed                    openSUSE Tumbleweed
```

インストール済みの Linux ディストリビューションを確認する

```terminal
> wsl --list --verbose

NAME                   STATE           VERSION
Ubuntu                 Running         2
```

``wsl --install -d Ubuntu`` コマンドで Ubuntu をインストールした後、
初回起動時にユーザー名とパスワードを設定します。

次回以降の起動時は Windows Terminal から Ubuntu を指定するか、
``wsl -d Ubuntu -u {UserName}`` でログインすることができます。

インストールした Ubuntu の OS バージョンを確認します。

```terminal
$ cat /etc/os-release

PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
```

WSL の DNS 設定を上書きするため、```.wslconfig``` を作成します。
コマンドプロンプトから ``C:\Users\<username>\.wslconfig`` ファイルを作成します。
※ WSL では ``/etc/resolv.conf`` ファイルが自動生成される。

```terminal
> code .wslconfig
```

```.wslconfig
[wsl2]
dnsTunneling=true
```

[WSL2のDNS問題をいい感じに解決する(2024)](https://zenn.dev/99no_exit/articles/e05c8536c86248) の記事がとても参考になりました。

WSL2 で実行中のすべてのディストリビューションと WSL2 の仮想マシンを停止するには、以下のコマンドを使用します。

```terminal
> wsl --shutdown
```

もし特定のディストリビューションだけを停止したい場合は、[``shutdown``](https://learn.microsoft.com/ja-jp/windows/wsl/basic-commands#shutdown) オプションではなく、[``terminate``](https://learn.microsoft.com/ja-jp/windows/wsl/basic-commands#terminate) オプションを使用します。

```terminal
> wsl --terminate Ubuntu (Distribution Name)
```

セットアップ手順とは関係ないですが、[IPアドレスの確認方法](https://learn.microsoft.com/ja-jp/windows/wsl/basic-commands#identify-ip-address) も貼っておきます。

## ROS2 パッケージのインストール

- Ubuntu の **言語と地域の設定 (ロケール設定)** を行う


```terminal
$ locale  # check for UTF-8

$ sudo apt update && sudo apt install locales
$ sudo locale-gen en_US en_US.UTF-8
$ sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
$ export LANG=en_US.UTF-8

$ locale  # verify settings
```


```terminal
# add-apt-repository コマンドをインストールする
$ sudo apt install software-properties-common

# repository を追加する
$ sudo add-apt-repository universe
```

※ add-apt-repository コマンドでリポジトリを追加する仕組みについては [APT: Advanced Packaging Tool](https://ryonakagami.github.io/2020/12/20/packages-manager-apt-command/#apt-advanced-packaging-tool) に詳しく記載されています。

- パッケージリストの更新 と curl のインストール


```terminal
$ sudo apt update && sudo apt install curl -y
```

install の -y オプションはインストール実行時に入力が必要な場合は yes と入力すると同義で、パッケージインストールを自動化する際などに用いられるオプション。

- ROS2 GPG Key の取得
GPG Key とは、「GnuPG」(GNU Privacy guard) という暗号化ソフトで生成される公開鍵。Linux では、GPGキーを用いて、apt コマンドや yurn コマンドをつかてインターネットから入手できるパッケージが正しい配布先のものかどうかのチェックなどに利用されている。

```terminal
$ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
```

- ソースリストにリポジトリを追加する

```terminal
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
```

- リポジトリを追加したので、パッケージの更新を行う

```terminal
$ sudo apt update && sudo apt upgrade
```

- GUI ツールのインストール

```terminal
$ sudo apt install ros-humble-desktop
```


- No GUI ツールのインストール

```terminal
$ sudo apt install ros-humble-ros-base
```


- 開発ツールのインストール

```terminal
$ sudo apt install ros-dev-tools
```


- 環境のセットアップ
.bash スクリプトを実行して、環境セットアップを実行します。

```terminal
$ source /opt/ros/humble/setup.bash
```


```/opt/ros/humble/setup.bash
# copied from ament_package/template/prefix_level/setup.bash

AMENT_SHELL=bash

# source setup.sh from same directory as this file
AMENT_CURRENT_PREFIX=$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" && pwd)
# trace output
if [ -n "$AMENT_TRACE_SETUP_FILES" ]; then
  echo "# . \"$AMENT_CURRENT_PREFIX/setup.sh\""
fi
. "$AMENT_CURRENT_PREFIX/setup.sh"
```

- [Installation - ROS 2 Documentation: Humble](https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html)

### Linux コマンド一覧

| コマンド | 概要 |
| --- | --- |
| [locale](https://atmarkit.itmedia.co.jp/ait/articles/1812/06/news038.html) | 言語と地域の設定を行うためのコマンド |
| [sudo](https://atmarkit.itmedia.co.jp/ait/articles/1611/28/news036.html) | スーパーユーザー (root) の権限が必要なコマンドを実行する |  |
| [apt](https://atmarkit.itmedia.co.jp/ait/articles/1708/31/news017.html) | Debian系のディストリビューションに使われているパッケージ管理用のコマンド |
| [source](https://atmarkit.itmedia.co.jp/ait/articles/1712/21/news015.html) | ファイルに書かれたコマンドを現在のシェルで実行するコマンド。主にシェルの設定ファイルを反映させる際に使用する。 |
| [clear](https://atmarkit.itmedia.co.jp/ait/articles/1903/14/news026.html) | 表示内容をクリアするコマンド。画面に表示されている文字を消して、プロンプトは画面の一行目に表示されます。 |
| [export](https://atmarkit.itmedia.co.jp/ait/articles/1801/12/news015.html) | 環境変数やシェル変数を設定するコマンド |
| [printenv](https://atmarkit.itmedia.co.jp/ait/articles/1801/11/news008.html) | 環境変数の内容を表示するコマンド |
| [pwd](https://atmarkit.itmedia.co.jp/ait/articles/1712/14/news021.html) | カレントディレクトリの名称を表示するコマンド |
| [history](https://atmarkit.itmedia.co.jp/ait/articles/1710/20/news015.html) | コマンド入力の履歴 (ヒストリー) を表示するコマンド |
| [grep](https://atmarkit.itmedia.co.jp/ait/articles/1604/15/news019.html) | パイプ と組み合わせて、他のコマンドの出力結果から必要な個所だけを絞り込んで表示する際に使用するコマンド |

# TurtleBot 3 とは？

> TurtleBotはROSの標準プラットフォームロボットです。Turtleは、1967年に教育用コンピュータプログラミング言語Logoで制御されたTurtleロボットに由来しています。また、ROSの基本チュートリアルで最初に登場するturtlesimノードは、Logoのturtleプログラムのコマンドシステムを模倣したプログラムです。これはまた、ROSのシンボルとしてTurtleアイコンを作成するために使用されます。ROSロゴに使用される9つの点は、亀の背甲から派生しています。LogoのTurtleから派生したTurtleBotは、ROSに新規参入者に簡単に教えることを目的として設計されており、また、Logoを使用してコンピュータプログラミング言語を教えることもできます。それ以来、TurtleBotは、開発者や学生の間で最も人気のあるプラットフォームであるROSの標準プラットフォームとなっています。
>
> TurtleBotモデルには3つのバージョンがあります。TurtleBot1は、iRobotのRoombaベースの研究用ロボットCreateの上に、Willow GarageのTully（Open Roboticsのプラットフォームマネージャー）とMelonee（Fetch RoboticsのCEO）によって開発され、ROS展開のために開発されました。これは2010年に開発され、2011年から販売されています。2012年に、Yujin Robotによって、研究用ロボットiClebo KobukiをベースにしたTurtleBot2が開発されました。2017年には、TurtleBot3が前身の不足している機能とユーザーの要望を補完する機能を備えて開発されました。TurtleBot3は、駆動にROBOTISスマートアクチュエータDYNAMIXELを採用しています。TurtleBotシリーズの詳細については、以下のリンクを参照してください。
>
> **TurtleBot3は、教育、研究、趣味、および製品のプロトタイピングに使用される、小型で手頃な価格の、プログラム可能な、ROSベースのモバイルロボット** です。TurtleBot3の目標は、プラットフォームのサイズを大幅に削減し、価格を下げることなく機能性と品質を犠牲にすることなく、拡張性を提供することです。TurtleBot3は、機械部品を再構築する方法や、コンピュータやセンサなどのオプション部品を使用する方法によって、さまざまな方法でカスタマイズできます。また、TurtleBot3は、頑丈な組み込みシステムに適した、コスト効果の高い小型のSBC、360度距離センサー、3Dプリント技術を採用して進化しています。
>
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/5df6afb9-6c37-0586-5869-5fcef19ca5a3.png)
> [ROBOT Shop](https://e-shop.robotis.co.jp/product.php?id=265) より画像引用 (OpenManipulator)
> **TurtleBot3のコア技術はSLAM、Navigation、Manipulationであり、家庭用サービスロボットに適しています。** TurtleBotは、SLAM（同時位置同定と地図作成）アルゴリズムを実行して地図を作成し、部屋の中を移動することができます。また、ラップトップ、ジョイパッド、またはAndroidベースのスマートフォンからリモートで制御することもできます。TurtleBotは、部屋の中を歩く人の脚に従うこともできます。また、**TurtleBot3は、OpenMANIPULATORのようなマニピュレータを取り付けることで、物体を操作することができるモバイルマニピュレータとしても使用できます。** OpenMANIPULATORは、TurtleBot3 Waffle と Waffle Pi と互換性があります。この互換性により、TurtleBot3が持つSLAMとナビゲーション機能により、自由度の不足を補うことができ、サービスロボットとしての完成度が向上します。
>
> [What is TurtleBot?](https://emanual.robotis.com/docs/en/platform/turtlebot3/overview/#overview) 本文を ChatGPT で日本語訳

# TurtleBot3 ハードウェア仕様

| デバイス名 | 画像 |
| --- | --- |
| TurtleBot3 Burger | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/8b5a9d45-e2bc-f569-33dd-87c8a8dcbffe.png) |
| TurtleBot3 Waffle Pi | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/d5c25e1b-893c-141f-0b6f-1abb914eff14.png) |

- [Hardware Specifications](https://emanual.robotis.com/docs/en/platform/turtlebot3/features/#components)


# TurtleBot3 の主な機能
TurtleBot3 の 主な機能は以下3つです。

- SLAM
- Navigation
- Manipulator


| 機能 | 説明 |
| --- | --- |
| SLAM | SLAM（Simultaneous Localization and Mapping）は、**任意の空間で現在の位置を推定して地図を作成する技術** です。 |
| Navigation | ナビゲーションは、与えられた環境内でロボットを現在地から指定された目的地まで移動させることです。このためには、与えられた環境の家具、物体、壁などの幾何学情報を含むマップが必要です。マップはセンサーによって取得された距離情報とロボット自身の位置情報によって作成されます。ナビゲーションは、**マップ、ロボットのエンコーダ、IMUセンサ、距離センサを使用して、ロボットを現在の姿勢からマップ上の指定された目標姿勢まで移動させること** です。 |
| Manipulator | ROBOTIS の OpenMANIPULATOR-X は、ROSプラットフォームをサポートするマニピュレータの1つであり、DYNAMIXELアクチュエータと3Dプリントされた部品を使用して低コストで簡単に製造することができる利点があります。**OpenMANIPULATOR-X は、TurtleBot3 Waffle と Waffle Pi と互換性があるという利点があります。** この互換性により、TurtleBot3の持つSLAMとナビゲーション機能とともに、自由度の不足を補うことができ、より完成度の高いサービスロボットとして機能することができます。 |

# TurtleBot3 セットアップ (PC)

## 前提条件

- WSL2 で Ubuntu 22.04 LTS 環境をセットアップ済みであること
- ROS 2 Humble パッケージをインストール & 初期セットアップ済みであること

## 手順

ROS 2 の依存パッケージをインストールする
(Gazebo, Cartographer, Navigation2)


```terminal
$ sudo apt install ros-humble-gazebo-*
```

```terminal
$ sudo apt install ros-humble-cartographer
$ sudo apt install ros-humble-cartographer-ros
```

```terminal
$ sudo apt install ros-humble-navigation2
$ sudo apt install ros-humble-nav2-bringup
```

TurtleBot3 パッケージをインストールする

```terminal
$ source ~/.bashrc
$ sudo apt install ros-humble-dynamixel-sdk
$ sudo apt install ros-humble-turtlebot3-msgs
$ sudo apt install ros-humble-turtlebot3
```

環境変数の export を .bashrc に追加 & 適用

```terminal
$ echo 'export ROS_DOMAIN_ID=30 #TURTLEBOT3' >> ~/.bashrc
$ source ~/.bashrc
```

- [ROBOTS | Quick Start Guide | 3.1 PC Setup](https://emanual.robotis.com/docs/en/platform/turtlebot3/quick-start/)

# TurtleBot3 Simulation

## シミュレーションパッケージのインストール
シミュレーション用のパッケージをインストールします。
※ シミュレーションを動作させるためには、``turtlebot3`` と ``turtlebot3_msgs`` パッケージが必要となります。(PC セットアップ手順にインストール方法記載あり)

```terminal
$ mkdir -p ~/turtlebot3_ws/src
$ cd ~/turtlebot3_ws/src
$ git clone -b humble-devel https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git
```

```terminal
$ cd ~/turtlebot3_ws && colcon build --symlink-install

Starting >>> turtlebot3_fake_node
Starting >>> turtlebot3_gazebo
Finished <<< turtlebot3_fake_node [0.09s]
Finished <<< turtlebot3_gazebo [11.3s]
Starting >>> turtlebot3_simulations
Finished <<< turtlebot3_simulations [0.08s]

Summary: 3 packages finished [11.5s]
```

## シミュレーター (Gazebo) の起動

```
$ export TURTLEBOT3_MODEL=waffle
$ ros2 launch turtlebot3_gazebo empty_world.launch.py
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/777d169d-07f8-6798-08c0-c394b373d11e.png)

新しいターミナルを開き、``turtlebot3_teleop`` を実行します。

```terminal
$ export TURTLEBOT3_MODEL=waffle
$ ros2 run turtlebot3_teleop teleop_keyboard

ros2 run turtlebot3_teleop teleop_keyboard

Control Your TurtleBot3!
---------------------------
Moving around:
        w
   a    s    d
        x

w/x : increase/decrease linear velocity (Burger : ~ 0.22, Waffle and Waffle Pi : ~ 0.26)
a/d : increase/decrease angular velocity (Burger : ~ 2.84, Waffle and Waffle Pi : ~ 1.82)

space key, s : force stop

CTRL-C to quit
```

Gazebo でシミュレートされた Waffle をキーボードで操作することができます。

| キーボード入力 | アクション | 
| --- | --- |
| w | 前進 |
| s | 停止 |
| x | 後進 |
| a | 左回転 |
| d | 右回転 |

- [TurtleBot3 | Simulation](https://emanual.robotis.com/docs/en/platform/turtlebot3/simulation/)

# Navigation 用の Map を作成する

Gazebo で turtlebot3_world を起動する

```
$ export TURTLEBOT3_MODEL=waffle
$ ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/9122332f-84a2-b0fc-39e3-cf87c1273390.png)


続いて、SLAM ノードを起動します。
RViz が立ち上がる。

```
$ export TURTLEBOT3_MODEL=waffle
$ ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True
```

teleop で map 生成のために waffle を動かす

```terminal
$ export TURTLEBOT3_MODEL=waffle
$ ros2 run turtlebot3_teleop teleop_keyboard
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/f012ff55-a302-0508-2e2f-62d9a204f848.png)

map データを保存する

```
$ ros2 run nav2_map_server map_saver_cli -f ~/map
```

# Navigation を試してみる

- turtlebot3_world を起動する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/4a08a9df-afe4-f224-95d3-9b2e177991ba.png)

```
$ export TURTLEBOT3_MODEL=waffle
$ ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
```

- SLAM ノードを起動する

:::note warn
公式ドキュメントでは省略されているが、SLAM (RViz) を立ち上げないと、
Navigation ノード に SLAM データが送信されないため、
Navigation ノード (RViz) で map データを読み込めないエラーが発生する。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/bec31fed-4be5-25ec-1cef-01c1cd34345e.png)

```
$ export TURTLEBOT3_MODEL=waffle
$ ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True
```

- Navigation ノードを起動する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/12f5de2d-ce0c-52ff-5a80-a31c55dd9928.png)

```
$ ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=True map:=$HOME/map.yaml
```

- Navigation ノード (RViz) の [2D Pose Estimate] ツールで初期位置を調整する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/bbf71420-e051-a704-7267-17ede926850f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/5390f241-4acc-315e-a3c8-e146d2574efa.png)

- Navigation ノード (RViz) の [Nav2 Goal] ツールで移動させたい場所と向きをセットする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/cb97c509-9479-e270-7fbb-2ee99ae05ea6.png)

Gazebo の Waffle を [Nav2 Goal] で設定した場所まで自律走行させることができました👏

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/9068dd94-70cf-c913-ba35-1ad91302d7c8.png)


# TurtleBot3 実機接続

SSH で TurtleBot3 の Raspberry Pi へ接続する

```terminal
> ssh ubuntu@{IP_ADDRESS_OF_RASPBERRY_PI}
```

Remote PC とのデータ通信をするには、
TurtleBot3 上で ``bringup`` コマンドを実行する必要がある。


- [TurtleBot3 SLAM](https://emanual.robotis.com/docs/en/platform/turtlebot3/slam/#run-slam-node)


# トラブルシューティング
## WSL2 
"WSL2 を実行するには、カーネルコンポーネントの更新が必要です。詳細については https://aka.ms/wsl2kernel を参照してください" メッセージが表示された場合の対処法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/7a298cff-2c00-95ee-1476-13ae0a5076d4.png)

以下、Update コマンドを利用して Linux カーネル更新プログラムを更新する。

```terminal
> wsl --update
```

[Linux カーネル更新プログラムパッケージをインストールする](https://learn.microsoft.com/ja-jp/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package)

## Gazebo

### colcon Build --symlink-install でエラーが発生する場合 (1)

**エラー内容**
```terminal
$ cd ~/turtlebot3_ws && colcon build --symlink-install

Starting >>> turtlebot3_fake_node
Starting >>> turtlebot3_gazebo
--- stderr: turtlebot3_fake_node
CMake Error at CMakeLists.txt:18 (find_package):
  By not providing "Findament_cmake.cmake" in CMAKE_MODULE_PATH this project
  has asked CMake to find a package configuration file provided by
  "ament_cmake", but CMake did not find one.

  Could not find a package configuration file provided by "ament_cmake" with
  any of the following names:

    ament_cmakeConfig.cmake
    ament_cmake-config.cmake

  Add the installation prefix of "ament_cmake" to CMAKE_PREFIX_PATH or set
  "ament_cmake_DIR" to a directory containing one of the above files.  If
  "ament_cmake" provides a separate development package or SDK, be sure it
  has been installed.


---
Failed   <<< turtlebot3_fake_node [0.78s, exited with code 1]
Aborted  <<< turtlebot3_gazebo [0.79s]

Summary: 0 packages finished [0.89s]
  1 package failed: turtlebot3_fake_node
  1 package aborted: turtlebot3_gazebo
  2 packages had stderr output: turtlebot3_fake_node turtlebot3_gazebo
  1 package not processed
```

**解決策**
ROS 2 Humble の ``setup.bash`` を実行する

```
$ source /opt/ros/humble/setup.bash
```

[Problem with Turtlebot3 in Dockerfile: CMake Error at CMakeLists.txt](https://answers.ros.org/question/402750/problem-with-turtlebot3-in-dockerfile-cmake-error-at-cmakeliststxt/)

### colcon Build --symlink-install でエラーが発生する場合 (2)

**エラー内容**

```terminal
$ cd ~/turtlebot3_ws && colcon build --symlink-install

Starting >>> turtlebot3_fake_node
Starting >>> turtlebot3_gazebo
Finished <<< turtlebot3_fake_node [9.14s]
--- stderr: turtlebot3_gazebo
CMake Warning (dev) at /usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:438 (message):
  The package name passed to `find_package_handle_standard_args` (PkgConfig)
  does not match the name of the calling package (gazebo).  This can lead to
  problems in calling code that expects `find_package` result variables
  (e.g., `_FOUND`) to follow a certain pattern.
Call Stack (most recent call first):
  /usr/share/cmake-3.22/Modules/FindPkgConfig.cmake:99 (find_package_handle_standard_args)
  /usr/lib/x86_64-linux-gnu/cmake/gazebo/gazebo-config.cmake:72 (include)
  CMakeLists.txt:23 (find_package)
This warning is for project developers.  Use -Wno-dev to suppress it.

---
Finished <<< turtlebot3_gazebo [21.2s]
Starting >>> turtlebot3_simulations
Finished <<< turtlebot3_simulations [0.77s]

Summary: 3 packages finished [22.2s]
  1 package had stderr output: turtlebot3_gazebo
```

**解決策**
Gazebo の CMakeList.txt で指定されているパッケージ名を修正する

```
$ vi ~/turtlebot3_ws/src/turtlebot3_simulations/turtlebot3_gazebo/CMakeLists.txt
```

```CMakeLists.txt
- find_package(gazebo REQUIRED)
+ find_package(gazebo_ros REQUIRED)
```

[Docker環境上でROS2 Humble＋TB3のGazeboシミュレーションする](https://pseudowire.hatenablog.com/entry/2023/08/01/094715) 
↑記事を参考にさせていただきました。


### Gazebo 起動時にエラーが発生する場合

もし gazebo が認識されていない場合は、以下サイトを参考に
``source ~/turtlebot3_ws/install/setup.bash`` ファイルを実行してみてください。

- [Cannot find turtlebot3_gazebo on ROS2 humble on 22.04](https://robotics.stackexchange.com/questions/103623/cannot-find-turtlebot3-gazebo-on-ros2-humble-on-22-04)
- [Gazebo Answers | Gazebo crashes, Assertion `px != 0' failed](https://answers.gazebosim.org//question/7173/gazebo-crashes-assertion-px-0-failed/)

### gzclient プロセスが強制終了する場合

自分の環境で試したところ、[ERROR][gzclient-2]: process has died が表示され、gazebo を起動する前にプロセスが強制終了する事象が発生しました。

```terminal
$ ros2 launch turtlebot3_gazebo empty_world.launch.py

[INFO] [launch]: All log files can be found below /home/futo23/.ros/log/2024-04-24-11-09-56-897550-PC1346-15223
[INFO] [launch]: Default logging verbosity is set to INFO
urdf_file_name : turtlebot3_burger.urdf
urdf_file_name : turtlebot3_burger.urdf
[INFO] [gzserver-1]: process started with pid [15227]
[INFO] [gzclient-2]: process started with pid [15229]
[INFO] [robot_state_publisher-3]: process started with pid [15231]
[INFO] [spawn_entity.py-4]: process started with pid [15233]
[robot_state_publisher-3] [INFO] [1713924597.469949780] [robot_state_publisher]: got segment base_footprint
[robot_state_publisher-3] [INFO] [1713924597.470458448] [robot_state_publisher]: got segment base_link
[robot_state_publisher-3] [INFO] [1713924597.470470743] [robot_state_publisher]: got segment base_scan
[robot_state_publisher-3] [INFO] [1713924597.470473200] [robot_state_publisher]: got segment caster_back_link
[robot_state_publisher-3] [INFO] [1713924597.470475429] [robot_state_publisher]: got segment imu_link
[robot_state_publisher-3] [INFO] [1713924597.470477311] [robot_state_publisher]: got segment wheel_left_link
[robot_state_publisher-3] [INFO] [1713924597.470479114] [robot_state_publisher]: got segment wheel_right_link
[spawn_entity.py-4] [INFO] [1713924597.662729741] [spawn_entity]: Spawn Entity started
[spawn_entity.py-4] [INFO] [1713924597.662940642] [spawn_entity]: Loading entity XML from file /home/futo23/turtlebot3_ws/install/turtlebot3_gazebo/share/turtlebot3_gazebo/models/turtlebot3_burger/model.sdf
[spawn_entity.py-4] [INFO] [1713924597.663363103] [spawn_entity]: Waiting for service /spawn_entity, timeout = 30
[spawn_entity.py-4] [INFO] [1713924597.663515798] [spawn_entity]: Waiting for service /spawn_entity
[spawn_entity.py-4] [INFO] [1713924602.923990663] [spawn_entity]: Calling service /spawn_entity
[gzserver-1] [INFO] [1713924603.131798633] [turtlebot3_imu]: <initial_orientation_as_reference> is unset, using default value of false to comply with REP 145 (world as orientation reference)
[spawn_entity.py-4] [INFO] [1713924603.169880747] [spawn_entity]: Spawn status: SpawnEntity: Successfully spawned entity [burger]
[gzserver-1] [INFO] [1713924603.282025475] [turtlebot3_diff_drive]: Wheel pair 1 separation set to [0.160000m]
[gzserver-1] [INFO] [1713924603.282118706] [turtlebot3_diff_drive]: Wheel pair 1 diameter set to [0.066000m]
[gzserver-1] [INFO] [1713924603.282989512] [turtlebot3_diff_drive]: Subscribed to [/cmd_vel]
[gzserver-1] [INFO] [1713924603.284359776] [turtlebot3_diff_drive]: Advertise odometry on [/odom]
[gzserver-1] [INFO] [1713924603.286126733] [turtlebot3_diff_drive]: Publishing odom transforms between [odom] and [base_footprint]
[gzserver-1] [INFO] [1713924603.291833336] [turtlebot3_joint_state]: Going to publish joint [wheel_left_joint]
[gzserver-1] [INFO] [1713924603.291876853] [turtlebot3_joint_state]: Going to publish joint [wheel_right_joint]
[INFO] [spawn_entity.py-4]: process has finished cleanly [pid 15233]
[gzclient-2] D3D12: Removing Device.
[ERROR] [gzclient-2]: process has died [pid 15229, exit code -7, cmd 'gzclient'].
```

- [Starting ROS Issue | reddit](https://www.reddit.com/r/ROS/comments/1b1tv7e/starting_ros_issue/?rdt=40688)
- [OpenGL accelerated rendering in WSLg](https://github.com/microsoft/wslg?tab=readme-ov-file#opengl-accelerated-rendering-in-wslg)

``LIBGL_ALWAYS_SOFTWARE=1`` 環境変数を設定して CPU レンダリングを強制する

```
export LIBGL_ALWAYS_SOFTWARE=1
```

- [Running RViz with WSL2](https://docs.ros.org/en/rolling/How-To-Guides/Installation-Troubleshooting.html#running-rviz-with-wsl2)

必要に応じて WSL の仮想マシンに割り当てるメモリの設定を追加します。
なんの設定もしないまま試してみると、Gazebo は起動したものの、WSL関連のプロセスが CPU 使用率 100% まで圧迫し、PC に高負荷がかかってしまったので、``.wslconf`` にて memory 設定を追加することで、CPU 使用率を制御することができました。

- [WSL が使うメモリ (VmmemWSL) を制限する](https://bftnagoya.hateblo.jp/entry/2023/02/08/091138)

```.wslconfig
[wsl2]
dnsTunneling=true
memory=16GB
```

# 参考文献
- [WSL を使用して Windows に Linux をインストールする方法](https://learn.microsoft.com/ja-jp/windows/wsl/install)
- [ROS2 Nav2 - Navigation Stack in 1 Hour [Crash Course])](https://www.youtube.com/watch?v=idQb2pB-h2Q)
- [進化を止めないROSは「ROS2」へ移行を加速、デジタルツイン対応も進む](https://monoist.itmedia.co.jp/mn/articles/2312/13/news011.html)
- [Windows Subsystem for Linux September 2023 update](https://devblogs.microsoft.com/commandline/windows-subsystem-for-linux-september-2023-update/)
- [散々苦しめられた、WSL2の Could not resolve host 問題](https://zenn.dev/99no_exit/articles/e05c8536c86248)

※ インストール済みの Linux ディストリ―ビューションを削除する場合は、
[設定] > [アプリ] > [インストールされているアプリ] から削除することができます。
Microsoft Store から Uninstall は不可。