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の実装例をご紹介しました。参考になれば幸いです。
以上です。
コメント