要求

  1. 软硬件模块数据增加,运行期间难免有些模块会出现异常退出,或者导致系统崩溃。如何为系统提供自我修复能力
  2. 模块之间有很强的联系,如何管理模块间的有效通信?对于关键模块间的通信,信息不可丢失,不可有过大的延时。
  3. 每个功能模块间如何进行资源的隔离,如何分配计算与内存资源,当资源不足时如何确认更高的优先级执行

边缘计算(用户端系统)

ROS介绍

注意:ROS并不是真正意义上的操作系统,只能算是中间件

ROS具有很强的代码可复用性硬件抽象性能,采用分布式架构,通过各功能独立的节点实现消息传递任务的分层次运行,从而减轻实时计算的压力。同时ROS为常用的机器人和传感器提供了硬件驱动接口。

ROS 本身是基于消息机制的,这样的做法使得开发者可以根据软件的功能把软件拆分成各个模块。ROS底层会识别某一个消息的使用者,然后把消息数据分发给他们。

  • 节点:实现运算功能的进程,ROS机器人仿真架构由功能独立的节点组成。
  • 节点管理器:Master 主要用来管理节点,每个节点都需要通过节点管理器实现节点名字的注册,节点之间相互查找也需要在节点管理器内进行。
  • 参数服务器:Parameter Server 节点运行时用来存取参数,但它并不是用来实现高效率数据传输的,而是用来存放节点运行所需的配置参数。
  • 消息:Message 一个消息是一个由类型域构成的简单的数据结构。
  • 主题:Topic 节点之间是围绕一个特定的主题进行消息传输的,主题名称就是传输消息的主要内容。类似多人聊天室,不能保证发布消息能够得到及时的相应。
  • 服务:Service 一种利用同步通信的方式请求/回复的复杂交互的分布式系统。包括服务端和客户端。
  • 任务:Action ROS中的Action功能包主要用来实现服务器端和客户端之间的信息交互。主要包含5个基本的主题:goal cancel status feedback result。

ROS 1.0

ROS 1.0 的主要部分主要有三种:ROS Master、ROS Node 和 ROS Service。

  • ROS Master 的主要功能是命名服务,他存储了启动时需要的运行时参数、消息发布上游节点和接收下游节点的连接名和连接方式,以及已有ROS服务的连接名。
  • ROS Node 负责执行,对收到的消息进行处理,并发布新的消息给下游节点
  • ROS Service 一种特殊的ROS节点,相当于一个服务节点,接收请求并返回请求结果。

通信流程:首先节点会向master节点发布(advertise)或者订阅(subscribe)主题。当连接创建后,下游节点会向上游节点TCP server发布连接请求,连接创建后上游节点消息会通过连接送至下游节点。

注:ROS因为存在消息流,存在上下游的概念,可以理解为数据的处理步骤/流程。

ROS 2.0

ROS 2.0 主要是为了让ROS符合工业级的运行标准,采用了DDS这个工业级别的中间件股则可靠的额通信。

  • 通信节点可以动态地发现新的节点,而且用共享内存的方式使得通信效率更高。
  • 依赖于动态的P2P的自发现模式,也就去掉了ROS Master这个中心节点。
  • DDS上层通过DDS API封装,实现了DDS的实现对于ROS Client透明

注:ROS 2.0 还是一个开发中的框架,还需要时间。

改进方法

ROS1 存在一些问题:性能不高、信息传输安全性不高、有一个主节点,主节点崩溃,系统崩溃,比较脆弱。这些问题在ROS2有得到解决。

  • 提高可靠性
    • 采用ZooKeeper机制,在主节点失效时,自动重启主节点,以确保整个ROS系统在任何时刻都处于双备份模式
    • ROS 2.0直接采用去中心化的设计,移除ROS Master节点更加可靠。
  • 提高性能
    • 弃用原先的TCP/IP通信模式,采用共享内存的方式完成节点通信。只传递数据的地址和大小信息,然后直接在内存中寻址。
    • 然后对于ROS广播机制的优化可以使用组播,实现一个发送节点和每一个接收节点传输相同的数据,只需要复制一份数据即可,提高了数据的传送效率,减少了主干网络出现阻塞的可能性。
    • 数据的序列化与反序列化也是一个消耗时间的过程,如果使用轻量级的序列化程序,我们可以将序列化的延迟降低50%。
  • 提高安全性
    • LXC(Linux Containers)提供轻量级虚拟化,限制每一个节点可供使用的资源数。
    • LXC还提供了沙盒支持,使得系统可以限制ROS节点进程的权限,确保节点的独立运行。
    • 最大限度地防止资源泄露

补充

  • 现在有许多通信中间件标准和产品。DDS是唯一一个以数据为中心的标准,适用于物联网。大多数中间件通过在应用和系统之间发送信息来进行工作。以数据为中心保证所有消息的安全,包括应用在理解所接收到的数据所需要的上下文信息。

参考