客户端库

概述

客户端库是允许用户实现其 ROS 2 代码的 API。 使用客户端库,用户可以访问 ROS 2 概念,例如节点、主题、服务等。 客户端库有多种编程语言,因此用户可以使用最适合其应用程序的语言编写 ROS 2 代码。 例如,您可能更喜欢用 Python 编写可视化工具,因为它可以加快原型迭代速度,而对于系统中与效率相关的部分,节点可能最好用 C++ 实现。

使用不同客户端库编写的节点能够相互共享消息,因为所有客户端库都实现了代码生成器,为用户提供了使用相应语言与 ROS 2 接口文件交互的能力。

除了特定于语言的通信工具外,客户端库还向用户展示了使 ROS 成为“ROS”的核心功能。 例如,以下是通常可以通过客户端库访问的功能列表:

  • Names and namespaces

  • Time (real or simulated)

  • Parameters

  • Console logging

  • Threading model

  • Intra-process communication

支持的客户端库

C++ 客户端库(“rclcpp”)和 Python 客户端库(“rclpy”)都是利用“rcl”中常见功能的客户端库。

“rclcpp”包

ROS C++ 客户端库(“rclcpp”)是面向用户的 C++ 惯用接口,提供所有 ROS 客户端功能,如创建节点、发布者和订阅。 “rclcpp”建立在“rcl”和“rosidl”|API|之上,旨在与“rosidl_generator_cpp”生成的 C++ 消息一起使用。

“rclcpp” 利用 C++ 和 C++17 的所有功能使界面尽可能易于使用,但由于它重用了“rcl”中的实现,因此它能够与使用“rcl”API 的其他客户端库保持一致的行为。

“rclcpp”存储库位于 GitHub 上 ros2/rclcpp and contains the package rclcpp. The generated API documentation is here:

api/rclcpp/index.html

The rclpy package

ROS Python 客户端库(“rclpy”)是 C++ 客户端库的 Python 对应库。 与 C++ 客户端库一样,“rclpy”也是在“rcl”C API 之上构建的。 该接口提供惯用的 Python 体验,使用本机 Python 类型和模式,如列表和上下文对象。 通过在实现中使用“rcl”API,它在功能奇偶校验和行为方面与其他客户端库保持一致。 除了为每条消息提供围绕“rcl”|API|和 Python 类的 Python 惯用绑定外,Python 客户端库还负责执行模型,使用“threading.Thread”或类似程序来运行“rcl”|API|中的函数。

与 C++ 一样,它为用户交互的每条 ROS 消息生成自定义 Python 代码,但与 C++ 不同的是,它最终将本机 Python 消息对象转换为消息的 C 版本。 所有操作都发生在 Python 版本的消息上,直到需要将它们传递到“rcl”层,此时它们被转换为纯 C 版本的消息,以便可以将其传递到“rcl”C API

如果可能的话,在同一进程中发布者和订阅者之间进行通信时应避免这种情况,以减少 Python 的转换。

“rclpy”存储库位于 GitHub 上 ros2/rclpy and contains the package rclpy. 生成的 API 文档在这里:

api/rclpy/index.html

Community-maintained

While the C++ and Python client libraries are maintained by the core ROS 2 team, members of the ROS 2 community maintain additional client libraries:

  • Ada This is a set of packages (binding to rcl, message generator, binding to tf2, examples and tutorials) that allows the writing of Ada applications for ROS 2.

  • C rclc does not put a layer on top of rcl but complements rcl to make rcl+rclc a feature-complete client library in C. See micro.ros.org for tutorials.

  • JVM and Android Java and Android bindings for ROS 2.

  • .NET Core, UWP and C# This is a collection of projects (bindings, code generator, examples and more) for writing ROS 2 applications for .NET Core and .NET Standard.

  • Node.js rclnodejs is a Node.js client for ROS 2. It provides a simple and easy JavaScript API for ROS 2 programming.

  • Rust This is a set of projects (the rclrs client library, code generator, examples and more) that enables developers to write ROS 2 applications in Rust.

  • Flutter and Dart Flutter and Dart bindings for ROS 2.

Older, unmaintained client libraries are:

通用功能:rcl

客户端库中的大多数功能并不特定于客户端库的编程语言。 例如,参数的行为和命名空间的逻辑在所有编程语言中都应该相同。 因此,客户端库不是从头开始实现通用功能,而是使用通用核心 ROS 客户端库 (RCL) 接口,该接口实现不特定于语言的 ROS 概念的逻辑和行为。 因此,客户端库只需使用外部函数接口将通用功能包装在 RCL 中。 这使客户端库更薄,更易于开发。 因此,通用 RCL 功能通过 C 接口公开,因为 C 语言通常是客户端库最容易包装的语言。

除了使客户端库轻量级之外,拥有通用核心的一个优点是语言之间的行为更加一致。 如果对核心 RCL 中功能的逻辑/行为(例如命名空间)进行了任何更改,则所有使用 RCL 的客户端库都将反映这些更改。 此外,拥有通用核心意味着在修复错误时维护多个客户端库的工作量会减少。

可以在以下位置找到“rcl”的 API 文档 here.

特定于语言的功能

需要特定于语言的功能/属性的客户端库概念未在 RCL 中实现,而是在每个客户端库中实现。 例如,“spin”函数使用的线程模型将具有特定于客户端库语言的实现。

演示

有关使用“rclpy”的发布者和使用“rclcpp”的订阅者之间的消息交换的演练,我们鼓励您观看 this ROSCon talk starting at 17:25 (see the slides here).

与 ROS 1 的比较

在 ROS 1 中,所有客户端库都是“从头开始”开发的。 例如,这允许 ROS 1 Python 客户端库纯粹用 Python 实现,这带来了无需编译代码等好处。 但是,客户端库之间的命名约定和行为并不总是一致的,必须在多个地方进行错误修复,并且有很多功能只在一个客户端库中实现(例如 UDPROS)。

摘要

通过利用通用核心 ROS 客户端库,用各种编程语言编写的客户端库更容易编写,并且行为更一致。