ROS2 学习笔记11:创建工作空间
Background 背景
工作空间是包含ROS 2
包的目录。在使用ROS 2
之前,需要在终端source
一下安装ROS 2
的工作空间(添加ROS 2
环境变量)。这样,ROS 2
的软件包就可以在该终端中使用了。
也可以选择source
顶层(overlay
),也就是第二个工作空间,你可以在顶层添加一些新的包,但不干扰现有拓展的ROS2
工作空间,(该空间)又称为底层。底层一定包含顶层所有包的依赖。顶层包会覆盖底层包。也可以有多个顶层和底层,并且每一个顶层会使用其对应的底层包。
思考及疑问: 不是很好理解,需要举例说明;顶层与底层的关系, overlay underlay
Prerequisites 前提
ros2
安装
colcon
安装
git
安装
turtlesim
安装
rosdep
安装
基本的终端指令(linux
常用指令指导http://www.ee.surrey.ac.uk/Teaching/Unix/
)
文本编辑器
Tasks 任务
1 Source ROS 2 environment
ROS 2
主安装将作为本教程的底层。(请记住,底层并不一定是 ROS 2
的主安装)。
根据安装 ROS 2
的方式(源代码或二进制文件)以及所使用平台,source
命令会有所不同:
source /opt/ros/iron/setup.bash
2 Create a new directory
为每个新工作区创建一个新目录。名称并不重要,但最好能说明工作区的目的。示例:选择 ros2_ws
作为 "开发工作区 "的目录名:
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
另一个最佳实践是将工作区中的包拉取到 src
目录中。上述代码是 在dev_ws
目录内创建一个 src
文件夹,然后进入该文件夹。
3 Clone a sample repo
拉取之前,请确保你仍在 ros2_ws/src
目录中。
在初级开发者教程的其余部分中,你将创建自己的软件包,但现在你将练习使用现有软件包组建工作区。
如果你已经学习了《初级 CLI 工具教程》,你就会对 ros_tutorials
中的一个软件包 turtlesim
比较熟悉。
一个软件仓库可以有多个分支。你需要查看针对你已安装的 ROS 2
发行版的那个分支,拉取该 repo
时,在该分支后添加 -b
参数。
在 ros2_ws/src
目录下运行以下命令:
git clone https://github.com/ros/ros_tutorials.git -b iron
现在,ros_tutorials
已被拉取到你的工作区。ros_tutorials
软件源中包含了我们在本教程接下来的内容中要用到的 turtlesim
软件包。该资源库中的其他软件包因包含 COLCON_IGNORE
文件而未被编译。
到目前为止,你已经在工作区中填充了一个示例软件包,但它还不是一个功能完备的工作区。您需要先解决依赖关系,然后再构建工作区。
4 Resolve dependencies
在构建工作区之前,需要解决软件包依赖问题。您可能已经有了所有的依赖包,但最佳做法是每次拉取时都检查依赖包。你不会希望经过长时间等待编译后,才发现缺少了依赖包,从而导致构建失败。
在工作区 (ros2_ws
) 根目录下运行以下命令:
# cd if you're still in the ``src`` directory with the ``ros_tutorials`` clone
cd ..
rosdep install -i --from-path src --rosdistro iron -y
如果在 Linux
源代码或 "fat archive"
安装了 ROS 2
,则需要使用安装说明中的 rosdep
命令。下面是源代码 rosdep
https://docs.ros.org/en/iron/Installation/Alternatives/Ubuntu-Development-Setup.html#linux-development-setup-install-dependencies-using-rosdep
部分和 "fat archive" rosdep
部分。
如果你已经有了所有依赖项,控制台将返回
#All required rosdeps installed successfully
软件包会在 package.xml
文件中声明其依赖关系(在下一教程中将进一步了解软件包)。该命令会查看这些声明,并安装缺少的依赖。有关 rosdep
的更多信息,请参阅另一篇教程。
5 Build the workspace with 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
目录放的是工作空间的设置文件setup
,也就是你用来source
顶层。
6 Source the overlay
在source
顶层之前,你应该新开一个终端,与你编译工作空间的终端分开。在你已编译或者已有其他顶层的终端下,再source
顶层会导致一些复杂问题。
在新终端,source
一下ros2
环境变量作为底层,然后你就可以在上面构建顶层
source /opt/ros/iron/setup.bash
进入工作区的根目录:
cd ~/ros2_ws
在根目录,source
顶层:
source install/local_setup.bash
source
顶层的local_setup
会在你环境中增加顶层应用包。setup
使你source
了顶层和底层,可以让你使用两个工作空间。
所以,source
ros2 安装配置文件setup
,和ros2_ws
顶层的local_setup
,,如同也source
了ros2_ws
工作空间的配置setup
,因为它包含了底层的环境
现在,你可以在顶层运行turtlesim
包:
ros2 run turtlesim turtlesim_node
但是,你怎么能确定这是运行顶层 turtlesim
,而不是你的主安装版 turtlesim
呢?
让我们在顶层中修改 turtlesim
,看看效果如何:
-
你可以在顶层中单独修改和重建软件包。
-
顶层优先于底层。
7 Modify the overlay
可以通过编辑 turtlesim
窗口的标题栏来修改顶层中的 turtlesim
。为此,请找到 ~/ros2_ws/src/ros_tutorials/turtlesim/src
中的 turtle_frame.cpp
文件。使用您的文本编辑器打开 turtle_frame.cpp
。
在第 52 行,您将看到函数 setWindowTitle("TurtleSim");
。将 "TurtleSim "
改为 "MyTurtleSim"
,然后保存文件。
返回之前运行 colcon build
的第一个终端,再次运行 colcon build
。
返回第二个终端(底层所在的终端),再次运行 turtlesim
:
ros2 run turtlesim turtlesim_node
你会看到海龟模拟窗口的标题栏现在显示 "MyTurtleSim"
。
尽管您的主 ROS 2
环境是在该终端中先创建的,但您的 ros2_ws
环境的顶层优先于底层的内容。
为了确认底层的还是没有影响的,新开一个终端,只是source
一下底层的ros2
环境变量,再次运行 turtlesim
:
ros2 run turtlesim turtlesim_node
您可以看到,顶层中的修改实际上并不影响底层中的任何内容。
Summary 总结
在本教程中,source
ROS 2
主发行版作为底层,并通过拉取和构建新工作区中的软件包来创建顶层。顶层会被预置到路径中,并优先于底层,就像你在修改过的turtlesim
中看到的那样。
建议在处理少量软件包时使用顶层构建,这样就不必把所有东西都放在同一个工作区,也不必在每次迭代时都重建一个巨大的工作区。
Next steps 下一步
现在,你认识了创建,编译工作空间,source
工作空间环境变量的细节内容,你可以学习如果创建自己的包了。