背景
工作区是包含ROS 2包的目录。在使用ROS 2之前,有必要在您使用的终端中source您的ROS 2安装工作区。这使得您可以在该终端中使用ROS 2的包。
你也可以选择source“覆盖层”(overlay),覆盖层运行你在在不干扰现有ROS 2工作区的情况下添加新包。您的下一层目录(underlay)必须包含覆盖层中所有包的依赖项。覆盖层中的包将覆盖底层中的包。当然,也存在几层底层和覆盖层的情况,每个后继的覆盖层使用其父底层的包。
任务
1 source ros2的工作环境
source /opt/ros/humble/setup.bash
2 创建一个新的文件夹目录
实际工作中应当每个新工作区创建一个新目录,将工作空间中的所有包放入src目录,文件夹命名尽量见名知意。本节新建一个ros2_ws文件夹:
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
3 clone一个demo仓库代码到src目录下
在进行clone之前,确保您仍然在ros2_ws/src目录中。
在“ros2_ws/src”目录下,执行如下命令:
git clone https://github.com/ros/ros_tutorials.git -b humble
现在,在您的工作空间中克隆了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文件中声明它们的依赖关系(后续会介绍)。该命令遍历这些声明并安装缺少的声明。
5 使用colcon编译工作空间
从你的工作空间(ros2_ws)的根目录,你现在可以使用下面的命令来构建你的包:
colcon build
控制台将返回以下消息:
Starting >>> turtlesim
Finished <<< turtlesim [5.49s]
Summary: 1 package finished [5.58s]
colcon构建的其他有用参数:
--package -up-to构建你想要的包,加上它的所有依赖项,但不是整个工作区(节省时间)
--symlink-install使您不必在每次调整python脚本时重新构建
--event-handlers console_direct+在构建时显示控制台输出(可以在日志目录中找到)
构建完成后,在工作区根目录(~/ros2_ws)中输入以下命令:
ls
你会看到colcon已经创建了新的目录:
build install log src
install目录是您的工作空间的安装文件所在的位置,您可以使用它来source setup文件。
6 source 覆盖层
在获取覆盖之前,打开一个新的终端,将其与构建工作区的终端分开,在新的终端中,将你的主要ROS 2环境作为“底层”,这样你就可以在它上面构建覆盖层:
source /opt/ros/humble/setup.bash
进入到你的工作空间根目录下:
cd ~/ros2_ws
在根目录中,source你的覆盖层:
source install/local_setup.bash
或者你也可以直接使用如下命令(省略source /opt/ros/humble/setup.bash 这一步骤):
source install/setup.bash
现在你可以从当前overlay中运行turtlesim包:
ros2 run turtlesim turtlesim_node
但是你怎么知道这是覆盖层(overlay)的turtlesim在运行,而不是你ros2j基础安装的turtlesim呢?
在覆盖层中修改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
你会看到turtlesim窗口的标题栏现在显示为“MyTurtleSim”。
尽管我们现在的主要ROS 2环境是在前面的终端中source获取的,但是ros2_ws环境的覆盖层优先于底层的内容。
要查看底层是否可用,可打开一个新的终端,并只source ROS 2的setup文件。再运行turtlesim:
source /opt/ros/humble/setup.bash
ros2 run turtlesim turtlesim_node
你可以看到,在覆盖层的修改实际上并没有影响到底层的任何东西。
总结
在本教程中,您将主要的ROS 2发行版安装作为底层,并通过在新工作区中克隆和构建包来创建一个覆盖层。覆盖层被预先添加到路径上,并且优先于底层,正如您在修改后的turtlesim中看到的那样。
对于处理少量的包,建议使用覆盖层,这样您就不必将所有内容放在相同的工作空间中,并在每次迭代中重新编译一个巨大的工作空间。