关于ROS 2客户端库

概述

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

使用不同客户端库编写的节点能够相互共享消息,因为所有客户端库都实现了代码生成器,使用户能够以各自的语言与ROS接口文件进行交互。 [待校准@10037]

除了特定语言的通讯工具外,客户端库还向用户公开使ROS之所以为 ROS”的核心功能。例如,以下是可通过客户端库访问的典型的功能列表: [Alyssa@10038]

  • 名称和命名空间

  • 时间 (真实的或模拟的)

  • 参数

  • 控制台日志

  • 线程模型 [Alyssa@10042]

  • 进程内通讯

支持的客户端库

C++ 客户端库 ( rclcpp ) 和Python客户端库 ( rclpy ) 都是利用RCL中通用功能的客户端库。 [Alyssa@10045]

在C++ 和Python客户端库由核心ROS 2团队维护的同时,ROS 2社区的成员已经创建了其他客户端库: [Alyssa@10046]

通用功能: RCL [Alyssa@10055]

客户端库中的大多数功能并不特定于客户端库的编程语言。例如,理想情况下,参数的行为和命名空间的逻辑在所有编程语言中应该是相同的。因此,客户端库不是从头开始实现通用功能,而是使用通用核心ROS客户端库 (RCL) 实现非特定语言的ROS概念的逻辑和行为的接口。基于此,客户端库只需要用外部函数接口包装RCL中的通用功能。这使得客户端库更轻量化,更易于开发。为方便外部函数接口的封装,常见的RCL功能通过C接口公开,因为C语言通常是调用客户端库最简单的语言。 [Alyssa@10056]

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

RCL的API文档可以参考此处. [Alyssa@10058]

特定语言的功能 [Alyssa@10059]

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

演示 [待校准@10061]

对于使用 rclpy 的发布者和使用 rclcpp的订阅者之间的消息交换的演练,我们鼓励您观看 从17:25处开始的这个 ROSCon 课程 (此处是课程幻灯片)[Alyssa@10062]

与ROS 1的比较

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

总结

通过使用通用核心ROS客户端库,用多种编程语言编写的客户端库更易于编写,并且行为更一致。 [Alyssa@10065]