You're reading the documentation for a development version. For the latest released version, please have a look at Galactic.

创建工作区

目标:创建一个工作空间,并学习如何为开发和测试设置一个覆盖层。

Tutorial level: Beginner

Time: 20 minutes

背景

工作区(workspace)是一个包含 ROS 2 包的目录。在使用 ROS 2 之前,有必要在您计划工作的终端中激活您的 ROS 2 安装工作区。这使得您可以在该终端上使用 ROS 2 的包。

你也可以选择激活一个覆盖层——一个二级工作区,在那里你可以添加新的包,而不干扰你正在扩展的现有 ROS 2 工作区,或“底层”(underlay)。你的底层必须包含覆盖层中所有包的依赖项。覆盖层中的包将覆盖底层中的包。也可以有多层的底层和覆盖层,每个后续的覆盖层都使用其父层的包。

先决条件

任务

1 激活 ROS 2 环境

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

取决于你如何安装 ROS 2(从源代码或二进制文件),以及你所在的平台,你的源代码命令会有所不同:

source /opt/ros/xin/setup.bash

如果这些命令对您不起作用,请参考您所遵循的 安装指南

2 新建目录

最佳实践是为每个新工作区创建一个新目录。名称并不重要,但让它表明工作区的用途是有帮助的。让我们为“开发工作区”选择一个名为 dev_ws 的目录:

mkdir -p ~/dev_ws/src
cd ~/dev_ws/src

另一个最佳实践是将工作区中的任何包放到 src 目录中。上面的代码在 dev_ws 中创建了一个 src 目录,然后导航到它。

3 克隆一个样本 repo

在克隆之前,确保您仍然在 dev_ws/ 目录中。

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

您将使用的现有包来自 ros_tutorials 存储库(repo)。如果你读过“初学者:CLI 工具”教程,你会熟悉 turtlesim,这是这个 repo 中的一个包。

你可以在 GitHub 上 看到该仓库。

注意,在目录列表的左边有一个“Branch”下拉列表。当你克隆这个 repo 时,添加 -b 参数,后面跟着对应于你的 ROS 2 发行版的分支。

dev_ws/src 目录下,针对你正在使用的发行版运行以下命令:

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

现在 ros_tutorials 已经在你的工作空间中克隆了。ros_tutorials 仓库包含 turtlesim 包,我们将在本教程的其余部分使用它。这个资源库中的其他软件包没有被构建,因为它们包含一个 COLCON_IGNORE 文件”

现在你已经用一个样本包填充了你的工作区,但它还不是一个功能齐全的工作区。你需要先解决依赖关系并建立工作区。

4 解决依赖关系

在构建工作区之前,您需要解析包依赖关系。您可能已经有了所有的依赖项,但最佳实践是每次克隆时检查依赖项。您不希望构建在长时间等待后因为缺少依赖项而失败。

从你的工作区的根(dev_ws),运行以下命令:

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

如果你在 Linux 上从源码或 “fat” 档案中安装了 ROS 2,你将需要使用其安装说明中的 rosdep 命令。这里是 from-source rosdep section“fat” archive rosdep section

如果你已经有了所有的依赖项,控制台将返回:

#All required rosdeps installed successfully

包在 package.xml 文件中声明它们的依赖项(在下一个教程中您将了解更多关于包的信息)。该命令遍历这些声明,并安装缺失的声明。你可以在另一个教程(即将推出)中了解更多关于 rosdep 的内容。

5 使用 colcon 构建工作区

从你的工作区的根(dev_ws),你现在可以使用命令构建你的包:

colcon build

控制台将返回以下消息:

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

Summary: 1 package finished [5.58s]

注解

colcon build 的其他有用参数:

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

  • --symlink-install 节省您在每次调整 Python 脚本时都必须重新构建的时间

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

一旦构建完成,在工作区根目录(~/dev_ws)中输入 ls,你会看到 colcon 已经创建了新的目录:

build  install  log  src

install 目录是工作区的 setup 文件所在的位置,您可以使用这些文件来生成覆盖层。

6 激活覆盖层

在获取覆盖层之前,打开一个新的终端是非常重要的,它与您构建工作区的那个终端是分开的。在您所构建的终端中寻找覆盖层,或者在覆盖层来源的终端中寻找覆盖层,可能会产生复杂的问题。

在新的终端中,source 你的主要 ROS 2 环境作为“底层”,所以你可以在它之上构建覆盖层:

source /opt/ros/xin/setup.bash

进入你的工作空间的根部:

cd ~/dev_ws

在根部,激活覆盖层。

. install/local_setup.bash

注解

激活覆盖层的 local_setup 只会将覆盖层中可用的包添加到您的环境中。setup 源覆盖以及创建它的底层,允许您利用这两个工作区。

所以,激活你的主要 ROS 2 安装的 setup,然后 dev_ws 覆盖的 local_setup,就像你刚刚做的,是相同的只是来源 dev_wssetup,因为这包括它创建的底层环境。

现在你可以从覆盖层运行 turtlesim 包:

ros2 run turtlesim turtlesim_node

但是你怎么知道这是运行的覆盖 turtlesim,而不是你的主安装的 turtlesim

让我们在覆盖层中修改 turtlesim,这样你就可以看到效果:

  • 您可以在覆盖层中单独修改和重建包。

  • 覆盖层优先于底层。

7 修改覆盖层

你可以通过编辑 turtlesim 窗口的标题栏在覆盖层中修改 turtlesim。为此,在 ~/dev_ws/src/ros_tutorials/turtlesim/src 中找到 turtle_frame.cpp 文件。使用首选的文本编辑器打开 turtle_frame.cpp

在第 52 行,您将看到函数 setWindowTitle("TurtleSim");。将 ”TurtleSim” 的值修改为 ”MyTurtleSim”,保存文件。

返回之前运行 colcon build 的第一个终端并再次运行它。

返回到第二个终端(覆盖的激活),再次运行 turtlesim

ros2 run turtlesim turtlesim_node

你会看到 turtlesim 窗口的标题栏现在显示 “MyTurtleSim”。

../../_images/overlay.png

即使您的主 ROS 2 环境是在这个终端中早先获得的,您的 dev_ws 环境的覆盖层优先于底层的内容。

要看到你的底层仍然完好无损,打开一个全新的终端和来源只您的 ROS 2 安装。再次运行 turtlesim

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

你可以看到在覆盖层中的修改实际上并没有影响到底层中的任何东西。

小结

在本教程中,你将你的主要 ROS 2 发行版安装作为你的底层,并通过在一个新的工作区中克隆和构建包创建一个覆盖层。覆盖层被附加到路径上,并优先于底层,正如您在修改后的 turtlesim 中看到的那样。

对于处理少量的包,建议使用覆盖层,因此您不必将所有内容都放在同一个工作区中,并在每次迭代时重新构建一个巨大的工作区。

下一步

现在你了解了创建、构建和激活你自己的工作空间背后的细节,你可以学习如何 创建你自己的包