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_packageREQUIRE机制是有区别的

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库文件,否则两个目录都有库文件

mergesymlink生成的文件从功能上看是一致的,生成的文件夹主要有

  • build
    存放构建时生成的中间文件,如.c.cpp文件的.o文件,需要联互联网下载的外部功能包等
  • install
    存放最终生成的文件,即安装路径,该路径可用指令中提供的参数--install-base修改
    包括配置脚本文件local_setupsetup.ps1用于windows平台,其他平台可用.sh/.bash/.zsh
  • log
    存放构建过程中生成的日志文件,日志文件会按构建和测试时间进行分类
    默认提供三个软链接latestlatest_buildlatest_test
    分别链接最近一次操作结果,最近一次构建结果和最近一次测试结果日志

其他参数

  • --packages-select
    指定需要构建的功能包
  • --packages-ignore
    忽视不需要构建的功能包

--packages-up-to
--install-base参数指定安装路径
--parallel表示最多可并行构建的功能包数
--event-handlers表示处理事件的方式
console_cohesion+表示构建结束后输出到终端,+表示启用,-表示不启用,默认不启用

colcon测试

colcon test在选择参数--merge-install--symlink-install时应与colcon build对应

测试指令参数中,测试方式需要与构建方式(mergesymlink)一致

测试指令可用参数控制输出到终端的内容,如--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 listcolcon-package-infomation提供的枚举功能包的指令
可通过discovery arguments和package selection arguments增加约束
-nnames-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_argcompletetab补全

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 默认确认

posted @ 2024-11-01 19:55  sgqmax  阅读(19)  评论(0编辑  收藏  举报