QooPenBlog

技術や日常のあれやこれや

ROS2 Humbleで動かすTurtlebot3シミュレーション

概要

ROSの学習コンテンツのひとつにTurtlebot3というロボットがあります。
本記事ではそのTurtlebot3のシミュレーション環境をDocker上に構築するための手順をまとめます。
なお、本記事ではDockerの環境構築についての説明は省略します。

Github

ここで紹介する内容は下記リポジトリに置いてありますのでよければお使いください。

github.com

動作環境

Dockerを動かすUbuntu環境はネイティブ、WSL2のどちらでも動くことを確認済です。
ネイティブのUbuntu環境だと私の知識不足でX serverにアクセスできず、GUIアプリケーション(GazeboとかRviz2とか)が使えなかったのでTiryoさんが作成しているVNC環境を使わせていただきました。(助かる~~!

github.com

訂正
ネイティブのUbuntu環境でGUIが動かせなかったのはDockerのユーザー権限周りに問題があったようでした。公式チュートリアルに沿ってやり直したら無事に起動できました。
- Official Install Guide
- ユーザーグループの設定(重要)

Turtlebot3環境構築

TL;DR(読まなくても良いよ。の意)

最初、下記の記事を参考にしながら進めていましたが
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
で起動しようとしてもエラーで正常に立ち上がらず苦戦していました。

zenn.dev

エラーメッセージ

[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氏から助言が・・・!!

藁にも縋る思いでnavigation2のチュートリアルを試してみると、、

という感じで無事に動作できたので、
以降の環境構築では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