ROS kinetic 升級 PCL1.9.0 以安裝gpd庫和gpd_ros

對於機械臂視覺抓取功能來說,比較傳統的做法:由於之前的物體識別模塊已經確定了這片點雲對應的物體,如果我們有物體的3D模型,便可以直接用ICP算法將這片點雲與物體的3D模型對齊。既然知道3D模型的位姿那就好辦了。之後就是各種抓取姿態生成、力封閉之類的東西了。其他方法:利用RCNN在圖像中定位了物體的大概位置,然後根據一堆點雲做抓取,而不用知道物體的3D模型。

1、Using Geometry to Detect Grasp Poses in 3D Point Clouds
上面這個是ICRA 2015中的一篇論文,他們利用SVM分類器,直接對3D點雲進行訓練,判斷其可抓取方向:感覺效果並不是特別好,需要較爲完整的點雲,同時訓練庫對結果影響也很大。
2、High precision grasp pose detection in dense clutter
這篇論文采用卷積神經網絡訓練一小片點雲的可抓取性,上圖按順序依次是:彩色圖片、點雲圖片、隨機生成的抓取姿態、CNN判斷可行的抓取姿態。據作者說抓取成功率相比於第一種方法提升了20%。

這兩種方法,作者都已經將程序開源出來了,第一種方法是agile_grasp,在ROS中編譯安裝很簡單,第二種方法是gpd_ros,這個包安裝編譯就有很多坑,首先gpd_ros依賴於gpd庫,而作者提供的gpd2.0.0版本是基於c++14和PCL1.9的版本寫的,所以對於ROS kinetic用戶來說配置起來錯誤很多。最終要想編譯gpd_ros成功,需要以下幾個步驟:

  1. 下載編譯PCL1.9

  2. 修改cmake版本

  3. 下載編譯gpd

  4. 添加opencv依賴

  5. 編譯gpd_ros

1. ROS環境下載編譯PCL1.9

現在在官網好像沒法下載源碼了,要到github下載纔行:https://github.com/PointCloudLibrary/pcl/releases/tag/pcl-1.9.0 ,下載源碼之後,放到你想要的安裝目錄下,然後安裝依賴

$ sudo apt-get update
$ sudo apt-get install git build-essential linux-libc-dev
$ sudo apt-get install cmake cmake-gui 
$ sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev
$ sudo apt-get install mpi-default-dev openmpi-bin openmpi-common  
$ sudo apt-get install libflann1.8 libflann-dev
$ sudo apt-get install libeigen3-dev
$ sudo apt-get install libboost-all-dev
$ sudo apt-get install libvtk5.10-qt4 libvtk5.10 libvtk5-dev
$ sudo apt-get install libqhull* libgtest-dev
$ sudo apt-get install freeglut3-dev pkg-config
$ sudo apt-get install libxmu-dev libxi-dev 
$ sudo apt-get install mono-complete
$ sudo apt-get install qt-sdk openjdk-8-jdk openjdk-8-jre

然後進入目錄編譯:

$ cd pcl_1.9
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=None -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_GPU=ON -DBUILD_apps=ON -DBUILD_examples=ON -DCMAKE_INSTALL_PREFIX=/usr ..
$ make -j

編譯過程中,由於系統的VTK版本比較低,可能會出現以下warning像下面這樣的,不用管:

In file included from /home/redwall/catkin_ws/pcl-1.9.0/visualization/include/pcl/visualization/impl/pcl_visualizer.hpp:48:0,
                 from /home/redwall/catkin_ws/pcl-1.9.0/visualization/include/pcl/visualization/pcl_visualizer.h:2352,
                 from /home/redwall/catkin_ws/pcl-1.9.0/examples/segmentation/example_cpc_segmentation.cpp:49:
/usr/include/vtk-6.2/vtkMath.h:672:3: warning: multi-line comment [-Wcomment]
   // a & b \\
   ^
/usr/include/vtk-6.2/vtkMath.h:676:3: warning: multi-line comment [-Wcomment]
   // 1 & 0 \\
   ^
/usr/include/vtk-6.2/vtkMath.h:679:3: warning: multi-line comment [-Wcomment]
   // a & b \\

等到編譯完成之後,雖然有很多警告,只要能編譯通過,就沒關係,安裝即可:

$ sudo make install

此時PCL1.9版本和之前ROS集成的PCL版本是可以共用的,通過在CMakeLists中即可指定特定版本。

2. 下載編譯GPD庫

https://github.com/atenpas/gpd/tree/2.0.0,和上面的方法類似,下載文件之後解壓到安裝的目錄下,但是由於這個包的依賴比較新,編譯的時候提示cmake版本低,網上搜索發現,升級cmake需要先卸載老版本的cmake,但是ROS用戶會由於這個操作把ROS給幹崩,巨坑,所以我只修改了CMakeList.txt,將cmake_minimum_required(VERSION 3.5.1 FATAL_ERROR)中的版本換成自己的較低的版本,實測成功。可以看到後面庫要求的依賴是 find_package(PCL 1.9 REQUIRED)是1.9的版本:老規矩先編譯在安裝

$ cd gpd
$ mkdir build && cd build
$ cmake ..
$ make -j

$ sudo make install

3. 下載編譯gpd_ros

https://github.com/atenpas/gpd_ros.git ,編譯過程中還是有問題:

