WSL2 + rocker を用いたROS2開発のための環境構築

# 免責事項
- 筆者は本記事の掲載内容を用いて行う一切の行為について, 何らの責任を負うものではありません.  
- 本記事を公開するにあたり, 掲載されている情報の正確性については万全を期しておりますが, 筆者は掲載内容の正確性・完全性・信頼性・最新性を保証するものではありません.  
- 筆者はリンク先サイトについて, その掲載情報の正確性･合法性等を保証するものではありません. リンク先サイトの利用によって生じた問題に対して筆者は責任を負いません.
# Introduction
この記事では Windows 10 上で WSL2 と Docker Desktop を使って ROS2 の開発を行うための環境を構築する手順を説明する.  
コンテナを起動するためのツールとしてrocker[^rocker]を利用している.  
なお, ROSに関しては勉強中であるため, Windows + Docker ですべての機能が使えるかどうかは未確認.  
環境に関する詳細な情報はEnvironmentに記載した.

# Abstract
1. WSL2, Docker Desktopをそれぞれインストール
    - 詳しい説明はReferenceの記事[^wsl2][^kaneko][^docker]を参照
2. Ubuntu-22.04にROS2のリポジトリを追加
    - ROS2の公式ドキュメント[^ros2]を参考に記述
3. Ubuntu-22.04にrockerをインストールして動作確認
    - rockerを使ってコンテナを起動
    - rviz2が使えることを確認

# 1. WSL2, Docker Desktopをそれぞれインストール
WSL2 と Docker Desktop をインストールして WSL2 で Docker を使える環境を構築する  

## 1.1. PowerShell上でコマンドを入力しWSL2をインストール
私の場合は以下の手順で特に問題なかったが, 何か問題が生じたときは公式ドキュメント[^wsl2]や有識者の記事[^kaneko]を参考にする
```shell
# PowerShell上で下のコマンドを実行することでインストール可能
# 終了したら再起動を求められるので再起動
# デフォルトのディストリビューションとしてUbuntuがインストールされる (はず)
wsl --install

# 別のディストリビューションが必要な場合は適宜インストール
# 今回はUbuntu-22.04をインストール
# インストールが完了するとユーザ名とパスワードの設定を求められるので設定する
wsl --install Ubuntu-22.04
```

## 1.2. Docker Desktopをインストール  
公式サイト[^docker]のインストーラを使ってインストールする.  
設定はデフォルトで問題ない.

## 1.3. Ubuntu-22.04からdockerを使えるか確認
```shell
# PowerShellで実行し, Ubuntu-22.04にログイン
wsl -d Ubuntu-22.04

# dockerコマンドが有効か確認
docker run hello-world
```


# 2. Ubuntu-22.04にROS2のリポジトリを追加
rockerをインストールするためにROS2のリポジトリを追加する  
コマンドは公式[^ros2]のドキュメントに記載されているものをそのまま持ってきた.  
WSL2のUbuntu-22.04内で以下のコマンドを実行していく.
1. 最初にロケールを設定 (ja_JP.UTF-8やその他のUTF-8でもおそらく大丈夫)
```shell
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
```
2. 次のコマンドを使って追加
```shell
# Ubuntu Universe repositoryを追加
sudo apt install software-properties-common
sudo add-apt-repository universe

# ROS2のGPGキーを取得
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

# リポジトリを追加
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
```

# 3. Ubuntu-22.04にrockerをインストールして動作確認
aptを使ってインストールし, 動作確認
```shell
sudo apt update && sudo apt install python3-rocker

# インストールできたか確認
rocker --version

# rviz2を用いて動作確認
# GPUなし
rocker --x11 osrf/ros:crystal-desktop rviz2
# GPUあり
rocker --nvidia --x11 osrf/ros:crystal-desktop rviz2
```

# Environment
## OS
Windowsで ｢設定｣ >> ｢システム｣ >> ｢詳細情報｣ で確認
| エディション | Windows 10 Home |
| :----------- | :-------------- |
| バージョン   | 22H2            |
| OSビルド     | 19045.3086      |

## WSL2 & Distribution
`wsl --version`で確認
| WSL バージョン              | 1.2.5.0                                          |
| :-------------------------- | :----------------------------------------------- |
| カーネル バージョン         | 5.15.90.1                                        |
| WSLg バージョン             | 1.0.51                                           |
| MSRDC バージョン            | 1.2.3770                                         |
| Direct3D バージョン         | 1.608.2-61064218                                 |
| DXCore バージョン           | 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp |
| Linuxディストリビューション | Ubuntu-22.04                                     |

## Docker Desktop
`docker version`で確認
| Client            |               |
| :---------------- | :------------ |
| Cloud integration | v1.0.35       |
| Version           | 24.0.2        |
| API version       | 1.43          |
| Go version        | go1.20.4      |
| OS/Arch           | windows/amd64 |
| Context           | default       |

| Server       | Docker Desktop 4.21.0 (113844) |
| :----------- | :----------------------------- |
| Engine       |                                |
| Version      | 24.0.2                         |
| API version  | 1.43 (minimum version 1.12)    |
| Go version   | go1.20.4                       |
| OS/Arch      | linux/amd64                    |
| Experimental | false                          |
| containerd   |                                |
| Version      | 1.6.21                         |
| runc         |                                |
| Version      | 1.1.7                          |
| docker-init  |                                |
| Version      | 0.19.0                         |

# Reference
[^rocker]: [GitHub - osrf/rocker: A tool to run docker containers with overlays and convenient options for things like GUIs etc.](https://github.com/osrf/rocker)
[^wsl2]: [WSL のインストール | Microsoft Learn](https://learn.microsoft.com/ja-jp/windows/wsl/install)
[^kaneko]: [WSL2 のインストール，WSL2 上への Ubuntu のインストールと利用（Windows 11 対応の記事）（Windows 上）](https://www.kkaneko.jp/tools/wsl/wsl2.html)
[^docker]: [Windows Home に Docker Desktop をインストール — Docker-docs-ja 19.03 ドキュメント](https://docs.docker.jp/docker-for-windows/install-windows-home.html)
[^ros2]: [Ubuntu (source) — ROS 2 Documentation: Humble documentation](https://docs.ros.org/en/humble/Installation/Alternatives/Ubuntu-Development-Setup.html#add-the-ros-2-apt-repository)