Windows10へのROS2セットアップ

WindowsへのROS2(iron)をインストールしたときの実際の課題を中心にまとめています。

## ROS2をインストールする
基本的には公式のInstallationを参考にインストールを実施した。
https://docs.ros.org/en/iron/Installation.html

ちなみに、コマンドの実行はコマンドプロンプト(cmd)を管理者権限で使用した。

### Pythonのインストール
Chocolateyを使ってPythonをインストールした。しかしすでにより新しいVerが入っていたので強制インストールでを実施
```
choco install -y python --version 3.8.3 --force
```
### Visual C++再頒布パッケージのインストール
Chocolateyで以下を実行
```
choco install -y vcredist2013 vcredist140
```
### OpenSSLをインストール
Win64 OpenSSL v1.1.1n OpenSSLインストーラを[ダウンロード](https://slproweb.com/products/Win32OpenSSL.html)してインストール

環境変数にOPENSSL_CONFを追加
```
setx /m OPENSSL_CONF "C:\Program Files\OpenSSL-Win64\bin\openssl.cfg"
```
環境変数のPathに以下を追加
``C:\Program Files\OpenSSL-Win64\bin\``

### Visual Studio2019のインストール
[リンク](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)からインストーラをダウンロードして``Desktop development with C++``をインストール。更新パッケージもインストール。
### OpenCVをインストール
[リンク](https://github.com/ros2/ros2/releases/download/opencv-archives/opencv-3.4.6-vc16.VS2019.zip)からzipダウンロードして``C:¥opencv``として展開。

環境変数を以下で追加
```
setx /m OpenCV_DIR C:\opencv
```
環境変数Pathにも``C:\opencv\x64\vc16\bin``を追加。zipの展開の階層が間違っていたので、上記のパスにbinがくるように注意する。

### 依存関係のインストール
#### CMake
```
choco install -y cmake
```
とPathへ``C:\Program Files\CMake\bin``追加
#### Python関連パッケージ
[リンク](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
以下のコマンドを実行
```
choco install -y -s C:\Users\<UserName>\Downloads asio cunit eigen tinyxml-usestl tinyxml2 bullet
```
pipとsetuptoolsをアップデート
```
choco install -y -s C:\Users\<UserName>\Downloads asio cunit eigen tinyxml-usestl tinyxml2 bullet
```
パッケージを追加インストール
```
python -m pip install -U catkin_pkg cryptography empy importlib-metadata jsonschema lark==1.1.1 lxml matplotlib netifaces numpy opencv-python PyQt5 pillow psutil pycairo pydot pyparsing==2.4.7 pyyaml rosdistro
```
#### その他
libxml2,iconv,zlibの3点セットを[ダウンロード](https://www.zlatkovic.com/pub/libxml/64bit/)
7zが入ってなかったので64bit版を[ダウンロード](https://7-zip.opensource.jp)してインストール
全部を``c:\xmllint``に展開（この時xmllint直下にbinフォルダすべてを上書き保存
環境変数Pathに``C:\xmllint\bin``を追加
#### Qt5のインストール
[Qt公式](https://www.qt.io/offline-installers)から5.12.Xの最新版オフラインインストーラをダウンロードしインストール。
Qt5は商用利用不可なので要注意。
最後に以下を実行
```
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
```
#### Graphvizをインストール
[ここ](https://graphviz.gitlab.io/_pages/Download/Download_windows.html)からGranphvizのWindows最新EXE Installerをダウンロードしてインストール。インストーラの最後に環境変数登録をするか聞かれたのでcurrent userの環境変数を登録にチェックをいれた。
### ROS2のインストール
ここまできてようやくROS2を[公式](https://github.com/ros2/ros2/releases)からダウンロード
今回はIronのWindows-releaseパッケージ``ros2-iron-20230912-windows-release-amd64.zip``を選択
公式に従って``C:\dev\ros2_iron``にzipを展開
### DDSのインストール
通信ミドルウェアDDSをインストール。[RTI Connext DDS 5.3.1](https://community.rti.com/page/rti-connext-dds-installers-ros-2)をインストール。

### 環境設定
これはコマンドプロンプト開きなおす度に必要。
DDSとROS2の両方を動作準備するため以下の2行のコマンドの実行が必要
```
call "C:\Program Files\rti_connext_dds-5.3.1\resource\scripts\rtisetenv_x64Win64VS2017.bat"
call C:\dev\ros2_iron\local_setup.bat
```

### サンプルを実行
これで晴れて動作確認。2つのコマンド画面を開いて以下の2つのコマンドをそれぞれ実施
```
ros2 run demo_nodes_cpp talker
```
```
ros2 run demo_nodes_py listener
```
talker側のPublishメッセージをlistener側で受け取れていればOK。

### トラブルシュート
- Packagingの参照切れ
```ModuleNotFoundError: No module named 'packaging'```
#### 解決法１：Packagingを再入手してみる
```
pip install packaging
Requirement already satisfied: packaging in c:\python38\lib\site-packages (23.2)
```
上記の表示がでて問題ないことを確認
#### 解決法2：パスの確認
ROS2のインストールフォルダ``C:\dev\ros2_iron\Lib\site-packages``を見てみるとpackagingが存在しない
``where python``でpython.exeの場所を確認すると、
```
where python
C:\Python311\Scripts\python.exe
```
ここから``..\Lib\site-packages``をたどっていくとpackagingがあることを確認。
```
xcopy c:\Python311\Lib\site-packages\packaging c:\dev\ros2_iron\Lib\site-packages\. /E /H /C /I
```
- その他のPythonライブラリ参照切れ
いずれも以下を実行して解決
```
pip install <ライブラリ名>
```