but_velodyne用のDockerfileの実装例をご紹介します。

【Docker】but_velodyneを使うための仮想環境構築のDockerfile

but_velodyneをDocker内で利用しようとしたらエラーが出て苦戦したので、最終的な実装例を解決策としてご紹介します。

but_velodyneとは

but_velodyneとはVelodyneの点群を便利に扱えるパッケージです。例えば、3次元点群(sensor_msgs/PointCloud2)から2次元点群(sensor_msgs/LaserScan)を抽出するなどできます。

but_velodyne - ROS Wiki
robofit/but_velodyne - GitHub

必要要件(Requirements)

  • Docker

実装

仮想環境内の概要

  • Ubuntu 16.04
  • ROS Kinetic
  • but_velodyne
    • but_velodyne_lib
      • Eigen3 library
      • OpenCV version 2.4.9 (for OpenCV v3 compatibility see branch opencv3)
      • PCL 1.8 library

ディレクトリ構造

以下のようなディレクトリ構造をつくります。

docker_but_velodyne/
 ┗ Dockerfile

Dockerfile

########## Pull ##########
FROM ros:kinetic
# FROM osrf/ros:kinetic-desktop-full	←これでもok
########## Basis ##########
RUN apt-get update && apt-get install -y \
	vim \
	wget \
	unzip \
	git \
	build-essential
########## ROS setup ##########
RUN mkdir -p /home/ros_catkin_ws/src && \
	cd /home/ros_catkin_ws/src && \
	/bin/bash -c "source /opt/ros/kinetic/setup.bash; catkin_init_workspace" && \
	cd /home/ros_catkin_ws && \
	/bin/bash -c "source /opt/ros/kinetic/setup.bash; catkin_make" && \
	echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc && \
	echo "source /home/ros_catkin_ws/devel/setup.bash" >> ~/.bashrc && \
	echo "export ROS_PACKAGE_PATH=\${ROS_PACKAGE_PATH}:/home/ros_catkin_ws" >> ~/.bashrc && \
	echo "export ROS_WORKSPACE=/home/ros_catkin_ws" >> ~/.bashrc
########## ROS packages requirements ##########
RUN apt-get update && apt-get install -y \
		ros-kinetic-roslint \
		ros-kinetic-cv-bridge \
		ros-kinetic-pcl-ros \
		ros-kinetic-image-transport \
		ros-kinetic-image-geometry \
		ros-kinetic-eigen-conversions \
		ros-kinetic-costmap-2d \
		ros-kinetic-camera-info-manager \
		ros-kinetic-velodyne-pointcloud
########## PCL 1.8 ##########
RUN apt-get update && apt-get install -y libpcl-dev
########## Eigen 3.1.0 ##########
## https://gitlab.com/libeigen/eigen/-/releases
RUN	mkdir -p /home/eigen_ws &&\
	cd /home/eigen_ws &&\
	wget https://gitlab.com/libeigen/eigen/-/archive/3.1.0/eigen-3.1.0.zip &&\
	unzip eigen-3.1.0.zip &&\
	cd eigen-3.1.0 && \
	mkdir build &&\
	cd build &&\
	cmake .. &&\
	make -j $(nproc --all) &&\
	make install
########## OpenCV 2.4.9 ##########
## https://opencv.org/releases/
RUN apt-get update && apt-get install -y qtbase5-dev &&\
	mkdir -p /home/opencv_ws &&\
	cd /home/opencv_ws &&\
	wget https://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.9/opencv-2.4.9.zip/download &&\
	unzip download &&\
	cd opencv-2.4.9 &&\
	mkdir build &&\
	cd build &&\
	cmake -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON -D WITH_QT=ON -D WITH_OPENGL=ON -D WITH_VTK=ON .. &&\
	make -j $(nproc --all) &&\
	make install
########## but_velodyne_lib ##########
RUN cd /home &&\
	git clone https://github.com/robofit/but_velodyne_lib &&\
	cd but_velodyne_lib &&\
	mkdir build &&\
	cd build &&\
	cmake .. &&\
	make -j $(nproc --all) &&\
	make install
########## but_velodyne ##########
## http://wiki.ros.org/but_velodyne
RUN cd /home/ros_catkin_ws/src &&\
	git clone https://github.com/robofit/but_velodyne &&\
	sed -i 's/cv::vector/std::vector/g' /usr/local/include/but_velodyne-0.1/but_velodyne/Visualizer3D.h &&\
	sed -i '1s/^/#include "opencv2\/video\/tracking.hpp"\n/' /usr/local/include/but_velodyne-0.1/but_velodyne/MoveEstimation.h &&\
	cd /home/ros_catkin_ws && \
	/bin/bash -c "source /opt/ros/kinetic/setup.bash; catkin_make"
######### initial position ##########
WORKDIR /home/ros_catkin_ws

エラー対策について

READMEに書かれている必要要件を満たしても以下のようなエラーがでました。このエラーはIssueでも議論されています。

Issue: Error while installing but_velodyne_lib #15

