どうしてもWSLg環境でAWSIMを動かしたい時に見る記事

注意事項

今回のやり方は不具合が発生する可能性が高いため自力で問題切り分け・解決が可能な方に向けた情報共有です。広くおススメできる方法ではありません

達成したこと

Windows環境でAWSIMを起動し自動運転AIチャレンジのサンプルがそれらしく動くことを確認した。

WSLg上でAWSIMを起動する様子

※公式サイトの推奨環境ページに記載されている通り自動運転AIチャレンジの環境はUbuntu22.04を前提としている。今回は無理やりWindowsに環境作ったという報告

環境の構成

自動運転AIチャレンジの環境はシミュレータであるAWSIMと制御系のAutowareからなっている。(と思う。まだ始めたばかりでよく分かっていない)

Autowareの方はWindowsのWSL2環境でUbuntu22.04を用意して大会公式が用意してくれている環境構築手順そのままで構築すればOK。

問題はAWSIMの方でVulkanを使っているのでWSLg環境でDockerコンテナ内から実行することができない(エラーになる)。
※大会公式の環境ではUbuntu22.04上にDockerコンテナを作る形になっている

対策としてWSLgのIssueにあるようにkisak-mesaのドライバを入れてVulkanをD3D12に読み替えてバイパスしてもらうようにすれば、とりあえずたいていのVulkanアプリは動く。
ただし、自分が以前試した限りUbuntu24.04しかこの方法は使えなかった。参考

ただし、AWSIMはUbuntu22.04, ROS2 Humbleを前提にビルドされているので無理やり何とかする必要がある。

以上をまとめると下図のようにWindows上で22.04と24.04の2つのWSL環境を動かしAutowareはDockerコンテナ内、AWSIMはコンテナを使わず24.04上で直接実行する。

構成図

AWSIMを無理やり動かすための対策内容

WSL2上のUbuntu24.04でVulkanアプリが動くようにする

上述したWSLgのIssueの通りでOK。

sudo add-apt-repository ppa:kisak/kisak-mesa
sudo apt update
sudo apt upgrade

依存ライブラリを無理やりインストール

AWSIMの依存ライブラリをUbuntu22.04、ROS2 humbleからUbuntu24.04環境に持ってくる。

※バージョンが一致しないものを無理やり持ってくるので動く保証はない点に注意。一見動いているように見えても正しく動いていない可能性もある

Ubuntu22.04 から

足りないのは以下のファイル。/usr/lib/x86_64-linux-gnu ディレクトリに入っているのでWSL2のUbuntu22.04環境からコピーしてくる。

  • libconsole_bridge.so.1.0
  • libfmt.so.8.1.1
  • liborocos-kdl.so.1.5.1
  • libspdlog.so.1.9.2

24.04環境にコピーしたら以下のシンボリックリンクを張る。

libfmt.so.8 -> libfmt.so.8.1.1
liborocos-kdl.so.1.5 -> liborocos-kdl.so.1.5.1
libspdlog.so.1 -> libspdlog.so.1.9.2

ROS2 humble から

公式のリリースページからros2-humble-日付-linux-jammy-amd64.tar.bz2をダウンロードしてきてtar.bz2ファイルの中から以下のファイルをUbuntu24.04環境に入れる。

  • libclass_loader.so
  • librcl_action.so
  • librclcpp_action.so

入れる場所は分かりやすいように /opt/ros/humble/lib に入れた。

※Ubuntu24.04に対応するのはROS2 jazzyなので24.04環境に本来humbleディレクトリは存在しない

libpython3.10.so.1.0

Python3.10はPPAがあるので以下の手順ですんなり入る。

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt install libpython3.10

AWSIMファイル転送

Ubuntu22.04側で大会公式の環境構築手順を実施すればAWSIMのファイルもダウンロードされているので以下のファイルをUbuntu24.04側へコピーする。

  • aichallenge-racingkart/aichallenge/simulator/AWSIM
    • AWSIMのファイル一式。ディレクトリごとコピーする
  • aichallenge-racingkart/vehicle/cyclonedds.xml
    • CycloneDDSの設定ファイル。Autoware側でも同じファイルを使うので22.04側から削除しないように注意

ファイルの置き場所は任意で問題ないはず。今回はユーザのホームディレクトリ直下に置いた。

実行手順

AWSIM起動

WSL2インスタンスを起動するたびに以下を1回実行する。(Autoware側はDockerコンテナで実行してくれている)

# ROS2のディスカバリー通信が届くようにloデバイスをマルチキャストOnに設定する
sudo ip link set multicast on lo
# CycloneDDSでエラーにならないようにバッファサイズを増やす
sudo sysctl -w net.core.rmem_max=2147483647 >/dev/null

make dev手順の代わりに以下のコマンドで同等の手順になる。

CYCLONEDDS_URI="file://$HOME/cyclonedds.xml" \
ROS_LOCALHOST_ONLY=0 \
RMW_IMPLEMENTATION=rmw_cyclonedds_cpp \
ROS_DOMAIN_ID=1 \
LD_LIBRARY_PATH="$HOME/AWSIM/AWSIM_Data/Plugins:/opt/ros/humble/lib" \
$HOME/AWSIM/AWSIM.x86_64 \
  --start-mode off \
  --vehicles 1 \
  --laps 600 \
  --timeout 60000000

LD_LIBRARY_PATHにはAWSIMのPluginsディレクトリと無理やり持ってきたHumbleのライブラリ置き場を指定する。

AWSIMのコマンドライン引数に何を指定すれば良いのかは aichallenge-racingkart/aichallenge/run_simulator.bash を見れば分かる。

Autoware起動

make dev手順の代わりに以下のコマンドで同等の手順になる。

make autoware-simulator

Appendix デバッグ・問題切り分け作業内容

AWSIM エラー内容の確認

AWSIM実行中のエラーは以下のログファイルに出力されている。

/$HOME/.config/unity3d/TIERIV/AWSIM/Player.log

以下のように問題のあるPluginがログに残っている。

Unable to preload the following plugins:
    libfastrtps.so
    libfastrtps.so.2.6.3
    librmw_fastrtps_cpp.so
    librmw_fastrtps_shared_cpp.so

※自動運転AIチャレンジではCycloneDDSが使われているので問題ないが、今回の対策を実行しても上記のFastRTPS関連のエラーは残ったままなので注意

ROS2通信が上手くいかない場合は先にログを見た方がよさそう。

足りないライブラリの探し方

今回AWSIMのPluginがロードできない問題は依存ライブラリが足りないケースのみだったためlddスクリプトでロードできていない.soを1つずつ調べて足りないライブラリを探した。

# libRobotecGPULidar.soの依存関係を調べる例
LD_LIBRARY_PATH="$HOME/AWSIM/AWSIM_Data/Plugins:/opt/ros/humble/lib" \
ldd AWSIM/AWSIM_Data/Plugins/libRobotecGPULidar.so

結論

コンテナを使わないUbuntu24.04環境に無理やり依存ライブラリを持ってくることでWindows環境でも自動運転AIチャレンジの環境を作ることができた。
ただし、ライブラリの互換性問題で一見動いているように見えても正しく動かない可能性があるため広くおススメできる状態にはならなかった。
この課題は自動運転AIチャレンジの環境がUbuntu24.04に移行すれば解消しそうに思える(※)ので現状は別途Ubuntu22.04環境を用意するのが良いと思わる。

※AWSIMがUbuntu24.04前提ならmesaドライバのVulkan対応のみで動くため

以上