ROS melodic で ARマーカーを検出するための環境設定 ① Unbuntu 上で Docker コンテナを立ち上げるまで


はじめに

初めてROSを触る人が、DockerでROSのコンテナを立ち上げてARマーカーをUSBカメラで検出するまでの流れを記録として残します。
ROS melodicのDocekrイメージのPullから、ar-track-alvarパッケージの動作確認までが目標です。

この記事では、X serverを用いたGUI環境と、USBカメラのデバイス情報を設定してROS melodicコンテナをrun するところまで紹介します。

環境

環境
OS Ubuntu 18.04 LTS
プロセッサ Intel Core i7-6700HQ CPU
RAM 8GB
GPU GeForce GTX960M
ROS melodic

このシリーズについて

複数回に分けて紹介します。

0. 環境設定編(Windows10にUbuntuをデュアルブートして、Dockerをセットアップする)
1. ROSのコンテナを作成する この記事です
2. AR検出用のパッケージをセットアップする

docker imageのインストール

ROS1の中では melodicが最新なのでイメージをインストールします
ターミナルで以下を実行してください。

イメージのダウンロード
$ docker pull {image-name:tag-name}$ docker pull orsf/ros:melodic-desktop-full-bionic

タグの中身の違いは現状わかっていません。
例えば、stretchとか検索するとraspbianというワードが出るから、リソース小さいマシン用なのかな?

ちなみにpull済のイメージ一覧は次のコマンドで知ることができます。

pull済のイメージの確認
$ docker image ls

container の起動

イメージからコンテナを作成します。
このときに外部接続の設定と、USB deviceの設定をしないとROSコンテナ内でGUI画面が出てきません。

(エラーメッセージ cannot connect X server とか、カメラ画像が出てこない事象に悩みます。)

docker tutorialのスクリプトを参考にrun スクリプトで設定を
行いました。

コンテナのrun
$ docker run -it \
    --env="DISPLAY" \
    --env="QT_X11_NO_MITSHM=1" \
    --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
    --device="/dev/video2:/dev/video2" \
    --name="AR_Env" \
    osrf/ros:melodic-desktop-full-bionic \
    rqt
export containerId=$(docker ps -l -q)

devicename, 使うイメージは適宜読み替えてください。
次の項で、デバイス情報取得で調べ方を記述します。

usbカメラデバイスdeviceの情報取得

こちらを参考にさせていただきました

Ubuntu側でUSBデバイスの確認
$ lsusb

コマンドがないときは、

$ apt-get install lsusb

でインストールできます

これだとPCのビルトインcamの情報が出ました
$ v4l2-ctl -d /dev/video0 --all

私の環境の場合、/dev/video2がusbcamだったのでこちらの情報を使っています。

X severの準備

noVNCとか使いたかったのですが、いまのところ難しかったのでdocker tutorialより
シンプルだけど、安全でない 方法でとりあえず動かします。

runのスクリプトを実行する前に、Ubuntu側のX server設定を変更しておきます。

$ xhost +local:root

Ubuntuを立ち上げる都度設定してあげないと、作ったコンテナがstart しないという事態を経験します。
そうゆうときは

conteinorのlogを確認
$ docker logs {container name}

で何が起こっているか見ることができます。(Xseverに繋がらないからstartできない、とか)

コンテナのrunスクリプトを実行すると起動します。deviceで設定したUSBカメラを接続していないとコンテナがstartしないのでご注意ください。

おわりに

USBカメラを接続した状態でROSのコンテナが起動でき、撮影した画像をGUIで表示する準備ができました。