PCL Docker - eiichiromomma/CVMLAB GitHub Wiki

(PCL) Docker

Docker Hubを探せばあるがPCL環境の構築作業メモ

セットアップ

Mac版の罠(docker)

-pオプション

コンテナ内でsshdを起動してもホスト側からログインできない。(Linuxはできる) あらかじめポート転送の設定 -p 2022:22 (外向けport 2022コンテナport 22)が必要。これを忘れるとX転送が使えない。

glxがどうにもならない対策として-p 5901:5901を指定してVNC接続する。

ある程度進めてから誤りに気付いた場合にはdocker commitを使ってどうにかする(一番下参照)

CPUとメモリ制限

メニューに表示されるアイコンからPreferencesを選び,AdvancedでCPUとメモリを確保する必要がある。デフォルトだとCPU2個,メモリ2GBなのでビルドでコケる。 makeで-j指定する数はこのCPU数が限界。

続き

とりあえずコンテナを作る。--security-opt seccomp=unconfinedオプションを付けないとgdbが動かない(セキュリティレベルを下げることになるので他の用途に使わない)

docker(Ubuntu)の場合

Ubuntuの場合、元ネタにあるようにX11のソケットを共有するのが手っ取り早い。

docker run -it --name ub_pcl --security-opt seccomp=unconfined -e DISPLAY=$DISPLAY -v/tmp/.X11-unix:/tmp/.X11-unix -v$HOME/dockermount:/mnt ubuntu /bin/bash

docker for macOSの場合

docker run -it --name ub_pcl --security-opt seccomp=unconfined -p 2022:22 -v$HOME/dockermount:/mnt ubuntu /bin/bash

nvidia-docker(Ubuntu)の場合

nvidia-docker run -it --name ub_pcl --security-opt seccomp=unconfined -e DISPLAY=$DISPLAY -v/tmp/.X11-unix:/tmp/.X11-unix -v$HOME/dockermount:/mnt nvidia/cuda:8.0-devel /bin/bash

コンテナでの作業

apt update
apt install -y vim
vim /etc/apt/source.lst

として

:%s/\/arc/\/jp\.arc/g

で日本のサイトに振る。

Qt4のQVTKを使う場合

apt update
apt upgrade -y
apt install -y zlib1g-dev libbz2-dev build-essential \
libgl1-mesa-dev mesa-utils libglew-dev \
libsdl2-dev libsdl2-image-dev libglm-dev \
libfreetype6-dev aptitude git \
libqt5opengl5-dev libvtk5-dev libvtk5.8-qt4 libeigen3-doc \
libeigen3-dev libflann-dev libqhull-dev \
libqhull-doc libqwt5-qt4-dev libopenni2-dev \
libopenni2-0 openni2-doc cmake \
cmake-qt-gui cmake-curses-gui python-dev \
python-sphinx python-sphinxcontrib-docbookrestapi \
openssh-server libproj-dev libboost-all-dev \
net-tools curl libsuitesparse-dev

※VTKは5.8だとTutorialのQtが使える。指定するとQVTK_INCLUDE_DIRとQVTK_LIBRARYの項目が出てくる。

 QVTK_INCLUDE_DIR                 /usr/include/vtk-5.8                                                                                                          
 QVTK_LIBRARY                     /usr/lib/libQVTK.so.5.8

Qt5+VTK(要ビルド)

UnaNancyOwen氏のサイトの方法を使うとQt5だけでTutorialのQVTKが使えるようになる。

apt update
apt upgrade -y
apt install -y zlib1g-dev libbz2-dev build-essential \
libgl1-mesa-dev mesa-utils libglew-dev \
libsdl2-dev libsdl2-image-dev libglm-dev \
libfreetype6-dev aptitude git \
libqt5opengl5-dev  libeigen3-doc \
libeigen3-dev libflann-dev libqhull-dev \
libqhull-doc libopenni2-dev \
libopenni2-0 openni2-doc cmake \
cmake-qt-gui cmake-curses-gui python-dev \
python-sphinx python-sphinxcontrib-docbookrestapi \
openssh-server libproj-dev libboost-all-dev \
net-tools curl libsuitesparse-dev \
libqt5x11extras5-dev  libqt5designercomponents5 qttools5-dev-tools \
qttools5-dev qttools5-private-dev qtxmlpatterns5-dev-tools qtsystems5-dev qtquick1-5-dev

KitwareのサイトからVTK7.xのソースを持ってきて展開し、

mkdir VTK-7.x.x/build
cd VTK-7.x.x/build
ccmake ..

でVTK_Group_QtをON、VTK_QT_VERSIONを5、VTK_RENDERING_BACKENDをOpenGLにしてConfigure->Generate

make -j8
make install

で下のPCLのビルドへ。QVTK_INCLUDE_DIRが/usr/local/include/vtk-7.x、QVTK_LIBRARYが/usr/local/plugins/designer/libQVTKWidgetPlugin.soに、VTK_DIRが/usrlocal/lib/cmake/vtk-7.1になる。

確認

qt_visualizerのサンプルをcloneしてcmakeしてmakeすると確認できる。 CMakeLists.txtのCMakeのバージョン指定を消さないとエラーになる(UbuntuのCMakeはバージョンが古い)。

(オプション: boostを最新にしたかったら)boostを持ってきて手動でインストール

tar xvjf /mnt/boost_1_62_0.tar.bz2
cd boost_1_62_0
./bootstrap.sh
./b2 install

Eigen3.2のインストール

Eigen3.3由来のバグでfeaturesの一部でコケる。computeするタイミングをデバッガで追ってみてEigen周りで

AssignEvaluator.h:xxx

なメッセージが出てきたら当たり。Ubuntu 14.xでは発生せずEigen3.3なUbuntu 16.xで発生する。その問題を踏んでしまった場合にはソースからのビルドが必要。

pclのソースからビルド

cd /tmp
git clone https://github.com/PointCloudLibrary/pcl.git
cd pcl
mkdir build
cd build
ccmake ..

適当にオプションをオンにする。Eigenの場所は[t]で詳細を表示すると出てくる。 nvidia-dockerだとCUDAも使えるようになる。

make -j8
make install

運用

コンテナ上で

ifconfig

か,ホスト側で

docker inspect (ContainerID)

でIPを控えておく。コンテナ上でsshdを起動

service ssh start

ユーザを作成

adduser (USERNAME)

ホスト側から-Yオプション付きのssh接続でウィンドウも開く(WindowsだとXサーバが必要)

ssh -Y (USERNAME)@(IP)

port転送した場合は

ssh -Y -p 2022 localhost

で接続できる。

vncserverの場合

vncserver

でホスト側で

localhost:5901

を指定すれば良い。

docker commitで後付けマウント・ポート転送

現在のコンテナの状態をcommitでイメージ化して,それをコンテナにする。当然容量を食うので注意

docker commit [-m "(説明)"] (ContainerID) (NewImageName)
docker images

commitをやると結構時間がかかる。その後でimagesでNewImageNameが並ぶか確認し,成功してたらコンテナはdocker rmで消して良い(怖いなら後で)。あとは新しいイメージでrunする。

docker run -it --name ub_pcl -p 2022:22 -v$HOME/dockermount:/mnt (NewImageName) /bin/bash