在Ubuntu上使用Docker运行Rviz和Gazebo

首先

为了方便那些想要尝试创建各种不同的ROS环境但又觉得环境配置麻烦的人,我将介绍使用Docker来构建ROS环境的方法。相比直接在主机操作系统上配置环境,使用Docker可以省去很多配置环境的繁琐步骤,而且还可以创建多个环境,具有很多优点。这种方法不需要太多有关Docker的知识,这也是它的优点之一。

假设为前提的个人电脑环境

满足下列两个条件

    Ubuntu が入っている
    NVIDIA のグラフィックボード、もしくは Intel などの内蔵 GPU 1 を搭載している

能够做到的事情

使用Docker启动的Ubuntu中启动ROS,显示Rviz和Gazebo的GUI。

请首先确认您想使用的 ROS 版本是否得到支持,可以通过以下网站进行确认。本次所提及的 GitHub 存储库是基于此。

这次要做什么

    Docker のインストール
    NVIDIA 関連のあれこれ

    Nouveau の無効化
    NVIDIA ドライバのインストール
    NVIDIA Container Toolkit のインストール

    X サーバへのアクセス設定
    Docker イメージの取得

    Docker ファイルのダウンロード
    Docker ファイルのビルド

    動作確認

安装Docker

根据”在Ubuntu上安装Docker Engine – 使用Apt存储库进行安装”的说明,请打开终端并执行以下命令。

$ sudo apt update
$ sudo apt -y 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
$ 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 update
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

接下来,我们将对Docker命令进行更改,使其可以在非管理员权限(无需sudo)下执行。请执行以下命令。

$ sudo groupadd docker
$ sudo usermod -aG docker $USER

请确认操作步骤已经完成。请先关闭终端,再重新打开后执行以下命令。

$ docker --rm run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
719385e32844: Pull complete 
Digest: sha256:88ec0acaa3ec199d3b7eaf73588f4518c25f9d34f58ce9a0df68429c5af48e8d
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

英伟达(NVIDIA)驱动程序及相关事项

如果您的 PC 上安装了 NVIDIA 显卡,才需要执行此步骤。如果您没有安装显卡,而是使用内置的 GPU1,那么请跳过此步骤,继续进行“X 服务器访问设置”的步骤。

    NVIDIA グラフィックボードを搭載している場合
    まず既に NVIDIA ドライバをインストール済みかどうかを確認します。ターミナルを開き以下のコマンドを実行してください。
    $ dpkg -l | grep nvidia

    何も表示されなかった場合はそのまま以下の手順に進みます。何かしらの NVIDIA ドライバの情報が表示された場合は、以下の手順をスキップして “Docker のインストール” の手順に進んでください。
    その後、以下の手順を行います。

    Nouveau の無効化
    NVIDIA ドライバのインストール

新的无效化

    NVIDIA グラフィックボードを搭載している場合
    まず Nouveau モジュールが動いていることを確認します。ターミナルを開き以下のコマンドを実行してください。
    $ lsmod | grep nouveau
    nouveau 1403757 0
    video 24400 1 nouveau
    mxm_wmi 13021 1 nouveau
    i2c_algo_bit 13413 1 nouveau
    drm_kms_helper 125008 1 nouveau
    ttm 93441 1 nouveau
    drm 349210 3 ttm,drm_kms_helper,nouveau
    i2c_core 40582 5
    drm,i2c_i801,drm_kms_helper,i2c_algo_bit,nouveau
    wmi 19070 2 mxm_wmi,nouveau

    何かしらの情報が表示され Nouveau モジュールが動いていることを確認した後、 /etc/modprobe.d ディレクトリに移動します。TODOd: もしなにも表示されない場合。以下のコマンドを実行してください。
    $ cd /etc/modprobe.d

    次に Nouveau モジュールの設定を記述する blacklist-nouveau.conf ファイルを作成します。以下のコマンドを実行し、
    $ sudo nano blacklist-nouveau.conf

    表示される blacklist-nouveau.conf ファイルの内容に以下を書き記し、

    blacklist-nouveau.conf
    blacklist nouveau
    options nouveau modeset=0

    Control + S により blacklist-nouveau.conf ファイルを保存した後、Control + X で blacklist-nouveau.conf ファイルを閉じてください。
    最後に、initramfs イメージを更新します 2。以下のコマンドを実行してください。
    $ sudo update-initramfs -u

