从ROS 2 Bouncy开始colcon
,colcon教程中描述了推荐的编译工具。
概述
这将为您提供如何使用ament工作区启动和运行的快速摘要。这将是一个实用的教程,并非旨在取代核心文档。
背景
Ament是catkin元编译工具的迭代。有关设计的更多信息,请参阅此文档。
源代码可以在GitHub组织中找到。
前期准备
开发环境
确保根据源代码编译指令设置开发环境。
基本
ament工作空间是具有特定结构的目录。通常有一个src
子目录。在该子目录中是源代码所在的位置。通常,目录开始否则为空。
Ament不受源代码编译的影响。默认情况下,它将创建一个build
和install
目录作为src
目录的对等项。该build
目录将存储中间文件。对于每个包,将创建一个子文件夹,例如调用CMake。该install
目录是每个软件包将安装到的目录。
注意:与catkin相比,没有devel
目录。
创建目录结构
要在目录中创建基本结构~/ros2_ws
:
mkdir -p ~ / ros2_ws / src
cd ~ / ros2_ws
这是~/ros2_ws
您可以预期的目录结构:
.
└── src
1 directory, 0 files
添加一些源代码
首先,我们需要在没有安装任何ROS2的情况下设置底层。
wget https://raw.githubusercontent.com/ros2/ros2/master/ros2.repos
vcs import src < ros2.repos
注意:vcs import src < ros2.repos 需要安装vcstool 等包,参考https://github.com/dirk-thomas/vcstool 以及 https://github.com/ros2/ros2/wiki/Linux-Development-Setup ,执行以下指令后可行。
sudo apt update && sudo apt install -y \
build-essential \
git \
python3-colcon-common-extensions \
python3-pip \
python-rosdep \
python3-vcstool \
wget
# install some pip packages needed for testing
sudo -H python3 -m pip install -U \
argcomplete \
flake8 \
flake8-blind-except \
flake8-builtins \
flake8-class-newline \
flake8-comprehensions \
flake8-deprecated \
flake8-docstrings \
flake8-import-order \
flake8-quotes \
pytest-repeat \
pytest-rerunfailures
# [Ubuntu 16.04] install extra packages not available or recent enough on Xenial
python3 -m pip install -U \
pytest \
pytest-cov \
pytest-runner \
setuptools
# install Fast-RTPS dependencies
sudo apt install --no-install-recommends -y \
libasio-dev \
libtinyxml2-dev
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 python3-vcstool
这是~/ros2_ws
添加源后可以预期的目录结构(请注意目录/文件的确切结构和数量可能随时间而变化):
.
├── ros2.repos
└── src
├── ament
│ ├── ament_cmake
│ ├── ament_index
| ...
│ ├── osrf_pycommon
│ └── uncrustify
├── eProsima
│ ├── Fast-CDR
│ └── Fast-RTPS
├── ros
│ ├── class_loader
│ └── console_bridge
└── ros2
├── ament_cmake_ros
├── common_interfaces
├── demos
...
├── urdfdom
├── urdfdom_headers
└── vision_opencv
51 directories, 1 file
运行build
由于这是一个引导环境,我们需要通过其完整路径调用ament.py。
注意:将来一旦安装在您的系统或底层工作区中,就不再需要了。
由于没有devel
空间,并且需要安装每个包,因此它支持该选项--symlink-install
。这允许通过更改source
空间中的文件(例如Python文件或其他未编译的资源)来更改已安装的文件,以便更快地进行迭代。
src / ament / ament_tools / scripts / ament.py build --build-tests --symlink-install
运行测试
要运行刚刚编译的测试,请使用--build-tests
上面的选项运行以下命令:
src / ament / ament_tools / scripts / ament.py test
如果在包含测试(使用build --build-tests
)之前编译(并安装)了工作区,则可以跳过编译和安装步骤以加快进程:
src / ament / ament_tools / scripts / ament.py test --skip-build --skip-install
source环境
当ament成功完成编译后,输出将在install
目录中。要使用可执行文件和库,例如将install/bin
目录添加到路径中。Ament将在install
目录中生成bash文件以帮助设置环境。这些文件将向路径和库路径添加所需的元素,并提供由包导出的任何导出的bash或shell命令。
. install/ local_setup.bash
注意:这与catkin略有不同。该local_setup.*
文件与setup.*
文件略有不同,因为它只应用当前工作区的设置。使用多个工作空间时,您仍需要source setup.*
以获取包括所有父工作空间在内的环境。
试试一个demo
有了源环境,您现在可以运行由ament编译的可执行文件。
ros2 run demo_nodes_cpp listener &
ros2 run demo_nodes_cpp talker
你会看到数字递增输出。
让我们停止节点并尝试创建自己的覆盖工作区。
^-C
kill %1
开发自己的包
Ament使用的package.xml规格
与REP 140中 为catkin 定义的一样。
您可以在src
目录中创建自己的包,但是当您要仅在几个包上进行迭代时,建议使用覆盖空间。
工作空间的覆盖
现在你已经设置了引导程序底层,你也会发现ament
已经存在path
路径中。
下面让我们创建一个新的覆盖工作空间~/ros2_overlay_ws
。
mkdir -p ~ / ros2_overlay_ws / src
cd ~ / ros2_overlay_ws / src
首先,我们将覆盖ros2 / examples存储库:
# If you know that you're using the latest branch of all
# repositories in the underlay, you can also get the latest
# version of the ros2/examples repository, with this command:
# git clone https://github.com/ros2/examples.git
# Otherwise, clone a copy from the underlay source code:
git clone ~ / ros2_ws / src / ros2 / examples
然后,编译覆盖工作空间,我们使用debug进行编译,这样可以确保获得调试符号:
cd ~ / ros2_overlay_ws
ament build --cmake-args -DCMAKE_BUILD_TYPE = Debug
现在,此工作空间位于现有工作空间之上,因此您可以发现which talker是当前覆盖空间中的
。
如果您执行 source ~/ros2_overlay_ws/install/local_setup.bash,
它将更改为引用覆盖空间的中talker
。
如果您使用新终端返并想要在覆盖空间上进行开发,则可以简单地执行 source ~/ros2_overlay_ws/install/setup.bash,
将自动获取所有父工作空间环境的源。
创建自己的包
您可以创建自己的包。类似于catkin_create_package的命令
将被移植到ament中,但还没有提供。
(ROS 2 Bouncy 版本提供了 ros2 pkg create 命令)
Ament支持多种编译类型。推荐的编译类型是ament_cmake
和ament_python
。还支持纯cmake
包。预计会增加对更多编译类型的支持。
ament_python
编译的一个示例是ament_tools
包,其中setup.py是编译的主要入口点。
诸如demo_nodes_cpp
使用ament_cmake
编译类型的包,并使用CMake作为编译工具。
提示
-
如果您不想编译特定的包,请在目录中指定一个命名为
AMENT_IGNORE的
空文件,则不会将其编入索引。“Catch all”选项,如--cmake-args应该放在其他选项之后,或者用 '--'分隔:
ament build . --force-cmake-configure --cmake-args -DCMAKE_BUILD_TYPE=Debug -- --ament-cmake-args -DCMAKE_BUILD_TYPE=Release
- 如果要从某个包中运行单个特定测试:
ament test --only-packages YOUR_PKG_NAME --ctest-args -R YOUR_TEST_IN_PKG