创建工作空间
目标: 创建一个工作空间,并学习如何为开发和测试设置 overlay(覆盖层)。
教程级别: 初级
预计用时: 20 分钟
工作空间是一个包含 ROS 2 功能包的目录。
在使用 ROS 2 之前,你需要在当前终端中 source(加载)ROS 2 的安装环境,这样该终端就可以使用 ROS 2 的功能包了。
你还可以选择 source 一个 “overlay”(覆盖层)——它是一个次要工作空间,你可以在其中添加新的功能包,而不会干扰正在扩展的现有 ROS 2 工作空间(即 “underlay”,底层工作空间)。underlay 必须包含 overlay 中所有功能包的依赖项。overlay 中的功能包会覆盖 underlay 中的同名功能包。也可以有多层 underlay 和 overlay,每一层 overlay 都可以使用其父级 underlay 中的功能包。
1 Source ROS 2 环境
Section titled “1 Source ROS 2 环境”本教程将你的主 ROS 2 安装作为 underlay。(注意,underlay 不一定非得是主 ROS 2 安装。)
根据你安装 ROS 2 的方式(源码安装或二进制安装)以及所用平台,source 命令会有所不同:
Linux:
$ source /opt/ros/{DISTRO}/setup.bashmacOS:
$ . ~/ros2_install/ros2-osx/setup.bashWindows:
请注意,需要使用 x64 Native Tools Command Prompt for VS 2019 来执行以下命令,因为我们要构建工作空间。
$ call C:\dev\ros2\local_setup.bat如果按照安装指南操作后这些命令仍然无法使用,请查阅你所遵循的安装文档。
2 创建一个新目录
Section titled “2 创建一个新目录”最佳实践是为每个新工作空间创建一个新目录。目录名并不重要,但最好能体现工作空间的用途。我们将目录命名为 ros2_ws,表示 “开发工作空间”(development workspace):
Linux:
$ mkdir -p ~/ros2_ws/src$ cd ~/ros2_ws/srcmacOS:
$ mkdir -p ~/ros2_ws/src$ cd ~/ros2_ws/srcWindows:
$ md \ros2_ws\src$ cd \ros2_ws\src另一个最佳实践是将工作空间中的所有功能包放在 src 目录下。上面的命令在 ros2_ws 中创建了 src 目录,然后进入了该目录。
3 克隆一个示例仓库
Section titled “3 克隆一个示例仓库”在克隆之前,请确保你仍在 ros2_ws/src 目录中。
在后续的初级教程中,你将学习创建自己的功能包,但现在我们先练习用现有的功能包来组装一个工作空间。
如果你已经学习过初级教程(例如使用 TurtleSim),应该对 turtlesim 很熟悉——它是 ros_tutorials 仓库中的一个功能包。
一个仓库可以有多个分支。你需要 checkout 与你安装的 ROS 2 发行版对应的分支。克隆仓库时,添加 -b 参数并跟上分支名称。
在 ros2_ws/src 目录中,运行以下命令:
$ git clone https://github.com/ros/ros_tutorials.git -b {DISTRO}现在 ros_tutorials 已经克隆到你的工作空间中。ros_tutorials 仓库包含 turtlesim 功能包,后续教程中我们将使用它。该仓库中的其他功能包不会被构建,因为它们包含 COLCON_IGNORE 文件。
到目前为止,你已经在工作空间中添加了示例功能包,但它还不是一个功能完整的工作空间。你需要先解决依赖项,然后才能构建工作空间。
4 解决依赖项
Section titled “4 解决依赖项”在构建工作空间之前,你需要解决功能包的依赖项。你可能已经拥有所有依赖项,但最佳实践是每次克隆后都检查一遍。你不希望经历漫长的构建过程后才发现缺少依赖项。
从工作空间的根目录(ros2_ws)运行以下命令:
Linux:
如果你仍在 src 目录中(即刚才克隆 ros_tutorials 的位置),请先运行 cd .. 返回到工作空间根目录(ros2_ws)。
$ cd ..$ rosdep install -i --from-path src --rosdistro {DISTRO} -ymacOS:
rosdep 仅在 Linux 上运行,因此你可以直接跳到第 5 节 “使用 colcon 构建工作空间”。
Windows:
rosdep 仅在 Linux 上运行,因此你可以直接跳到第 5 节 “使用 colcon 构建工作空间”。
如果你是在 Linux 上通过源码或二进制归档方式安装的 ROS 2,需要按照对应的安装说明来使用 rosdep 命令。
如果你已经拥有所有依赖项,控制台将返回:
#All required rosdeps installed successfully功能包在 package.xml 文件中声明其依赖项(你将在下一个教程中了解更多关于功能包的知识)。上面的命令会遍历这些声明并安装缺失的依赖项。你可以在另一个教程中了解更多关于 rosdep 的信息(即将推出)。
5 使用 colcon 构建工作空间
Section titled “5 使用 colcon 构建工作空间”在工作空间根目录(ros2_ws)中,你现在可以使用以下命令来构建功能包:
Linux:
$ colcon buildStarting >>> turtlesimFinished <<< turtlesim [5.49s]
Summary: 1 package finished [5.58s]macOS:
$ colcon buildStarting >>> turtlesimFinished <<< turtlesim [5.49s]
Summary: 1 package finished [5.58s]Windows:
$ colcon build --merge-installStarting >>> turtlesimFinished <<< 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:
$ lsbuild install log srcmacOS:
$ lsbuild install log srcWindows:
$ dirbuild install log srcinstall 目录是工作空间的 setup 文件所在的位置,你可以使用这些文件来 source 你的 overlay。
6 Source overlay
Section titled “6 Source overlay”在 source overlay 之前,非常重要的一点是打开一个新终端,与构建工作空间时使用的终端分开。如果在与构建相同的终端中 source overlay,或者反过来在已经 source 了 overlay 的终端中构建,可能会产生复杂的问题。
在新终端中,先 source 你的主 ROS 2 环境作为 underlay,这样你就可以在其”之上”叠加 overlay:
Linux:
$ source /opt/ros/{DISTRO}/setup.bashmacOS:
$ . ~/ros2_install/ros2-osx/setup.bashWindows:
这种情况下,你可以使用普通的命令提示符,因为我们不会在这个终端中构建任何工作空间。
$ call C:\dev\ros2\local_setup.bat进入工作空间根目录:
Linux:
$ cd ~/ros2_wsmacOS:
$ cd ~/ros2_wsWindows:
$ cd \ros2_ws在根目录中,source 你的 overlay:
Linux:
$ source install/local_setup.bashmacOS:
$ . install/local_setup.bashWindows:
$ call install\setup.bat注意:
Source overlay 的
local_setup只会将 overlay 中可用的功能包添加到你的环境中。而setup会同时 source overlay 和创建它时所依赖的 underlay,允许你同时使用两个工作空间。因此,先 source 主 ROS 2 安装的
setup,再 sourceros2_wsoverlay 的local_setup(就像你刚才做的那样),与只 sourceros2_ws的setup效果相同,因为后者已经包含了其 underlay 的环境。
现在你可以从 overlay 中运行 turtlesim 功能包:
$ ros2 run turtlesim turtlesim_node但你如何判断运行的是 overlay 中的 turtlesim,还是主安装中的 turtlesim 呢?
我们来修改 overlay 中的 turtlesim,这样你就能看到效果:
- 你可以在 overlay 中独立于 underlay 修改和重新构建功能包。
- overlay 优先于 underlay。
7 修改 overlay
Section titled “7 修改 overlay”你可以通过编辑 turtlesim 窗口的标题栏来修改 overlay 中的 turtlesim。为此,找到 ~/ros2_ws/src/ros_tutorials/turtlesim/src 中的 turtle_frame.cpp 文件,用你喜欢的文本编辑器打开它。
找到函数 setWindowTitle("TurtleSim");,将值 "TurtleSim" 改为 "MyTurtleSim",然后保存文件。
返回之前运行 colcon build 的第一个终端,再次运行它。
然后返回第二个终端(已 source overlay 的终端),再次运行 turtlesim:
$ ros2 run turtlesim turtlesim_node你会看到 turtlesim 窗口的标题栏现在显示 “MyTurtleSim”。

即使你之前在这个终端中 source 了主 ROS 2 环境,你的 ros2_ws overlay 也会优先于 underlay 中的内容。
要验证你的 underlay 是否仍然完好,打开一个全新的终端,仅 source 你的 ROS 2 安装。再次运行 turtlesim:
$ ros2 run turtlesim turtlesim_node
可以看到,overlay 中的修改实际上并没有影响 underlay 中的任何内容。
在本教程中,你将主 ROS 2 发行版安装 source 为 underlay,并通过在新工作空间中克隆和构建功能包创建了一个 overlay。overlay 被添加到路径前面,并优先于 underlay,正如你在修改后的 turtlesim 中所看到的那样。
推荐在处理少量功能包时使用 overlay,这样你就不必将所有内容放在同一个工作空间中,也不必在每次迭代时重新构建一个庞大的工作空间。
现在你已经了解了创建、构建和 source 自己工作空间的细节,接下来可以学习如何创建自己的功能包了。