colcon构建工具
colcon工具相对于bazel等,效率不算高,但是其模块化做得好,易用性程度高
通过解析package.xml
获取配置信息,包括描述规范,名称,版本,构建方法和测试方法等
有关依赖会附有_depend
扩展名说明
如构建依赖build_depend
构建工具依赖buildtool_depend
测试依赖test_depend
运行依赖exec_depend
colcon支持的构建方式
cmake
不使用任何ROS相关依赖的构建方式,很多支持ROS或ROS2的第三方库便是这种构建方式ament_cmake
支持C/C++项目,更高效地获取ROS相关基础功能库,也可以使用所有通过ament
工具链定义的功能ament_python
支持Python项目
构建过程中,colcon会按照依赖关系按顺序对功能包进行编译安装,所有依赖都是从环境变量或本地路径进行查找,不允许路径中出现两个同名的功能包
若在构建过程中,没有找到相应的功能包,colcon不会报错,而会继续构建,这与CMake中的find_package
的REQUIRE
机制是有区别的
colcon是抽象在ament之上的,ament工具链服务于ROS2相关功能包,而colcon可扩展到其他项目
colcon组织的项目分为核心项目core和扩展项目extension
colcon-core是colcon的核心项目,colcon-gradle是支持Java Gradle项目的扩展项目
colcon工具链支持了build
,edit
,graph
,info
,test
,metadata
,mixin
等多个命令参数
colcon本身是一个模块化的工具链,所有colcon命令行参数都由相应的安装包提供,如build功能由colcon-core提供,edit功能由colcon-ed提供,可用colcon -h
查看是否有相关包进行支持
colcon会跳过COLCON_IGNORE文件的目录
colcon构建
colcon build
通过目录下每一个功能包中的package.xml
所共同描述的依赖拓扑关系,依次完成构建
若依赖拓扑关系中没有依赖项目,不会强制终止,也不会输出错误或警告,会继续构建
colcon build
参数支持输入cmake参数,如通过--cmake-args
输入cmake的-D
参数
colcon
的构建方式有两种
merge
方式,默认,参数--merge-install
将所有功能包的同类型文件放在一起
可执行文件一般放在bin
文件夹,二进制库和节点类执行文件会放在lib
下
头文件会放在include
下,其他的共享文件会放在share
下symlink
方式,參數--symlink-install
将每个功能包独立存放于安装目录,在每个安装目录下,会按类型(如bin,include,lib,share等)建立文件夹,这些文件夹命名和分类被称作ROS的文件系统层级标准
通过软链接方式指向脚本文件,如Python文件,允许当source空间中文件改变时安装的文件也会随之改变
以动态链接库为例,会在install目录下使用符号链接,指向build目录下生成的.so
库文件,否则两个目录都有库文件
merge
和symlink
生成的文件从功能上看是一致的,生成的文件夹主要有
build
存放构建时生成的中间文件,如.c
和.cpp
文件的.o
文件,需要联互联网下载的外部功能包等install
存放最终生成的文件,即安装路径,该路径可用指令中提供的参数--install-base
修改
包括配置脚本文件local_setup
和setup
,.ps1
用于windows平台,其他平台可用.sh/.bash/.zsh
等log
存放构建过程中生成的日志文件,日志文件会按构建和测试时间进行分类
默认提供三个软链接latest
,latest_build
和latest_test
分别链接最近一次操作结果,最近一次构建结果和最近一次测试结果日志
其他参数
--packages-select
指定需要构建的功能包--packages-ignore
忽视不需要构建的功能包
--packages-up-to
--install-base
参数指定安装路径
--parallel
表示最多可并行构建的功能包数
--event-handlers
表示处理事件的方式
console_cohesion+
表示构建结束后输出到终端,+
表示启用,-
表示不启用,默认不启用
colcon测试
colcon test
在选择参数--merge-install
或--symlink-install
时应与colcon build
对应
测试指令参数中,测试方式需要与构建方式(merge
或symlink
)一致
测试指令可用参数控制输出到终端的内容,如--return-code-on-test-failure
约束在失败时输出非0结果,以确保CI检查器可以捕获失败结果
--packages-up-to
--ctest-args
控制cmake测试参数
--pytest-args
控制python测试参数
测试包括静态测试和动态单元测试
- 静态测试
面向源代码进行筛查,会检查源码中各个文件的格式和规范,如XML文件,CMake文件,C++/Python文件等 - 单元测试
需要构建二进制程序,测试时调用该程序,完成各个单元功能的测试,并根据结果和断言的匹配程度来判断是否通过测试
相对于静态测试,单元测试需要工程师进行编码,并且需要测试人员对被测试体的功能十分熟悉i,以确保足够的测试覆盖率
colcon test
可选参数说明
--event-handlers
console_cohesion+
--packages-select
指定需要测试的功能包--symlink-install
无论是否指定console_cohesion
测试结果会保存在log
路径下的latest_test
中
colcon查阅
colcon info
查看功能包基本信息,以及功能包的依赖,来自colcon-package-infomation
扩展包
--paths
和--base-paths
这两个参数由discovery arguments功能支持,帮助指令快速找到功能包,若输入多个参数,则取并集,前者由colcon-core
提供,后者是colcon-recursive-crawl
提供
packages-up-to
参数由package selection arguments提供,帮助快速查找包,并支持多个参数
colcon list
由colcon-package-infomation
提供的枚举功能包的指令
可通过discovery arguments和package selection arguments增加约束
-n
是names-only
的缩写,表示只显示包名
-t
是--topological-order
的缩写,表示按拓扑关系以广度优先显示
colcon graph
的功能由colcon-package-infomation
提供
为功能包之间的依赖提供可视化表示
--density
提供了图的密度计算结果
--legend
提供了图的说明
--dot
提供了dot格式的输出结果
colcon插件
colcon_cd
快速查询并进入功能包
echo "source /usr/share/colcon_cd/function/colcon_cd.sh" >> ~/.bashrc
echo "export _colcon_cd_root=~/ros2_ws" >> ~/.bashrc
colcon_argcomplete
tab补全
echo "source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash" >> ~/.bashrc
cmake
设置动态库和可执行文件的变量名称
添加include
为头文件查找目录
添加可执行文件add_executable
和库add_libraries
的实现
并指明为共享库SHARED
链接和头文件做了区分安装
测试部分参考if(BUILD_TESTING)
后的内容
ament_lint_auto
负责静态测试
ament_cmake_gtest
负责单元测试
最后使用ament系列的CMake指令,完成对头文件目录和库的导出,便于其他包查找和链接
ament
开头的指令会生成一系列CMake文件,并安装到share目录
rosdep
sudo rosdep init
rosdep update
ROS的依赖工具
rosdep
install 安装
–ignore-src 忽略已安装的包
–from-path src 指定安装依赖路径
–rosdistro humble 指定ROS版本
-y 默认确认