14
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

DockerでGUIアプリを起動する(amd64)(GPU)(ROS2)

やりたいこと

amd64のGPU付きノートPCで、Docker上でROS/ROS2を起動して、rvizやgazeboを動かしたい。
本体環境を保護して、別のマシンに環境をそのまま持っていくことが目的。
やり方が理解できないので、先人のやっていることを理解しながらのメモ。

やりたいことをもう少し細分化

  • GPU付きのノートPCのDocker環境でROSを動かす
  • GUDA10.2とOpenGLが動く
  • GUIが画面に出力されるようにする
  • ディレクトリをホストと共有したい

参考にしている情報

シンプルに書いてある。参考になりそう。
DockerでGUIアプリを実行する

OpenGLが動くDockerイメージ
nvidia/opengl

CUDAとOpenGLが動くDockerイメージ
nvidia/cudagl

やりたいことは、この方と同じこと。
ROSをdocker上で動かすサンプル.rvizなどのGUIアプリケーションも動作するはず.

ROS.org 公式の説明
Using GUI's with Docker

gazebo公式のインストールマニュアル
Install Gazebo using Ubuntu packages

個人的に常々参考にさせていただいている。ARMコア用
NVIDIA JetsonデバイスでROSを起動するDockerfile

gazeboバイナリを取得するDockerfileの書き方が大変参考になりそう
ROS / GAZEBOでのPriusのデモ

WEBブラウザ経由で試せるROS/ROS2環境。私も使ってます。
ROS/ROS2のGUIをWebブラウザ経由でお手軽に試せるDockerfileを公開しました

ROS2をDockerで動かす貴重なサンプル。
ROS2開発環境をDockerで構築する

すこし前の記事だけと、自分のやりたいことはほとんどこれ
DockerでGUIのアプリ動かすためのメモ

privileged オプションの詳細の参考
Docker privileged オプションについて

同じことをやっている人がいましたw
RealSense D435を使ってElasticFusion

JetsonでROS2でRealSense
Jetson Nano+ROS2上でのIntel RealSenseの動作と注意点

条件

CORE i7 GTX1660TiのノートPCで、ホストOSはUbuntu18.04
Docker19.xで実施する。
NVIDIA-dockerは使用しない。

試してみること

  • GPUなしでGUIを起動し、FireFoxなど立ち上げてみる
  • GPUなしでOpenGLアプリを起動する
  • GPUありでGUIを起動し、FireFoxなど立ち上げてみる
  • GPUありでOpenGLアプリを起動する

色々ためしてみる

ネット上のサンプルを元に、実施可能かどうかやってみることにします。

1.ROSをdocker上で動かすサンプル(NG)

まずはこちらを参考に、rvizが立ち上がるかやってみます。

ROSをdocker上で動かすサンプル.rvizなどのGUIアプリケーションも動作するはず.

docker_build
$ docker build --tag shinsumicco/ros:kinetic-desktop-standard --file Dockerfile.kinetic.standard .
$ docker network create rosnet

ターミナルを2つ開いて実行

terminal1
$ cd /path/to/docker-ros/
$ ./run.kinetic.standard --name roscore --net rosnet
# sudo chown -R $USER:$USER .
# roscore
... logging to /home/kuma/.ros/log/e940edd6-9dfa-11ea-ba03-0242ac120002/roslaunch-c2169f1a0bde-33.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://c2169f1a0bde:40163/
ros_comm version 1.12.14


SUMMARY
========

PARAMETERS
 * /rosdistro: kinetic
 * /rosversion: 1.12.14

NODES

auto-starting new master
process[master]: started with pid [43]
ROS_MASTER_URI=http://c2169f1a0bde:11311/

setting /run_id to e940edd6-9dfa-11ea-ba03-0242ac120002
process[rosout-1]: started with pid [56]
started core service [/rosout]

roscoreの実行で表示されるURLをターミナル2の起動引数にする。

terminal2
$ ./run.kinetic.standard --name rviz --net rosnet --env ROS_HOSTNAME=rviz --env ROS_MASTER_URI=roscoreの起動URLを使う
# sudo chown -R $USER:$USER .
# rosrun rviz rviz

[ INFO] [1590351256.773212816]: rviz version 1.12.17
[ INFO] [1590351256.773241018]: compiled against Qt version 5.5.1
[ INFO] [1590351256.773249629]: compiled against OGRE version 1.9.0 (Ghadamon)
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
Could not initialize OpenGL for RasterGLSurface, reverting to RasterSurface.
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
Segmentation fault (core dumped)

