Skip to content

创建工作空间

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

教程级别: 初级

预计用时: 20 分钟

工作空间是一个包含 ROS 2 功能包的目录。

在使用 ROS 2 之前,你需要在当前终端中 source(加载)ROS 2 的安装环境,这样该终端就可以使用 ROS 2 的功能包了。

你还可以选择 source 一个 “overlay”(覆盖层)——它是一个次要工作空间,你可以在其中添加新的功能包,而不会干扰正在扩展的现有 ROS 2 工作空间(即 “underlay”,底层工作空间)。underlay 必须包含 overlay 中所有功能包的依赖项。overlay 中的功能包会覆盖 underlay 中的同名功能包。也可以有多层 underlay 和 overlay,每一层 overlay 都可以使用其父级 underlay 中的功能包。

  • 已安装 ROS 2
  • 已安装 colcon
  • 已安装 git
  • 已安装 turtlesim
  • 已安装 rosdep
  • 了解基本的终端命令(参考 Linux 指南)
  • 准备一个你习惯使用的文本编辑器

本教程将你的主 ROS 2 安装作为 underlay。(注意,underlay 不一定非得是主 ROS 2 安装。)

根据你安装 ROS 2 的方式(源码安装或二进制安装)以及所用平台,source 命令会有所不同:

Linux:

Terminal window
$ source /opt/ros/{DISTRO}/setup.bash

macOS:

Terminal window
$ . ~/ros2_install/ros2-osx/setup.bash

Windows:

请注意,需要使用 x64 Native Tools Command Prompt for VS 2019 来执行以下命令,因为我们要构建工作空间。

Terminal window
$ call C:\dev\ros2\local_setup.bat

如果按照安装指南操作后这些命令仍然无法使用,请查阅你所遵循的安装文档。

最佳实践是为每个新工作空间创建一个新目录。目录名并不重要,但最好能体现工作空间的用途。我们将目录命名为 ros2_ws,表示 “开发工作空间”(development workspace):

Linux:

Terminal window
$ mkdir -p ~/ros2_ws/src
$ cd ~/ros2_ws/src

macOS:

Terminal window
$ mkdir -p ~/ros2_ws/src
$ cd ~/ros2_ws/src

Windows:

Terminal window
$ md \ros2_ws\src
$ cd \ros2_ws\src

另一个最佳实践是将工作空间中的所有功能包放在 src 目录下。上面的命令在 ros2_ws 中创建了 src 目录,然后进入了该目录。

在克隆之前,请确保你仍在 ros2_ws/src 目录中。

在后续的初级教程中,你将学习创建自己的功能包,但现在我们先练习用现有的功能包来组装一个工作空间。

如果你已经学习过初级教程(例如使用 TurtleSim),应该对 turtlesim 很熟悉——它是 ros_tutorials 仓库中的一个功能包。

一个仓库可以有多个分支。你需要 checkout 与你安装的 ROS 2 发行版对应的分支。克隆仓库时,添加 -b 参数并跟上分支名称。

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

Terminal window
$ git clone https://github.com/ros/ros_tutorials.git -b {DISTRO}

现在 ros_tutorials 已经克隆到你的工作空间中。ros_tutorials 仓库包含 turtlesim 功能包,后续教程中我们将使用它。该仓库中的其他功能包不会被构建,因为它们包含 COLCON_IGNORE 文件。

到目前为止,你已经在工作空间中添加了示例功能包,但它还不是一个功能完整的工作空间。你需要先解决依赖项,然后才能构建工作空间。

在构建工作空间之前,你需要解决功能包的依赖项。你可能已经拥有所有依赖项,但最佳实践是每次克隆后都检查一遍。你不希望经历漫长的构建过程后才发现缺少依赖项。

从工作空间的根目录(ros2_ws)运行以下命令:

Linux:

如果你仍在 src 目录中(即刚才克隆 ros_tutorials 的位置),请先运行 cd .. 返回到工作空间根目录(ros2_ws)。

Terminal window
$ cd ..
$ rosdep install -i --from-path src --rosdistro {DISTRO} -y

macOS:

rosdep 仅在 Linux 上运行,因此你可以直接跳到第 5 节 “使用 colcon 构建工作空间”。

Windows:

rosdep 仅在 Linux 上运行,因此你可以直接跳到第 5 节 “使用 colcon 构建工作空间”。

如果你是在 Linux 上通过源码或二进制归档方式安装的 ROS 2,需要按照对应的安装说明来使用 rosdep 命令。

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

#All required rosdeps installed successfully

功能包在 package.xml 文件中声明其依赖项(你将在下一个教程中了解更多关于功能包的知识)。上面的命令会遍历这些声明并安装缺失的依赖项。你可以在另一个教程中了解更多关于 rosdep 的信息(即将推出)。

