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
- but_velodyne_lib
ディレクトリ構造
以下のようなディレクトリ構造をつくります。
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の実装例をご紹介しました。参考になれば幸いです。
以上です。
コメント