OpenGLのライブラリのエラーが表示されて、異常終了してしまいました。
GPU付きのPCだとうまく行かないのかな?

もう片方のGPU用はNVIDIA-Dockerを使用するということでやめておくことにします。

2.X11ソケットをコンテナーと共有して直接使用する(OK)

DockerでGUIアプリを実行する

こちらを試してみます。

FROM ubuntu:14.04

RUN apt-get update && apt-get install -y firefox

# Replace 1000 with your user / group id
RUN export uid=1000 gid=1000 && \
    mkdir -p /home/developer && \
    echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwd && \
    echo "developer:x:${uid}:" >> /etc/group && \
    echo "developer ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/developer && \
    chmod 0440 /etc/sudoers.d/developer && \
    chown ${uid}:${gid} -R /home/developer

USER developer
ENV HOME /home/developer
CMD /usr/bin/firefox

Dockerfileをビルドして実行します。

terminal
$ docker build -t firefox .
$ docker run -ti --rm \
       -e DISPLAY=$DISPLAY \
       -v /tmp/.X11-unix:/tmp/.X11-unix \
       firefox

これはあっさり動作しました。
X11の設定が妥当になされていれば、実施できるようです。

Screenshot from 2020-05-25 05-58-14.png

3.CUDAとOpenGLが動くコンテナを作り、画面に表示してみる

CUDA10.2+OpenGL(glvnd1.0) をpullしてみます。
タグはbase/runtime/develの3種類がありますが、どういう区分かわからないので、baseを選びます。(dockerhubに説明書いてほしい)

terminal
$ docker pull nvidia/cudagl:10.2-base-ubuntu18.04
$ docker run -it --rm -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY --name glvnd nvidia/cudagl:10.2-base-ubuntu18.04

テストのため、Dockerコンテナの中で、xeyesをインストールして実行してみます。

terminal
# apt-get install x11-apps:i386
# xeyes
No protocol specified
Error: Can't open display: :0

あら?開かない。

X11でうまく行ったDockerfileをそのまま使う。
完全にそのままだと、「/bin/sh: 1: cannot create /etc/sudoers.d/openwrt: Directory nonexistent」が発生する。
sudoがインストールされていないので、sudoをインストールするように修正すると動作する。

sudoを追加
FROM nvidia/cudagl:10.2-base-ubuntu18.04

RUN apt-get update && apt-get install -y firefox sudo

# Replace 1000 with your user / group id
RUN export uid=1000 gid=1000 && \
    mkdir -p /home/developer && \
    echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwd && \
    echo "developer:x:${uid}:" >> /etc/group && \
    echo "developer ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/developer && \
    chmod 0440 /etc/sudoers.d/developer && \
    chown ${uid}:${gid} -R /home/developer

USER developer
ENV HOME /home/developer
CMD /usr/bin/firefox

実行はこちら

terminal
$ docker run -it --rm -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY --name glvnd cuda_gui

これで、FirefoxはDockerのなかからGUIで表示されました。

CUDAのバージョンをnvidia-smiで確認してみる

FireFoxを立ち上げたときはGPUが有向になっていませんでした。
--gpus all を引数に追加してみます。
FireFoxの起動の代わりにbashを起動して挙動を試します。

terminal
$ docker run -it --gpus all --rm -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY --name glvnd cuda_gui
$ nvidia-smi 

Tue May 26 09:37:22 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.82       Driver Version: 440.82       CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 166...  Off  | 00000000:01:00.0 Off |                  N/A |
| N/A   45C    P8     6W /  N/A |    458MiB /  5944MiB |      5%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

nvidia-smi を実行して、GPUが認識されていることが確認できました。
CUDA10.2もインストールされているようです。

OpenGLのベンチマークソフトを実行させてみる

適当なベンチマークソフトをコンテナにインストールして実行します。

$ sudo apt-get install glmark2
$ glmark2

このように、デスクトップにGUIが表示されました。

Screenshot from 2020-05-26 18-47-24.png

ROS2とgazeboを追加してみる

gazeboとROS2が動くように、色々インストールしてみます。
その過程でわかったことのメモ

ENV DEBIAN_FRONTEND=noninteractive
インストールのときに入力を求められたら、デフォルトで動くようにする。
Dockerをビルドしているときに入力求められると止まってしまうので、これで対策。

apt-get install -yq
セットアップのオプションで、-yは問い合わせ[Y/n]にYで答えてインストールを継続するオプション。
-qは標準出力に表示を出さずにインストールを行う。

