关于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库时,一旦出现我这种情况是很蛋疼的,刚开始我都不知道哪儿出问题了,找了好久原因。

  

 

 

posted on 2017-07-28 11:56  zhch_pan  阅读(7203)  评论(0编辑  收藏  举报

导航