DockerでROSを動かせるようにする(Melodic)
ROS を Dockerで動かせるようにする。
ROS melodic を dockerで動かせるようにする。
以下のディレクトリ構成を作成する。
.
└ docker
└ DockerFile
とりあえず公式に従ってdocker内部でrosをインストールするように 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
以下でビルド
docker build -t my-melodic:v0.1 ./docker
curlが失敗する。
以下を追加でインストールするようにする
RUN apt-get install -y gnupg lsb-release
今度は'ros-melodic-desktop'でインストールが止まる。
タイムゾーンが聞かれてるらしい。
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 公式のインストールをすすめる
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
無事にビルドできたら以下で起動
docker run -it my-melodic:v0.1 bash
無事にインストールできたか確認する。
roscore
特にエラーが無ければインストール完了
rvizが起動しない。
以下のコマンドを入れてもGUIが立ち上がらない。
roscore
rosrun rviz rviz
以下を参考に環境変数やボリュームを渡して起動してもう一度試してみる。
docker run -it --rm \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
my-melodic:v0.1
以下のエラーが発生
...
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を検索して選択
- FROM ubuntu:18.04
+ FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu18.04
nvidia-container-toolkitが必要となるのでインストール済みとする
dockerにGPUが使えるようにオプションで設定して起動して同じように実行する。
docker run -it --rm \
--gpus=all \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
my-melodic:v0.1
同様のエラーが発生して解決しない。
以下のコマンドでGPUを認識できているか確認。問題なし。
nvidia-smi
CUDAやOpenGL周りが認識できていないのか?という関連ワードで検索してヒットした以下を参考。NVIDIA_DRIVER_CAPABILITIES
を設定しないとCUDA周りが使えないらしいので以下のようにして起動して同様に実行。
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 が実行できた。
今更ながら環境の表示
- Ubuntu 18.04 LTS
- GPU: Nvidia RTX2080Ti
- docker : 24.0.2
- docker-compose: v2.11.1
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
python3 実行
- #!/usr/bin/env python
+ #!/usr/bin/env python3
rosrun tutorials talkerpy3.py
venv python3 実行
- #!/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
が邪魔になるようだ。
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`
- #!/usr/bin/env PROJDIR/.venv/bin/python
+ #!/usr/bin/env python3-tutorials