概述
客户端库是开发者用以开发ROS代码时使用的API,使用客户端库,开发者将接触到ROS的相关概念例如节点、主题、服务等等。客户端库支持多种编程语言以便开发者更容易使用他们熟悉的环境进行开发。例如在原型迭代阶段可以使用Python编写可视化相关的代码;而涉及效率相关的系统部分,C++会更适合。
使用不同的客户端库编写的节点之间可以共享消息。因为所有的客户端库都实现了基于ROS接口的通信能力。
除了基于特定预研的通信工具外,客户端库还提供了ROS的核心功能。例如:
- 名称与名称空间
- 时间(真实/模拟)
- 参数
- 控制台日志
- 线程模型
- 进程间通信
支持的客户端库
官方提供了两种RCL的维护,rclcpp和rclpy。
社区提供了以下的RCL:
通用功能:RCL
大部分客户端库的功能与客户端所用的编程语言无关。例如,参数的行为和名称空间的逻辑在理想情况下在不同编程语言中应该是相同的。正因如此,客户端库使用公共的核心RCL接口以实现跨语言的ROS概念的行为与逻辑,而不是从头开始开发。因此,客户端库只需要用外部函数接口将核心RCL进行二次包装。这样就保证了客户端库的轻量化,并使得客户端库更易开发。
为了上述目的,通用的RCL功能被封装为C语言接口,因为C语言是最容易被不同客户端库所封装的。
此外,公共核心保证了跨语言的客户端库之间行为的一致性。如果对核心RCL中功能的行为和逻辑进行了任何修改,所有使用RCL的客户端库都将反应这些更改。同时在bug修复时可以减少多个客户端的维护工作量。
详情可参考RCL API文档。 1
语言特有功能
需要由语言特性描述的特性和属性没有在RCL中实现而是由各客户端库加以实现。例如,spin函数使用的线程模型在不同的客户端库中依赖于特定语言执行。
同ROS 1的比较
在ROS 1中,所有的客户端库都是“从头开始”开发的。例如python客户端库就完全使用纯Python进行开发,这带来了一些好处,例如无需编译。然而,命名约定和行为在客户端间并不总是一致,因此修复问题时需要在多个地方进行,且很多功能仅存在于某一客户端库(例如UDPROS)。
小结
通过实现通用功能的核心ROS客户端库,客户端库能够更好地适用于不同的编程语言,并且保持一致的行为特征。