WSL2 で ROS2 をつかうための開発環境を構築する方法

　この記事では今後 WSL 上で ROS2 をつかった開発をするときに必要な環境構築を紹介します。ここで紹介する環境構築をすべて行うことで WSL 上の ROS2 開発が通常の Linux での ROS2 開発とおなじハードルで行えるようになるでしょう。

::: note
この記事は今後 **新たに項目を追加する** 予定です。ストックするなどして更新状況を把握しておくことをお勧めします。
:::

# もくじ

- [VSCode をインストールしてセットアップする方法](#vscode-をインストールしてセットアップする方法)
    - [VSCode をダウンロードする](#vscode-をダウンロードする)
    - [VSCode をインストールする](#vscode-をインストールする)
    - [VSCode の言語を日本語にする](#vscode-の言語を日本語にする)
        - [再起動しても VSCode が英語のままの場合](#再起動しても-vscode-が英語のままの場合)
    - [VSCode から WSL Ubuntu にログインする方法](#vscode-から-wsl-ubuntu-にログインする方法)

---

- [WSL 上のネットワークとホスト上のネットワークを同一にする方法](#wsl-上のネットワークとホスト上のネットワークを同一にする方法)
    - [Hyper-V を有効にする](#windows-home-で-hyper-v-を有効にする方法)
    - [仮想インターフェースを作成する](#仮想インターフェースを作成する)
    - [Windows Home で Hyper-V を有効にする方法](#windows-home-で-hyper-v-を有効にする方法)

# VSCode をインストールしてセットアップする方法
## VSCode をダウンロードする
　下部のリンクから <font color="blue">**VSCode**</font> をダウンロードしてきてください。リンクをクリックすると以下のようなサイトが表示されるので、一番左の <font color="blue">**Windows**</font> をクリックして **VScode インストーラー** をダウンロードします。
<img width=25% /><img width=50% src="https://i.imgur.com/QYvcN5r.png" />

https://code.visualstudio.com/download

::: note
　<font color="blue">**Windows**</font> をクリックして **VScode インストーラー** をダウンロードすると、このような画面が表示され、**VScode インストーラー** がダウンロードフォルダにダウンロードされます。**ダウンロードが完了するまでこの画面を閉じないでください。**
<img src="https://i.imgur.com/683D7WN.png" />
:::

## VSCode をインストールする
　<font color="orange">**ファイルエクスプローラー**</font> を開いて、**ダウンロード** フォルダにダウンロードされている **`VSCodeUserSetup-x64-1.93.1.exe`** をダブルクリックして VScode インストーラーを起動してください。
<img src="https://i.imgur.com/Px1LZiq.png" />
　すると画像のようなインストーラーが起動します。
　このとき、***「次へ」*** をクリックする前に <font color="red">***「同意する」*** をクリックしてください。</font>
<img width=25% /><img width=50% src="https://i.imgur.com/ImmtIJy.png" />

　***「次へ」*** をクリックしたらこのような確認を促されるので、ここも ***「次へ」*** をクリックしてください。
<img width=25% /><img width=50% src="https://i.imgur.com/uCS1H4z.png" />
　今度は **スタートメニュー** の設定です。ここも特に触れる必要はありません。***「次へ」*** をクリックしてください。
<img width=25% /><img width=50% src="https://i.imgur.com/Z64D0Kn.png" />
　次は追加オプションの設定です。おすすめとして、赤枠のチェックボックス２つにチェックを入れると、右の図のようにエクスプローラ上から選択したファイルやフォルダを指定して VScode を起動することができるようになるので、効率的に開発することができます。
<img width=5% /><img width=42.5% src="https://i.imgur.com/AYQPTqS.png" /><img width=5% /><img width=42.5% src="https://i.imgur.com/dyZbVU2.png
" /><img width=5% />

　最後に左の図の画面が表示されるので、***「インストール」*** をクリックしてください。すると **VScode** がインストールされ、中央の図の画面が表示されます。インストールが終了すると右の図の画面が表示されるので、***「終了する」*** をクリックしてください。
<img width=2.5% /><img width=30% src="https://i.imgur.com/1zYyLpO.png" /><img width=2.5% /><img width=30% src="https://i.imgur.com/FX9vt7D.png
" /><img width=2.5% /><img width=30% src="https://i.imgur.com/3QcP7Hh.png
" /><img width=2.5% />

インストーラが閉じると、このように <font color="blue">**VScode**</font> が起動します。
<img src="https://i.imgur.com/V416wqQ.png" />

## VScode の言語を日本語にする
<img width=25% /><img width=50% src="https://i.imgur.com/V416wqQ.png" />
　このように、初めて VScode を起動すると言語が英語になっています。ここでは VScode の言語を日本語に変更する方法を解説します。 
 
 ---

　VScode の左側にはいくつかのアイコンが縦に並んでいるところがあります。ここを <font color="blue">**ツールバー**</font> といいます。ツールバーの下部に **田** のようなアイコン **（拡張機能）** をクリックしてください。
<img src="https://i.imgur.com/W8vYVyS.png" />
　ツールバー横に拡張機能一覧が表示されるので、検索バーに **`Japanese`** と入力してください。すると **japanese Language Pack ...** という名前の拡張機能が候補に挙げるので、<font color="blue">***install***</font> をクリックして日本語拡張機能をインストールしてください。
<img src="https://i.imgur.com/Xb3H7Ju.png" />
　<font color="blue">***install***</font> が <font color="blue">***uninstall***</font> になったらインストール完了です。**VScode を一度閉じで終了してください。**
<img src="https://i.imgur.com/BRhwjWc.png" />

---

<img width=25% /><img width=50% src="https://i.imgur.com/Eb5Cjy8.png" />
　スタートメニューを開き、検索バーに *`VScode`* と入力すると、VScode が候補に挙がるのでもう一度起動してください。するとこのように VScode の言語が日本語になるはずです。
<img src="https://i.imgur.com/nqqcULk.png" />

::: note
### 再起動しても VScode が英語のままの場合
　VScode を再起動しても言語が英語のままの場合の対処方法を解説します。

---

　まず、VScode の ***View*** をクリックして <font color="blue">***Command Palette ...***</font> をクリックして、***「コマンドパレット」*** を起動します。

> キーボードショートカットキーで **「Control + Shift + P」** をすることで素早くコマンドパレットを開くことができます。
<img src="https://i.imgur.com/1d99Beo.png" />

パレット上に **`Display`** と入力すると、
```
Configure Display Language
```
という項目が表示されるので、ここをクリックしてください。
<img src="https://i.imgur.com/Xq4ASqY.png" />

すると言語を選択する項目が表示されるので、**日本語** をクリックしてください。
<img src="https://i.imgur.com/ILsn5jp.png" />

すると画面に <font color="blue">再起動後 VScode のデフォルト言語を日本語にするか</font> と聞かれるので ***「Restart」*** をクリックして VSCode を再起動してください。
<img src="https://i.imgur.com/qdesHq1.png" />

再起動後 VSCode の言語が日本語になります。
<img src="https://i.imgur.com/nqqcULk.png" />
:::

## VScode から WSL Ubuntu にログインする方法
　VScode から WSL Ubuntu にログインして、開発するためのセットアップと使用方法を解説します。

---

　**拡張機能** を開いて、検索バーに ***「remote develop」*** と入力してください。すると、<font color="blue"> ***\>\<*** </font> みたいなアイコンの拡張機能 ***「Remote Development」*** をインストールしてください。
<img src="https://i.imgur.com/mFaemES.png" />
 インストールボタンが「インストール済み」になったら成功です。また、ツールバーの拡張機能の下にモニターのアイコンが追加されます。
<img src="https://i.imgur.com/j96FaTC.png" />
　このモニターアイコンをクリックすると、WSL 上に存在する Ubuntu に接続する設定が開きます。
<img src="https://i.imgur.com/PsItFxO.png" />
　**WSL TARGETS** の部分に WSL 上にインストールされている Linux 一覧が表示されています。ログインしたい Linux の横にある ***「→」*** をクリックすると、現在作業しているウィンドウで Linux にログインします。
<img src="https://i.imgur.com/bQP3XpB.png" />
　Linux に無事ログインすると、VScode ウィンドウ左下の青い部分に <font color="blue"> ***WSL Ubuntu*** </font> と表示されており、今作業している VScode で WSL Linux にログインしていることを表しています。
<img src="https://i.imgur.com/7qI7xqZ.png" />
　これで VScode をつかって WSL 上のプログラムを編集する環境が整いました！使用している VScode を WSL からログアウトしたい場合、 <font color="blue"> ***WSL Ubuntu*** </font> をクリックしてください。すると下の図のようにメニューが表示されるので、メニュー上でカーソルを下に回して一番下にある ***リモート接続を終了する*** をクリックしてください。
<img src="https://i.imgur.com/liPFJwa.png" />
　ログアウトするとVScode ウィンドウ左下の青い部分の <font color="blue"> ***WSL Ubuntu*** </font> が <font color="blue"> ***\>\<*** </font> になります。この状態が WSL からログアウトし、ホスト上にいることを示しています。

# WSL 上のネットワークとホスト上のネットワークを同一にする方法

::: note warn
WSL 上のネットワークを設定するには Windows の **"Hyper-V"** という機能を使用します。Hyper-V は通常では <font color="blue"> **Windows Pro シリーズ** </font> のみサポートしています。**Windows Home エディションはサポートされていません！**
　お使いのコンピューターの Windows が Pro か Home か確認したい場合、「設定」アプリを起動して「システム」＞「ライセンス認証」を開いてください。このように Windows の種類を特定することができます。
<img src="https://i.imgur.com/tHYlRFF.png"/>
　もしお使いのコンピューターが Windows Home の場合、[**Windows Home で Hyper-V を有効にする方法**](#windows-home-で-hyper-v-を有効にする方法) を参照してください。
:::

　ネットワークを使用したロボットを扱うとき、ホストの ip アドレス情報が必要になります。しかしながら WSL 上で起動する Linux には **固有の ip アドレス** が割り振られ、ホストから隔離された環境でネットワークが動作します。つまり、外部から WSL が動作しているコンピューターをみるとあたかも **2台のコンピューターが存在しているように見える** わけです。
　この状態ではネットワークを使用するロボットと通信したいとき、適切な ip アドレスをロボット側が検索することができず **正常にロボットと通信できない可能性** があります。ここではホスト上の ip アドレスを WSL Linux 上の ip アドレスに書き換えることで、外部から1台のコンピューターが存在するように見せることで適切なネットワーク環境を利用できるようにする方法を紹介します。

---

::: note
このセクションではこれから何をするのかを説明するだけです。すぐに作業に取り掛かりたい場合は [**Hyper-V を有効にする**](#hyper-v-を有効にする) をご覧ください。
:::
　WSL Linux にログインして、以下のコマンドを実行してネットワーク状況を取得するパッケージをインストールしてください。
```bash
sudo apt install net-tools
```
　つぎに以下のコマンドを実行して WSL Linux 上のネットワーク情報を取得します。
```
ifconfig
```
すると、以下のようなログが表示されます。
```bash
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.23.243.178  netmask 255.255.240.0  broadcast 172.23.255.255
        inet6 fe80::215:5dff:feb9:aaf9  prefixlen 64  scopeid 0x20<link>
        ether xxxxxxxxxxxxx  txqueuelen 1000  (Ethernet)
        RX packets 105  bytes 14332 (14.3 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 39  bytes 6135 (6.1 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 17  bytes 3448 (3.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 17  bytes 3448 (3.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```
注目すべくところは `eth0` の項目の `inet` の部分です。ここに Linux 上の ip アドレスが表示されます。ここでは ip アドレスが `172.23.243.178` であることがわかります。
　一方、ホスト側のネットワーク情報を見てみましょう。PowerShell を起動して以下のコマンドを実行してください。
```
ipconfig
```
　すると各種インターフェース上の ip アドレスを確認することができます。私の場合 ip アドレスは `192.168.0.202` でした。このように WSL Ubuntu 上の ip アドレスとホスト上のアドレスが異なることがわかるでしょう。この状態で他の ip アドレスをもつロボットと接続しようと試みても WSL Ubhntu 側からロボットに接続要求できてもロボットは WSL Ubuntu に向けて応答することができません。
<img src="https://i.imgur.com/UXUHIIX.jpeg" ?>
　ここでは、この問題を解決すべく WSL Ubuntu 上の ip アドレスとホストのアドレスを結合させる手法を用います。

## Hyper-V を有効にする
　おつかいのコンピューターの Hyper-V が有効になっているか確認しましょう。まず、スタートメニューを開いて ***「Windows」*** と入力し、候補に挙がる **Windows の機能の有効化と無効化** を起動してください。
<img src="https://i.imgur.com/8B8AZbv.jpeg" ?>

　起動するとこのようなチェックボックスがたくさんあるウィンドウが表示されます。ここに **"Hyper-V" の項目にチェックが入っているか確認してください。** チェックが入っていない場合はチェックを入れましょう。 
<img width=5% /><img width=42.5% src="https://i.imgur.com/V4SJ3AZ.png" /><img width=5% /><img width=42.5% src="https://i.imgur.com/yurytkb.png
" /><img width=5% />

 すでにチェックが入っている場合はここをスキップしてください。
 チェックを入れたら "OK" をいれて、コンピューターを再起動してください。
 <img width=25% /><img width=50% src="https://i.imgur.com/fYIpq0X.png" />

## 仮想インターフェースを作成する
::: note warn
　仮想インターフェースの作成対象となるのは **有線LAN（Ethernet）** です。有線LAN を搭載していないコンピュータを使用している場合はハブなどを用いて有線LAN を使える環境にしてください。
:::
　仮想インターフェースを作成し、Windows ホストのネットワークと WSL Ubuntu のネットワークをトンネルで繋げます。これにより見かけ上 WAL Ubuntu とホストの ip アドレスが同一になります。
　まず、スタートメニューで ***「Hyper-V」*** と検索してください。すると候補で **「Hyper-V マネージャー」** がでます。こちらのアプリを開いてください。
<img src="https://funakamome.com/i/86954b47f989d32961db995e7b14baba.png" />

::: note
もし **「Hyper-V マネージャー」** が表示されない場合、

- [Windows Home で Hyper-V を有効にする方法](#windows-home-で-hyper-v-を有効にする方法)

をお読みください。
:::

　Hyper-V マネージャーの操作パネルにある ***「仮想スイッチマネージャー」*** をクリックしてください。
<img src="https://i.imgur.com/PXRp8UV.jpeg" />

　以下のようなウィンドウが表示されます。仮想スイッチプロパティの名前の項目にわかりやすいプロパティ名を設定してください。今回仮想のインターフェース（Ethernet）を作成するので、私は **`vm_ethernet`** という名前にしました。
<img src="https://i.imgur.com/NH8IvhJ.jpeg" />
　接続の種類グループの仮想スイッチの種類を外部ネットワークにしてください。すると、インターフェースを選択する項目が現れるのでこちらを **Wi-Fi** という名前がついていないインターフェース名を選択してください。
<img src="https://i.imgur.com/nhm0Ejw.jpeg" />
　設定が完了したら、ウィンドウ右下の「適応」をクリックしてください。するとこのような警告が表示されますが、「はい」をクリックして設定を完了してください。警告ポップアップが消えたら「OK」をクリックして仮想スイッチマネージャーを閉じます。
<img width=50% src="https://i.imgur.com/6KxAo9G.jpeg" /><img width=50% src="https://i.imgur.com/Q2kAlop.jpeg" />
　次に PowerShell を起動して WSL を再起動してみましょう。再起動後 WSL Ubuntu にログインして以下のコマンドを実行してみましょう。
```
ifconfig
```
::: note
### `ifconfig コマンドがありません` と表示された場合
　以下のコマンドを実行して ifconfig 関連のコマンドをインストールします。
```
sudo apt install net-tools
```
:::

　すると、以下のようなログが表示されるでしょう。ここの項目欄にホストと同じ ip アドレスが表示されていたら成功です！
```
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.201  netmask 255.255.255.0  broadcast 192.168.0.255
        ether 5e:bb:f6:9e:ee:fa  txqueuelen 1000  (Ethernet)
        RX packets 22465  bytes 30469415 (30.4 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 12910  bytes 919205 (919.2 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```

---

## Windows Home で Hyper-V を有効にする方法
　コンピューターの **BIOS** を起動します。BIOS の起動方法はほとんどのコンピューターの場合電源投入直後に **F2 キー** を連打することで起動します。BIOS の ***「CPU Configuration」*** 項目の ***「Intel Virtualization Technology」*** が **`Enabled`** になるようにしてください。
　設定が完了したら F10 キーなどを押して変更を保存しコンピューターを再起動してください。

---

　BIOS の設定が完了したら、**Windows Home に Hyper-V をインストールするバッチファイル** を作成します。バッチファイルとは簡単にいうと Windows システム上で使用できるコマンドを組み合わせたプログラミング言語です。ここではバッチファイルのコーデイングスキルは問われないのでご安心ください。
　[**VSCode をインストールしてセットアップする方法**](#vscode-をインストールしてセットアップする方法) のセクションで VSCode をインストールできるので、VSCode をインストールしていない場合、このセクションをお読みください。ここでは VSCode をつかってバッチファイルを作成し、バッチプログラムを実行する方法を解説します。
　VSCode を起動して、「ファイル」タブの「新しいファイル」をクリックして、新規ファイルを作成します。

> キーボードショーっとカットキーで ***「Control + ALT + Windows + N」*** で素早く新規ファイル作成することができます。

<img src="https://i.imgur.com/lO5feTL.png" />

　するとこのようにファイル名を入力するバーが表示されるので、ここに **末尾（拡張し）が `.bat` で終わるファイル** を作成してください。ここでは
```
hyper-v-setup.bat
```
という名前にしました。確定したらエンターキーを押してください。
<img src="https://i.imgur.com/mNqxTnU.png" />

ファイルを保存する場所を指定する画面が表示されます。ファイルを保存する場所ですが、フォルダ名が **あなたのユーザー名** の部分に保存してください。下の画像ではモザイクになっている部分がユーザー名になります。保存先を確定したら ***「ファイルを作成」*** をクリックしてファイルを作成してください。
<img src="https://i.imgur.com/5fAIHLz.png" />

すると、VSCode に戻り、このような画面が表示されます。ここが VSCode のファイル編集画面になります。
<img src="https://i.imgur.com/aAj7bl2.png" />

以下のバッチプログラムをコピペしてください。
```bat
pushd "%~dp0"

dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt

for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt

Dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL
```
<img src="https://i.imgur.com/C5Cf6QU.png" />

コードをコピペしたらキーボードショートカットキー ***「Control + S」*** をするか、「ファイル」タブの「保存」をクリックしてバッチプログラムを保存してください。
<img src="https://i.imgur.com/71A2262.png" />

　つぎに、スタートメニューを起動して PowerShell を **管理者権限** で起動してください。
<img src="https://i.imgur.com/wjHTyZh.png" />

起動した PowerShell に以下のコマンドを実行して「ホームディレクトリ」に移動します。
```bat
cd $env:USERPROFILE
```
そして、咲くほど作成したバッチプログラムをここで実行します。実行方法は
```bat
.\ファイル名.bat
```
です。ここでは `hyper-v-setup.bat` という名前にしたので、このように書きます。
```bat
.\hyper-v-setup.bat
```
入力したらエンターキーを押してプログラムを実行してください。すると、このように Hyper-V を有効にするためのプログラムが動作します。時間がかかるのでしばらくお待ちください。
<img src="https://i.imgur.com/io9CcTw.png" />

プログラムが終了すると PowerShell 上で **`今すぐコンピューターを再起動しますか？`** と表示されるので、ここに **"y"** と入力してください。するとコンピューターが再起動します。
<img src="https://i.imgur.com/3DhH36T.png" />

　再起動中一部プログラムの更新が行われるため、何回か再起動を繰り返すことがあります。ログイン画面が表示されるまでしばらくお待ちください。

---

　再起動したらスタートメニューを開いて、***「Hyper-V」*** と入力してください。このとき、**Hyper-V マネージャー** アプリが表示されたらインストール成功です！
 <img src="https://i.imgur.com/Qotoqsh.jpeg" />