Windows Subsystem for Linux の Ubuntu に ROS2 をインストールする

#はじめに
ROS2 は皆様ご存じのとおり、Windows をサポートし、インストールできるようになっています。
[**ROS2ではじめよう**](https://gihyo.jp/book/2019/978-4-297-10742-0)
[**Windows 10とROS 2のインストール**](https://gbiggs.github.io/rosjp_ros2_intro/computer_prep_windows.html)
[**Installing ROS 2 on Windows**](https://index.ros.org/doc/ros2/Installation/Crystal/Windows-Install-Binary/)
[**ROS2.0をWindows10にインストールする**](https://qiita.com/matryorobotics/items/beab21d4cf3199b1f6ff)
ですが、いろいろな事情で Linux を使いたい方々の中には Windows Subsystem for Linux (WSL) を使用する方もいると思います。
[**Windows Subsystem for Linux の使用を開始する**](https://docs.microsoft.com/ja-jp/learn/modules/get-started-with-windows-subsystem-for-linux/)

そんなわけで WSL で ROS2 を使ってみようと思いましたので、そのインストールまでの手順を記録します。
基本的には書籍のインストール手順にしたがって導入すれば OK です！

# WSL の導入
すでにまとめられている記事がありますので割愛します。
[**Windows Subsystem for Linuxをインストールしてみよう！**](https://qiita.com/Aruneko/items/c79810b0b015bebf30bb)
[**WSL: Windows Subsystem for Linuxのインストールと設定**](https://demura.net/lecture/15062.html)
後者の出村先生のサイトでは、WSL で GUI を表示するための方法も説明されています（後述します）。

標準のターミナルだと表示が崩れることがあるので、wsltty をインストールしています。
**https://github.com/mintty/wsltty**
[WSLのコンソールを便利で高機能な「wsltty」に置き換える](https://www.atmarkit.co.jp/ait/articles/1812/13/news031.html)

> **＜オプション＞**
日本語環境をインストール
` apt install language-pack-ja`

>日本語環境を起動時に設定するために .bashrc に以下を追記
` export LANG=ja_JP.utf8`
[Linuxのローカライゼーション系LANG変数：langについて](https://eng-entrance.com/linux-localization-lang)

>なお、ROS 公式では en_US.utf8 ですが、言語はお好みでよいかと思います。

# ROS2 のインストール
ROS2 インストールについては公式、書籍、Biggs さんの記事も参照ください。
[**Installing ROS2 via Debian Packages**](https://index.ros.org/doc/ros2/Installation/Dashing/Linux-Install-Debians/)
[**Ubuntu LinuxでROS 2のインストール**](https://gbiggs.github.io/rosjp_ros2_intro/computer_prep_linux.html)

curl, gnupg2, lsb-release をインストール
` sudo apt update`
` sudo apt install curl gnupg2 lsb-release`

リポジトリのキーを導入
` curl http://repo.ros2.org/repos.key | sudo apt-key add -`
![2019-09-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155103/fb5112c8-8007-f94f-11ab-ea09a250cb56.png)

ROS のディストロを設定
` export ROS_DISTRO=dashing`

ROS2 本体をインストール
` sudo apt install ros-$ROS_DISTRO-desktop python3-colcon-common-extensions python3-rosdep python3-argcomplete`
**注意：python3-rosdep2 というのもありますが、無印と間違えないように。**

セットアップ環境を自動的に読み込む設定を .bashrc に記述
` echo "source /opt/ros/dashing/setup.bash" >> ~/.bashrc`

ここまでは標準的なインストールで進むと思います。

## Talker and Lister のデモ
無事にインストールが完了していれば、「[**ROS2ではじめよう**](https://gihyo.jp/book/2019/978-4-297-10742-0)」P47 2-3-6 に記載のデモプログラム「Talker and Listener」が動くはずですが、動きませんでした。これは Windows のファイアウォールが通信をブロックしているためです。ファイアウォールをオフにすれば問題なくデモプログラムが動きましたが、これではセキュリティホールになりますので、例外処理をするべきでしょう。
以下のフォーラムでも同様の症状が報告されており、WSL 2 の環境では解消されるようですが、未確認です。
[**Problem of ROS2.0 talker/listener example on WSL1.0**](https://github.com/microsoft/WSL/issues/4494)
[WSL 2 のインストール手順](https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-install)
※WSL 2 のインストールには Windows Insider Program への登録が必要です。

#GUI の導入
WSL は基本的にはコンソールのみですので、GUI がこのままでは使用できません。WSL から X サーバを介して GUI を生成するには [VcXsrv](https://sourceforge.net/projects/vcxsrv/) などの X サーバを別にインストールして、起動しておく必要があります。
[**WSL上にXサーバをインストールしてGUIを実現する（VcXsrv編）**](https://www.atmarkit.co.jp/ait/articles/1812/06/news040.html)
[**VcXsrv Windows X Server**](https://sourceforge.net/projects/vcxsrv/)

ROS1 で Rviz や Gazebo を表示するためには必須ですが、X サーバの以下の設定に注意が必要です。
[**WSL: Windows Subsystem for Linuxのインストールと設定**](https://demura.net/lecture/15062.html)
` echo ‘export DISPLAY=localhost:0.0’ >> ~/.bashrc`
` echo ‘export GAZEBO_IP=127.0.0.1’ >> ~/.bashrc`
> [**WSL: RvizやGazeboが起動しない**](https://demura.net/lecture/15304.html)
> 以前の設定と主な変更点は.bashrcのLIBGL_ALWAYS_INDIRECT=1をコメント化し、VcXsrvの起動オプションに-nowglを追加した。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">~/.bashrcに<br><br>export LIBGL_ALWAYS_INDIRECT=0<br><br>を書き込むと立ち上がりましたー</p>&mdash; 上田 隆一 (@ryuichiueda) <a href="https://twitter.com/ryuichiueda/status/1157174673295101952?ref_src=twsrc%5Etfw">August 2, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
ROS2 ではまだ試行していませんが、おそらく同じような設定になると思います。

**追記**
WSL2 での X サーバの設定についてコメントいただいたので、引用します。
> WSL2ではDISPLAYの設定をちょっと変える必要あります。

>localhost:0.0では上手くいかないようです。
>WSL2の方でifconfig等でIPアドレスを調べるとわかりますが、IPアドレスが別にあてられています。

>対応方法としては以下をすればよいです。
>- xserver側に-acオプションをつける
>- localhost:0.0ではなく、Windows側のIP:0.0を設定する

>詳細は以下が分かりやすいと思います。
>https://qiita.com/ryoi084/items/0dff11134592d0bb895c 

#おわりに
WSL は Windows 上で Linux を走らせることができ、Linux から Windows アプリケーションを呼び出すこともできるツールです。Ubuntu はもともと ROS がサポートしてきただけに情報も豊富にあります。WSL がそれぞれの利点をうまく組み合わせて活用できるようになればと思います。