ROS2探索总结-4.ament编译系统
ROS2探索总结-4.ament编译系统
说明
- 介绍和安装ament编译系统
上一篇我们小试牛刀,初步尝试了一下ROS2中的节点通信,这一篇我们来看一下ROS2中“全新”的编译系统——Ament。ROS编译系统从初期使用的rosbuild,到groovy版本之后的catkin,再到ROS2中的Ament,可谓是一波三者,虽然编译系统并不是ROS框架中的核心部分,但却是开发者最常接触的一个重要功能,了解其基本使用方法,常常可以发挥事半功倍的效果。
众所周知,ROS是一种分布式的框架,我们使用的软件都以相互独立的软件包的形式存在,用起来确实方便,但是对于编译系统来讲,还是有相当的挑战的,它不仅需要正确、快速地完成自动化构建过程,还需要解决每个软件包之间的相互依赖关系。虽然ROS中的编译系统一直采用标准的构建工具,比如CMake、Python setuptools,但是这些工具并没有办法完全满足ROS的需求,都需要添加一些额外的功能。
ament的前世今生
ament是一种元编译系统,用来构建组成应用程序的多个独立功能包,它并不是一个全新的东西,而是catkin编译系统进一步演化的版本,这两个单词也是近义词。
ament主要分为两个部分:
编译系统:配置、编译、安装独立的功能包
构建工具:将多个独立的功能包按照一定的拓扑结构进行链接
关于独立功能包之间的依赖关系,和ROS1相同,也需要在清单文件——package.xml中进行声明,如果有兴趣可以查看这个文件的定义标准 ([REP 140][2])。
ament的命令行工具
ament_tools是ament为用户提供的一种命令行工具,可以让用户完成功能包的编译、测试、安装、卸载,而且它本身也是一个Python的功能包。从功能上来看,ament_tools和cantkin系统中的catkin_tools类似,目前并不提供并行构建的能力,将来应该会加入。
ament vs catkin
相比ROS最初使用的rosbuild,catkin在很多方面还是先进很多的,比如支持外部构建,CMake配置文件的自动生成等等。但是catkin也并不完美,针对开发者对catkin缺陷提交的反馈,催生了新一代的编译系统。这些缺陷包括:
CMake centric
在catkin系统构建完成后,会在工作目录下生成一个devel文件夹,里边是编译好的功能包,以及环境变量的设置等等,基本上等同于ROS安装完成后的目录结构和作用。但是相信很多初学者因为devel中的环境变量而苦恼过,这确实为用户带来了一些不必要的麻烦。
Devel space
在catkin系统构建完成后,会在工作目录下生成一个devel文件夹,里边是编译好的功能包,以及环境变量的设置等等,基本上等同于ROS安装完成后的目录结构和作用。但是相信很多初学者因为devel中的环境变量而苦恼过,这确实为用户带来了一些不必要的麻烦。
CMAKE_PREFIX_PATH
catkin会将编译多个工作区的前缀存储到环境变量CMAKE_PREFIX_PATH 中,但是这种方法会干扰变量中的其他值,在ament中,不同工作区的前缀会放到不同的环境变量中。
catkin_simple
catkin_simple是一个用于改善用户catkin体验的工具包,可以减少复杂的CMake代码,但是会存在不稳定的情况。ament也是实现了类似的功能,但是可靠性更强。
Building within a single CMake context
使用catkin_make命令可以一次性编译工作空间中的所有功能包,虽然方便,但如果存在相同命名的功能包时,会编译失败,ament在这方面也进行了改善。
安装ament
- 创建目录
创建一个工作空间:
$ mkdir -p ~/ros2_ws/src
$ cd ~/ros2_ws
- 下载代码
这里需要用到一个版本控制的工具——vcs,可以参考https://github.com/dirk-thomas/vcstool进行安装
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
$ sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-key 0xB01FA116
$ sudo apt-get update
$ sudo apt-get install python-vcstool
然后需要安装一些列依赖的软件包,可参考一下https://github.com/ros2/ros2/wiki/Linux-Development-Setup里边需要安装的软件包,最好全装上,以免后面编译出现错误。
$ sudo apt-get update
$ sudo apt-get install git wget
$ sudo apt-get install build-essential cppcheck cmake libopencv-dev libpoco-dev libpocofoundation9v5 libpocofoundation9v5-dbg python-empy python3-dev python3-empy python3-nose python3-pip python3-setuptools python3-vcstool
# dependencies for testing
$ sudo apt-get install clang-format pydocstyle pyflakes python3-coverage python3-mock python3-pep8 uncrustify
# dependencies for fastrtps
$ sudo apt-get install libboost-chrono-dev libboost-date-time-dev libboost-program-options-dev libboost-regex-dev libboost-system-dev libboost-thread-dev
$ sudo apt-get install libboost-all-dev libpcre3-dev zlib1g-dev python-empy python-pkg-resources
- 下载ament的代码(需时较长)
$ vcs import ~/ros2_ws/src < ros2.repos
- 开始编译
$ src/ament/ament_tools/scripts/ament.py build --build-tests --symlink-install
这时,可能会报错:
ament build: Circular dependency within the following packages: rmw_implementation, rmw_opensplice_cpp
这是一个bug,解决的办法是删掉rmw_opensplice这个包,参考https://github.com/ros2/ros2/issues/303
继续编译
- 编译测试程序
$ src/ament/ament_tools/scripts/ament.py test
- 设置环境变量
ament编译完成后,所有声称的文件都放到了ros_ws工作目录下的install文件夹里:
生成的命令在bin文件夹下,如果我们需要在终端中调用这些命令,需设置环境变量:
$ . install/local_setup.bash
- 运行例程
打开两个终端,运行talker和listener例程
编译自己的功能包
可以在ros_ws的src里边创建自己的功能包,但是目前的工作区里边都是ros2相关的代码,需重新创建一个工作区
$ mkdir -p ~/ros2_overlay_ws/srccd ~/ros2_overlay_ws/src
由于我们目前还没有写过ros2的功能包,那就还是先用ros2的example
$ git clone https://github.com/ros2/examples.git
下载完成后,就可以编译这个新的工作区了(注意:之前编译好的ament的环境变量设置,可以写到.bashrc文件里):
$ cd ~/ros2_overlay_wsament build --cmake-args -DCMAKE_BUILD_TYPE=Debug
编译的过程和catkin差不多,编译完成后也会在工作区产生一个install文件,里边的目录结构和我们之前编译ament所生成的一样,example里边也包含talker和listener,运行的方法一样,先设置环境变量,然后运行,但是这次运行的程序是overlay工作区里边的。
参考资料
The meta build system “ament”:http://design.ros2.org/articles/ament.html
Ament Tutorial:https://github.com/ros2/ros2/wiki/Ament-Tutorial
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号