【備忘録】ROS2 の Windows開発環境を構築してみた

やんごとなき理由により、Windows のROS2開発環境が必要になり Windows版のROS2開発環境を構築をしてみましたので、そのメモを置いておきます。

# ROS2 開発環境のセットアップ

ROS2 のWindows版の開発環境のセットアップは正直めんどうくさいです。基本的には次のURLに詳細が記述されていますので、それに従います。今回は、humble を前提としています。iron も同じかと思いますが、Python のバージョンが違うかもしれないので注意してください。

https://docs.ros.org/en/humble/Installation/Windows-Install-Binary.html

簡単に手順を示しておきます

### 手順1. Chocolatery のインストール
Windows PowerShell の apt-get のようなプログラムです。ライブラリやプログラムのインストールは基本的にこのプログラムを使ってインストールします。PowerShell からは "choco" というコマンドで呼び出せます。

### 手順2. Python のインストール
PowerShell を管理者権限で開いて、Python 3.8.3 をインストールします。それより新しい Python がインストールされていたらアンインストールしてください。 私は Python 3.12 が入っていたので、この手順をスキップしたのですが、ros2 のプロセスが起動できないとエラーが出ます。

```powershell
https://docs.ros.org/en/humble/Installation/Windows-Install-Binary.html
```

### 手順3. Visual Studio の再配布可能パッケージのインストール
管理者権限をもつPowerShell 上でインストールします。
```powershell
choco install -y vcredist2013 vcredist140
```

### 手順4. OpenSSL のインストール
管理者権限をもつPowerShell 上でインストールし、環境変数をセットします。
```powershell
choco install -y openssl --version 1.1.1.2100
setx /m OPENSSL_CONF "C:\Program Files\OpenSSL-Win64\bin\openssl.cfg"
```

Windowsの環境変数の"Path"に次のディレクトリを追加し、OpenSSLのコマンドが通じるようにします。


**C:\Program Files\OpenSSL-Win64\bin\**

### 手順5. Visual Studio 2019 のインストール
次のURLから Visual Studio 2019 をダウンロードしてインストールします。

https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community&rel=16&src=myvs&utm_medium=microsoft&utm_source=my.visualstudio.com&utm_campaign=download&utm_content=vs+community+2019

インストールすると Windows のメニューに、"Visual Studio Installer"　というアプリケーションが追加されているので起動します。その中の【起動】ボタンを押すとメニューが現れます。「ワークロード」から”C++によるデスクトップ開発”を選択し、「インストールの詳細」から”Windows用C++ CMakeツール”のチェックを外します。

![VS2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598183/eae1a121-bf29-67e3-458d-a246950efb1e.png)

そのあと、「ダウンロードしながらインストールする」ボタンを押してインストールします。

### 手順6. OpenCV のインストール
次のURLからOpenCVをダウンロードし、ZIPファイルを、C:\opencvに展開します。展開先は任意のディレクトリで問題ありません。

https://github.com/ros2/ros2/releases/download/opencv-archives/opencv-3.4.6-vc16.VS2019.zip 

次のコマンドで環境変数を追加します。

```powershell
setx /m OpenCV_DIR C:\opencv
```

また環境変数のPathに `C:\opnecv\x64\vc16\bin` を追加します。


### 手順7. CMake のインストール
choco を使って CMake をインストールします。

```powershell
choco install -y cmake
```

環境変数のPathに `C:\Program Files\CMake\bin` を追加します。

### 手順8. Python 関連パッケージのインストール
次のURLから、次のファイルをダウンロードします。

https://github.com/ros2/choco-packages/releases/latest

- asio.1.12.1.nupkg 
- bullet.3.17.nupkg
- cunit.2.1.3.nupkg
- eigen-3.3.4.nupkg
- tinyxml-usestl.2.6.2.nupkg
- tinyxml2.6.0.0.nupkg


次のコマンドでインストールします。

```powershell
choco install -y -s <PATH\TO\DOWNLOADS\> asio cunit eigen tinyxml-usestl tinyxml2 bullet
```

### 手順9. 依存関係のインストール
pip と setuptools をインストールします。setuptools はバージョン指定をするようにしてください。あとでハマります。

```powershell
python -m pip install -U pip setuptools==59.6.0
```

その他の依存関係のあるパッケージをインストールします。

```powershell
python -m pip install -U catkin_pkg cryptography empy importlib-metadata lark==1.1.1 lxml matplotlib netifaces numpy opencv-python PyQt5 pillow psutil pycairo pydot pyparsing==2.4.7 pyyaml rosdistro
```

### 手順10 Qtのインストール
これがなかなか面倒でした。オープンソースのQtは基本的に商用利用することはできません。商用利用する場合は商用利用版のQtをインストールしてください。オープンソース版は、試用や教育用、内部研究用、ホビー用に限られます。

Qt商用利用版のインストーラー
https://www.qt.io/download-dev

Qtオープンソース版のインストーラー
https://www.qt.io/ja-jp/download-open-source


インストールしたら、Qt をインストールしたフォルダ以下の `Qt5.12.12\5.12.12` 以下に `msvc2017_64` フォルダがあることを確認します。`C:\Qt` がQtのインストールフォルダとしたら次のフォルダになります。

`C:\Qt\Qt5.12.12\5.12.12\msvc2017_64`

次のコマンドで環境変数を設定します。

```powershell
setx /m Qt5_DIR C:\Qt\Qt5.12.12\5.12.12\msvc2017_64
setx /m QT_QPA_PLATFORM_PLUGIN_PATH C:\Qt\Qt5.12.12\5.12.12\msvc2017_64\plugins\platforms
```