在工作空间根目录(ros2_ws)中,你现在可以使用以下命令来构建功能包:

Linux:

Terminal window
$ colcon build
Starting >>> turtlesim
Finished <<< turtlesim [5.49s]
Summary: 1 package finished [5.58s]

macOS:

Terminal window
$ colcon build
Starting >>> turtlesim
Finished <<< turtlesim [5.49s]
Summary: 1 package finished [5.58s]

Windows:

Terminal window
$ colcon build --merge-install
Starting >>> turtlesim
Finished <<< turtlesim [5.49s]
Summary: 1 package finished [5.58s]

Windows 对路径长度有限制,因此 --merge-install 会将所有路径合并到 install 目录中。

注意:

colcon build 的其他有用参数:

  • --packages-up-to:只构建你想要的功能包及其所有依赖项,而非整个工作空间(可节省时间)
  • --symlink-install:修改 Python 脚本后无需重新构建
  • --event-handlers console_direct+:在构建时直接显示控制台输出(否则可以在 log 目录中查看)
  • --executor sequential:逐个构建功能包,而不是并行处理

构建完成后,在工作空间根目录(~/ros2_ws)中执行命令,你会看到 colcon 创建了以下新目录:

Linux:

Terminal window
$ ls
build install log src

macOS:

Terminal window
$ ls
build install log src

Windows:

Terminal window
$ dir
build install log src

install 目录是工作空间的 setup 文件所在的位置,你可以使用这些文件来 source 你的 overlay。

在 source overlay 之前,非常重要的一点是打开一个新终端,与构建工作空间时使用的终端分开。如果在与构建相同的终端中 source overlay,或者反过来在已经 source 了 overlay 的终端中构建,可能会产生复杂的问题。

在新终端中,先 source 你的主 ROS 2 环境作为 underlay,这样你就可以在其”之上”叠加 overlay:

Linux:

Terminal window
$ source /opt/ros/{DISTRO}/setup.bash

macOS:

Terminal window
$ . ~/ros2_install/ros2-osx/setup.bash

Windows:

这种情况下,你可以使用普通的命令提示符,因为我们不会在这个终端中构建任何工作空间。

Terminal window
$ call C:\dev\ros2\local_setup.bat

进入工作空间根目录:

Linux:

Terminal window
$ cd ~/ros2_ws

macOS:

Terminal window
$ cd ~/ros2_ws

Windows:

Terminal window
$ cd \ros2_ws

在根目录中,source 你的 overlay:

Linux:

Terminal window
$ source install/local_setup.bash

macOS:

Terminal window
$ . install/local_setup.bash

Windows:

Terminal window
$ call install\setup.bat

注意:

Source overlay 的 local_setup 只会将 overlay 中可用的功能包添加到你的环境中。而 setup 会同时 source overlay 和创建它时所依赖的 underlay,允许你同时使用两个工作空间。

因此,先 source 主 ROS 2 安装的 setup,再 source ros2_ws overlay 的 local_setup(就像你刚才做的那样),与只 source ros2_ws 的 setup 效果相同,因为后者已经包含了其 underlay 的环境。

现在你可以从 overlay 中运行 turtlesim 功能包:

Terminal window
$ ros2 run turtlesim turtlesim_node

但你如何判断运行的是 overlay 中的 turtlesim,还是主安装中的 turtlesim 呢?

我们来修改 overlay 中的 turtlesim,这样你就能看到效果:

  • 你可以在 overlay 中独立于 underlay 修改和重新构建功能包。
  • overlay 优先于 underlay。

你可以通过编辑 turtlesim 窗口的标题栏来修改 overlay 中的 turtlesim。为此,找到 ~/ros2_ws/src/ros_tutorials/turtlesim/src 中的 turtle_frame.cpp 文件,用你喜欢的文本编辑器打开它。

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

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

然后返回第二个终端(已 source overlay 的终端),再次运行 turtlesim:

Terminal window
$ ros2 run turtlesim turtlesim_node

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

overlay

即使你之前在这个终端中 source 了主 ROS 2 环境,你的 ros2_ws overlay 也会优先于 underlay 中的内容。

要验证你的 underlay 是否仍然完好,打开一个全新的终端,仅 source 你的 ROS 2 安装。再次运行 turtlesim:

Terminal window
$ ros2 run turtlesim turtlesim_node

underlay

可以看到,overlay 中的修改实际上并没有影响 underlay 中的任何内容。

在本教程中,你将主 ROS 2 发行版安装 source 为 underlay,并通过在新工作空间中克隆和构建功能包创建了一个 overlay。overlay 被添加到路径前面,并优先于 underlay,正如你在修改后的 turtlesim 中所看到的那样。

推荐在处理少量功能包时使用 overlay,这样你就不必将所有内容放在同一个工作空间中,也不必在每次迭代时重新构建一个庞大的工作空间。

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