NVIDIA 驅動程式的安裝

警告
如果以下步骤失败,可能会导致驱动程序冲突、屏幕无法显示、无法登录等故障。请务必谨慎操作。

    NVIDIA グラフィックボードを搭載している場合
    まず Ubuntu のグラフィックスドライバを更新します。ターミナルを開き以下のコマンドを実行してください。
    $ sudo add-apt-repository ppa:graphics-drivers/ppa
    $ sudo apt update

    次に PC に推奨されるドライバを調べます。以下のコマンドを実行してください。
    $ ubuntu-drivers devices
    == /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
    modalias : pci:v000010DEd00002204sv000019DAsd00001613bc03sc00i00
    vendor : NVIDIA Corporation
    driver : nvidia-driver-535 – third-party non-free
    driver : nvidia-driver-525 – third-party non-free
    driver : nvidia-driver-525-server – distro non-free
    driver : nvidia-driver-470-server – distro non-free
    driver : nvidia-driver-470 – distro non-free
    driver : nvidia-driver-535-server – distro non-free
    driver : nvidia-driver-535-server-open – distro non-free recommended
    driver : nvidia-driver-525-open – distro non-free
    driver : nvidia-driver-535-open – third-party non-free
    driver : xserver-xorg-video-nouveau – distro free builtin

    表示されたリストの中で recommended と書かれている NVIDIA ドライバをインストールします。例えば nvidia-driver- であった場合、以下のようにコマンドを実行してください。
    $ sudo apt install nvidia-driver-

    再起動します。以下のコマンドを実行してください。
    $ sudo reboot

    ログイン後、まずインストールされた NVIDIA 関連のパッケージを確認します。以下のコマンドを実行してください。
    $ dpkg -l | grep nvidia
    ii libnvidia-cfg1-525:amd64 525.85.12-0ubuntu1 amd64 NVIDIA binary OpenGL/GLX configuration library
    ii libnvidia-common-525 525.85.12-0ubuntu1 all Shared files used by the NVIDIA libraries
    ii libnvidia-compute-525:amd64 525.85.12-0ubuntu1 amd64 NVIDIA libcompute package
    ii libnvidia-compute-525:i386 525.85.12-0ubuntu1 i386 NVIDIA libcompute package
    ii libnvidia-container-tools 1.13.5-1 amd64 NVIDIA container runtime library (command-line tools)
    ii libnvidia-container1:amd64 1.13.5-1 amd64 NVIDIA container runtime library
    ii libnvidia-decode-525:amd64 525.85.12-0ubuntu1 amd64 NVIDIA Video Decoding runtime libraries
    ii libnvidia-decode-525:i386 525.85.12-0ubuntu1 i386 NVIDIA Video Decoding runtime libraries
    ii libnvidia-encode-525:amd64 525.85.12-0ubuntu1 amd64 NVENC Video Encoding runtime library
    ii libnvidia-encode-525:i386 525.85.12-0ubuntu1 i386 NVENC Video Encoding runtime library
    ii libnvidia-extra-525:amd64 525.85.12-0ubuntu1 amd64 Extra libraries for the NVIDIA driver
    ii libnvidia-fbc1-525:amd64 525.85.12-0ubuntu1 amd64 NVIDIA OpenGL-based Framebuffer Capture runtime library
    ii libnvidia-fbc1-525:i386 525.85.12-0ubuntu1 i386 NVIDIA OpenGL-based Framebuffer Capture runtime library
    ii libnvidia-gl-525:amd64 525.85.12-0ubuntu1 amd64 NVIDIA OpenGL/GLX/EGL/GLES GLVND libraries and Vulkan ICD
    ii libnvidia-gl-525:i386 525.85.12-0ubuntu1 i386 NVIDIA OpenGL/GLX/EGL/GLES GLVND libraries and Vulkan ICD
    ii nvidia-compute-utils-525 525.85.12-0ubuntu1 amd64 NVIDIA compute utilities
    ii nvidia-container-toolkit 1.13.5-1 amd64 NVIDIA Container toolkit
    ii nvidia-container-toolkit-base 1.13.5-1 amd64 NVIDIA Container Toolkit Base
    ii nvidia-dkms-525 525.85.12-0ubuntu1 amd64 NVIDIA DKMS package
    ii nvidia-driver-525 525.85.12-0ubuntu1 amd64 NVIDIA driver metapackage
    ii nvidia-kernel-common-525 525.85.12-0ubuntu1 amd64 Shared files used with the kernel module
    ii nvidia-kernel-source-525 525.85.12-0ubuntu1 amd64 NVIDIA kernel source package
    ii nvidia-modprobe 525.85.12-0ubuntu1 amd64 Load the NVIDIA kernel driver and create device files
    ii nvidia-prime 0.8.16~0.20.04.2 all Tools to enable NVIDIA’s Prime
    ii nvidia-settings 525.85.12-0ubuntu1 amd64 Tool for configuring the NVIDIA graphics driver
    ii nvidia-utils-525 525.85.12-0ubuntu1 amd64 NVIDIA driver support binaries
    ii screen-resolution-extra 0.18build1 all Extension for the nvidia-settings control panel
    ii xserver-xorg-video-nvidia-525 525.85.12-0ubuntu1 amd64 NVIDIA binary Xorg driver

    次に NVIDIA モジュールの状態を確認します。以下のコマンドを実行してください。
    $ lsmod | grep nvidia
    nvidia_uvm 1388544 0
    nvidia_drm 69632 14
    nvidia_modeset 1216512 20 nvidia_drm
    nvidia 56336384 1168 nvidia_uvm,nvidia_modeset
    drm_kms_helper 307200 1 nvidia_drm
    drm 618496 18 drm_kms_helper,nvidia,nvidia_drm

    最後に GPU の状態や利用率を確認します。以下のコマンドを実行してください。
    $ nvidia-smi
    Sun Oct 15 17:08:11 2023
    +—————————————————————————–+
    | NVIDIA-SMI 525.85.12 Driver Version: 525.85.12 CUDA Version: 12.0 |
    |——————————-+———————-+———————-+
    | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
    | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
    | | | MIG M. |
    |===============================+======================+======================|
    | 0 NVIDIA GeForce … On | 00000000:01:00.0 On | N/A |
    | 0% 57C P8 25W / 350W | 473MiB / 24576MiB | 19% Default |
    | | | N/A |
    +——————————-+———————-+———————-+

    +—————————————————————————–+
    | Processes: |
    | GPU GI CI PID Type Process name GPU Memory |
    | ID ID Usage |
    |=============================================================================|
    | 0 N/A N/A 1140 G /usr/lib/xorg/Xorg 35MiB |
    | 0 N/A N/A 1880 G /usr/lib/xorg/Xorg 252MiB |
    | 0 N/A N/A 2004 G /usr/bin/gnome-shell 26MiB |
    | 0 N/A N/A 2458 G …veSuggestionsOnlyOnDemand 48MiB |
    | 0 N/A N/A 54442 G /usr/bin/anydesk 20MiB |
    | 0 N/A N/A 624141 G …937440421976888396,262144 10MiB |
    | 0 N/A N/A 728274 G …/ros/noetic/lib/rviz/rviz 8MiB |
    | 0 N/A N/A 2923469 G …RendererForSitePerProcess 45MiB |
    +—————————————————————————–+

    以上の手順は “【Ubuntu + NVIDIA】Ubuntu に NVIDIA ドライバーをインストール”、”ubuntuにCUDA、nvidiaドライバをインストールするメモ” を参考にしました。

