WSL2 Docker ROS2 Gazebo - eiichiromomma/CVMLAB GitHub Wiki

(WSL2) DockerでROS2 (Gazebo使える版)

rviz2とGazeboを使おうとしたときに,使う予定のないサウンドデバイスが無いことでコケる。 かなり根深い問題らしく,WSL2でサウンドデバイスが使えないのが原因らしい。

1. WSL2で音を出す

まずWindowsマシンのIPv4アドレスを調べる。コマンドプロンプトで

ipconfig

と打って "Wireless LAN adapter Wi-Fi"あたりのIPv4 アドレスをメモっておく。vEthernetのものではなく192とか10とかで始まるピリオド区切りの数字。例えば192.168.86.25みたいなもので後で使う。

元ネタ

  1. WSLで音を出す。最新版
  2. Enabling sound in WSL/Ubuntu

DockerではなくホストのWSLで音が出せない。確認はPCの音量を下げてからWSL上で下記を実行する。

pacat < /dev/urandom

で雑音が出ない。(Ctrl+C で停止) そもそもpacatがcommand not foundとなったら

sudo apt install -y pulseaudio  pulseaudio-utils

でインストールできる。

  1. Windows用のPulseaudioを展開する
  2. Pulseaudioの設定を変更する
  3. WindowsのコマンドラインでPulseaudioのサーバーを起動する
  4. WSL上で環境変数PULSE_SERVERに,WindowsのIPv4アドレスを指定する
  5. Docker runするときに環境変数PULSEO_SERVERを渡す (オプション: IPv4が変わらないなら)

という流れになる。要するにWSL上でどうにかするのは諦めてWindows側に音出しは丸投げする。 厄介なのはWindows用のPulseaudioの配布が停止してしまっていて,archive.orgから入手しなければならないところ。

1.1 pulseaudioの設定

からダウンロードして展開する。 ここでは自分のダウンロードフォルダにpulseaudio-1.1というフォルダで展開したことにする。その中の2ファイルをメモ帳等で編集する。

pulseaudio-1.1/etc/default.pa の編集

42行目あたり

load-module module-waveout sink_name=output source_name=input record=0

61行目あたり

load-module module-native-protocol-tcp auth-anonymous=1

または,元ネタ2のようにIPv4アドレスを指定できる。ただし,127.0.0.1は効かなかった(localhostForwardingできるような話や取り下げたような話が出てくるので避ける)。 192.168.86.25がWindows機のIPv4の場合

load-module module-native-protocol-tcp auth-ip-acl=192.168.86.25

とする。

pulseaudio-1.1/etc/daemon.conf の編集

39行目あたり

exit-idle-time = -1

とする。

1.2 Pulseaudioサーバーの起動と動作確認

両ファイルを保存してから、コマンドプロンプトを開き、

cd Downloads\pulseaudio-1.1\bin
pulseaudio

と入力すると、ウィンドウが開いて許可するか聞いてくるので許可する。

WSLでDockerを使う前に最初のIPv4アドレスを下記のxxx.xxx.xxx.xxxに当て嵌めて入力する。

export PULSE_SERVER=tcp:xxx.xxx.xxx.xxx

例えば192.168.86.25の場合

export PULSE_SERVER=tcp:192.168.86.25

と打ったあとででPCの音量を下げてからWSLで

pacat < /dev/urandom

でザーっと音が出れば成功。(Ctrl+C で停止)

PULSE_SERVERの指定をDockerのコンテナ上からでも同じようにすれば音がちゃんと出るようになる。

1.3 次回以降

  1. コマンドプロンプトでIPv4アドレスを確認
  2. コマンドプロンプトからPulseaudioサーバーの起動
  3. コンテナ起動(下で説明)
  4. コンテナ上でPULSE_SERVERを指定

とする。

2. WSL2上でGazeboシミュレーション

基本的には下記元ネタのまま実行するだけだが,ROSを使う上での暗黙の了解等もあるので,そこらへん含めて記載。

2.1 初回のコンテナ作成

WSL2でコンテナのrun。(--rmを付けていないので終了してもコンテナが残る)

docker run --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

IPv4が変わらない環境の場合は --env PULSE_SERVER=${PULSE_SERVER}も含めると以降exportで設定する必要がなくなる。(いまどきそうそう無い)

別のWSL2を開き

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

で今度はmate-terminalのウィンドウが開くので,そこで

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

