articles:ros_docker

文書の過去の版を表示しています。


ROS Docker

参考:https://docs.docker.com/engine/install/ubuntu/

aptの設定

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
 
# Add the repository to Apt sources:
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

dockerのインストール

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

NVIDIA Container Toolkitのインストール
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html

aptの設定

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list \
  && \
    sudo apt-get update

インストー

sudo apt-get install -y nvidia-container-toolkit

dockerを一般ユーザで使えるようにする

sudo usermod -aG docker jibun

docker: Error response from daemon: could not select device driver “” with capabilities: gpu.が出たら

sudo apt-get install nvidia-container-runtime

その後,マシンの再起動または

service docker restart

参考:

githubからのダウンロード

$ git clone https://github.com/turlucode/ros-docker-gui.git
$ cd ros-docker-gui
$ ls
LICENSE  Makefile  Readme.md  assets  cpu  nvidia  tools

サポートされているコンテナを調べる

$ make
help                                       This help.
nvidia_ros_indigo                          [NVIDIA] Build ROS  Indigo  Container
 
.
.
nvidia_ros_kinetic                         [NVIDIA] Build ROS  Kinetic Container
.
.
nvidia_ros_melodic                         [NVIDIA] Build ROS  Melodic Container
nvidia_ros_melodic_cuda10                  [NVIDIA] Build ROS  Melodic Container | (CUDA 10     - no cuDNN)
nvidia_ros_melodic_cuda10-1                [NVIDIA] Build ROS  Melodic Container | (CUDA 10.1   - no cuDNN)
nvidia_ros_melodic_cuda10_cudnn7           [NVIDIA] Build ROS  Melodic Container | (CUDA 10     - cuDNN 7)
nvidia_ros_melodic_cuda10-1_cudnn7         [NVIDIA] Build ROS  Melodic Container | (CUDA 10.1   - cuDNN 7)
nvidia_ros_melodic_cuda11-4-2              [NVIDIA] Build ROS  Melodic Container | (CUDA 11.4.2 - no cuDNN)
nvidia_ros_melodic_cuda11-4-2_cudnn8       [NVIDIA] Build ROS  Melodic Container | (CUDA 11.4.2 - cuDNN 8)
nvidia_ros_noetic                          [NVIDIA] Build ROS  Noetic  Container
.
.
nvidia_ros_bouncy                          [NVIDIA] Build ROS2 Bouncy  Container
nvidia_run_help                            [NVIDIA] Prints help and hints on how to run an [NVIDIA]-based image
cpu_ros_indigo                             [CPU]    Build ROS  Indigo  Container
cpu_ros_kinetic                            [CPU]    Build ROS  Kinetic Container
cpu_ros_melodic                            [CPU]    Build ROS  Melodic Container
cpu_ros_noetic                             [CPU]    Build ROS  Noetic  Container
cpu_run_help                               [CPU]    Prints help and hints on how to run an [CPU]-based image
tools_vscode                               [Tools]  Create a new image that contains Visual Studio Code. Use it as "make tools_vscode <existing_docker_image>".
tools_canutils                             [Tools]  Create a new image that contains Canutils. Use it as "make tools_canutils <existing_docker_image>".
tools_cannelloni                           [Tools]  Create a new image that contains Cannelloni. Use it as "make tools_cannelloni <existing_docker_image>".
tools_cmake                                [Tools]  Create a new image that contains CMake. Use it as "make tools_cmake <existing_docker_image>".

サポートされているものが多数あるのでどれが良いかわからないが とりあえずシンプルに nvidia_ros_melodic を選択してみる.

$ sudo make nvidia_ros_melodic

かなり時間がかかる.

最後に以下が表示されて完了となる.

Docker Image: turlucode/ros-melodic:nvidia

実行前の処理

$ xhost +

rootとしてログインする実行スクリプト(–rm オプションは終了時にcontainerを削除するので注意)

docker run --gpus all -it --rm --name=ros_melodic \
       --privileged --net=host --ipc=host \
       -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY \
       -v $HOME/.Xauthority:/home/$(id -un)/.Xauthority \
       -e XAUTHORITY=/home/$(id -un)/.Xauthority \
       turlucode/ros-melodic:nvidia

一般ユーザでログインする実行スクリプト(–rm オプションは終了時にcontainerを削除するので注意)

ホスト側ユーザと同じ名前,IDのユーザをコンテナ側にも作成する

docker run -it --gpus all --rm --privileged --net=host --ipc=host \
  -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY \
  -v $HOME/.Xauthority:/home/$(id -un)/.Xauthority -e XAUTHORITY=/home/$(id -un)/.Xauthority \
  -e DOCKER_USER_NAME=$(id -un) \
  -e DOCKER_USER_ID=$(id -u) \
  -e DOCKER_USER_GROUP_NAME=$(id -gn) \
  -e DOCKER_USER_GROUP_ID=$(id -g) \
  -e ROS_IP=127.0.0.1 \
  turlucode/ros-melodic:nvidia

入ってから,

> sudo apt update
> sudo apt upgrade

