概要
ROSの学習コンテンツのひとつにTurtlebot3というロボットがあります。
本記事ではそのTurtlebot3のシミュレーション環境をDocker上に構築するための手順をまとめます。
なお、本記事ではDockerの環境構築についての説明は省略します。
Github
ここで紹介する内容は下記リポジトリに置いてありますのでよければお使いください。
動作環境
Dockerを動かすUbuntu環境はネイティブ、WSL2のどちらでも動くことを確認済です。
ネイティブのUbuntu環境だと私の知識不足でX serverにアクセスできず、GUIアプリケーション(GazeboとかRviz2とか)が使えなかったのでTiryoさんが作成しているVNC環境を使わせていただきました。(助かる~~!)
訂正
ネイティブのUbuntu環境でGUIが動かせなかったのはDockerのユーザー権限周りに問題があったようでした。公式チュートリアルに沿ってやり直したら無事に起動できました。
- Official Install Guide
- ユーザーグループの設定(重要)
Turtlebot3環境構築
TL;DR(読まなくても良いよ。の意)
最初、下記の記事を参考にしながら進めていましたが
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
で起動しようとしてもエラーで正常に立ち上がらず苦戦していました。
エラーメッセージ
[spawn_entity.py-4] [INFO] [1708755625.431923993] [spawn_entity]: Waiting for entity xml on /robot_description [spawn_entity.py-4] [INFO] [1708755625.445295021] [spawn_entity]: Waiting for service /spawn_entity, timeout = 30 [spawn_entity.py-4] [INFO] [1708755625.446068811] [spawn_entity]: Waiting for service /spawn_entity [spawn_entity.py-4] [ERROR] [1708755655.517602461] [spawn_entity]: Service %s/spawn_entity unavailable. Was Gazebo started with GazeboRosFactory? [spawn_entity.py-4] [ERROR] [1708755655.518336260] [spawn_entity]: Spawn service failed. Exiting. [ERROR] [spawn_entity.py-4]: process has died [pid 2400, exit code 1, cmd '/opt/ros/humble/lib/gazebo_ros/spawn_entity.py -topic /robot_description -entity big_wheel -x -2.0 -y -0.5 -z 0.01 --ros-args'].
そのことをX(旧Twitter)で嘆いていたところ、porizou氏から助言が・・・!!
turtlebot3_gazeboのlaunch使う以外にnav2のtb3_simulation_launch.py使う方法も https://t.co/5XQVI7bg8p
— porizou (@porizou1) 2024年2月29日
藁にも縋る思いでnavigation2のチュートリアルを試してみると、、
ありがとうございます!!https://t.co/sfNNEr48um
— くーぺん (@QooPen0815) 2024年2月29日
公式チュートリアルを確認して足りないパッケージや処理を補って試してみたら無事に動きました!!!感謝です〜〜〜!
(turtlebot3モデルがスポーンされないときが時々ありましたが何度か繰り返すと正常に起動しました!) pic.twitter.com/G18o3lr1n5
という感じで無事に動作できたので、
以降の環境構築ではnavigation2パッケージを使ってTurtlebot3シミュレーションを動かすことにしています。ご承知おきくださいませ。
Docker構築
環境構築用のDockerfile, docker-compose.ymlは下記の通りです。
Dockerfile
ARG ROS_DISTRO=humble FROM osrf/ros:${ROS_DISTRO}-desktop LABEL maintainer="KuwanoTomohiro<ku_fairlady_wa@outlook.com>" # Set to not be asked to select keyboard settings ARG DEBIAN_FRONTEND=noninteractive # Install apt packages RUN apt update && apt upgrade -y RUN apt install -y \ tzdata \ x11-apps \ build-essential \ python3 python3-pip \ python3-colcon-common-extensions && \ apt clean && rm -rf /var/lib/apt/lists/* ENV TZ=Asia/Tokyo # Install dependent ROS2 packages RUN apt update && \ apt install -y \ ros-${ROS_DISTRO}-gazebo-* \ ros-${ROS_DISTRO}-cartographer \ ros-${ROS_DISTRO}-cartographer-ros \ ros-${ROS_DISTRO}-navigation2 \ ros-${ROS_DISTRO}-nav2-bringup \ ros-${ROS_DISTRO}-xacro RUN apt clean && rm -rf /var/lib/apt/lists/* # Install Turtlebot3 Packages RUN apt update && \ apt install -y \ ros-${ROS_DISTRO}-dynamixel-sdk \ ros-${ROS_DISTRO}-turtlebot3-gazebo \ ros-${ROS_DISTRO}-turtlebot3-msgs \ ros-${ROS_DISTRO}-turtlebot3 RUN apt clean && rm -rf /var/lib/apt/lists/* # Create workspace & Clone Turtlebot3 simulation package RUN mkdir -p /root/ros2_ws/src RUN git clone -b ${ROS_DISTRO}-devel https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git /root/ros2_ws/src # Environment Configuration RUN echo "source /opt/ros/$ROS_DISTRO/setup.bash" >> /root/.bashrc RUN echo 'export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/opt/ros/$ROS_DISTRO/share/turtlebot3_gazebo/models' >> /root/.bashrc RUN /bin/bash -c "source /root/.bashrc" # Build packages RUN cd /root/ros2_ws && \ /bin/bash -c "source /opt/ros/$ROS_DISTRO/setup.bash; colcon build --symlink-install" && \ /bin/bash -c "source install/setup.bash" RUN echo "source /root/ros2_ws/install/setup.bash" >> /root/.bashrc
docker-compose.yml
version: "3.8" services: dev: build: context: . dockerfile: docker/Dockerfile args: - ROS_DISTRO=humble image: turtlebot3-sim container_name: tb3_dev volumes: - /tmp/.X11-unix:/tmp/.X11-unix:rw # DockerでGUIを使用する設定 - ${XAUTHORITY:-$HOME/.Xauthority}:/root/.Xauthority tty: true network_mode: host privileged: true environment: # Display X Server GUI. - DISPLAY=${DISPLAY} - QT_X11_NO_MITSHM=1 # Set environment variables. It is instead of writing them in .bashrc. - TURTLEBOT3_MODEL=waffle - ROS_DOMAIN_ID=30
コンテナはdocker compose up -d --build
で起動、docker compose down
で終了です。
コンテナがうまく立ち上がったら、中に入ってturtlebot3のGazeboを以下のコマンドで立ち上げます。
ros2 launch nav2_bringup tb3_simulation_launch.py headless:=False
初回起動とかだとうまく立ち上がらないこともあるので、その時はCtrl+Cで終了してコマンドをもう一度やり直してください。
参考
謝辞
X(旧Twitter)で助言をくださった方々ありがとうございました。
ROSは大学時代によく触っていましたが、卒業後はあまり触れておらず、さらにROSからROS2に移り変わってしまったのでほぼビギナーも同然です。
そんな感じなので些細なことでも意見交換させていただけるのはとても嬉しいですし、相談のしやすいROSコミュニティは心強いですね。
これからも宜しくお願い致します(`・ω・´)b