正如我们在前一章中所看到的,ROS客户端库只是用于实现ROS概念的API。因此,我们可以在用户代码中直接访问ROS客户端库实现的ROS的相关概念,如节点、服务和话题。ROS客户端库提供了对多种编程语言的支持。
由于每种编程语言都有各自的优缺点,所以用户可以根据需要来决定选择哪种语言。例如:如果系统关注效率和更快的响应速度,则可以选择rclcpp;如果系统考虑有限的开发时间要求原型开发优先,则可以选择rclpy。
ROS-2中的ROS客户端库分为两部分:一部分是面向特定于语言的(如rclcpp、rclpy和rcljava),另一部分则是用C语言实现的通用功能。这种实现机制使得客户端库具有精简、轻量级和易于开发的优点。
开发人员在ROS中编写代码时,很有可能会对代码进行各种迭代,有时还需要改变与网络中其他节点或参与者的连接方式。为了满足这些需求,可能需要更改在代码中实现ROS概念的逻辑。由于接口层具有不同的语言支持,因此使用不同编程语言的开发人员仅需要关心代码中的进程内通信和线程处理,这是因为这些处理是基于特定语言实现的。例如,ros::spin()在C++和Python中可能有不同的实现方法。
ROS-2客户端中的两层实现机制使得上述在编程语言层所做的变化将不会影响到ROS概念层,因此当进行错误修复时,仅维护为数不多的几个客户端库相对容易。
图2.5展示了ROS-2的客户端库的结构,其中所有特定语言的ROS组件接口(rclcpp、rclpy、rcljava和rclcs)都位于用户代码下面的层上。下一个公共层rcl由C语言实现,由特定的ROS函数组成,如名称、名称空间、服务、话题、时间、参数和日志信息。这种结构使得任何特定语言接口层都能与rcl层连接,从而轻松地在不同节点或参与者之间建立通信。
图2.5 ROS-2的客户端库架构图示
本节对ROS-2的基础原理进行了概要论述,下面我们将对ROS-2工具进行介绍。