この後,turtlebot3関連のパッケージをインストールすれば良い.

ユーザのローカルディスクのマウントオプション

# for root user
-v $HOME/<some_path>/catkin_ws:/root/catkin_ws
# for local user
-v $HOME/<some_path>/catkin_ws:/home/$(id -un)/catkin_ws

実行前の処理

$ xhost +

rootとしてログインする実行スクリプト(containerを残すため–rmをなくす): run_ros_melodic.sh

docker run --gpus all -it --name=ros_melodic \
       --privileged --net=host --ipc=host \
       -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY \
       -v $HOME/.Xauthority:/home/$(id -un)/.Xauthority \
       -e XAUTHORITY=/home/$(id -un)/.Xauthority \
       turlucode/ros-melodic:nvidia

containerのrootとしてやるべきことをやる.

  • aptのupdate,upgrade
  • その他,パッケージのインストール(これは後からでもできる)
  • ユーザの追加.ホスト側に合わせておくと楽かも.
  • ユーザのパスワード設定
  • ユーザをsudoグループに追加
> apt update
> apt upgrade
> apt install emacs
> useradd -u 1000 ts
> passwd ts
> usermod -G sudo ts

とりあえずsudoできるユーザを作成しておけば後は比較的自由にできる.

上記containerを抜けて新しいイメージの保存する.

$ docker commit melodic melodic:01

このあとは新たに作成したmelodic:01イメージに一般ユーザでログインする.

ホスト側にソースコードなどを残したいのでホスト側でディレクトリを作り それをcontainer側でマウントする.

$ mkdir ros_melodic

container名として同じros_melodicを使うのでros_melodicを消しておく.

$ docker container rm ros_melodic

ros_melodic:01を使ってユーザtsで/home/ts/ros_melodicをマウントしてcontainerを走らせる. (run_ros_melodic_4.sh)

このスクリプトは,startのたびに深くsu tsするためおかしな状態になるので使えない.

docker run -it --gpus all \
     --name ros_melodic\
     --privileged=true --net=host --ipc=host \
     -v $HOME/ros_melodic:/home/$(id -un)/ros_melodic \
     -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY \
     -v $HOME/.Xauthority:/home/$(id -un)/.Xauthority \
     -e XAUTHORITY=/home/$(id -un)/.Xauthority \
     -e DOCKER_USER_NAME=$(id -un) \
     -e DOCKER_USER_ID=$(id -u) \
     -e DOCKER_USER_GROUP_NAME=$(id -gn) \
     -e DOCKER_USER_GROUP_ID=$(id -g) \
     -e ROS_IP=127.0.0.1 \
     ros_melodic:01

そこで以下のスクリプトで走らせる.

docker run  -it --gpus all \
     --name ros_melodic \
     --privileged=true --net=host --ipc=host \
     -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY \
     -v $HOME/.Xauthority:/root/.Xauthority \
     -e XAUTHORITY=/root/.Xauthority \
     -e ROS_IP=127.0.0.1 \
     -v $HOME/ros_melodic:/home/$(id -un)/ros_melodic \
     ros_melodic:01

この後は,su tsとして一般ユーザとしてrosbookの作業を行っていけばよい.

containerを削除せずに続けて使えば変更が蓄積されていく.

 

もう一つのスクリプト

docker run -ti --rm --name robosoft \
     –v /home/ts:/home/ts:rw \
     –privileged=true \
     –workdir=/home/ts \
     –e DISPLAY=:0 \
     –v /tmp/.X11-unix:/tmp/.X11-unix \
     –v /home/ts/.Xauthority:/root/.Xauthority \
     –net=host \
     robosoft:1.0 \
   “bash” 

スナップショットが必要であれば新たな名前でimageを作成する.

Failed to load module “canberra-gtk-module” の対処法

$ sudo apt-get install libcanberra-gtk*

imageリスト

  1. ros_noetic:01 ユーザー作成,その他
  2. ros_noetic:02 rosbook 3,4,5章

実行前の処理

$ xhost +

rootとしてログインする実行スクリプト(containerを残すため–rmをなくす): run_ros_melodic.sh

docker run --gpus all -it --name=ros_noetic_01 \
       --privileged --net=host --ipc=host \
       -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY \
       -v $HOME/.Xauthority:/home/$(id -un)/.Xauthority \
       -e XAUTHORITY=/home/$(id -un)/.Xauthority \
       turlucode/ros-noetic:nvidia

containerのrootとしてやるべきことをやる.

  • aptのupdate,upgrade
  • その他,パッケージのインストール(これは後からでもできる)
  • ユーザの追加.ホスト側に合わせておくと楽かも.
  • ユーザのパスワード設定
  • ユーザをsudoグループに追加
> apt update
> apt upgrade
> apt install emacs
> apt install ros-noetic-turtlebot3-gazebo
> apt install gnome-terminal
> apt install python-is-python3
> adduser ts
> usermod -G sudo ts
> cp /etc/skel/.bashrc /home/ts
> cp /etc/skel/.bash_logout /home/ts
> cp /etc/skel/.profile /home/ts
> cd /home/ts
> chown ts:ts . .bashrc .bash_logout .profile
> su ts
$ cd
$ echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc

