最近在搭项目框架,写了一个节点叫map_server,有写了一个节点叫plan_manager,后者会调用前者中定义类方法,开始的时候,我就非常naive的在plan_manager中的manger_node.cpp中引入了map_server相关的头文件,但是这其实是不行的,因为cmake在编译的时候是不会自动帮你找别的pkg中的库函数的,需要在cmakelist.txt和package.xml中进行一些配置才能够使用,下面是我的配置心得体会:
目录:
CMakelists.txt(map_server)配置
作为被调用的包,应当在CATKIN_DEPENDS的基础上,增加INCLUDE_DIRS和LIBRARIES参数,其中:
INCLUDE_DIRS是将当前包的include,pcl头文件,Boost头文件加入到catkin_make的路径中,我们可以使用include_directories(${catkin_INCLUDE_DIRS})为cmake添加头文件检索路径,这里其实也可以不传PCL和Boost,那你在plan_manager中,就需要加find_package找到,这是不太好的,因为plan_manager要将所有自定义包的依赖都find到,自定义包一多,就很冗长了,因此,当你在配置依赖包的cmakelist时,就应刚直接将库的依赖顺便一并导出
LIBRARIES是说明你在当前包中定义的那些库要添加到catkin_make的检索路径,我们可以使用target_link_libraries(${catkin_LIBRARIES})将依赖库链接到plan_manager上
catkin_package(
INCLUDE_DIRS include ${PCL_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS}
LIBRARIES map_maintainer
CATKIN_DEPENDS roscpp rospy std_msgs
)
其中,map_maintainer是我们自己生成的库
add_library(map_maintainer
src/map_maintainer.cpp
)
CMakelists.txt(plan_manager)配置
当我们调用其他包中定义的函数/类/方法时,我们要在cmakelist和package.xml中进行配置,在cmakelists.txt中,我们要关注
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
map_server
)
其中,map_server就是我们想要调用自定义库的包名称,由于我们在map_server的CMakelists中已经通过catkin_package的LIBRARIES将我们需要的库添加进catkin路径中了,所以我们这里是可以通过map_server找到对应库的
此外,我们要关注
catkin_package(
CATKIN_DEPENDS roscpp rospy std_msgs map_server
)
我们需要将map_server也加入到我们这个包的依赖中(catkin_make才会帮我们调整各个包的编译顺序,先编译依赖元包,再编译调用包)
最后,我们要关注
include_directories(
include
${catkin_INCLUDE_DIRS}
)
和
target_link_libraries(manager_node
plan_manager
${catkin_LIBRARIES}
)
目的是将我们找到的catkin组件放入头文件和库文件中等待调用和链接
package.xml(plan_manager)配置
除了要配置plan_manager的cmakelist,还要配置package.xml,才能保证plan_manager包的顺利编译和运行,只需要添加如下语句即可:
<build_depend>map_server</build_depend>
<exec_depend>map_server</exec_depend>
至此,plan_manager调用map_server就配置好了!
在ROS项目开发中,当一个节点需要调用另一个节点中的类方法时,需要正确配置CMakeLists.txt和package.xml以解决依赖。调用方需在CMakeLists中find_package找到被调用包,并在catkin_package中声明依赖。同时,被调用包要在CATKIN_DEPENDS基础上增加INCLUDE_DIRS和LIBRARIES,将库的依赖导出。package.xml中也需要相应添加build_depend和exec_depend。这样可以确保编译顺序正确,且能正确链接所需库。
8183

被折叠的 条评论
为什么被折叠?



