ROS2開発をDockerで快適にする方法【VSCode devcontainer完全対応】
ROS2の環境構築はOSバージョンに強く依存します。Ubuntu 22.04にはHumble、24.04にはJazzyというように、ディストリビューションが固定されています。
Macや Windows で開発する場合、またはチームで同じ環境を共有したい場合は Docker を使うのがベストです。
この記事では「Dockerでの基本的な使い方」から「VSCode devcontainerで本格的に開発する方法」まで順に説明します。
Dockerfile
FROM osrf/ros:humble-desktop
# タイムゾーン設定(対話的なプロンプトを避ける)
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Tokyo
# 開発ツールを追加インストール
RUN apt-get update && apt-get install -y \
python3-pip \
python3-colcon-common-extensions \
python3-rosdep \
ros-humble-nav2-bringup \
ros-humble-slam-toolbox \
ros-humble-tf2-tools \
vim \
git \
&& rm -rf /var/lib/apt/lists/*
# Python パッケージ
RUN pip3 install \
anthropic \
numpy \
scipy
# ワーキングディレクトリ
WORKDIR /ros2_ws
# ROS2の環境を自動で読み込む
RUN echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc && \
echo "source /ros2_ws/install/setup.bash 2>/dev/null || true" >> ~/.bashrc
# デフォルトでbashを起動
CMD ["/bin/bash"]
docker-compose.yml
services:
ros2:
build:
context: .
dockerfile: Dockerfile
container_name: ros2_dev
volumes:
# ソースコードをマウント(ホスト側で編集したものがコンテナに即反映)
- ./src:/ros2_ws/src
# ビルドキャッシュを保持(毎回フルビルドしなくて済む)
- ros2_build:/ros2_ws/build
- ros2_install:/ros2_ws/install
- ros2_log:/ros2_ws/log
# GUI用(Linux/Mac)
- /tmp/.X11-unix:/tmp/.X11-unix
environment:
- DISPLAY=${DISPLAY:-host.docker.internal:0}
- ROS_DOMAIN_ID=0
- TURTLEBOT3_MODEL=burger
network_mode: host
stdin_open: true
tty: true
# privileged はシリアルポート(実機)にアクセスする場合に必要
# privileged: true
volumes:
ros2_build:
ros2_install:
ros2_log:
よく使うコマンド
# コンテナをビルドして起動
docker compose up -d --build
# コンテナに入る
docker compose exec ros2 bash
# 停止
docker compose down
# ボリュームごと削除(ビルドキャッシュをリセットしたいとき)
docker compose down -v
VSCode devcontainerで開発する
「コンテナ内でVSCodeが動く」状態にすることで、ホストのVSCodeから直接ROS2コードを書いて実行できます。
必要なVSCode拡張機能
- Dev Containers(必須)
- ROS(ms-iot.vscode-ros)
- Python(ms-python.python)
- C/C++(実機開発する場合)
.devcontainer/devcontainer.json
プロジェクトルートに .devcontainer/ フォルダを作って設定ファイルを置きます。
{
"name": "ROS2 Humble Dev",
"dockerComposeFile": "../docker-compose.yml",
"service": "ros2",
"workspaceFolder": "/ros2_ws",
"customizations": {
"vscode": {
"extensions": [
"ms-python.python",
"ms-python.pylance",
"ms-iot.vscode-ros",
"ms-vscode.cpptools",
"eamodio.gitlens"
],
"settings": {
"python.defaultInterpreterPath": "/usr/bin/python3",
"ros.distro": "humble",
"editor.formatOnSave": true,
"python.formatting.provider": "black"
}
}
},
"postCreateCommand": "cd /ros2_ws && colcon build --symlink-install 2>/dev/null || true",
"remoteUser": "root"
}
使い方
- VSCodeでプロジェクトフォルダを開く
- 左下の「><」をクリック → 「Reopen in Container」
- 初回はDockerイメージのビルドが走る(数分かかる)
- 完了するとコンテナ内でVSCodeが動いている状態になる
コンテナ内のターミナルで:
# パッケージをビルド
colcon build --symlink-install
# ROS2コマンドが使える
source install/setup.bash
ros2 run my_package my_node
MacでGUI(RViz2)を動かす
MacはLinuxと違い、Docker内のGUIをそのまま表示できません。XQuartzを使います。
XQuartzのインストールと設定
# インストール
brew install --cask xquartz
# 再起動後、XQuartzを起動してから設定を変更
# XQuartz > 環境設定 > セキュリティ
# 「ネットワーク・クライアントからの接続を許可」にチェック
毎回必要な作業
# XQuartzを起動した後
xhost +localhost
# docker-compose.yml の environment に追加
# DISPLAY: host.docker.internal:0
コンテナ内で:
source /opt/ros/humble/setup.bash
rviz2 # ウィンドウが表示されれば成功
Macでよくあるエラー
Authorization required, but no authorization protocol specified
xhost +localhost # を実行してから再度試す
libGL error: No matching fbConfigs or visuals found
export LIBGL_ALWAYS_SOFTWARE=1
rviz2
ビルドを速くするTips
# 特定のパッケージだけビルド
colcon build --symlink-install --packages-select my_package
# 並列ビルド数を指定(CPUコア数に合わせる)
colcon build --symlink-install --parallel-workers 4
# デバッグビルド(エラーが詳しくなる)
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Debug
# ビルドキャッシュを使いつつ変更のあったパッケージだけ再ビルド
colcon build --symlink-install --packages-above my_package
プロジェクト全体のディレクトリ構成
project/
├── .devcontainer/
│ └── devcontainer.json
├── src/
│ ├── my_robot/
│ │ ├── my_robot/
│ │ │ ├── __init__.py
│ │ │ └── node.py
│ │ ├── launch/
│ │ ├── config/
│ │ ├── package.xml
│ │ └── setup.py
│ └── my_interfaces/ # カスタムメッセージ定義
├── docker-compose.yml
└── Dockerfile
この構成にしておくと、git clone してから docker compose up -d と「Reopen in Container」だけで環境が整います。チームへの共有も簡単です。