關於catkin_make的一些學習筆記(持更)


(此博文為新手自學筆記,只是淺顯理解並不保證准確性,后期有更深入的了解會更新內容,歡迎指正博文中的錯誤~)

1.添加自定義的頭文件

2. C++11與PCL庫沖突問題

 

 

 


  • 添加自定義的頭文件
  1. 習慣上,在該package目錄下新建include文件夾,專門存放頭文件,比如:PACKAGE_NAME / include / Library_name / HEAD_1.h
  2. 頭文件中函數或者類的具體實現放在.cpp文件中,習慣與節點源碼放在一起,比如:PACKAGE_NAME / src / HEAD_1.cpp
  3. 在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} )

 

  •  C++11與PCL庫沖突問題

  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庫時,一旦出現我這種情況是很蛋疼的,剛開始我都不知道哪兒出問題了,找了好久原因。

  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM