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