WSL2 Docker ROS2 - eiichiromomma/CVMLAB GitHub Wiki

(WSL2) DockerでROS2

ROS/ROS2はUbuntu上での動作が基本のような状態なので,Ubuntuマシンを用意できない場合はWindowsで頑張るよりWSL2上で動かしてしまった方が楽。

面倒なところとしてはROSのノードごとにターミナルを開く必要があるので工夫がいる。

  1. コンテナ内でVNCを起動してWebブラウザ経由で作業する
  2. 都度ターミナルを起動する

のどっちかになる。

1. VNC経由

が楽。解説記事1,解説記事2もある。

WSL2(Ubuntu)を開いて

docker run --rm -p 6080:80 --security-opt seccomp=unconfined --shm-size=512m tiryoh/ros2-desktop-vnc:humble

とする。断片をダウンロード(Downloading)した後に展開(Extracting)するので数分待つ。日付と時間が先頭のログが流れ始めたらhttp://localhost:6080をブラウザで開く。開いたときのブラウザの大きさ=VNC画面の大きさになるので注意。

あとは左上のアイコンをクリックしてからSystem Tools->Mate Terminalでターミナルが起動できるので,ターミナルを2つ開きそれぞれ

ros2 run turtlesim turtlesim_node

ros2 run turtlesim turtle_teleop_key

を実行する。turtle_teleop_keyのターミナルをクリックしてからカーソルキーを押すとカメが動く。 終了はそれぞれのターミナルでCtrl-C(^Cと表記)。

docker runしたUbuntuの方で^Cすれば終了。(--rmオプションで起動しているのでコンテナは残らない)

2. docker execを使う方法(WSLg)

上記のVNCが使えるROS2環境に寄生して

docker run --rm --name ros2test -p 6080:80\
    --security-opt seccomp=unconfined --shm-size=512m \
    --mount type=bind,source=/tmp/.X11-unix,target=/tmp/.X11-unix \
    --mount type=bind,source=/mnt/wslg,target=/mnt/wslg \
    --env DISPLAY=${DISPLAY} --env WAYLAND_DISPLAY=${WAYLAND_DISPLAY} \
    --env XDG_RUNTIME_DIR=${XDG_RUNTIME_DIR} \
    tiryoh/ros2-desktop-vnc:humble 

のようにXを使えるようにdocker runする。その代わりVNCは使えない状態になる。

2-1. WSLgでmate-terminalを起動する

Ubuntuのウィンドウを追加で開き,

xhost +
docker exec --user 1000 ros2test mate-terminal

と実行すると,VNCのときと同様にターミナルが開く。そこで ワーニングのメッセージがドバーっと流れるので

sudo mkdir /run/user/1000
sudo chown 1000:1000 /run/user/1000

としてから

mate-terminal

と打てばもう一つターミナルを開ける。 あとはVNCと同様。

exit

とターミナルで打てば閉じる。

2-2. ターミナルはWSL2のを使ってGUI関係だけWSLgを使う

Ubuntuのウィンドウを追加で開き,

xhost +
docker exec -it --user 1000 ros2test /bin/bash

とすると,そのままコンテナの中に入れる。

sudo mkdir /run/user/1000
sudo chown 1000:1000 /run/user/1000
としておく。

Ubuntuのウィンドウを追加で開き

docker exec -it --user 1000 ros2test /bin/bash

とするともう一つターミナルが開ける。

あとはVNCの場合と同じ。

3. GAZEBO

VNCでもdocker execでも動く。

ROS2でのGAZEBOの例 に従って

ros2 launch ros_gz_sim gz_sim.launch.py gz_args:="shapes.sdf"

を実行するとGazeboが動く。

4. (オプション) GPU対応版

GPUに対応したベースから使えるものもある。

docker buildが必要になるのと,Gazeboのインストールが必要(?)。