目录
一.catkin编译系统
二.package.xml(功能包配置文件)
三.CMakeList.txt(构建配置文件)
1.catkin概述
catkin是ROS的官方编译系统,是ros原始编译系统build的继承者。catkin相比于build来讲操作更加简化且工作效率更高,可移植性更好,且支持交叉编译和更加合理的功能包分配。
2.catkin编译的工作流程
首先在工作空间的src目录下递归的查找每一个ros的package。因为每一个package中都有package.xml和CMakeList.txt文件,所以catkin编译系统依据CMakeList.txt文件,生成makefile文件,放在工作空间的build文件夹中。然后make刚刚生成的makefiles等文件,编译链接生成可执行文件,放在工作空间下的devel文件夹中。简而言之,catkin就是将camke和make指令做了一个封装从而完成整个编译过程的工具。
3.catkin的特点
catkin是基于CMake的编译构建系统,其沿用了包管理的传统基础结构,扩展了CMake.
一个catkin的package必须包括package.xml和CMakeList.txt这两个文件
package.xml:定义了package的属性(包的自我描述),如包名、版本号、作者、依赖等
CMakeList.txt:规定了catkin的编译规则,是构建package所需的CMake文件,具体的有:调用catkin的函数/宏;解析package.xml;找到其他依赖的catkin软件包;将本软件包添加到环境变量等等
4.使用catkin_make进行编译
常用的catkin命令:
catkin_create_pkg 创建一个包含package.xml和CMakeList.txt文件的空功能包
$catkin_create_pkg package_name depend1 depend2
catkin_make 创建和初始化工作空间,编译
catkin_generate_changelog 该命令是在更新功能包的版本时创建一个描述更新记录的CHANGELOG.rst文件
catkin_prepare_release 准备发布时用到的更新记录和版本标记
在把创建的功能包注册到官方ROS存储库或更新功能包的版本时,会使用到上面两个命令。
catkin_find 搜索catkin,找到并显示工作空间,可通过运行该命令来找出正在使用的所有工作目录,如果执行“catkin_find package_name”,则会看到选项中指定的与功能包相关的工作目录
用catkin编译一个工程或软件包只需要用catkin_make指令。一般当我们写完代码,执行一次catkin_make进行编译,调用系统自动完成编译和链接过程,构建生成目标文件。
package.xml包含了package的名称、版本号、内容描述、维护人员、软件许可、编译构建工具、编译依赖、运行依赖等信息。
文件写法:遵循XML标签文本的写法,目前存在两种格式,但内容大致一样。(红色字体的是必备标签)
定义文档语法的语句,放在文档开头
新版本用
例子:
从例子中可以明显看出新旧版本的差别
特别要注意
CMakeList.txt原本是Cmake编译系统的规则文件,ROS的构建系统catkin基本上使用CMake,只是针对ROS工程添加了一些宏定义。因此在写法上CMakeList.txt和Cmake基本一致。
CMakeList.txt文件规定了catkin的编译规则,直接规定这个包需要依赖那些package,要编译生成那些目标,如何编译等等流程
写法:该文件的基本语法都是按照CMake,只是在其基础上添加了一些宏
总体结构
camke_minimum_required() #CMake的版本号,指定系统中安装的CMake的最低版本,如比规定的低则必须要更新版本
例 cmake_minimum_required(VERSION2.8.3) 指定最低版本是2.8.3
project() #项目的名称,必须要使用package.xml中的
find_package() #进行构建所需的组件包,这是让用户先创建依赖包的选项
例 find_package(catkin REQUIRED COMPONENTS roscpp std_msgs) #roscpp和std_msgs被添加为依赖包
如果是使用ROS以外的功能包时有一定区别,如使用Boost时,必须先安装system功能包
find_package(Boost REQUIRED COMPONENTS sysytem)
catkin_python_setup() #catkin新加宏,打开catkin的Python Module的支持,调用Python安装过程setup.py
add_message_files() #catkin新加宏,添加自定义Message文件
例 add_message_files(FILES Message1.msg Message2.msg) FILES将引用当前功能包目录的msg目录中的
*.msg文件,自动生成一个头文件(*.h)
add_service_files() #catkin新加宏,添加自定义Service文件
例 add_service_files(FILES service1.srv service2.srv) FILES将引用当前功能包目录的srv目录中的
*.srv文件
add_action_files() #catkin新加宏,添加自定义Action文件
generate_message() #catkin新加宏,生成不同语言版本的mag/srv/action接口
catkin_package() #catkin新加宏,生成当前package的cmake配置,供依赖本包的其它软件包调用
例 catkin_package(
INCLUDE_DIRS inlude #使用INCLUDE_DIRS后面的内部目录include的头文件
LIBRARIES package_name #使用功能包package_name的库
CATKIN_DEPENDS roscpp std_msgs #其后面指定roscpp和std_msgs依赖包
DEPENDS system_lib #描述系统依赖包的设置
)
add_library() #生成库,声明构建之后需要创建的库
add_executable() #生成可执行二进制文件
add_dependencies() #在构建该库和可执行文件之前,如果有需要预先生成的有依赖性的消息,则需要先执行
target_link_libraries() #在创建特定的可执行文件之前将库和可执行文件进行链接的选项
catkin_add_gtest #catkin新加宏,生成测试
install() #安装至本机
例子