创建工作区

目标: 创建一个工作区并了解如何设置用于开发和测试的覆盖。

教程级别: 初学者

时间: 20 分钟

背景

工作区是包含 ROS 2 软件包的目录。 在使用 ROS 2 之前,需要在计划工作的终端中获取 ROS 2 安装工作区。 这样,您就可以在该终端中使用 ROS 2 的软件包。

您还可以选择获取“覆盖” - 一个辅助工作区,您可以在其中添加新软件包,而不会干扰您正在扩展的现有 ROS 2 工作区或“底层”。 您的底层必须包含覆盖中所有软件包的依赖项。 覆盖中的软件包将覆盖底层中的软件包。 也可以有多层底层和覆盖,每个连续的覆盖都使用其父底层的软件包。

先决条件

任务

1 源ROS 2环境

您的主要 ROS 2 安装将成为本教程的底层。 (请记住,底层不一定是主要 ROS 2 安装。)

根据您安装 ROS 2 的方式(从源代码或二进制文件)以及您使用的平台,您的确切源命令将有所不同:

source /opt/ros/rolling/setup.bash

如果这些命令对您不起作用,请查阅:doc:安装指南<../.././Installation>。

2 创建新目录

最佳实践是为每个新工作区创建一个新目录。 名称无关紧要,但有助于表明工作区的用途。 让我们选择目录名称“ros2_ws”,作为“开发工作区”:

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src

另一个最佳实践是将工作区中的所有包放入“src”目录中。 上面的代码在“ros2_ws”内创建一个“src”目录,然后导航到该目录。

3 克隆示例仓库

确保在克隆之前您仍位于“ros2_ws/src”目录中。

在其余的初学者开发人员教程中,您将创建自己的包,但现在您将练习使用现有包将工作区组合在一起。

如果您阅读过:doc:Beginner: CLI Tools 教程,您将熟悉“turtlesim”,它是“ros_tutorials <https://github.com/ros/ros_tutorials/>`__ 中的包之一。

一个存储库可以有多个分支。

您需要查看针对您安装的 ROS 2 发行版的那个。

克隆此存储库时,添加“-b”参数,后跟该分支。

在“ros2_ws/src”目录中,运行以下命令:

git clone https://github.com/ros/ros_tutorials.git -b rolling

现在“ros_tutorials”已克隆到您的工作区中。“ros_tutorials”存储库包含“turtlesim”包,我们将在本教程的其余部分中使用它。此存储库中的其他包未构建,因为它们包含“COLCON_IGNORE”文件。

到目前为止,您已使用示例包填充了您的工作区,但它还不是一个功能齐全的工作区。 您需要先解决依赖关系,然后构建工作区。

4 解决依赖关系

在构建工作区之前,您需要解决包依赖关系。 您可能已经拥有所有依赖项,但最佳做法是在每次克隆时检查依赖项。 您不希望在长时间等待后才发现缺少依赖项而构建失败。

从工作区(“ros2_ws”)的根目录运行以下命令:

# cd if you're still in the ``src`` directory with the ``ros_tutorials`` clone
cd ..
rosdep install -i --from-path src --rosdistro rolling -y

如果您从源代码或二进制存档在 Linux 上安装了 ROS 2,则需要使用其安装说明中的 rosdep 命令。 以下是:ref:源 rosdep 部分二进制存档 rosdep 部分

如果您已经拥有所有依赖项,则控制台将返回:

#All required rosdeps installed successfully

包在 package.xml 文件中声明其依赖项(您将在下一个教程中了解有关包的更多信息)。 此命令将遍历这些声明并安装缺少的声明。 您可以在另一个教程(即将推出)中了解有关“rosdep”的更多信息。

5 使用 colcon 构建工作区

从您的工作区(“ros2_ws”)的根目录,您现在可以使用以下命令构建您的包:

colcon build

控制台将返回以下消息:

Starting >>> turtlesim
Finished <<< turtlesim [5.49s]

Summary: 1 package finished [5.58s]

Note

“colcon build” 的其他有用参数:

  • --packages-up-to 构建您想要的包及其所有依赖项,但不是整个工作区(节省时间)

  • --symlink-install 让您不必在每次调整 Python 脚本时重建

  • --event-handlers console_direct+ 在构建时显示控制台输出(否则可以在 log 目录中找到)

  • --executor sequation 逐个处理包,而不是使用并行性

构建完成后,在工作区根目录(“〜/ ros2_ws”)中输入命令:

ls

您将看到 colcon 已创建新目录:

build  install  log  src

“install”目录是你的工作区安装文件所在的地方,你可以使用它来获取你的覆盖。

6 Source the overlay

在获取覆盖层之前,打开一个新终端非常重要,该终端与您构建工作区的终端不同。 在构建覆盖层的同一终端中获取覆盖层,或者在获取覆盖层的位置构建覆盖层,可能会产生复杂的问题。

在新终端中,将您的主 ROS 2 环境作为“底层”获取,以便您可以在其“上方”构建覆盖层:

source /opt/ros/rolling/setup.bash

进入工作区的根目录:

cd ~/ros2_ws

在根目录中,获取您的覆盖:

source install/local_setup.bash

Note

获取覆盖层的“local_setup”只会将覆盖层中可用的包添加到您的环境中。 “setup”会获取覆盖层以及创建它的底层,让您能够同时使用这两个工作区。

因此,获取主 ROS 2 安装的“setup”,然后获取“ros2_ws”覆盖层的“local_setup”(就像您刚才所做的那样), 与获取“ros2_ws”的“setup”相同,因为这包括其底层的环境。

现在您可以从覆盖运行“turtlesim”包:

ros2 run turtlesim turtlesim_node

但是您如何知道这是正在运行的覆盖 turtlesim,而不是主安装的 turtlesim?

让我们在覆盖中修改 turtlesim,以便您可以看到效果:

  • 您可以独立于底层修改和重建覆盖中的包。

  • 覆盖优先于底层。

7 修改覆盖

您可以通过编辑 turtlesim 窗口上的标题栏来修改覆盖层中的“turtlesim”。 为此,请在“~/ros2_ws/src/ros_tutorials/turtlesim/src”中找到“turtle_frame.cpp”文件。 使用您喜欢的文本编辑器打开“turtle_frame.cpp”。 找到函数“setWindowTitle(“TurtleSim”);”,将值“”TurtleSim””更改为“”MyTurtleSim””,然后保存文件。 返回到您之前运行“colcon build”的第一个终端并再次运行它。 返回第二个终端(覆盖层的来源)并再次运行 turtlesim:

ros2 run turtlesim turtlesim_node

您将看到 turtlesim 窗口上的标题栏现在显示“MyTurtleSim”。

../../../_images/overlay.png

即使您的主 ROS 2 环境之前已在此终端中获取,但“ros2_ws”环境的覆盖优先于底层的内容。

要查看底层是否完好无损,请打开一个全新的终端并仅获取您的 ROS 2 安装。 再次运行 turtlesim:

ros2 run turtlesim turtlesim_node
../../../_images/underlay.png

您可以看到,覆盖层中的修改实际上并未影响底层中的任何内容。

摘要

在本教程中,您将主 ROS 2 发行版安装作为底层,并通过在新的工作区中克隆和构建包来创建覆盖。 覆盖被添加到路径前面,并优先于底层,就像您在修改后的 turtlesim 中看到的那样。

建议使用覆盖来处理少量包,这样您就不必将所有内容放在同一个工作区中,并在每次迭代时重建一个巨大的工作区。

下一步

现在您了解了创建、构建和获取您自己的工作区背后的细节,您可以学习如何 创建您自己的包