摸索了好几天,查阅了很多都没有一个准确的教程,经过我不断地测试,终于找到正确的打开方式了!!!比如我们现在要在B package 引用A package下的example.h文件
首先,因为在ROS的功能包里其实是可以同时存在多个节点的,但是你会发现自动生成功能包时,官方对于cmakelist.txt中的可执行文件的命名都是${PROJECT_NAME}_node,这其实已经在提示我们,你在src里面写的带main函数的.cpp文件应该是一个创建节点的包含ros::init的主入后。所以这里我对于网上所有关于ROS的教程中,在cmakelist.txt文件中的${PROJECT_NAME}_node名称改为实际.cpp文件的名字表示意见保留,我觉得你的某个ROS节点文件就命名为${PROJECT_NAME}_node挺好的。如果实在有多个节点,再额外带下标加以区分即可。
另外,在大型工程的src里,创建ROS节点的.cpp文件一般都不长,会在其中调用其他.cpp文件内的函数来进行相关操作,这其实形成了一种良好的生态,因为我可以直接把别人写好的实现某些操作的不带main函数的.cpp直接拷贝到我的src目录下,然后自己创建个简单的ros节点文件,就能够实现对相关函数的调用了。
这种调用,一般是通过#include来实现的。比如我们在功能包A_package中的src目录下,现在有一个example.cpp,我创建了一个test.cpp初始化ROS节点。接下来需要:
网上一般的教程都没考虑ROS可执行文件和链接库的区别,所以都统一命名了,但其实里面是有讲究的。
首先,对于一个不需要在其他功能包调用此功能包内容的情况下,我们只需要打开那两行注释即可
add_executable(${PROJECT_NAME}_node
src/test.cpp
src/example.cpp
)
target_link_libraries(${PROJECT_NAME}_node
${catkin_LIBRARIES}
)
这里catkin_make编译通过后会出现一行
[100%] Built target A_package_node
如果你引用了example.h文件,还需要额外加两行
catkin_package(
INCLUDE_DIRS include
CATKIN_DEPENDS roscpp rospy std_msgs
)
include_directories(
SYSTEM
include
${catkin_INCLUDE_DIRS}
# ${OpenCV_INCLUDE_DIRS}
# ${PCL_INCLUDE_DIRS}
# ${Eigen3_INCLUDE_DIRS}
)
其中catkin_package的具体写法可以参照我的上一篇博客。
但是,当你想要在其他功能包里调用这个example.h文件时,你需要在额外生成一个c++的链接库。也就是最关键的一步。
add_library( A_package
src/example.cpp
)
target_link_libraries( A_package
${catkin_LIBRARIES}
# ${PCL_LIBRARIES}
# ${Eigen3_LIBRARIES}
# ${OpenCV_LIBS}
)
catkin_package(
INCLUDE_DIRS include
LIBRARIES A_package
CATKIN_DEPENDS roscpp rospy std_msgs
)
此时catkin_make编译通过后会额外出现一行
[100%] Built target A_package
前面相当于对于test.cpp生成了一个名为A_package_node的可执行文件,对于example.cpp生成了一个链接库,通过这个链接库可以调用example.h
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
A_package
)
这里的“A_package”就是对应前面生成的c++链接库的名字。
catkin_package(
INCLUDE_DIRS include
LIBRARIES B_package
CATKIN_DEPENDS roscpp rospy std_msgs
CATKIN_DEPENDS A_package
)
其中CATKIN_DEPENDS 就是说会依赖A_package,相当于调用了。
A_package
A_package
A_package
这里三个A_package对应上cmakelist.txt里新添的链接库名字。
所以,如果你拿到了一份ROS包装的代码,那肯定是若干个功能包,可以在本篇博客的基础上二次开发;
如果你拿到了一份纯c++代码,那就可以在上一篇博客的基础上二次开发。