LoginSignup
10
9

Docker・rocker でGUIとGPUが使えるROS 2 Humbleの環境を作る

Posted at

はじめに

Nvidia DockerでGUIとGPUが使えるDocker イメージを作成してrockerでコンテナを起動するメモ
同様のDockerファイルはいろいろ公開されているが余計なものが多いのでDockerfileは自分で作成する

環境

ホストPCの環境

Component Version
OS Ubuntu 22.04.2 LTS
GPU NVIDIA GeForce RTX 3050Ti
NVIDIAドライバ 530.30.02
Docker 23.0.5

Docker ・ Nvidia-dockerのインストール

Docker

sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
sudo apt-get update
sudo apt-get install docker-ce

nvidia-docker2

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install nvidia-docker2
sudo systemctl restart docker.service

Dockerfileの作成

適当な場所にDockerfileを作る 
説明はコメントを参照

Dockerfile
# ベースイメージの設定
FROM nvidia/opengl:base-ubuntu22.04 

# 環境変数の設定
ENV DEBIAN_FRONTEND=noninteractive
ENV __NV_PRIME_RENDER_OFFLOAD=1
ENV __GLX_VENDOR_LIBRARY_NAME=nvidia

# 必要なパッケージのインストール
RUN apt-get update && apt-get install -y \
    curl \
    gnupg \
    lsb-release

# ROSのリポジトリをsource listに追加
ENV UBUNTU_CODENAME=focal
RUN curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | apt-key add - \
    && echo "deb http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" > /etc/apt/sources.list.d/ros2-latest.list

# ROS2のインストール
RUN apt-get update && apt-get install -y \
    ros-humble-desktop

# colconのインストール
RUN apt-get install -y python3-colcon-common-extensions

# Gazeboのインストール
RUN apt-get install -y gazebo \
    ros-humble-gazebo-*

# rqtのプラグインをインストール
RUN apt-get install -y ros-humble-rqt-*

# ワークスペースの作成
RUN mkdir -p ~/ros2_ws/src
WORKDIR /root/ros2_ws/
RUN /bin/bash -c '. /opt/ros/humble/setup.bash; colcon build'

# エントリーポイントを設定
COPY ./ros_entrypoint.sh /
RUN chmod +x /ros_entrypoint.sh
ENTRYPOINT ["/ros_entrypoint.sh"]

# コマンドを設定
CMD ["bash"]

Dockerコンテナで起動したrviz2やGazeboがGPUを使って描画できるようにOpenGLが入ったubuntu22.04のイメージをベースにする。

Dockerfile
FROM nvidia/opengl:base-ubuntu22.04 

Dockerfileと同じディレクトリにros_entrypoint.shを作成する。
毎回コンテナ起動する度にsource ../setup.bashを実行するのは面倒なのでここに記述してCOPY ./ros_entrypoint.sh / でコンテナ内にコピーする

vim ros_entrypoint.sh
sudo chmod +x ros_entrypoint.sh
ros_entrypoint.sh
#!/bin/bash
source /opt/ros/humble/setup.bash
source ~/ros2_ws/install/setup.bash
exec "$@"

Dockerfileのビルド

Dockerfileがあるディレクトリで以下を実行
ros2_humbleには適当な名前を設定

 docker build -t ros2_humble .

imageができているか確認

docker images
REPOSITORY                               TAG                               IMAGE ID       CREATED         SIZE
ros2_humble                              latest                            c124ead937a3   9 hours ago     4.23GB

rocker でDockerコンテナの起動

rockerのインストール

sudo apt update && sudo apt install curl gnupg lsb-release
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
sudo apt update
sudo apt-get install python3-rocker

コンテナの起動

以下先程作成したros_humbleイメージのコンテナを起動するコマンドの例

rocker --nvidia --x11 --user --network host --privileged --nocleanup --name humble ros2_humble:latest 

--nvidia : GPUを有効にする
--x11 : X11を有効にしてGUIを使えるようにする
--network host : ホストPCとネットワークを共有して他PCとROS2通信したり、Ethernetのデバイスを使ったりする
--privileged : USBデバイスなどを使えるように
--nocleanup : コンテナstop時にコンテナが削除されないようにする
--name humble : コンテナに名前をつける

2回目以降起動するとき

docker start humble
docker attach humble

rviz2, Gazeboの動作確認

docker コンテナ内でrviz2 やGazeboを起動
ホストPCまたはDockerコンテナ内のターミナルでnvidia-smi を実行してrviz2またはGazeboのプロセス名前があればOK

rviz2
nvidia-smi

image.png

rockerのオプション

オプション 日本語の説明
-h, --help このヘルプメッセージを表示して終了します
--noexecute 廃止予定(デフォルト:False)
--nocache キャッシュを無効にします
--nocleanup コンテナが停止したときにDockerコンテナを削除しない(デフォルト:False)
--pull Dockerイメージをプルします
-v, --version プログラムのバージョン番号を表示して終了します
--dev-helpers 開発ツールのemacsとbyobuを環境に追加します(デフォルト:None)
--devices [DEVICES [DEVICES ...]] デバイスをコンテナにマウントします(デフォルト:None)
--env NAME[=VALUE] [NAME[=VALUE] ...], -e NAME[=VALUE] [NAME[=VALUE] ...] 環境変数を設定します(デフォルト:[])
--env-file ENV_FILE env-fileを介して環境変数を設定します(デフォルト:None)
--git ホストからのグローバルGit設定を使用します(/etc/gitconfigおよび~/.gitconfig)(デフォルト:None)
--git-config-path GIT_CONFIG_PATH git設定へのパスを上書きします(デフォルト:/home/daisuke/.gitconfig)
--home ユーザーのホームディレクトリをマウントします(デフォルト:None)
--name NAME コンテナの名前(デフォルト:)
--network {host,none,bridge} 使用するネットワーク設定(デフォルト:None)
--nvidia nvidiaを有効にします(デフォルト:None)
--privileged コンテナに拡張権限を付与します(デフォルト:None)
--pulse pulseオーディオデバイスをマウントします(デフォルト:None)
--ssh SSHエージェントをコンテナに転送します(デフォルト:None)
--user 現在のユーザーIDをマウントし、そのユーザーとして実行します(デフォルト:None)
--user-override-name USER_OVERRIDE_NAME 現在のユーザー名を上書きします(デフォルト:None)
--user-preserve-home 新しいユーザーを作成するときにホームディレクトリが存在する場合は削除しません
--volume HOST-DIR[:CONTAINER-DIR[:OPTIONS]] [HOST-DIR[:CONTAINER-DIR[:OPTIONS]] ...] コンテナ内のボリュームをマウントします(デフォルト:None)
--x11 x11を有効にします(デフォルト:None)
--mode {interactive,non-interactive,dry-run} rockerの操作モードを選択します(デフォルト:interactive)
--image-name IMAGE_NAME 最終イメージにタグをつけます。dry-runと一緒に有用です(デフォルト:None)
--extension-blacklist [EXTENSION_BLACKLIST [EXTENSION_BLACKLIST ...]] これらの拡張機能のロードを防ぎます(デフォルト:[])

参考

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9