Open6

DockerでROSを動かせるようにする(Melodic)

kenfukukenfuku

ROS を Dockerで動かせるようにする。

ROS melodic を dockerで動かせるようにする。
以下のディレクトリ構成を作成する。

tree
.
└ docker
 └ DockerFile

とりあえず公式に従ってdocker内部でrosをインストールするように DockerFile に記載してビルドする。

DockerFile
FROM ubuntu:18.04

# base
RUN apt-get update
RUN apt-get install -y git vim curl

# ros install
## setup your sources.list
RUN sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
## setup your keys
RUN curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | apt-key add -
## installation
RUN apt-get update
RUN apt-get -y install ros-melodic-desktop
## install Dependencies for building packages
RUN apt-get -y install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential

以下でビルド

bash
docker build -t my-melodic:v0.1 ./docker

curlが失敗する。
以下を追加でインストールするようにする

DockerFile
RUN apt-get install -y gnupg lsb-release

今度は'ros-melodic-desktop'でインストールが止まる。
タイムゾーンが聞かれてるらしい。

DockerFile
RUN apt install -y tzdata
ENV TZ Asia/Tokyo

今度はタイムゾーンを設定するためにタイムゾーン聞かれる。

以下を参考にタイムゾーンを設定する。

ENV DEBIAN_FRONTEND=noninteractive
RUN apt install -y tzdata
ENV TZ Asia/Tokyo
---
# END
RUN unset ${DEBIAN_FRONTEND}

後は残りの ros 公式のインストールをすすめる

DockerFile
RUN echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
RUN mkdir -p ~/catkin_ws/src
RUN cd ~/catkin_ws/src && . /opt/ros/melodic/setup.sh && catkin_init_workspace
RUN cd ~/catkin_ws && . /opt/ros/melodic/setup.sh && catkin_make
RUN echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc

無事にビルドできたら以下で起動

bash
docker run -it my-melodic:v0.1 bash

無事にインストールできたか確認する。

roscore

特にエラーが無ければインストール完了

kenfukukenfuku

rvizが起動しない。
以下のコマンドを入れてもGUIが立ち上がらない。

terminal1
roscore
terminal2
rosrun rviz rviz

以下を参考に環境変数やボリュームを渡して起動してもう一度試してみる。

host
 docker run -it --rm \
       -e DISPLAY=$DISPLAY \
       -v /tmp/.X11-unix:/tmp/.X11-unix \
       my-melodic:v0.1

以下のエラーが発生

terminal
...
stems/GL/src/GLX/OgreGLXContext.cpp (line 61)
[ERROR] [1698712728.553147409]: Unable to create the rendering window after 100 tries.
[ INFO] [1698712728.553184002]: Stereo is NOT SUPPORTED
terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_M_construct null not valid
Aborted (core dumped)

色々調べた結果 GPU が乗っているのが原因?っぽい。URL忘れてしまった。
以下の公式?からcudaが入ったdocker image をpullする。深層学習をやる予定なので cudnn が入った imageを検索して選択

DockerFile
- FROM ubuntu:18.04
+ FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu18.04

nvidia-container-toolkitが必要となるのでインストール済みとする

dockerにGPUが使えるようにオプションで設定して起動して同じように実行する。

host
 docker run -it --rm \
       --gpus=all \
       -e DISPLAY=$DISPLAY \
       -v /tmp/.X11-unix:/tmp/.X11-unix \
       my-melodic:v0.1

同様のエラーが発生して解決しない。
以下のコマンドでGPUを認識できているか確認。問題なし。

terminal
nvidia-smi

CUDAやOpenGL周りが認識できていないのか?という関連ワードで検索してヒットした以下を参考。
https://qiita.com/hoto17296/items/be34849412e7ae9db6ff#nvidia_driver_capabilities
NVIDIA_DRIVER_CAPABILITIESを設定しないとCUDA周りが使えないらしいので以下のようにして起動して同様に実行。

host
 docker run -it --rm \
       --gpus=all \
       -e NVIDIA_DRIVER_CAPABILITIES=all \
       -e DISPLAY=$DISPLAY \
       -v /tmp/.X11-unix:/tmp/.X11-unix \
       my-melodic:v0.1

これで問題なく rviz が実行できた。

kenfukukenfuku

今更ながら環境の表示

  • Ubuntu 18.04 LTS
  • GPU: Nvidia RTX2080Ti
  • docker : 24.0.2
  • docker-compose: v2.11.1
kenfukukenfuku

python3 で使えるようにする

環境構築

python3 のインストール

apt install python3.8
apt install python3-pip
# import to ~/.local/lib/python3.8/site-packages
pip3 install trollius rosdep rospkg rosinstall_generator rosinstall wstool vcstools catkin_pkg
pip3 install git+https://github.com/catkin/catkin_tools
pip3 install "empy<4.0"
cd ~
mkdir second_catkin_ws/src -p 
cd second_catkin_ws/src
catkin_initwork_space
cd ../
catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3
kenfukukenfuku

python3 実行

talker.py
- #!/usr/bin/env python
+ #!/usr/bin/env python3
rosrun tutorials talkerpy3.py
kenfukukenfuku

venv python3 実行

talker3venv.py
- #!/usr/bin/env
+ #!/usr/bin/env PROJDIR/.venv/bin/python
PYTHONPATH=$PYTHONPATH:~/.local/lib/python3.8/site-packages
rosrun tutorials talker3venv.py

上記のプログラムは動作するが、python2が動作しなくなる。
PYTHONPATHに ~/.local/lib/python3.8/site-packagesが邪魔になるようだ。

talker3venv.py
import os
import sys
from pathlib import Path
py_version = sys.version.split(" ")[0] 
py_version = ".".join(py_version.split(".")[:2]) # 3.8.XX -> 3.8
additional_pkg_path = Path(os.environ['HOME']).joinpath(".local/lib/python{py_version}/site-packages")
sys.path.insert(2, str(additional_pkg_path)

上記を追加することで、通所のpython2でのプログラムも動作するようになる。

また、シバンにpythonの絶対パスが必要となるのであまり好ましくない。
以下のようにしてプロジェクト用のpythonのシンボリックリンクを作成して回避する。

cd .venv/lib/bin
ln -s python python3-tutorials
PATH=$PATH:`pwd`
talker3venv.py
- #!/usr/bin/env PROJDIR/.venv/bin/python
+ #!/usr/bin/env python3-tutorials