目标:创建一个工作空间,并学习如何为开发和测试设置一个覆盖层。
教程级别:初学者
时间:20 分钟
目录
背景
先决条件
任务
1 源 ROS 2 环境
2. 创建一个新目录
3. 克隆一个示例仓库
4. 解决依赖性
5. 使用 colcon 构建工作空间
6 源覆盖
7 修改覆盖层
摘要
下一步
背景
工作空间是包含 ROS 2 包的目录。在使用 ROS 2 之前,必须在您计划工作的终端中启用您的 ROS 2 安装工作空间。这使得 ROS 2 的包在该终端中可供您使用。
您还可以选择创建一个“覆盖层”——一个次级工作空间,在这里您可以添加新的软件包,而不会干扰您正在扩展的现有 ROS 2 工作空间,或称为“底层”。您的底层必须包含覆盖层中所有软件包的依赖项。覆盖层中的软件包将覆盖底层中的软件包。也可以有多个层次的底层和覆盖层,每个后续的覆盖层都使用其父底层的软件包。
先决条件
ROS 2 安装
Colcon 安装
Git 安装
海龟仿真安装
已安装 rosdep
理解基本的终端命令(这里有一个 Linux 指南)
您选择的文本编辑器
任务
1 源 ROS 2 环境
您的主要 ROS 2 安装将是本教程的底层。(请记住,底层不一定是主要的 ROS 2 安装。)
取决于您是如何安装 ROS 2 的(从源代码还是二进制文件),以及您使用的是哪个平台,您的确切源命令会有所不同:
source /opt/ros/jazzy/setup.bash
# 源码编译
source /home/cxy/ros2_jazzy/install/setup.bash
如果这些命令对您不起作用,请参阅您所遵循的安装指南。
2. 创建一个新目录
最佳实践是为每个新工作区创建一个新目录。名称无关紧要,但最好能够表明工作区的用途。让我们选择目录名称 ros2_ws
,代表“开发工作区”:
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
另一个最佳实践是将工作区中的任何包放入 src
目录。上述代码在 ros2_ws
内创建一个 src
目录,然后导航进入它。
3. 克隆一个示例仓库
确保你在克隆之前仍在 ros2_ws/src
目录中。
在接下来的初学者开发者教程中,你将创建自己的包,但现在你将练习使用现有的包来组建一个工作空间。
如果您已经学习了初学者:CLI 工具教程,您会对 turtlesim
很熟悉,它是 ros_tutorials 中的一个软件包。
一个仓库可以有多个分支。您需要检出目标您已安装的 ROS 2 发行版的那个分支。当您克隆此仓库时,添加 -b
参数,后跟该分支。
在 ros2_ws/src
目录中,运行以下命令:
cxy@ubuntu2404-cxy:~/ros2_ws/src$ git clone https://github.com/ros/ros_tutorials.git -b jazzy
正克隆到 'ros_tutorials'...
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (434/434), done.
remote: Compressing objects: 100% (178/178), done.
remote: Total 3114 (delta 279), reused 388 (delta 249), pack-reused 2680
接收对象中: 100% (3114/3114), 707.48 KiB | 252.00 KiB/s, 完成.
处理 delta 中: 100% (1896/1896), 完成.
现在 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 jazzy -y
如果您是从源代码或二进制档案在 Linux 上安装了 ROS 2,您将需要使用他们安装说明中的 rosdep 命令。这里是从源代码的 rosdep 部分和二进制档案的 rosdep 部分。
如果您已经具备所有依赖项,控制台将返回:
#All required rosdeps installed successfully
软件包在 package.xml 文件中声明它们的依赖项(您将在下一个教程中了解更多关于软件包的信息)。这个命令会检查这些声明,并安装那些缺失的依赖项。您可以在另一个即将推出的教程中了解更多关于 rosdep
的信息。
使用 colcon 构建工作空间
从您的工作区根目录 ( ros2_ws
),您现在可以使用以下命令构建您的包:
cxy@ubuntu2404-cxy:~/ros2_ws$ colcon build --packages-select turtlesim
Starting >>> turtlesim
Finished <<< turtlesim [3.20s]
Summary: 1 package finished [3.43s]
便条
其他有用的参数为 colcon build
:
--packages-up-to
构建您想要的包以及所有依赖项,但不包括整个工作区(节省时间)--symlink-install
可以避免你每次调整 Python 脚本时都要重新构建--event-handlers console_direct+
在构建时显示控制台输出(否则可以在log
目录中找到)--executor sequential
逐个处理包裹,而不是使用并行处理
构建完成后,在工作区根目录输入命令 ( ~/ros2_ws
):您将看到 colcon 已创建新目录:
cxy@ubuntu2404-cxy:~/ros2_ws$ ls
build install log src
install
目录是您工作区设置文件所在的地方,您可以使用它来源覆盖。
6 源覆盖层
在配置 overlay 之前,非常重要的是您需要打开一个新的终端,这个终端要与您构建工作空间的终端分开。在同一个终端中配置 overlay,或者在已配置 overlay 的终端中构建,可能会产生复杂的问题。
在新终端中,将您的主要 ROS 2 环境作为“底层”,这样您就可以在其上构建“上层”:
source /opt/ros/jazzy/setup.bash
# 源码编译安装
source ~/ros2_jazzy/install/setup.bash
进入您工作区的根目录:
cd ~/ros2_ws
在根目录中,源你的覆盖层 source your overlay:
source install/local_setup.bash
便条
导入覆盖层的 local_setup
只会将覆盖层中可用的包添加到您的环境中。 setup
导入覆盖层以及创建它的底层,使您能够同时使用这两个工作空间。
所以,像你刚才所做的那样,源自你主要的 ROS 2 安装的 setup
然后是 ros2_ws
覆盖的 local_setup
,与仅仅源自 ros2_ws
的 setup
是一样的,因为那包含了它下层的环境。
现在您可以从覆盖层运行 turtlesim
包:
ros2 run turtlesim turtlesim_node
但你怎么能分辨出这是正在运行的覆盖层 turtlesim,而不是你主安装的 turtlesim 呢?
让我们在覆盖层中修改 turtlesim,这样您就可以看到效果:
您可以单独修改和重建 overlay 中的包,而不影响 underlay。
覆盖层优先于底层。
7. 修改叠加层
您可以通过编辑 turtlesim 窗口上的标题栏来修改覆盖层中的 turtlesim
。为此,请在 ~/ros2_ws/src/ros_tutorials/turtlesim/src
中找到 turtle_frame.cpp
文件。用您喜欢的文本编辑器打开 turtle_frame.cpp
。
找到函数 setWindowTitle("TurtleSim");
,将值 "TurtleSim"
更改为 "MyTurtleSim"
,然后保存文件。
返回到您之前运行 colcon build
的第一个终端,并再次运行它。
返回到第二个终端(源自覆盖层的地方),并再次运行 turtlesim:
ros2 run turtlesim turtlesim_node
您将看到 turtlesim 窗口的标题栏现在显示为“MyTurtleSim”。
即使您的主要 ROS 2 环境早先已在此终端中被加载,您的 ros2_ws
环境的覆盖层仍然优先于底层内容。
要查看您的底层是否仍然完好无损,请打开一个全新的终端,并且只加载您的 ROS 2 安装。再次运行 turtlesim:
您可以看到,叠加层中的修改实际上并未影响底层中的任何内容。
摘要
在本教程中,您将主要的 ROS 2 发行版安装作为底层,并通过在新工作空间克隆和构建包来创建一个覆盖层。覆盖层被添加到路径前面,并且优先于底层,正如您在修改后的 turtlesim 中所看到的。
使用叠加层进行少量包的工作是推荐的,这样你就不必把所有东西都放在同一个工作区,也不必在每次迭代时重建一个庞大的工作区。
下一步
现在您已经了解了创建、构建和配置您自己的工作空间背后的细节,您可以学习如何创建自己的包。https://docs.ros.org/en/jazzy/Tutorials/Beginner-Client-Libraries/Creating-Your-First-ROS2-Package.html