ROS2的功能包、依赖管理、工作空间配置与编译
版权信息
Copyright 2023 Herman Ye@Auromix. All rights reserved.This course and all of its associated content, including but not limited to text,
images, videos, and any other materials, are protected by copyright law.
The author holds all rights to this course and its contents.Any unauthorized use, reproduction, distribution, or modification of this course
or its contents is strictly prohibited and may result in legal action.
This includes, but is not limited to:
Copying or distributing course materials without express written permission.
Reposting, sharing, or distributing course content on any platform without proper attribution and permission.
Creating derivative works based on this course without permission.
Permissions and InquiriesIf you wish to use or reproduce any part of this course for purposes other than personal learning,
please contact the author to request permission.The course content is provided for educational purposes, and the author makes no warranties or representations
regarding the accuracy, completeness, or suitability of the course content for any specific purpose.
The author shall not be held liable for any damages, losses,
or other consequences resulting from the use or misuse of this course.Please be aware that this course may contain materials or images obtained from third-party sources.
The author and course creator diligently endeavor to ensure that these materials
are used in full compliance with copyright and fair use regulations.
If you have concerns about any specific content in this regard,
please contact the author for clarification or resolution.By enrolling in this course, you agree to abide by the terms and conditions outlined in this copyright notice.
学习目标
- 了解ROS2功能包的基本概念
- 熟悉ROS2中功能包的配置及其构建
- 熟悉ROS2中的依赖管理
- 熟悉ROS2的工作空间配置及其构建
难度级别
初级 | 中级 | 高级 |
---|---|---|
√ |
预计耗时
45 mins
学习前提
对象 | 类型 | 状态 |
---|---|---|
ROS2 Humble | 软件 | 已安装 |
Ubuntu22.04操作系统 | 软件 | 已确认 |
Shell的基本使用 | 知识 | 已了解 |
工作空间
在ROS2开发中,工作空间是一个重要概念,它是一个包含ROS 2软件包及其编译安装信息的目录。
它用于组织和管理机器人的代码、参数、脚本以及其他相关文件。类似于在 Visual Studio Code 中创建一个项目一样,工作空间提供了一个有序的环境,同时也避免了不同项目之间的冲突,以便更轻松地进行机器人软件开发。
以下是工作空间的常见目录及其用途:
文件夹名称 | 用途 |
---|---|
src | 代码空间:用于存储功能包的代码等。 |
build | 编译空间:存储构建过程中产生的缓存和中间文件。软件构建过程通常会产生中间文件,它们通常不直接使用,但保留它们可以使后续构建更快。 |
install | 安装空间:用于存放构建生成的可执行文件和脚本。安装空间包含已安装的软件以及使您能够使用该空间的 shell 脚本。 |
log | 日志空间:用于保存构建过程中的警告、错误等日志信息。 |
下面是一个示例ROS 2工作空间的目录结构:
my_ros2_workspace/ # ROS 2工作空间的根目录
├── src/ # 存放ROS 2功能包的源代码
│ ├── my_c++_robot_package/ # C++机器人功能包
│ ├── my_python_robot_package/ # Python机器人功能包
│ ├── ... # 可以包含其他功能包
├── build/ # 存储构建生成的中间文件,如构建结果
├── install/ # 存放构建生成的功能包文件
├── log/ # 存放ROS 2的构建日志文件
假设我们正在进行机器人开发,通常会发现GitHub上有第三方开源ROS2软件包,非常适合项目,并且可以实现一个令人印象深刻的ROS2演示,为了实现这个演示,我们可以尝试以下步骤:
1.创建工作空间
首先,我们需要创建一个ROS2工作空间。
# Create workspace
mkdir -p ~/ros2_workspace/src
# Go to your workspace src
cd ~/ros2_workspace/src
2.获取功能包
这时需要获取软件包。在这里,我们以官方的demos
软件包为例。
# Go to your workspace src
cd ~/ros2_workspace/src
# Download package
git clone https://github.com/ros2/demos.git -b humble
3.安装功能包依赖
当你将第三方分享的软件包放入工作空间时,这些软件包通常会有一些依赖关系。
如果缺少这些依赖关系,软件包将无法正常运行。此时,你需要安装这些软件包的依赖项。
rosdep
是ROS2中用于管理和解决ROS软件包的依赖关系的一个工具,能够识别和解决ROS软件包所需的各种系统和第三方软件包的依赖关系,完成依赖的安装和后续的更新。
在下面的命令中,我们使用rosdep
工具来完成这个依赖的安装:
rosdep | install | –ignore-src | –from-path src | –rosdistro humble | -y |
---|---|---|---|---|---|
ROS的依赖工具 | 安装 | 忽略已安装的包 | 指定安装依赖路径 | 指定ROS版本 | 默认确认 |
# Install pip
sudo apt install -y python3-pip
# Install rosdep
sudo pip install rosdep
# Init rosdep
sudo rosdep init
# Update rosdep
rosdep update
# Go to your workspace
cd ~/ros2_workspace
# Install dependencies for package
rosdep install --ignore-src --from-path src --rosdistro humble -y
对于中国用户,可能会由于网络问题导致rosdep
工具失效。在这种情况下,你可以尝试以下命令,使用rosdepc
代替rosdep
:
# Install pip
sudo apt install -y python3-pip
# Install rosdepc
sudo pip install rosdepc
# Init rosdepc
sudo rosdepc init
# Update rosdepc
rosdepc update
# Go to your workspace
cd ~/ros2_workspace
# Install dependencies for package
rosdepc install --ignore-src --from-path src --rosdistro humble -y
当为工作空间中的软件包安装好相应的依赖项后,你将获得以下反馈:
All required rosdeps installed successfully
4.构建工作空间
在完成对依赖的更新后,你可以开始构建你的ROS2工作空间。
ROS2的构建系统
ROS2的构建系统包括三个核心概念:
-
构建工具(Build Tool)
构建工具是用于控制单个软件包的编译和测试的关键软件。在ROS2中,通常使用CMake来构建C++软件包,而对于Python软件包,通常使用setuptools。 -
构建辅助工具(Build Helpers)
构建辅助工具是用于增强开发者体验的辅助功能,它们与构建工具交互,简化构建,可以试做在基本的构建工具上又封装了一层。
在ROS2中使用名为ament
的构建辅助工具。当一个软件包被标记为ament包
时,这意味着它是一个独立的软件单元,由package.xml
清单文件描述,包括源代码、构建文件、测试、文档以及其他资源。
举例来说,如果一个软件包是“ament CMake包”
,那么它将使用CMake
来构建并符合ament包
的规范。
- 通用构建工具(meta-build Tool):
通用构建工具是用户在ROS2中直接交互的表层构建工具。
它是能够对一组软件包进行拓扑排序,并按正确的依赖关系顺序进行构建或测试的软件。它实际上是调用构建工具来执行编译、测试和软件包安装的工具。
在ROS2中使用了通用构建工具,被称为colcon
。colcon
是一个用于构建和测试多个软件包的命令行工具。如果你想深入了解colcon
,可以查看colcon readme。
如果你希望深入了解ROS2的构建系统,可以参考ROS2构建系统
关于colcon构建工具的设计理念,可以参考ROS2设计:colcon
不过这些构建系统概念不需要深入了解或理解,只需要知道ROS2使用colcon工具进行构建即可。
- 安装colcon
如果你尚未安装 colcon,首先需要获取它。你可以执行以下命令:
sudo apt update
sudo apt upgrade
sudo apt install python3-colcon-ros
sudo apt install python3-colcon-common-extensions
- 编译工作空间
随后你可以开始编译整个工作空间:
# Go to workspace
cd ~/ros2_workspace
# Build the workspace
colcon build
一旦编译成功,你的执行文件将位于工作空间的 install 目录下。由于 Python 是解释性语言,因此会在 install 目录中创建一份拷贝。ROS 会执行 install 目录中的内容。如果你不重新编译,ROS 执行的内容将不会更新,因为它将使用 install 目录中的拷贝版本。
- 特殊需求:单独编译包
如果你只需要编译工作空间中的某个特定包,你可以使用 --packages-select 后缀来节省时间。例如:
colcon build --packages-select package_name
- 特殊需求:使用符号链接安装
如果你希望在修改 Python 脚本后无需每次重新构建工作空间,你可以使用符号链接安装选项--symlink-install
。但请注意,这可能会导致代码不兼容问题,如果出现无法正常运行的情况,建议使用常规的colcon build
。同时,不建议混合使用两种方式。
colcon build --symlink-install
相关原理:
使用 colcon build --symlink-install
进行构建时,Colcon 不会将软件包的文件复制到安装目录,而是在安装目录中创建符号链接,指向在构建目录中生成的实际文件。这些符号链接只包含文件的路径信息,而不是实际的文件数据。
这种方式可以节省磁盘空间,因为相同的文件可以在多个软件包之间共享,而不会多次复制相同的文件。此外,符号链接方式还使得在软件包的源代码发生更改时,安装的文件会自动反映这些更改,因为符号链接会指向最新生成的文件。
5. 编译异常的处理
如果在构建过程中出现异常情况,你可以尝试删除工作空间目录下的 build
、install
和 log
文件夹,然后重新执行构建。这有时可以解决构建问题。
如果仍无法解决问题,则需要进一步考虑依赖、配置文件及代码自身是否存在问题。
6. 设置ROS2工作空间的环境变量
通常,source
命令用于立即生效最近的更改的初始化文件,而无需注销和重新登录。在设置工作空间的环境变量时,我们使用 ros2_workspace/install/setup.bash
文件来确保新生成的文件可以被正确调用。以下是具体的操作步骤:
# Go to your workplace
cd ~/ros2_workspace
# Run env set script
. install/setup.bash
自动环境变量设置
你也可以配置自动设置环境变量,使得每次打开终端时都能自动生效。以下是具体的步骤:
-
你可以使用
pwd
命令来查看当前目录的路径,以获取工作空间的目录路径。 -
然后,将以下命令添加到你的
.bashrc
文件中,替换其中的~/ros2_workspace
为你的工作空间的这将自动设置 ROS2 环境变量,以便在每次打开终端时自动生效:
echo "source ~/ros2_workspace/install/setup.bash" >> ~/.bashrc
7.测试功能包的基本功能
尝试运行刚才下载的demos
包中的案例:
ros2 run demo_nodes_py talker
关于工作空间更详细的内容可以参考ROS官方关于创建工作空间的教程
功能包
在ROS 2中,功能包(packages)是组织和管理机器人应用程序的基本单元之一,通常包含一组相关的功能和代码,用于实现特定的机器人任务或功能。
它们使机器人开发者能够组织、共享和重用代码,以便更容易开发和维护复杂的机器人应用程序。通过合理组织功能包,开发者可以更高效地开发各种机器人应用。
如图所示,ros2_learning
和 ros2_learning_interfaces
是在工作空间的源码目录下的两个功能包。
功能包的特点
-
模块化设计
ROS 2鼓励开发者将功能包设计成可重用的模块,以便在不同的机器人项目中进行重复使用。这种模块化设计使得功能包可以更容易共享和扩展,从而提高了ROS 2的灵活性和可维护性。因此包通常以模块化的理念来设计。 -
依赖关系友善
ROS 2功能包可以依赖于其他功能包,这意味着它们可以使用其他功能包中的代码和资源来实现其功能。这种依赖关系允许开发者构建复杂的机器人应用程序,同时避免重复造轮子。 -
代码组织规整
ROS 2功能包包含了一组源代码文件、配置文件、启动文件、资源文件和其他所需的文件,这些文件用于实现特定的机器人任务或功能。这些文件通常按照一定的目录结构组织,以便开发者更容易理解和维护。
功能包的基本目录样式
在ROS2中,对于Python功能包,通常有以下目录结构:
my_python_package/package.xml # 功能包的元数据文件,包含名称、版本、作者、依赖关系等基本包信息setup.py # 定义python包的元信息,指定python入口点setup.cfg # 用于配置Python包的构建信息my_python_package/ # 存放代码的地方__init__.py # 空文件,用于标识该目录为Python模块目录my_node.py # 示例节点代码文件...launch/ # 存放ROS2启动文件的目录。启动文件用于启动和配置ROS 2节点和其他组件my_launch_file.launch.py # 示例启动文件resource/ # 用于存放功能包中的资源文件,通常用不上my_python_packagetest/...
在ROS2中,对于C++功能包,通常有以下目录结构:
my_cplusplus_package/├── CMakeLists.txt # CMake构建系统配置,描述如何在包中构建代码的文件├── package.xml # 功能包的元数据文件,包含名称、版本、作者、依赖关系等基本包信息├── include/ # 包含包的头文件的目录│ └── my_cplusplus_package/ # C++头文件目录│ └── my_node.hpp # ROS节点的头文件├── src/│ ├── my_node.cpp # 源码文件│ └── my_another_node.cpp # 源码文件2│ └── ...├── launch/ # 启动文件目录│ └── my_node_launch.py # ROS 2启动文件
创建功能包
python
如果你希望创建一个ROS2 Python功能包,请执行:
ros2 pkg create --build-type ament_python <package_name>
C++
如果你希望创建一个ROS2 C++功能包,请执行:
ros2 pkg create --build-type ament_cmake <package_name>
关于功能包的创建如果希望了解更多,可参考ROS官方关于创建功能包的资料。
ROS 2 功能包的命令行工具
在ROS 2中,有一些命令行工具可用于管理和操作功能包。以下是这些工具的介绍和用法。
列出功能包中的可执行文件
要列出特定功能包中的可执行文件,可以使用以下命令:
ros2 pkg executables packagename
这将返回指定功能包(packagename
)中所有可执行文件的列表。你也可以指定包含文件后缀,以进一步过滤结果。
列出本地所有已安装的功能包
如果你想查看系统中所有已安装的功能包,可以使用以下命令:
ros2 pkg list
这将返回一个包含所有已安装功能包的列表。
- 查找功能包的安装位置
要知道特定功能包的安装位置,可以使用以下命令:
ros2 pkg prefix packagename
这将输出指定功能包(packagename
)的安装位置前缀。
获取功能包的清单描述信息
如果你需要查看功能包的清单描述信息,可以使用以下命令:
ros2 pkg xml packagename
这将返回指定功能包(packagename
)的XML清单描述信息,其中包含有关功能包的详细信息。
跳转到包
ROS2支持和ROS1中roscd
相似的colcon_cd
,该命令colcon_cd允许您快速将 shell 的当前工作目录更改为包的目录,
将以下两个脚本写入~/.bashrc
即可
echo "source /usr/share/colcon_cd/function/colcon_cd.sh" >> ~/.bashrc
echo "export _colcon_cd_root=/opt/ros/humble/" >> ~/.bashrc
colcon_cd your_package
具体的使用方式参考colcon_cd的使用,此处不涉及。