(此博文為新手自學筆記,只是淺顯理解並不保證准確性,后期有更深入的了解會更新內容,歡迎指正博文中的錯誤~)
- 習慣上,在該package目錄下新建include文件夾,專門存放頭文件,比如:PACKAGE_NAME / include / Library_name / HEAD_1.h
- 頭文件中函數或者類的具體實現放在.cpp文件中,習慣與節點源碼放在一起,比如:PACKAGE_NAME / src / HEAD_1.cpp
- 在CmakLists.txt中添加庫:
catkin_package( ... INCLUDE_DIRS include LIBRARIES Library_name ... ) add_library(Library_name src/HEAD_1.cpp src/HEAD_2.cpp ... }
4.庫編譯完后,在其他.cpp中如果用到了這個庫,就可以在編譯的時候添加這個庫的鏈接:
add_executable(node_name src/node_name.cpp)
add_dependencies(node_name Library_name)
target_link_libraries(node_name Library_name ${catkin_LIBRARIES} )
1. 我的ROS版本為indigo,PCL庫版本 1.7,gcc版本是4.8.4(gcc只有4.7及以上的版本才支持c++11的編譯格式)
2. 如果代碼里有c++11格式的語句,比如:
for (auto p:cloud.points) { // 將點雲里的點插入到octomap中 tree.updateNode( octomap::point3d(p.x, p.y, p.z), true ); }
則在編譯的時候,應在CMakeLists.txt中加入
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
3.經過測試,非ROS工作空間中,使用cmake .. / make 方式編譯,編譯格式是否為c++11與pcl並沒有沖突,但是如果在ROS工作空間中,
用catkin_make編譯時,如果編譯格式設置為c++11,則有些用到pcl的時候會出現報錯:
段錯誤(核心已轉儲)
segmentation fault (core dumped)
例如我遇到的一個情況:
在一個ROS-package中,因為要對點雲進行濾波操作(Removing outliers using a Conditional or RadiusOutlier removal),新建remove_outliers.cpp,其中包含頭文件
#include <pcl/filters/radius_outlier_removal.h>
#include <pcl/filters/conditional_removal.h>
同時我的CMakeLists.txt中之前設置了編譯格式為支持c++11(SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")),
使用catkin_make編譯通過后,一旦rosrun該節點,直接出現“段錯誤(核心已轉儲)”,去掉這倆頭文件,便可以正常運行節點,但是也無法做濾波了。
解決方案:
>同一個workspace下,catkin_creat_pkg一個新的pkg單獨編譯該濾波node,同時該pkg的CMakeLists.txt不要指定編譯格式(其實默認就是沒有設置的)
總結:
>ROS中用到跟pcl庫有關的調用時,最好建個pkg將跟pcl有關的節點放在里面,避免出現跟c++11的沖突,因為有些其他的pkg編譯時可能需要c++11的支持,
這時如果又在同一個pkg里引用一些pcl庫時,一旦出現我這種情況是很蛋疼的,剛開始我都不知道哪兒出問題了,找了好久原因。