In file included from /home/redwall/catkin_ws/src/grasps/gpd_ros/src/gpd_ros/grasp_messages.cpp:1:0:
/home/redwall/catkin_ws/src/grasps/gpd_ros/include/gpd_ros/grasp_messages.h:44:12: error: ‘GraspConfigList’ in namespace ‘gpd_ros’ does not name a type
   gpd_ros::GraspConfigList createGraspListMsg(const std::vector<std::unique_ptr<gpd::candidate::Hand>>& hands, const std_msgs::Header& header);
            ^
/home/redwall/catkin_ws/src/grasps/gpd_ros/src/gpd_ros/grasp_messages.cpp:3:10: error: ‘GraspConfigList’ in namespace ‘gpd_ros’ does not name a type
 gpd_ros::GraspConfigList GraspMessages::createGraspListMsg(const std::vector<std::unique_ptr<gpd::candidate::Hand>>& hands, const std_msgs::Header& header)

通過修改gpd_ros包中的CMakeLists.txt,將PCL依賴部分換成find_package(PCL 1.9.0 REQUIRED),指定成最新升級的版本而不是用老版本。

第二個錯誤:

[ 95%] Built target gpd_ros_generate_messages
In file included from /usr/local/include/gpd/descriptor/image_generator.h:54:0,
                 from /usr/local/include/gpd/grasp_detector.h:51,
                 from /home/redwall/catkin_ws/src/grasps/gpd_ros/include/gpd_ros/grasp_detection_node.h:55,
                 from /home/redwall/catkin_ws/src/grasps/gpd_ros/src/gpd_ros/grasp_detection_node.cpp:1:
/usr/local/include/gpd/descriptor/image_strategy.h:40:31: fatal error: opencv2/imgproc.hpp: 沒有那個文件或目錄
compilation terminated.
grasps/gpd_ros/CMakeFiles/gpd_ros_detect_grasps.dir/build.make:62: recipe for target 'grasps/gpd_ros/CMakeFiles/gpd_ros_detect_grasps.dir/src/gpd_ros/grasp_detection_node.cpp.o' failed
make[2]: *** [grasps/gpd_ros/CMakeFiles/gpd_ros_detect_grasps.dir/src/gpd_ros/grasp_detection_node.cpp.o] Error 1
CMakeFiles/Makefile2:1341: recipe for target 'grasps/gpd_ros/CMakeFiles/gpd_ros_detect_grasps.dir/all' failed
make[1]: *** [grasps/gpd_ros/CMakeFiles/gpd_ros_detect_grasps.dir/all] Error 2
make[1]: *** 正在等待未完成的任務....
In file included from /usr/local/include/gpd/descriptor/image_generator.h:54:0,
                 from /usr/local/include/gpd/grasp_detector.h:51,
                 from /home/redwall/catkin_ws/src/grasps/gpd_ros/include/gpd_ros/grasp_detection_server.h:46,
                 from /home/redwall/catkin_ws/src/grasps/gpd_ros/src/gpd_ros/grasp_detection_server.cpp:1:
/usr/local/include/gpd/descriptor/image_strategy.h:40:31: fatal error: opencv2/imgproc.hpp: 沒有那個文件或目錄
compilation terminated.
grasps/gpd_ros/CMakeFiles/gpd_ros_detect_grasps_server.dir/build.make:62: recipe for target 'grasps/gpd_ros/CMakeFiles/gpd_ros_detect_grasps_server.dir/src/gpd_ros/grasp_detection_server.cpp.o' failed
make[2]: *** [grasps/gpd_ros/CMakeFiles/gpd_ros_detect_grasps_server.dir/src/gpd_ros/grasp_detection_server.cpp.o] Error 1
CMakeFiles/Makefile2:200: recipe for target 'grasps/gpd_ros/CMakeFiles/gpd_ros_detect_grasps_server.dir/all' failed
make[1]: *** [grasps/gpd_ros/CMakeFiles/gpd_ros_detect_grasps_server.dir/all] Error 2
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2
Invoking "make -j4 -l4" failed

看到了/usr/local/include/gpd/descriptor/image_strategy.h:40:31: fatal error: opencv2/imgproc.hpp: 沒有那個文件或目錄,應該是opencv庫的問題,看了以下CMakeLists.txt,發現果然沒有opencv的依賴,添加然後在編譯即可:

# Opencv
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
link_directories(${OpenCV_LIBRARY_DIRS})
add_definitions(${OpenCV_DEFINITIONS})

編譯,完美通過:

 


                                                                                        分割線


之前配置PCL1.9的時候,對於低版本的VTK,編譯過程中會出現一些警告,剛好這段時間用的包需要依賴VTK8.2的版本,於是下載了源碼包編譯安裝,一段時間之後,再次編譯gpd_ros出現了一些錯誤,一番搜索之後,發現好像是更新VTK版本之後,之前編譯的動態庫就被替換了,換言之就是先基於VTK低版本編譯安裝了PCL1.9和gpd_ros包,然後升級了VTK8.2版本之後導致PCL找不到原本的動態庫,導致gpd_ros編譯報錯。。。。坑!!!

由於是通過make源碼編譯安裝的,沒辦法直接卸載VTK高版本,只能手動刪除了,通過make編譯的庫一般都在/usr/local/lib目錄下,具體再那個文件夾下,需要再/usr/local下的幾個文件夾仔細找找,一般都是libvtkxxx.so.8.2這種格式的。

刪除之後,再次編譯gpd_ros之後,就沒有上面的錯誤了,但是新的錯誤又來了,糾結了好久,千萬記得將ROS工作空間裏面的build文件夾和devel文件夾清理以下,否則都是之前的編譯完成的東西,一旦鏈接的還是原來的動態庫自然就會報錯!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章