ROS 2 Iron 教程 第二章 Client libraries 第二节 创建一个工作空间
前言
本系列文章是由笔者翻译自ROS 2 官方教程。笔者水平有限,如有错误,还请读者指正。
本节教程中部分代码为 Liunx下,请使用其他操作系统的读者前往原文查看。
背景
工作空间是存放 ROS 2 包的目录。在使用 ROS 2 之前,将你的 ROS 2 工作空间添加到终端是十分重要的。这使得 ROS 2 包在你使用的终端中可被使用。
你还可以选择添加一个“覆盖层” - 一个辅助工作区,你可以在此添加新包,而不会干扰现有的 ROS 2 工作空间,或是“底层”。你的底层必须包含覆盖层中所有包的依赖项。在你的覆盖层中的包将会替代你的底层中的包。也可以有多层的覆盖层和底层,每级覆盖层使用其相对于的底层。
先决条件
- ROS 2 安装
- colcon 安装
- git 安装
- turtlesim 安装
- rosdep 安装
- 理解基本终端命令
- 文本编辑器
任务
1 Source ROS 2 environment (添加 ROS 2 环境)
你的主 ROS 2 安装将会在本节教程中充当底层的角色。(底层不一定必须是主 ROS 2 安装)
具体的添加命令将会随着你安装 ROS 2 方式的不同,以及平台的不同而不同(Liunx):
source /opt/ros/iron/setup.bash
如果上方命令不能工作的话,查询 安装教程。
2 Create a new directory (创建新目录)
最佳的做法是为每个新工作空间创建新的目录。目录的名字可以任取,但选用一个可以指名工作空间用途的名字是有帮助的。让我们选用ros2_ws
作为我们“开发工作空间”的名字(Liunx):
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
译者注:
在上节教程中已经创建该目录的读者可不用重复创建。
另一个好的做法是将包存放在工作空间的src
目录。上方的命令在ros2_ws
中创建了src
目录,并进入该目录。
3 Clone a sample repo (克隆示例仓库)
在克隆之前,确保你仍在ros2_ws/src
目录中。
在剩下的初学者教程中,你将会创建自己的包,但目前你将会练习使用现有包组成工作空间。
如果你完成了第一章 CLI Tools 的的教程,你将会对turtlesim
很熟悉,它是 ros_tutorials 之中的包之一。
一个仓库可以拥有多个分支。你将会需要找到与你 ROS 2 发行版相对应的分支。当你克隆这个仓库,添加-b
参数来选择分支,将分支添加在参数后。
在ros2_ws/src
目录中,运行如下命令:
git clone https://github.com/ros/ros_tutorials.git -b iron
现在ros_tutorials
已经克隆到你的工作空间。ros_tutorials
仓库中含有了turtlesim
包,这在后续的教程中将会被使用。在这个仓库中的其他包将不会被构建,因为它们包含有COLCON_IGNORE
文件。
到目前为止,你已经将示例包放入了工作区,但它还不是一个功能齐全的工作区。需要先解决依赖项,然后再构建工作区。
4 Resolve dependencies (解决依赖)
在构建工作区之前,你需要解决包依赖。你可能已经有了所有依赖,但最好还是在每次克隆时检查一下依赖。你并不想白白等待失败的构建,失败的原因是缺少依赖。
在你工作区的根目录(ros2_ws
),运行如下命令(Liunx):
# cd if you're still in the ``src`` directory with the ``ros_tutorials`` clone
cd ..
rosdep install -i --from-path src --rosdistro iron -y
如果你在 Liunx 上使用源代码或是“fat”架构安装,你将会需要按照安装说明来使用 rosdep 命令。详见 from-source rosdep section 和 “fat” archive rosdep section。
如果你已经拥有了全部依赖,终端将会返回:
#All required rosdeps installed successfully
包在 package.xml 文件中声明它们的依赖项(你将会在下一节教程中了解到更多关于包的内容)。rosdep
命令将会历遍这些声明并安装缺少的依赖。
5 Build the workspace with colcon (使用 colcon 构建工作空间)
在你的工作空间的根目录,你可以使用如下命令构建包:
colcon build
终端将会返回如下信息:
Starting >>> turtlesim
Finished <<< turtlesim [5.49s]
Summary: 1 package finished [5.58s]
提示:
colcon
中的其他有用的参数:
--packages-up-to
构建你想要构建的包,加上所有的依赖项,但不是整个工作空间(节省时间)--symlink-install
使你不必在每次调整 Python 脚本时重新构建--event-handlers console_direct+
在构建时输出信息(log
目录中也会保存)
一旦构建完成,在工作空间根目录(~/ros2_ws
)中输入如下命令:
ls
你将会发现 colcon 创建的新目录:
build install log src
install
目录存放了你工作空间的启动文件,启动文件可以用来添加为你的覆盖层。
6 Source the overlay (添加覆盖层)
在添加覆盖层之前,重要的是打开一个新终端,与你构建工作空间的终端分离开来。
在你构建的同一个终端内添加覆盖层,或是在添加覆盖层的终端内构建,可能会造成复杂问题。
在一个新终端,添加你的主 ROS 2 环境作为“底层”,所以你可以“在底层之上”构建覆盖层:
source /opt/ros/iron/setup.bash
进入你的工作空间的根目录:
cd ~/ros2_ws
在根目录中,添加你的覆盖层:
source install/local_setup.bash
提示:
在你的覆盖层中添加local_setup
只会将覆盖层中可用的包加入你的环境。setup
同时添加了覆盖层和它所在的底层,这允许你切换两个工作空间。
所以添加你主 ROS 2 安装的setup
然后添加ros2_ws
覆盖层的local_setup
,与仅仅添加ros2_ws
的setup
是一样的,这是因为它们包括了底层。
现在从覆盖层中运行turtlesim
包:
ros2 run turtlesim turtlesim_node
但你怎么分辨是覆盖层的 tutlesim 正在运行,而不是主安装里的 turtlesim 呢?
让我们更改覆盖层里的 turtlesim 来查看效果:
- 你可以各自更改并重构覆盖层里的包和底层里的包。
- 覆盖层里的包将会优先于底层中的包。
7 Modify the overlay (更改覆盖层)
你可以更改覆盖层中的turtlesim
通过编辑海龟窗口的标题。为了达成这个目标,找到~/ros2_ws/src/ros_tutorials/turtlesim/src
中的turtle_frame.cpp
文件,并使用你喜欢的文本编辑器打开。
在第52行,你将会看到函数setWindowTitle("TurtleSim");
,将"TurtleSim"
改为"MyTurtleSim"
,并保存文件。
回到一开始你运行colcon build
的终端并再次运行该命令。
回到第二个终端(添加覆盖层的那个),并再次运行 turtlesim :
ros2 run turtlesim turtlesim_node
你将会看到海龟窗口的标题变成了 “MyTurtleSim” :
即使你在之前在这个终端中添加了你的主 ROS 2 环境,你的ros2_ws
覆盖层比你的底层优先级高。
要查看您的底层是否仍然完好无损,请打开一个全新的终端并仅添加主 ROS 2 安装。再次运行 turtlesim:
ros2 run turtlesim turtlesim_node
你可以看到覆盖层上的改变不会实际影响底层的内容。
总结
在本节教程中,你添加了主要的 ROS 2 发行版安装作为底层,并通过在新工作区中克隆和构建软件包来创建覆盖层。覆盖层被添加到 path 中,并优先于底层,就像您在修改后的 turtlesim 中看到的那样。
建议使用覆盖层来处理少量包,这样你就不必将所有内容放在同一个工作区中,并在每次迭代时重新构建一个巨大的工作区。