警告

您正在阅读的 ROS 2 文档版本已达到 EOL(生命周期结束),不再受官方支持。如果您想了解最新信息,请访问 Jazzy.

关于构成

ROS 1 - 节点与小节点

在 ROS 1 中,您可以将代码写成 ROS 节点 或作为 ROS 小节点.ROS 1 节点被编译成可执行文件。而 ROS 1 小节点则编译成共享库,然后由容器进程在运行时加载。

ROS 2 - 统一应用程序接口

在 ROS 2 中,推荐的代码书写方式与节点小程序类似,我们称之为 组件.这样就可以轻松地在现有代码中添加通用概念,如 生命周期.不同的应用程序接口是 ROS 1 的最大缺点,而 ROS 2 则避免了这一缺点,因为两种方法都使用相同的应用程序接口。

备注

使用类似节点的 "编写自己的主程序 "的方式也是可行的,但在一般情况下并不推荐使用。

将流程布局作为一个部署时间决策,用户可以在两者之间做出选择:

  • 在独立进程中运行多个节点,具有进程/故障隔离以及更容易调试单个节点的优点,而且

  • 在单个进程中运行多个节点,开销更低,通信效率更高(见 流程内交流).

此外 玫瑰2 启动 可用于通过专门的启动操作自动执行这些操作。

编写组件

由于组件只内置在共享库中,因此它没有 主要 函数(见 Talker 源代码).组件通常是 rclcpp::Node.由于它不控制线程,因此它不应该在构造函数中执行任何长时间运行或阻塞的任务。相反,它可以使用定时器获取定期通知。此外,它还可以创建发布者、订阅、服务器和客户端。

让这样的类成为组件的一个重要方面是,该类使用软件包中的宏来注册自己。 rclcpp_components (见源代码最后一行)。这样,在运行进程中加载组件库时,就可以发现该组件--它就像一个入口点。

此外,一旦创建了一个组件,它就必须在索引中注册,才能被工具发现。

add_library(对话者组件 共享 src/talker_component.cpp)
rclcpp_components_register_nodes(对话者组件 "composition::Talker";)
# 若要在同一共享库中注册多个组件,可多次调用
# rclcpp_components_register_nodes(talker_component "composition::Talker2")

备注

为了让 component_container 能够找到所需的组件,它必须从已获取相应工作区的 shell 中执行或启动。

使用组件

"(《世界人权宣言》) 构成 软件包包含几种不同的组件使用方法。最常见的有三种:

  1. 启动一个 (通用容器流程) 并调用 ROS 服务 加载节点 容器提供的组件。然后,ROS 服务将加载由传递的软件包名称和库名称指定的组件,并在运行进程中开始执行。你也可以使用一个 命令行工具 使用传入的命令行参数调用 ROS 服务

  2. 创建一个 自定义执行 包含编译时已知的多个节点。这种方法要求每个组件都有一个头文件(在第一种情况下,严格来说并不需要)。

  3. 创建启动文件并使用 玫瑰2 启动 来创建一个已加载多个组件的容器进程。

实际应用

尝试 构图演示.