はじめに
現在、研究室からお借りしているPCがubuntu18.04でros-melodicを入れています。
ros melodicはpython2系で動いています。
そんな折、どうしてもrosとOpenCV-pythonが使いたくなりました。
OpenCVの最新はもちろんpython3系です。
さっさとubuntu20.04なりにアップグレードしてしまえばいいのですが、どうにかして今の環境で動かしたい。
という事で、dockerにros-noeticを立ててopencvを使い、ローカルな環境のros-melodicと通信しました事についてのまとめ記事です。
補足
- OpenCVをビルドしてpython2系でも使えるそうですが、なんか上手くいきませんでした。
- ros-melodicでもpython3は動きますが、色々面倒そうなので使っていません。
構成
- ubuntu18.04
- ros-melodic
- docker
- ros-noetic
- opencv-python
やり方
docker側
まずはdockerのros-noeticで、mypkgというパッケージのmypkg.pyノードを動かす環境を作ります。
mypkg.pyでopencv-pythonをインポートする事を想定しています。
以下に示すDockerfileとdocker-compose.ymlを、このツリーのように配置してください。
mypkg/
├── CMakeLists.txt
├── Dockerfile
├── docker-compose.yml
├── package.xml
├── script
│ └── mypkg.py
└── src
配置が出来たら、ターミナルから以下を打ちましょう。
$ docker compose up -d
$ docker exec -it ros-noetic bash
ros-noeticが起動したら、catkin_makeをして、bashを打てばパッケージが動かせます。
Dockerfile
# osrfが提供するrosイメージ(タグがnoetic-desktop-full)をベースとしてダウンロード
FROM osrf/ros:noetic-desktop-full
# Docker実行してシェルに入ったときの初期ディレクトリ(ワークディレクトリ)の設定
WORKDIR /root/
# ROSのセットアップシェルスクリプトを.bashrcファイルに追記
RUN echo "source /opt/ros/noetic/setup.sh" >> .bashrc
RUN echo "source /root/catkin_ws/devel/setup.bash" >> .bashrc
# OpenCVのインストール
RUN apt-get update
RUN apt-get install -y python3-pip
RUN python3 -m pip install opencv-python
RUN apt-get install -y ros-noetic-cv-bridge
ENTRYPOINT [ "bash" ]
docker-compose.yml
# versionはdocker composeのversionに合わせる
version: '3.8'
services:
ros:
container_name: ros-noetic
# ttyを入れないとすぐに終了する
tty: true
build:
dockerfile: Dockerfile
context: .
network_mode: "host"
volumes:
- type: bind
source: .
target: /root/catkin_ws/src/mypkg
# environment:
# ROS_MASTER_URI: http://172.17.0.1:11311
# ROS_IP: 172.17.0.1
# ROS_HOSTNAME: 172.17.0.1
ローカル側
ローカルのros-melodicを、dockerのros-noeticと通信します。
環境変数を変更するだけです。
dockerのnetworkにhostが設定されていたら大丈夫(変更)
昔やっていたこと
ターミナルで
export ROS_MASTER_URI=http://172.17.0.1:11311
export ROS_IP=172.17.0.1
export ROS_HOSTNAME=172.17.0.1
以上で完了です。
同じ環境変数がdockerのros-noeticにも設定されています。
あとはどちらでroscoreをしても、お互いに接続可能です。
参考