安装 NVIDIA 容器工具包

    NVIDIA グラフィックボードを搭載している場合
    まず必要なリポジトリと GPG 鍵を設定します。ターミナルを開き以下のコマンドを実行してください。
    $ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
    && 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/$distribution/libnvidia-container.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

    NVIDIA Container Toolkit をインストールします。以下のコマンドを実行してください。
    $ sudo apt update && sudo apt install -y nvidia-container-toolkit

    次に Docker デーモンが NVIDIA Container Runtime を認識するよう設定をします。以下のコマンドを実行してください。
    $ sudo nvidia-ctk runtime configure –runtime=docker

    Docker デーモンを再起動します。以下のコマンドを実行してください。
    $ sudo systemctl restart docker

    最後に NVIDIA Container Toolkit が正しくインストールされたか確認します。以下のコマンドを実行してください。
    $ docker run –rm –gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark -numbodies=640000

    以上の手順は “UbuntuにDockerをインストールしてGPUを認識させる – NVIDIA Container Toolkitのインストール”、”Installing the NVIDIA Container Toolkit” を参考にしました。

X 服务器的访问设置

我們將設定允許連接到 X 伺服器,這樣一來,X Window System (X11) 的圖形使用者介面就可以運作,並且能夠使用即將建立的 Docker 容器。請打開終端機並執行以下指令。

