NVIDIAのGPUとCUDAドライバ,dockerとNVIDIA Container Toolkitも必要。NVIDIAのページ(英語)でも説明しているが,"Ubuntu docker nvidia"とかでググれば日本語の解説も出てくる。色々変わってるので極力新しい情報を使う。
WSL2の場合も同様でWindows用のDocker Desktopと,ここらへんを参考にWSL用CUDAドライバも入れる。あとWSLgも必要なので出来ればWindows11が望ましい。(Windows10でもInsider Previewにしちゃえば使えたが,今どうなってるかは不明)
Dockerfileを置いたディレクトリで
docker build . -t ros2env
でイメージを作成して
docker run --rm -e DISPLAY=unix$DISPLAY -p 7400-7401:7400-7401 -p 7410-7419:7410-7419 \
-v /tmp/.X11-unix:/tmp/.X11-unix -v /path_to/dockermount:/mnt --gpus all -it ros2env /bin/bash
/mnt/wslg
のマウントはデバイスの共有?
docker run -it --rm -e DISPLAY=$DISPLAY -p 7400-7401:7400-7401 -p 7410-7419:7410-7419 \
-v /tmp/.X11-unix:/tmp/.X11-unix -v /mnt/wslg:/mnt/wslg --gpus all ros2env /bin/bash
xeyes
で目玉のウィンドウが出たらXの設定は成功。
glxgears
で歯車が出てきたらOpenGLも成功。
とりあえずgazebo+turtlebot3を使ってみる
TURTLEBOT3_MODEL=burger ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
でgazeboが開く。(初回起動は結構な時間がかかる場合があるので,docker起動時の--rmは付けずにdocker startで以後使う方が良いかも知れない)
gazeboは最初にバナーウィンドウが表示されるのだが,wslgがWindowsのスケーリングと相性が悪いようで100%じゃないと真っ黒な長方形が表示される。
別のターミナルを開き
docker container ls
で動いてるコンテナ一覧が出るので,ros2envのコンテナを探し,その最後にある名前(例えば distracted_swirles みたいの)を指定して同一コンテナで別のシェルを起動する
docker exec -it その名前 /bin/bash
で,コンテナに入ったら
TURTLEBOT3_MODEL=burger ros2 run turtlebot3_teleop teleop_keyboard
を実行すると,GAZEBO上のTurtlebot3 burgerをキーボードで移動できるようになる。