警告
您正在阅读的 ROS 2 文档版本已达到 EOL(生命周期结束),不再受官方支持。如果您想了解最新信息,请访问 Jazzy.
关于 ROS 2 客户端库
概述
客户端库是允许用户实现其 ROS 代码的应用程序接口。通过客户端库,用户可以访问节点、主题、服务等 ROS 概念。客户端库有多种编程语言,因此用户可以使用最适合其应用的语言编写 ROS 代码。例如,你可能更喜欢用 Python 编写可视化工具,因为它能让原型迭代更快,而对于系统中注重效率的部分,用 C++ 来实现节点可能更好。
使用不同客户端库编写的节点能够相互共享信息,因为所有客户端库都有代码生成器,能让用户以各自的语言与 ROS 界面文件进行交互。
除了特定语言的通信工具外,客户机库还向用户展示了使 ROS 成为 "ROS "的核心功能。例如,下面列出了通常可以通过客户端库访问的功能:
名称和命名空间
时间(真实或模拟)
参数
控制台记录
穿线模式
进程内通信
支持的客户端库
C++ 客户端库 (rclcpp
)和 Python 客户端库 (rclpy
) 都是客户端库,利用 RCL 中的共同功能。
"(《世界人权宣言》) rclcpp
包装
ROS C++ 客户端库 (rclcpp
)是面向用户的 C++ 惯用接口,提供所有 ROS 客户端功能,如创建节点、发布者和订阅。
rclcpp
在 rcl
和 rosidl
应用程序接口的 C++ 报文一起使用。 rosidl_generator_cpp
.
rclcpp
使用了 C++ 和 C++17 的所有功能,使界面尽可能易于使用,但由于它重复使用了 rcl
的客户端库保持一致的行为。 rcl
应用程序接口.
"(《世界人权宣言》) rclcpp
仓库位于 GitHub 上的 ros2/rclcpp 并包含 包装 rclcpp
.生成的 应用程序接口 文件在这里:
"(《世界人权宣言》) rclpy
包装
用于 Python 的 ROS 客户端库 (rclpy
) 是 C++ 客户端库的 Python 对应库。就像 C++ 客户端库一样、 rclpy
也建立在 rcl
C API 来实现。该接口使用本地 Python 类型和模式(如列表和上下文对象),提供了一种习以为常的 Python 体验。通过使用 rcl
应用程序接口 在实现方面,它与其他客户端库在功能和行为上保持一致。除了围绕 rcl
应用程序接口 和 Python 类,Python 客户端库负责执行模型,使用 threading.Thread
或类似功能来运行 rcl
应用程序接口.
与 C++ 一样,它会为用户交互的每一条 ROS 消息生成自定义的 Python 代码,但与 C++ 不同的是,它最终会将本地 Python 消息对象转换成 C 语言版本的消息。所有操作都是在 Python 版本的信息上进行的,直到需要将它们传入 rcl
层,然后将其转换为纯 C 语言版本的报文,以便将其传递到 rcl
C 应用程序接口.在同一流程中的出版商和订阅之间进行通信时,应尽可能避免这种情况,以减少 Python 语言的输入和输出转换。
"(《世界人权宣言》) rclpy
仓库位于 GitHub 上的 ros2/rclpy 并包含 包装 rclpy
.生成的 应用程序接口 文件在这里:
社区维护
ROS 2 核心团队负责维护 C++ 和 Python 客户端库,而 ROS 2 社区成员则负责维护其他客户端库:
阿达 ROS 2 的 Ada 绑定和工具 - 工作区叠加。
C
rclc
并不是在 rcl 的基础上再加一层,而是对 rcl 的补充,使 rcl+rclc 成为一个功能完备的 C 语言客户端库。 micro.ros.org 用于教程。JVM 和安卓 ROS 2 的 Java 和 Android 绑定。
.NET Core、UWP 和 C# 这是一个项目集(绑定、代码生成器、示例等),用于为 .NET Core 和 .NET Standard 编写 ROS 2 应用程序。
Node.js rclnodejs 是 ROS 2 的 Node.js 客户端。它为 ROS 2 编程提供了简单易行的 JavaScript API。
生锈 这是一组项目(rclrs 客户端库、代码生成器、示例等),可帮助开发人员用 Rust 编写 ROS 2 应用程序。
较旧的、未经维护的客户端库是:
通用功能:RCL
客户机程序库中的大部分功能并不是客户机程序库的编程语言所特有的。例如,参数的行为和命名空间的逻辑最好在所有编程语言中都相同。正因为如此,客户机库不需要从头开始实现通用功能,而是使用一个通用的核心 ROS 客户机库(RCL)接口来实现 ROS 概念的逻辑和行为,而这些功能与语言无关。因此,客户端库只需用外来函数接口封装 RCL 中的通用功能即可。这样,客户端库就更精简,也更易于开发。因此,RCL 的常用功能都是通过 C 语言接口实现的,因为 C 语言通常是客户端库最容易封装的语言。
除了使客户端库变得轻量级之外,使用通用核心的一个好处是不同语言之间的行为更加一致。如果对 RCL 核心功能的逻辑/行为(例如命名空间)做出任何更改,所有使用 RCL 的客户端库都将反映这些更改。此外,有了共同的核心,维护多个客户端库的错误修复工作也会变得更轻松。
特定语言功能
需要特定语言特点/属性的客户机库概念不在 RCL 中实现,而是在每个客户机库中实现。例如,"spin "函数使用的线程模型将根据客户机库的语言进行特定实现。
演示
如需了解信息发布者之间的信息交换情况,请使用 rclpy
和使用 rclcpp
我们鼓励您观看 这次 ROSCon 演讲 从 17:25 开始 (在此查看幻灯片).
与 ROS 1 的比较
在 ROS 1 中,所有客户端库都是 "从头开始 "开发的。例如,这使得 ROS 1 Python 客户端库可以完全用 Python 实现,从而带来了无需编译代码等好处。然而,客户端库之间的命名约定和行为并不总是一致的,错误修复必须在多个地方进行,而且有很多功能只能在一个客户端库中实现(如 UDPROS)。
摘要
通过使用通用的核心 ROS 客户端库,用各种编程语言编写的客户端库更容易编写,行为也更一致。