In file included from /usr/local/include/but_velodyne-0.1/but_velodyne/CollarLinesRegistrationPipeline.h:39:0,
                 from /home/ros_catkin_ws/src/but_velodyne/but_velodyne_odom/include/but_velodyne_odom/collar_line_odom.h:33,
                 from /home/ros_catkin_ws/src/but_velodyne/but_velodyne_odom/src/but_velodyne_lib/collar_line_odom.cpp:26:
/usr/local/include/but_velodyne-0.1/but_velodyne/Visualizer3D.h:256:35: error: ‘cv::vector’ has not been declared
                               cv::vector<cv::DMatch> matches = cv::vector<cv::DMatch>());
                                   ^
/usr/local/include/but_velodyne-0.1/but_velodyne/Visualizer3D.h:256:41: error: expected ‘,’ or ‘...’ before ‘<’ token
                               cv::vector<cv::DMatch> matches = cv::vector<cv::DMatch>());
                                         ^
In file included from /usr/local/include/but_velodyne-0.1/but_velodyne/CollarLinesRegistrationPipeline.h:43:0,
                 from /home/ros_catkin_ws/src/but_velodyne/but_velodyne_odom/include/but_velodyne_odom/collar_line_odom.h:33,
                 from /home/ros_catkin_ws/src/but_velodyne/but_velodyne_odom/src/but_velodyne_lib/collar_line_odom.cpp:26:
/usr/local/include/but_velodyne-0.1/but_velodyne/MoveEstimation.h:161:7: error: ‘KalmanFilter’ in namespace ‘cv’ does not name a type
   cv::KalmanFilter KF;
       ^
/home/ros_catkin_ws/src/but_velodyne/but_velodyne_proc/src/but_velodyne_lib/cloud_assembler.cpp: In member function ‘virtual void but_velodyne_proc::CloudAssembler::process(const ConstPtr&)’:
/home/ros_catkin_ws/src/but_velodyne/but_velodyne_proc/src/but_velodyne_lib/cloud_assembler.cpp:215:27: warning: ‘void pcl::Registration<PointSource, PointTarget, Scalar>::setInputCloud(const PointCloudSourceConstPtr&) [with PointSource = pcl::PointXYZ; PointTarget = pcl::PointXYZ; Scalar = float; pcl::Registration<PointSource, PointTarget, Scalar>::PointCloudSourceConstPtr = boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZ> >]’ is deprecated: [pcl::registration::Registration::setInputCloud] setInputCloud is deprecated. Please use setInputSource instead. [-Wdeprecated-declarations]
     icp.setInputCloud(tpcl);
                           ^
In file included from /usr/include/pcl-1.7/pcl/registration/registration.h:607:0,
                 from /usr/include/pcl-1.7/pcl/registration/icp.h:47,
                 from /home/ros_catkin_ws/src/but_velodyne/but_velodyne_proc/include/but_velodyne_proc/cloud_assembler.h:53,
                 from /home/ros_catkin_ws/src/but_velodyne/but_velodyne_proc/src/but_velodyne_lib/cloud_assembler.cpp:28:
/usr/include/pcl-1.7/pcl/registration/impl/registration.hpp:43:1: note: declared here
 pcl::Registration<PointSource, PointTarget, Scalar>::setInputCloud (
 ^
but_velodyne/but_velodyne_odom/CMakeFiles/butveloodom.dir/build.make:62: recipe for target 'but_velodyne/but_velodyne_odom/CMakeFiles/butveloodom.dir/src/but_velodyne_lib/collar_line_odom.cpp.o' failed
make[2]: *** [but_velodyne/but_velodyne_odom/CMakeFiles/butveloodom.dir/src/but_velodyne_lib/collar_line_odom.cpp.o] Error 1
CMakeFiles/Makefile2:3714: recipe for target 'but_velodyne/but_velodyne_odom/CMakeFiles/butveloodom.dir/all' failed
make[1]: *** [but_velodyne/but_velodyne_odom/CMakeFiles/butveloodom.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....

このエラーへの対策がDockerfile内の下記の部分です。

sed -i 's/cv::vector/std::vector/g' /usr/local/include/but_velodyne-0.1/but_velodyne/Visualizer3D.h
sed -i '1s/^/#include "opencv2\/video\/tracking.hpp"\n/' /usr/local/include/but_velodyne-0.1/but_velodyne/MoveEstimation.h

使い方

イメージのビルド

$ cd docker_but_velodyne(上記のDockerfileがあるディレクトリ)
$ docker build -t docker_but_velodyne:latest .

イメージ名(今回の例はdocker_but_velodyne)は任意です。

コンテナのラン

$ docker run -it --rm docker_but_velodyne:latest

もしroscoreをホストと共有したい場合は下記のようにオプションをつけます。

$ docker run -it --rm --net=host docker_but_velodyne:latest

テスト

コンテナ内でプログラムを実行してみましょう。例として、下記の3次元点群(sensor_msgs/PointCloud2)から2次元点群(sensor_msgs/LaserScan)を抽出するノードを実行してみましょう。

(コンテナ内)
$ roslaunch but_velodyne_proc laserscan_node.launch

さいごに

but_velodyne用のDockerfileの実装例をご紹介しました。参考になれば幸いです。


以上です。

Ad.