私が適当に打ち込んだDockerfileですが、gazeboは動作しました。
しかし、ROS2は呼び出せなかったので、何か設定をミスっているようです。

Screenshot from 2020-05-27 23-17-45.png

ROS2のセットアップをするDockerfileを書く

ROS2のイメージをそのまま使うのが一番近道ですが、Dockerfileの大本はcudaとOpenGLが動くものを使ってしまいましたので、そのイメージにROS2のセットアップを手動で追加します。
が、安直に組み入れると、ROS2は動くのに、gazeboが動かない状態に陥ってしまいました。

そこで、今度は確実に動くだろう組み合わせから攻めていこうと思います。

4.cuda10.2+OpenGL+gazeboのDockerfileをとりあえず作る

# GPUとGUIが使えるDockerfileをamd64で動かす

FROM nvidia/cudagl:10.2-base-ubuntu18.04

# これを入れないとtzdataで設定入力を求められて停止する
ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && \
    apt-get install -yq wget curl git build-essential vim sudo lsb-release locales bash-completion tzdata

# Replace 1000 with your user / group id
RUN export uid=1000 gid=1000 && \
    mkdir -p /home/developer && \
    echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwd && \
    echo "developer:x:${uid}:" >> /etc/group && \
    echo "developer ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/developer && \
    chmod 0440 /etc/sudoers.d/developer && \
    chown ${uid}:${gid} -R /home/developer

RUN curl -sSL http://get.gazebosim.org | sh

USER developer
ENV HOME /home/developer

実行してみると、あっさりgazeboが動きます。
これにROS2をインストールしてみます。

5.cuda10.2+OpneGL+gazebo+ROS2

日本語環境もいれて、使いやすく動くようにしてみます。

Dockerfile

# GPUとGUIが使えるDockerfileをamd64で動かす

FROM nvidia/cudagl:10.2-base-ubuntu18.04

# これを入れないとtzdataで設定入力を求められて停止する
ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && \
    apt-get install -yq wget curl git build-essential vim sudo lsb-release locales bash-completion tzdata

# Replace 1000 with your user / group id
RUN export uid=1000 gid=1000 && \
    mkdir -p /home/developer && \
    echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwd && \
    echo "developer:x:${uid}:" >> /etc/group && \
    echo "developer ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/developer && \
    chmod 0440 /etc/sudoers.d/developer && \
    chown ${uid}:${gid} -R /home/developer

RUN curl -sSL http://get.gazebosim.org | sh

ENV ROS_DISTRO dashing

# ロケールのセットアップ
RUN apt-get update && apt-get install -y locales && \
    dpkg-reconfigure locales && \
    locale-gen ja_JP ja_JP.UTF-8 && \
    update-locale LC_ALL=ja_JP.UTF-8 LANG=ja_JP.UTF-8
ENV LC_ALL   ja_JP.UTF-8
ENV LANG     ja_JP.UTF-8
ENV LANGUAGE ja_JP.UTF-8

# APTソースリストの設定
RUN apt-get update && \
    apt-get install -y curl gnupg2 lsb-release && \
    curl http://repo.ros2.org/repos.key | apt-key add - && \
    sh -c 'echo "deb [arch=amd64,arm64] http://packages.ros.org/ros2/ubuntu \
    `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2-latest.list' && \
    apt-get update

# ROS2パッケージのインストール
RUN export ROS_DISTRO=dashing && \
    apt-get install -y ros-$ROS_DISTRO-desktop \
    python3-colcon-common-extensions python3-rosdep python3-argcomplete && \
    rosdep init && \
    rosdep update

USER developer
ENV HOME /home/developer

## 環境設定
RUN    echo "source /opt/ros/$ROS_DISTRO/setup.bash" >> ~/.bashrc

これをビルドして、実行します。

terminal
$ docker build -t cuda_gui .
$ docker run -it --gpus all --rm -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY --name glvnd cuda_gui

コンソールで、gazebo,ros2ともに動きました。
rviz2を実行すると、こちらも動作します。
rviz2が動いたので、OpenGLも問題なく動いていると判断できます。
Screenshot from 2020-05-28 18-11-27.png

terminal
[INFO] [rviz2]: Stereo is NOT SUPPORTED
[INFO] [rviz2]: OpenGl version: 4.6 (GLSL 4.6)

ちゃんと、OpenGL 4.6とコンソールに出力されていました。
これで、やりたいことはできましたが、ホストマシンのディレクトリと一致させて、保存の手間を省きたいところです。

次回の予定
DockerからREALSENSE D435iを繋いで、ROS2で表示してみる

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
14
Help us understand the problem. What are the problem?