创建工作区
目标: 创建一个工作区并了解如何设置用于开发和测试的覆盖。
教程级别: 初学者
时间: 20 分钟
背景
工作区是包含 ROS 2 软件包的目录。 在使用 ROS 2 之前,需要在计划工作的终端中获取 ROS 2 安装工作区。 这样,您就可以在该终端中使用 ROS 2 的软件包。
您还可以选择获取“覆盖” - 一个辅助工作区,您可以在其中添加新软件包,而不会干扰您正在扩展的现有 ROS 2 工作区或“底层”。 您的底层必须包含覆盖中所有软件包的依赖项。 覆盖中的软件包将覆盖底层中的软件包。 也可以有多层底层和覆盖,每个连续的覆盖都使用其父底层的软件包。
先决条件
Have rosdep installed
Understanding of basic terminal commands (here’s a guide for Linux)
Text editor of your choice
任务
1 源ROS 2环境
您的主要 ROS 2 安装将成为本教程的底层。 (请记住,底层不一定是主要 ROS 2 安装。)
根据您安装 ROS 2 的方式(从源代码或二进制文件)以及您使用的平台,您的确切源命令将有所不同:
source /opt/ros/rolling/setup.bash
. ~/ros2_install/ros2-osx/setup.bash
请记住使用“VS 2019 的 x64 本机工具命令提示符”来执行以下命令,因为我们要构建一个工作区。
call C:\dev\ros2\local_setup.bat
如果这些命令对您不起作用,请查阅:doc:安装指南<../.././Installation>。
2 创建新目录
最佳实践是为每个新工作区创建一个新目录。 名称无关紧要,但有助于表明工作区的用途。 让我们选择目录名称“ros2_ws”,作为“开发工作区”:
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
md \ros2_ws\src
cd \ros2_ws\src
另一个最佳实践是将工作区中的所有包放入“src”目录中。 上面的代码在“ros2_ws”内创建一个“src”目录,然后导航到该目录。
3 克隆示例仓库
确保在克隆之前您仍位于“ros2_ws/src”目录中。
在其余的初学者开发人员教程中,您将创建自己的包,但现在您将练习使用现有包将工作区组合在一起。
如果您阅读过:doc:Beginner: CLI Tools 教程,您将熟悉“turtlesim”,它是“ros_tutorials <https://github.com/ros/ros_tutorials/>`__ 中的包之一。
一个存储库可以有多个分支。
您需要查看针对您安装的 ROS 2 发行版的那个。
克隆此存储库时,添加“-b”参数,后跟该分支。
在“ros2_ws/src”目录中,运行以下命令:
git clone https://github.com/ros/ros_tutorials.git -b rolling
现在“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 rolling -y
rosdep 仅在 Linux 上运行,因此您可以跳至“5 使用 colcon 构建工作区”部分。
rosdep 仅在 Linux 上运行,因此您可以跳至“5 使用 colcon 构建工作区”部分。
如果您从源代码或二进制存档在 Linux 上安装了 ROS 2,则需要使用其安装说明中的 rosdep 命令。 以下是:ref:源 rosdep 部分 和 二进制存档 rosdep 部分。
如果您已经拥有所有依赖项,则控制台将返回:
#All required rosdeps installed successfully
包在 package.xml 文件中声明其依赖项(您将在下一个教程中了解有关包的更多信息)。 此命令将遍历这些声明并安装缺少的声明。 您可以在另一个教程(即将推出)中了解有关“rosdep”的更多信息。
5 使用 colcon 构建工作区
从您的工作区(“ros2_ws”)的根目录,您现在可以使用以下命令构建您的包:
colcon build
colcon build
colcon build --merge-install
Windows 不允许长路径,因此“merge-install”会将所有路径合并到“install”目录中。
控制台将返回以下消息:
Starting >>> turtlesim
Finished <<< turtlesim [5.49s]
Summary: 1 package finished [5.58s]
Note
“colcon build” 的其他有用参数:
--packages-up-to
构建您想要的包及其所有依赖项,但不是整个工作区(节省时间)
--symlink-install
让您不必在每次调整 Python 脚本时重建
--event-handlers console_direct+
在构建时显示控制台输出(否则可以在log
目录中找到)
--executor sequation
逐个处理包,而不是使用并行性
构建完成后,在工作区根目录(“〜/ ros2_ws”)中输入命令:
ls
ls
dir
您将看到 colcon 已创建新目录:
build install log src
“install”目录是你的工作区安装文件所在的地方,你可以使用它来获取你的覆盖。
6 Source the overlay
在获取覆盖层之前,打开一个新终端非常重要,该终端与您构建工作区的终端不同。 在构建覆盖层的同一终端中获取覆盖层,或者在获取覆盖层的位置构建覆盖层,可能会产生复杂的问题。
在新终端中,将您的主 ROS 2 环境作为“底层”获取,以便您可以在其“上方”构建覆盖层:
source /opt/ros/rolling/setup.bash
. ~/ros2_install/ros2-osx/setup.bash
在这种情况下,您可以使用普通命令提示符,因为我们不会在此终端中构建任何工作区。
call C:\dev\ros2\local_setup.bat
进入工作区的根目录:
cd ~/ros2_ws
cd ~/ros2_ws
cd \ros2_ws
在根目录中,获取您的覆盖:
source install/local_setup.bash
. install/local_setup.bash
call install\setup.bat
Note
获取覆盖层的“local_setup”只会将覆盖层中可用的包添加到您的环境中。 “setup”会获取覆盖层以及创建它的底层,让您能够同时使用这两个工作区。
因此,获取主 ROS 2 安装的“setup”,然后获取“ros2_ws”覆盖层的“local_setup”(就像您刚才所做的那样), 与获取“ros2_ws”的“setup”相同,因为这包括其底层的环境。
现在您可以从覆盖运行“turtlesim”包:
ros2 run turtlesim turtlesim_node
但是您如何知道这是正在运行的覆盖 turtlesim,而不是主安装的 turtlesim?
让我们在覆盖中修改 turtlesim,以便您可以看到效果:
您可以独立于底层修改和重建覆盖中的包。
覆盖优先于底层。
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:
ros2 run turtlesim turtlesim_node
您可以看到,覆盖层中的修改实际上并未影响底层中的任何内容。
摘要
在本教程中,您将主 ROS 2 发行版安装作为底层,并通过在新的工作区中克隆和构建包来创建覆盖。 覆盖被添加到路径前面,并优先于底层,就像您在修改后的 turtlesim 中看到的那样。
建议使用覆盖来处理少量包,这样您就不必将所有内容放在同一个工作区中,并在每次迭代时重建一个巨大的工作区。
下一步
现在您了解了创建、构建和获取您自己的工作区背后的细节,您可以学习如何 创建您自己的包。