创建工作区
目标: 创建工作区并了解如何设置用于开发和测试的覆盖层。
教程级别: 初学者
时间: 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 克隆示例 repo
在克隆之前,请确保您仍在 ros2_ws/src
目录中。
在其余的初学者开发人员教程中,您将创建自己的包,但现在您将练习使用现有包将工作区组合在一起。
如果您阅读了 Beginner: CLI Tools 教程,您将熟悉 turtlesim
,它是 ros_tutorials 中的一个包。
一个 repo 可以有多个分支。
您需要查看针对您安装的 ROS 2 发行版的那个。
克隆此 repo 时,添加 -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 only runs on Linux, so you can skip ahead to section “5 Build the workspace with colcon”.
rosdep only runs on Linux, so you can skip ahead to section “5 Build the workspace with 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 Sequenced
逐个处理包而不是使用并行性
构建完成后,在工作区根目录(~/ros2_ws
)中输入命令:
ls
ls
dir
您将看到 colcon 已创建新目录:
build install log src
install
目录是工作区设置文件所在的位置,您可以使用它来获取覆盖层。
6 获取覆盖层
在获取覆盖层之前,打开一个新终端非常重要,该终端与您构建工作区的终端不同。 在构建覆盖层的同一终端中获取覆盖层,或者在获取覆盖层的位置构建覆盖层,可能会产生复杂的问题。
在新终端中,将您的主 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 中看到的那样。
建议使用覆盖来处理少量包,这样您就不必将所有内容放在同一个工作区中,并在每次迭代时重建一个巨大的工作区。
下一步
现在您了解了创建、构建和获取您自己的工作区背后的细节,您可以学习如何 创建您自己的包。