【ROS入门篇·二】CMakeLists.txt & package.xml详解

快速链接:【ROS入门篇】ROS学习简介

一、CMakeLists.txt

1.1 CMakeLists.txt文件简介

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文件详解

1.2 添加自定义messages, services and actions

@== 以自定义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;

1.3 catkin_package && find_package

·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}
)

二、package.xml

@== 包信息描述文件

    ……                ## 基本信息,如包名,版本号,维护者,许可证等

    catkin    ## 编译构建工具,通常为catkin

    roscpp                                        ## 编译依赖项

    roscpp        ## 导出依赖项

    roscpp                                           ## 运行依赖项

    doxygen                                           ## 文档生成依赖项

    ## 其他未指定的标签

   

           ## 其他包含格外信息的工具,如nodelet

   

NEXT:【ROS入门篇·三】ROS通讯架构-Topic

你可能感兴趣的:(ROS入门篇,自动驾驶,人工智能,机器学习)