WSL2 Docker ROS2 - eiichiromomma/CVMLAB GitHub Wiki
WSL2) DockerでROS2
(ROS/ROS2はUbuntu上での動作が基本のような状態なので,Ubuntuマシンを用意できない場合はWindowsで頑張るよりWSL2上で動かしてしまった方が楽。
面倒なところとしてはROSのノードごとにターミナルを開く必要があるので工夫がいる。
- コンテナ内でVNCを起動してWebブラウザ経由で作業する
- 都度ターミナルを起動する
のどっちかになる。
1. VNC経由
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のインストールが必要(?)。