### 手順11. Graphviz をインストール
必要に応じて Graphviz をインストールします。次のURLからダウンロードしてインストールしてください。

https://graphviz.gitlab.io/_pages/Download/Download_windows.html

### 手順12. ROS2のインストール
ROS2のWindowsパッケージををダウンロードして展開します。

https://github.com/ros2/ros2/releases

今回は、humble を使うので次のパッケージをダウンロードしました。 [ros2-humble-20240807-windows-release-amd64.zip](https://github.com/ros2/ros2/releases/download/release-humble-20240807/ros2-humble-20240807-windows-release-amd64.zip)

ダウンロードしたZIPを例えば次のフォルダに展開します。

`C:\dev\ros2_humble`

### 手順12. DDSのインストール
ROSの通信を行うDDSをインストールします。公式ではオプションとなっていますが、いろいろ試行錯誤した結果、インストールしないと動かないような気がします（確信なし）。

https://docs.ros.org/en/humble/Installation/DDS-Implementations.html

### 手順13. 開発用のコンソールの設定
これで、だいたい環境設定が終わりました。ここからがハマりポイントです。公式では、コマンドプロンプトとなっていますが、私は「Visual Studio 2019」アプリの「Developer PowerShell for VS 2019」を管理者権限で開きます。管理者権限でないとビルド時にエラーがでますので注意してください。

```powershell
********************************************************************
** Visual Studio 2019 Developer PowerShell v16.11.30
** Copyright (c) 2021 Microsoft Corporation
********************************************************************
PS C:\WINDOWS\system32>
```

コンソールで次のコマンドを打って、環境設定します。私は、`setup_ros.ps1` というスクリプトファイルにして、PowerShellから起動します。
```powershell
Start-Process "C:\Program Files\rti_connext_dds-5.3.1\resource\scripts\rtisetenv_x64Win64VS2017.bat"
& "C:\dev\ros2_humble\local_setup.ps1"
```

今後の開発は、「Developer PowerShell for VS 2019」を使います。

## 動作確認
### ros2-examples のダウンロード
作業用のディレクトリを次のフォルダに作成 `c:\dev\ros2_examples`し、ros2_examples をクローンする。

```powershell
C:\dev\ros2_examples > mkdir src
C:\dev\ros2_examples > git clone https://github.com/ros2/examples.gt src/examples
C:\dev\ros2_examples > git clone https://github.com/ros2/example_interfaces.git src/example_interfaces
```

### ros2-examples のブランチの切り替え

```powershell
C:\dev\ros2_examples > cd src/examples
C:\dev\ros2_examples\src\examples > git checkout humble
C:\dev\ros2_examples > cd ../example_interfaces
C:\dev\ros2_examples\src\example_interfaces > git checkout humble
```

### examples のビルド
colcon build で examples をビルドします。TypeErrorというエラーが出ますがあまり気にしなくてよさそうです。どうしても気に食わないという人は、ビルド時に次のオプションを設定してみてください。 `--event-handlers desktop_notification-`

```powershell
C:\dev\ros2_examples\src\example_interfaces > cd ../../
C:\dev\ros2_examples > colcon build --symlink-install
Summary: 23 packages finished [1min 20s]
  1 package had stderr output: example_interfances
WNDPROC return value cannot be converted to LRESULT
TypeError: WPARAM is simple, so must be an int object (got NonType)
```

### 動作確認
Publisher と Subscriber で動作確認をします。まず、subscriber を立ち上げます。

```powershell
C:\dev\ros2_examples > & .\installsetup.ps1
C:\dev\ros2_examples > ros2 run examples_rclpy_minimal_subscriber subscriber_member_function
```

もうひとつ、「Developer PowerShell for VS 2019」を管理者権限を開き、publisher を立ち上げます。 

```powershell
********************************************************************
** Visual Studio 2019 Developer PowerShell v16.11.30
** Copyright (c) 2021 Microsoft Corporation
********************************************************************
PS C:\WINDOWS\system32> cd C:\dev\ros2_examples
PS C:\dev\ros_examples > Start-Process "C:\Program Files\rti_connext_dds-5.3.1\resource\scripts\rtisetenv_x64Win64VS2017.bat"
PS C:\dev\ros_examples > & "C:\dev\ros2_humble\local_setup.ps1"
PS C:\dev\ros_examples > & .\install\setup.ps1
PS C:\dev\ros_examples > ros2 run examples_rclpy_minimal_publisher publisher_member_function
```

publisher 側、subscriber 側それぞれに次のようなメッセージが出てくれば環境構築成功です。

Publisher 側
```powershell
[INFO] [1723365560.880453700] [minimal_publisher]: Publishing: "Hello World: 638"
[INFO] [1723365561.380387400] [minimal_publisher]: Publishing: "Hello World: 639"
...
```

Subscriber 側
```powershell
[INFO] [1723365560.880366200] [minimal_subscriber]: I heard: "Hello World: 638"
[INFO] [1723365561.380721300] [minimal_subscriber]: I heard: "Hello World: 639"
...
```

# 所感
とんでもなく面倒くさい環境構築ですが、なんとかなりました。
いまや WSL2 があたり前になってきているので、この環境もそのうち廃れていくと思いますが、やんごとなき理由は結構発生したりするので、今しばらくは必要な人には必要な環境ですのでメンテナンスされていくことでしょう。

#### 参考文献
https://qiita.com/mucot/items/3a679798598290e019fb
https://answers.ros.org/question/415532/wndproc-return-value-cannot-be-converted-to-lresult/
https://scrapbox.io/tygoto/Windows%E3%81%A7ROS_2_examples%E3%82%92%E3%83%93%E3%83%AB%E3%83%89%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86