创建工作空间

目标: 创建工作空间,并学习如何配置开发和测试使用的 overlay .

教程等级: 初级

预计时长: 20 分钟

背景

工作空间是一个包含有 ROS 2 包的文件夹。 在使用 ROS 2 之前,需要在终端中 source ROS 2 的环境。 这样你就能在终端中使用 ROS 2 自带的包了。

你也可以选择使用 “overlay”(就是一个次级工作空间),这样在其中添加新的包就不会干扰现有的 ROS 2 工作空间(也就是 “underlay”)。 underlay 必须包含 overlay 中所有包的依赖。 overlay 中的包会覆盖(override) underlay 中的包。 overlay 也可以有多层 underlay 和 overlay,每个 overlay 都使用其父 underlay 的包。(译者注:overlay 和 underlay 都是相对的概念,被依赖的都是 underlay,依赖 underlay 的都是 overlay。)

前提条件

任务

1 Source ROS 2 环境

在这个教程中,ROS 2 的安装环境就是你的 underlay。 (请注意,underlay 不一定是 ROS 2 的安装环境。)

source 所用的指令会由于你的安装方式和部署平台的不同而有所变化。

source /opt/ros/humble/setup.bash

如果这些指令对你的环境没有作用,请查看你所遵循的 安装指南

2 创建新文件夹

最好能够为每个新工作空间都创建一个新的文件夹。 文件夹的名字不重要,但最好能够表明工作空间的用途。 让我们选择 ros2_ws 作为文件夹名字,表示 “development workspace”:

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

另外一个建议是把工作空间中的包都放在 src 目录下。 前面给出的指令就在 ros2_ws 文件夹下创建了一个 src 文件夹,并进入了这个文件夹。

3 克隆样例仓库

ros2_ws/src 目录下,克隆一个样例仓库。

在后续的初级教程中,你可能会创建自己的包,但现在你可以练习使用已有的包来组建工作空间。

如果你已经完成了 初级: CLI 工具 教程,那应该已经熟悉了 turtlesim 这个包,它是 ros_tutorials 的一部分.

一个仓库可以有多个分支。 你需要检出(check out)一个针匹配你的 ROS 2 版本的分支。 当你克隆仓库时,使用 -b 参数,加那个分支的名字就能直接切换到那个分支。

ros2_ws/src 目录下,运行以下指令:

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

现在 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 humble -y

如果你是从源码或二进制包安装的 ROS 2,则需要使用 ROS 2 安装指南中的 rosdep 指令。 这里是 源码安装 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 sequential 一个接一个地处理包,而不是并行处理

构建完成后,在工作空间根目录(~/ros2_ws)下运行以下指令:

ls

你会看到 colcon 创建了新的目录:

build  install  log  src

install 目录是工作空间的配置文件,你可以用它来 source 你的 overlay。

6 Source the overlay

在 source overlay 之前,请注意要打开一个新的终端,和构建工作空间用的不一样的终端,这一点很重要。 在与 underlay 同一个终端中 source overlay,或者在 source overlay 的环境中再构建 overlay,可能会导致复杂的问题。

在新的终端中,source 你的 ROS 2 主环境作为 underlay,这样你就可以在其上构建 overlay:

source /opt/ros/humble/setup.bash

然后进入工作空间的根目录:

cd ~/ros2_ws

在根目录中 source 你的 overlay:

source install/local_setup.bash

Note

source overlay 的 local_setup 只会把 overlay 中的包添加到你的环境中。 setup 会同时 source overlay 和它所在的 underlay,这样你就可以同时使用两个工作空间中的资源。

也就是说,source 你的 ROS 2 安装环境的 setup,然后再 source ros2_ws overlay 的 local_setup,就和直接 source ros2_wssetup 一样,因为后者已经包含了前者的环境。

现在你可以从 overlay 运行 turtlesim 包了:

ros2 run turtlesim turtlesim_node

但是你可能会问:“我怎么知道这是 overlay 中的 turtlesim,而不是 ROS 2 自带的 turtlesim?”

让我们修改一下 turtlesim 包,这样就能看到效果:

  • 你可以在 overlay 中单独修改和重新构建包。

  • overlay 会覆盖 underlay。

7 修改 the overlay

你可以修改 overlay 中 turtlesim 的标题栏,这样就能看到效果。 先找到 ~/ros2_ws/src/ros_tutorials/turtlesim/src 目录下的 turtle_frame.cpp 文件。 用你喜欢的文本编辑器打开 turtle_frame.cpp 文件。

找到 setWindowTitle("TurtleSim"); 函数,把 "TurtleSim" 改成 "MyTurtleSim",然后保存文件。

回到前面你运行 colcon build 的终端,再运行一次这个指令。

切到第二个终端(source overlay 的终端)再次运行 turtlesim:

ros2 run turtlesim turtlesim_node

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

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

虽然你之前在这个终端中 source 了你的 ROS 2 主环境,但 overlay 会覆盖 underlay 中的内容。

打开一个全新的终端,只 source 你的 ROS 2 安装环境,就能检查它还是不是好的。 再次运行 turtlesim:

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

你会发现 overlay 中的修改并没有影响到 underlay 中的 turtlesim。

总结

在这个教程中,你 source 了你的 ROS 2 安装环境作为 underlay,然后在新的工作空间中克隆和构建包,创建了一个 overlay。 source overlay 会将 overlay 的安装路径添加到环境变量中,覆盖掉 underlay 中的同名包,你就能看到 overlay 中对 turtlesim 的修改了。

使用 overlay 是为了在少量包上工作时更方便,这样你就不用把所有东西都放在同一个工作空间中,每次都要重新构建一个庞大的工作空间。

下一步

现在你已经了解了创建、构建和 source 你自己的工作空间的细节,接下来可以学习如何 创建你自己的包