とりあえずsudoできるユーザを作成しておけば後は比較的自由にできる.

上記containerを抜けて新しいイメージの保存する.

$ docker commit ros_noetic_01 ros_noetic:01

このあとは新たに作成したros_noetic:01イメージに一般ユーザでログインする.

ホスト側にソースコードなどを残したいのでホスト側でディレクトリを作り それをcontainer側でマウントする.

$ mkdir ros_noetic

ros_melodic:01を使ってユーザtsで/home/ts/ros_melodicをマウントしてcontainerを走らせる. (run_ros_melodic_4.sh)

このスクリプトは,startのたびに深くsu tsするためおかしな状態になるので使えない.

docker run -it --gpus all \
     --name ros_melodic\
     --privileged=true --net=host --ipc=host \
     -v $HOME/ros_melodic:/home/$(id -un)/ros_melodic \
     -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY \
     -v $HOME/.Xauthority:/home/$(id -un)/.Xauthority \
     -e XAUTHORITY=/home/$(id -un)/.Xauthority \
     -e DOCKER_USER_NAME=$(id -un) \
     -e DOCKER_USER_ID=$(id -u) \
     -e DOCKER_USER_GROUP_NAME=$(id -gn) \
     -e DOCKER_USER_GROUP_ID=$(id -g) \
     -e ROS_IP=127.0.0.1 \
     ros_melodic:01

そこで以下のスクリプトで走らせる.

docker run  -it --gpus all \
     --name ros_noetic_02 \
     --privileged=true --net=host --ipc=host \
     -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY \
     -v $HOME/.Xauthority:/root/.Xauthority \
     -e XAUTHORITY=/root/.Xauthority \
     -e ROS_IP=127.0.0.1 \
     -v $HOME/ros_noetic:/home/$ts/ros_noetic \
     ros_noetic:01

この後は,su tsとして一般ユーザとしてrosbookの作業を行っていけばよい.

containerを削除せずに続けて使えば変更が蓄積されていく.

以下のエラーメッセージへの対応.

Couldn't connect to accessibility bus: Failed to connect to socket /run/user/1000/at-spi/bus_1: No such file or directory

.bashrcに以下を記述

# disable to display dbind-WARNING
export NO_AT_BRIDGE=1

もう一つのスクリプト

docker run -ti --rm --name robosoft \
     –v /home/ts:/home/ts:rw \
     –privileged=true \
     –workdir=/home/ts \
     –e DISPLAY=:0 \
     –v /tmp/.X11-unix:/tmp/.X11-unix \
     –v /home/ts/.Xauthority:/root/.Xauthority \
     –net=host \
     robosoft:1.0 \
   “bash” 

スナップショットが必要であれば新たな名前でimageを作成する.

Failed to load module “canberra-gtk-module” の対処法

$ sudo apt-get install libcanberra-gtk*

imageリスト

  1. ros_noetic:01 ユーザー作成まで
  2. ros_noetic:02 rosbook 3,4,5
  3. ros_noetic:03 wanderbot, teleopbot
  4. ros_noetic:04 followbot, mapping
  5. ros_noetic:05 navigation, patrol
  6. ros_noetic:06 stockroomの途中.失敗
  7. ros_noetic:07 tortoise
  8. ros_noetic:08 cougar
  9. ros_noetic:09 jaka
  10. ros_noetic:10 realsense

ros_noetix:xのイメージのcontainerを走らせる

sh ros_noetic_xth.sh

走っているros_noetic:xのイメージのcontainerに接続する

docker start ros_noetic_(x+1)

ros_noetic:xのイメージのcontanerを消して新たに走らせる

docker rm ros_noetic_(x+1)
sh ros_noetic_xth.sh

ros_noetic_(x+1)のcontainerをベースに新しいイメージを作り走らせる

$ docker commit ros_noetic_(x+1) ros_noetic:(x+1)

ros_neotic_(x+2)th.shを作成する - ベースイメージがros_noetic:(x+1) - container名はros_noetic_(x+2)

sh ros_noetic_(x+1)th.sh

containerをstartさせたり,imageからrunしようとしても以下のようなエラーで立ち上がらなくなった.

....
nvidia-container-cli: initialization error: nvml error: driver/library version mismatch: unknown.

対策:

  1. 再起動
  2. ドライバーの入れ直し.https://ryo-iijima.com/nvidia-smi-version-mismatch/

1が楽.

これはubuntu22.04ベース固定であまり使えなそう.

ちょとお試しという感じ.

参考:

$ sudo docker run -p 6080:80 --shm-size=512m tiryoh/ros-desktop-vnc:melodic

参考:

これから調査

素のubuntu desktop環境から始めれば自由度が高いかもしれない

と思ったが,何も(xとかも)入っていないので環境構築に苦労しそうl

  • articles/ros_docker.1724162752.txt.gz
  • 最終更新: 2024/08/20 23:05
  • by Takashi Suehiro