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みたいなもので後で使う。
元ネタ
DockerではなくホストのWSLで音が出せない。確認はPCの音量を下げてからWSL上で下記を実行する。
pacat < /dev/urandom
で雑音が出ない。(Ctrl+C で停止) そもそもpacatがcommand not foundとなったら
sudo apt install -y pulseaudio pulseaudio-utils
でインストールできる。
- Windows用のPulseaudioを展開する
- Pulseaudioの設定を変更する
- WindowsのコマンドラインでPulseaudioのサーバーを起動する
- WSL上で環境変数
PULSE_SERVER
に,WindowsのIPv4アドレスを指定する - 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 次回以降
- コマンドプロンプトでIPv4アドレスを確認
- コマンドプロンプトからPulseaudioサーバーの起動
- コンテナ起動(下で説明)
- コンテナ上で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で操作できる。