とする。またIPv4アドレスを使い,音が出るか確認

export PULSE_SERVER=tcp:192.168.86.25
pacat < /dev/urandom

でザーっと音が出れば成功。(Ctrl+Cで停止)

必要なパッケージの整理

sudo apt update
sudo apt-get install -y ros-humble-gazebo-*
sudo apt install -y ros-humble-cartographer
sudo apt install -y ros-humble-cartographer-ros
sudo apt install -y ros-humble-navigation2
sudo apt install -y ros-humble-nav2-bringup
sudo apt install -y ros-humble-xacro
sudo apt remove -y ros-humble-dynamixel-sdk
sudo apt remove -y ros-humble-turtlebot3-msgs
sudo apt remove -y ros-humble-turtlebot3

turtlebot3関係

mkdir -p ~/turtlebot3_ws/src
cd ~/turtlebot3_ws/src/
git clone -b humble-devel https://github.com/ROBOTIS-GIT/DynamixelSDK.git
git clone -b humble-devel https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
git clone -b humble-jp-devel https://github.com/ROBOTIS-JAPAN-GIT/turtlebot3_jp_custom.git
cd ~/turtlebot3_ws
colcon build --symlink-install
echo 'source ~/turtlebot3_ws/install/setup.bash' >> ~/.bashrc
source ~/.bashrc

RealSense2関係

sudo apt-get install -y ros-humble-realsense2-camera
cd ~/turtlebot3_ws/src
git clone -b humble-jp-devel https://github.com/ROBOTIS-JAPAN-GIT/realsense-ros_jp_custom
git clone -b foxy-devel https://github.com/pal-robotics/realsense_gazebo_plugin
cd ~/turtlebot3_ws
colcon build --symlink-install

シミュレーション関係

cd ~/turtlebot3_ws/src/
git clone -b humble-jp-devel https://github.com/ROBOTIS-JAPAN-GIT/turtlebot3_simulations_jp_custom
git clone https://github.com/robotics-upo/lightsfm
cd lightsfm
make
sudo make install
cd ~/turtlebot3_ws
colcon build --symlink-install

必要な設定をbashrcに書き込む。ここではbig_wheelを使う設定(シミュレーション上でRealSenseのカメラが付いてる)。

echo "export TURTLEBOT3_MODEL=big_wheel" >> ~/.bashrc
echo "export LDS_MODEL=LDS-01" >> ~/.bashrc
source ~/.bashrc

2.2は飛ばして2.3へ

2.2 次回以降

コンテナをros2testという名前で作成しているのでそれをstartする

docker start -i ros2test

別のWSL2を開きmate-terminalを起動する。

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

2.3 シミュレーション

以下全てmate-terminalで実行する。 ipconfigで調べたIPv4のアドレス(ここでは192.168.86.25の場合)を使ってPULSE_SERVERを指定してからmate-terminalをいっぺんい開く。

export PULSE_SERVER=tcp:192.168.86.25
mate-terminal
mate-terminal
mate-terminal
mate-terminal

mate-terminalその1

gazeboのsetup.shも使わないとgazeboが動かない暗黙の了解らしい。

cd ~/turtlebot3_ws
source ./install/setup.bash
source /usr/share/gazebo/setup.sh
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

turtlebot3_world.launch.pyを変えると別空間も試せる。

mate-terminalその2 (たぶん不要)

cd ~/turtlebot3_ws
source ./install/setup.bash
ros2 launch turtlebot3_bringup turtlebot3_state_publisher.launch.py

元ネタではrviz2にロボットモデルが表示されないので/robot_descriptionトピックを生成しとあるが,普通に成功しているのでやらなくても良さそう。 (RobotModelを追加しようとするとErrorになるときがある。そのときはrviz2の左下のreset)

mate-terminalその3

cd ~/turtlebot3_ws
source ./install/setup.bash
ros2 run turtlebot3_teleop teleop_keyboard

カメ操作でお馴染のteleopでwasdxキーでTurtleBot3を制御できる。

mate-terminalその4

cd ~/turtlebot3_ws
source ./install/setup.bash
ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True

rviz2が起動する。

起動後

rviz2とGazeboのウィンドウも開き,この時点でGazeboは空間にロボットが居る状態,rviz2はLiDARの出力でmapが生成されつつある状態になっている。 teleopのmate-terminalで操作できる。