$ xhost local:user

请在从以下获取的Docker镜像中创建和使用容器之前,每次都执行以下步骤。

获取Docker镜像

执行以下步骤。

    Docker ファイルの複製
    Docker ファイルのビルド

复制Docker文件 Docker

请将GitHub存储库复制到任意目录中,例如复制到主目录(~/)中。请打开终端并执行以下命令。

$ cd
$ git clone https://github.com/turlucode/ros-docker-gui.git

构建Docker文件

首先,切換到存放 Docker 文件的目錄中。例如,切換到(~/ros-docker-gui)。打開終端並執行以下命令。

$ cd ~/ros-docker-gui

然后进行构建。请执行以下命令。例如,将要使用的 ROS 版本设为

    PC にグラフィックボードを搭載している場合
    $ make ros_

    PC にグラフィックボードを搭載しておらず内蔵 GPU 1 を搭載している場合
    $ make cpu_ros_

确认动作

请创建一个容器并登录。打开终端并执行以下命令。

    NVIDIA グラフィックボードを搭載している場合
    $ docker run -it –runtime=nvidia –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 ROS_IP=127.0.0.1 turlucode/ros-:

    グラフィックボードを搭載しておらず内蔵 GPU 1 を搭載している場合
    $ docker run -it –privileged –net=host –ipc=host –device=/dev/dri:/dev/dri -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY -v $HOME/.Xauthority:/home/$(id -un)/.Xauthority -e XAUTHORITY=/home/$(id -un)/.Xauthority -e ROS_IP=127.0.0.1 turlucode/ros-:cpu

如果执行上述命令,则会打开 X Window System 的终端 (Terminator 3)。

请在Terminator上执行以下命令来启动roscore。

$ roscore

请在Terminator上执行以下命令以启动Rviz。

$ rviz

请在Terminator上按Ctrl + C来退出Rviz。

请在终端中输入以下命令来启动 Gazebo。

$ gazebo

请在终止器上按下 Ctrl + C 来结束 Gazebo。

请最后注销并停止容器。请关闭终端。

最后一句

在我们刚才介绍的容器中,如果需要进一步编写代码,可以方便地使用已安装了VSCode的Docker镜像,或者使用VSCode的扩展功能(Remote Explorer)。

引用资料

    https://github.com/turlucode/ros-docker-gui
    内蔵GPUとは?外部GPUとの違いや今後の動向について解説!
    【Ubuntu + NVIDIA】Ubuntu に NVIDIA ドライバーをインストール
    ubuntuにCUDA、nvidiaドライバをインストールするメモ
    Install Docker Engine on Ubuntu – Install using the Apt repository
    Linux post-installation steps for Docker Engine – Manage Docker as a non-root user
    UbuntuにDockerをインストールしてGPUを認識させる – NVIDIA Container Toolkitのインストール
    Installing the NVIDIA Container Toolkit
    ターミナル環境の構築: Terminatorのインストール

根据 “内蔵GPUとは?外部GPUとの違いや今後の動向について解説!”,内蔵GPU指的是像Intel等CPU内置的图形处理器,而分离GPU则指的是像图形卡等外部设备。

根据”ターミナル環境の構築: Terminatorのインストール”,Terminator (终端仿真器) 是一个可以替代默认安装的终端 (Gnome Terminal) 来使用的终端程序。

bannerAds