文書の過去の版を表示しています。
ROS Docker
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
ros-docker-gui
参考:
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
nvidia_ros_melodicの今回の使い方
実行前の処理
$ 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リスト
- ros_noetic:01 ユーザー作成,その他
- ros_noetic:02 rosbook 3,4,5章
nvidia_ros_noetic の今回の使い方
実行前の処理
$ 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リスト
- ros_noetic:01 ユーザー作成まで
- ros_noetic:02 rosbook 3,4,5
- ros_noetic:03 wanderbot, teleopbot
- ros_noetic:04 followbot, mapping
- ros_noetic:05 navigation, patrol
- ros_noetic:06 stockroomの途中.失敗
- ros_noetic:07 tortoise
- ros_noetic:08 cougar
- ros_noetic:09 jaka
- 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
nvidiaのcontainerが動かなくなった
containerをstartさせたり,imageからrunしようとしても以下のようなエラーで立ち上がらなくなった.
.... nvidia-container-cli: initialization error: nvml error: driver/library version mismatch: unknown.
対策:
- 再起動
1が楽.
docker-ros-desktop-vnc
これはubuntu22.04ベース固定であまり使えなそう.
ちょとお試しという感じ.
参考:
$ sudo docker run -p 6080:80 --shm-size=512m tiryoh/ros-desktop-vnc:melodic
ubuntu18.04
参考:
これから調査
素のubuntu desktop環境から始めれば自由度が高いかもしれない
と思ったが,何も(xとかも)入っていないので環境構築に苦労しそうl