@[toc]
参考官方文档:Creating a workspace
背景
工作区是包含 ROS 2 包的目录。 在使用 ROS 2 之前,有必要在您计划使用的终端中source您的 ROS 2 安装工作区。这使得 ROS 2 的包可供您在该终端中使用。
您还可以选择source一个“覆盖层”——一个辅助工作区,您可以在其中添加新包而不会干扰您正在扩展的现有 ROS 2 工作区,或“底层”。 您的底层必须包含覆盖层中所有包的依赖项。覆盖层中的包将覆盖底层中的包。也可以有多层底层和覆盖层,每个连续的覆盖层都使用其父底层的包。
1. source ROS 2环境
source /opt/ros/humble/setup.bash
2. 创建一个新的文件夹
最佳做法是为每个新工作区创建一个新目录。 名称并不重要,但它有助于表明工作区的用途。 让我们为“开发工作区”选择目录名称 ros2_ws:
mkdir -p ~/ros2_ws/src && cd ~/ros2_ws/src
3. 下载示例仓库
确保你在下载之前仍然在ros2_ws/src目录下。
在初学者开发人员教程的其余部分,您将创建自己的包,但现在您将练习使用现有包将工作区放在一起。
您将使用的现有包来自 ros_tutorials 存储库 (repo)。 turtlesim 就是此存储库中的一个包。
注意目录列表左侧的“Branch”下拉列表。 当您克隆此 repo 时,添加 -b 参数,后跟与您的 ROS 2 发行版对应的分支。
在ros2_ws/src目录下,为你所使用的发行版运行以下命令:
git clone https://github.com/ros/ros_tutorials.git -b humble-devel
现在 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
如果您已经拥有所有依赖项,终端将返回:
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]
下面是其他关于colcon build的参数:
--packages-up-to:构建你想要的软件包,以及它的所有依赖项,但不是整个工作区(节省时间)。
--symlink-install:使您不必每次修改 python 脚本时都必须重新构建。
--event-handlers console_direct+:在构建时显示控制台输出(否则可以在日志目录中找到)
一旦构建完成,在工作区根(~/ros2_ws)输入ls,你会看到colcon已经创建了新的目录:
build install log src
install目录是你的工作空间的设置文件所在的地方,你可以用它来source你的覆盖层。
6. source覆盖层
在source之前,最好打开一个新终端,要与您构建工作区的终端分开。 在您构建的同一终端中source覆盖层,或者同样在source覆盖层后构建,可能会产生复杂的问题。 在新终端中,将你的主要 ROS 2 环境作为“底层”,这样你就可以在它“之上”构建覆盖层:
source /opt/ros/humble/setup.bash
进入你的工作空间的根部:
cd ~/ros2_ws
在根部,source你的覆盖层:
. install/local_setup.bash
现在你可以从覆盖层中运行turtlesim软件包:
ros2 run turtlesim turtlesim_node
但是,你怎么能知道这是在运行覆盖层的海龟模型,而不是你的ROS 2主安装的海龟模型?
让我们在覆盖层中修改turtlesim,这样你就可以看到效果了。你可以在覆盖层中单独修改和重建软件包,而不是在底层中。覆盖层比底层优先权更高。
7. 修改覆盖层
你可以通过编辑turtlesim窗口的标题栏在你的覆盖层中修改turtlesim。要做到这一点,找到 ~/ros2_ws/src/ros_tutorials/turtlesim/src 中的 turtle_frame.cpp 文件。用你喜欢的文本编辑器打开turtle_frame.cpp。
在第52行你会看到函数 setWindowTitle("TurtleSim"); 。将 "TurtleSim"的值改为 "MyTurtleSim",并保存文件。
回到你先前运行colcon build的第一个终端,再次运行它。
返回到第二个终端(source覆盖层的终端),再次运行turtlesim:
ros2 run turtlesim turtlesim_node
你会看到海龟模拟窗口的标题栏现在显示 "MyTurtleSim"。
为了查看你的底层是否仍然完好无损,打开一个全新的终端,只用source你的ROS 2安装。再次运行turtlesim:
ros2 run turtlesim turtlesim_node
窗口名称仍然是TurtleSim。
你可以看到,对覆盖层的修改实际上并没有影响到底层的任何东西。