快速链接:【ROS入门篇】ROS学习简介
cmake_minimum_required(VERSION 3.0.2)
project(my_pkg_name*)
## 找到编译需要的其他 Cmake/catkin package
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
)
## Declare ROS messages, services and actions 自定义数据结构 *详见1.2
add_message_files()
add_service_files()
add_action_files()
generate_messages()
## Declare ROS dynamic reconfigure parameters 动态配置参数
generate_dynamic_reconfigure_options(
# cfg/DynReconf1.cfg
# cfg/DynReconf2.cfg
)
## catkin specific configuration 声明传递给依赖当前功能包的 其他包 的内容 *详见1.3
catkin_package(
# INCLUDE_DIRS include ## 软件包导出的头文件路径
# LIBRARIES ${PROJECT_NAME} ## 项目导出的库
# CATKIN_DEPENDS roscpp rospy ## 当前项目依赖的其他catkin项目
# DEPENDS system_lib ## 当前项目依赖的非catkin CMake项目
)
## Build 添加编译目标-库文件/可执行文件 *详见1.4
include_directories() / link_directories() ##添加头文件&库路径
add_library() ##生成库目标
add_executable() / target_link_libraries() ##生成可执行目标 & 链接库
set_target_properties() ##设置库目标/可执行目标输出名称
add_dependencies() ##提前指定编译顺序,生成库目标/可执行目标时都可以设置
## Install 声明安装规则 *详见1.5
install()
参考链接:ROS中CMakeLists.txt文件详解
@== 以自定义message为例
1) 创建消息数据 xxx.msg文件,并放在msg/文件夹中;
2) 修改package.xml文件
## 编译依赖项,动态产生message的依赖
message_generation ## 运行依赖项
message_runtime
3) 修改CMakeLists.txt文件
## 在find_package()中添加message_generation功能包
find_package(catkin REQUIRED COMPONENTS
roscpp
message_generation
)
## 取消注释add_message_files(),添加xxx.msg
add_message_files(FILES
xxx.msg
)
## 取消注释generate_messages(),添加依赖
generate_messages(DEPENDENCIES
std_msgs
)
## 取消注释catkin_package(),添加message_runtime和其他依赖
catkin_package(
CATKIN_DEPENDS message_runtime
)
4) 编译
·xxx.msg文件一旦修改过,就需要重新编译
5) 引用自定义 xxx.msg文件(C++)
·.cpp文件中添加: #include <*package_name/*xxx.h>
·调用时:*package_name :: xxx;
·赋值时:xxx.data1 = 10;
·find_package(): 声明构建当前功能包需要依赖的其他包
cmake_minimum_required(VERSION 3.0.2)
project(my_pkg_name*)
find_package(catkin REQUIRED COMPONENTS
rosconsole
roscpp
)
find_package(Boost REQUIRED COMPONENTS
system
thread
)
find_package(PythonLibs REQUIRED)
find_package(OpenGL REQUIRED)
·catkin_package(): 声明 需要传递给依赖当前功能包的 其他包 的内容,即依赖当前功能包的包需要具备哪些依赖
参考链接:catkin_package(…)到底在做什么?
- DEPENDS : 当 其他包 通过find_package()查找 当前功能包 时,返回DEPENDS和CATKIN_DEPENDS中的依赖项;
- INCLUDE_DIRS : 因find_package()返回结果格式不规范,显式传递给 *_INCLUDE_DIRS;
- LIBRARIES : 因find_package()返回结果格式不规范,显式传递给 *_LIBRARIES;
- CATKIN_DEPENDS : 只处理catkin程序包
catkin_package(
INCLUDE_DIRS include ${OPENGL_INCLUDE_DIR}
LIBRARIES test ${OPENGL_LIBRARIES}
CATKIN_DEPENDS roscpp
DEPENDS Boost
)
·编译目标: 编译目标可以采取多种形式,但通常它们代表两种可能性之一
- 可执行目标: 可以运行的程序
- 库目标: 在编译和/或运行时可以由可执行目标使用的库
·添加头文件&库路径: 在指定编译目标前,需明确为编译目标寻找资源的位置(路径)
- include_directories() #头文件目录,编译目标所需头文件的路径
- link_directories() #库目录,编译可执行目标指向的库路径
include_directories(
include ## 第一个参数“include”表示包中的include/目录也是路径的一部分
${catkin_INCLUDE_DIRS}
${PCL_INCLUDE_DIRS}
)
link_directories(${PCL_LIBRARY_DIRS}) ##一般不用,信息通过find_package()已经提取
·库目标:
add_library(${PROJECT_NAME}
src/${PROJECT_NAME}/process_velodyne.cpp
)
·可执行目标
add_executable(velodyne_sub_pub src/velodyne_sub_pub.cpp src/other_node.cpp)
target_link_libraries(velodyne_sub_pub ##指定可执行目标所要链接的库
${catkin_LIBRARIES}
${PCL_LIBRARIES}
)
·set_target_properties()
set_target_properties(${PROJECT_NAME}_node
PROPERTIES OUTPUT_NAME node PREFIX "")
## 在编译和安装输出时将目标名称${PROJECT_NAME}_node -> node
·add_dependencies():
- 提前指定编译顺序,尤其是有自定义数据结构和dynamic reconfigure时,构建库和可执行文件前,如果有需要预先生成的有依赖性的消息或dynamic_reconfigure,则要先执行;
- package.xml中
add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
·当使用C++进行编程,需要包含自定义源文件时(test.cpp)
ROS中的C++实现中头文件与源文件调用以及Python模块导入(十一)
tips:
·可以在可执行文件中同时包含test.h和test.cpp
·也可以把自定义源文件test.cpp当作库目标,给可执行文件aaa.cpp用
add_library(test
include/test.h
src/test.cpp
)
add_executable(aaa src/aaa.cpp)
target_link_libraries(test ${catkin_LIBRARIES})
target_link_libraries(aaa
test
${catkin_LIBRARIES}
)
@== 包信息描述文件
…… ## 基本信息,如包名,版本号,维护者,许可证等
catkin ## 编译构建工具,通常为catkin
roscpp ## 编译依赖项
roscpp ## 导出依赖项
roscpp ## 运行依赖项
doxygen ## 文档生成依赖项## 其他未指定的标签
## 其他包含格外信息的工具,如nodelet