基于ROS的空间即插即用架构软件解决方案
2019-04-04李长春乔兵王鹤彬
李长春,乔兵,王鹤彬
南京航空航天大学航天学院,南京 210016
随着航天事业的发展,快速开发和部署面向特定任务的卫星的能力成为强烈需求之一,从而推动了模块化、即插即用等技术在航天器上的应用[1]。2004年,美国空军研究实验室(AFRL)启动了一项将个人计算机领域流行的即插即用技术应用到航天器系统开发的研究,这项研究工作最初被命名为“空间即插即用航电”(Space Plug-and-play Avionics,SPA)[2],并在概念成熟后更名为空间即插即用架构(Space Plug-andplay Architecture,SPA[3]。SPA 的核心思想是通过具有自描述功能的组件的自动配置来减少重复的人工定制工作,以达到快速构建复杂航天器软硬件系统的目的。
受SPA的启发,国内一些航天机构和院校也开始了对航天器即插即用技术应用的研究,包括在卫星综合电子系统中应用即插即用技术[4],利用即插即用标准接口实现航天器的模块化设计[5-7],利用即插即用技术解决航天器在轨可扩展、可重构的需求[8-9]等。综合国内发表的文献来看,它们大多是通过采用SPA中的关键技术实现了单个模块的即插即用特征[6-9],即停留在硬件模块化层面,很少涉及综合化的软件架构的研究,也没有深入研究SPA的网络模型。然而要将具有即插即用特征的模块集成为完整的航天器系统,必须有一套支持SPA网络方法的中间层软件系统。因此,为了开展航天器模块化即插即用项目研究和工程开发,必须自主开发一套这样的软件系统。
软件可复用是提高航天器软件开发效率的一种有效途径[10],也是SPA的关键技术之一。SPA创建了一套标准协议用于航天器组件的发现和数据交换,使具有标准接口的航天器组件可以快速集成到系统中,而无需在原有软件系统中修改或添加代码。最初实现这套协议的软件架构称为卫星数据模型(Satellite Data Model,SDM)[11]。然而,此时的 SPA还缺少一个统一的模型,SDM也没有一个简洁的、可扩展的网络化方法[12]。为此,SPA研发人员又基于标准的开放系统互联(Open Systems Interconnection,OSI)模型制定了SPA的网络模型,提出了一套新的SPA组件网络寻址和路由方案[12]。本文将首先分析这一模型,作为后文的软件实施方案的参考依据。
机器人操作系统(Robot Operating System,ROS)是一个在机器人学研究和开发领域得到广泛应用的软件框架,它为类似于机器人这样由多节点构成的分布式系统软件开发提供了基础功能、方法和工具[13]。通过分析可以发现,采用SPA网络模型的航天器本质上也属于这样的分布式系统,其中SPA模块化组件对应于ROS节点,因此,ROS中的众多功能和方法可以用来解决SPA中的类似需求。更重要的是,作为广泛应用于机器人系统开发的类操作系统,ROS的稳定性已得到了验证。根据上述分析,本文提出一种基于ROS的空间即插即用系统软件实施方案。
1 SPA网络模型
一个典型的航天器系统包含了许多不同组件,并且各个组件有着不同的带宽需求。例如一个低数据率的温度传感器可能挂载在如I2C总线这样的简单二线制接口上,而复杂设备,例如一台高级的成像仪器,则需要接到SpaceWire或光纤那样的高速接口上。不同的物理层接口形成不同的子网络,SPA系统被设计为支持多种不同类型的子网络互连,尽管它们内部的寻址方案和路由方式互不相同[12]。
SPA网络方法可以用一个类似OSI模型的5层结构来概括。如图1所示,其左半部分将OSI模型简化为一个5层结构,即把传统模型的表示层和会话层包含在了应用层内。图1右半部分是SPA模型,它展示了SPA用以实现OSI模型中每一层功能的基本协议。
在OSI模型中,物理层定义器件的电气和物理规范,以及器件与传输媒介间的关系。物理层负责处理物理传输介质与数字信号之间的转换,连接的建立和终止,还提供了流控制和解决传输冲突的方法。SPA模型的物理层则定义了特定物理子网中的设备连接可采用的标准,当前包括的标准有SpaceWire、I2C、USB、光纤和UDP套接字[3]。
图1 OSI与SPA分层模型Fig.1 Layered models of the OSI and SPA
数据链路层提供网络实体间的数据传输功能,包括组件发现和物理寻址,以及修复物理层中可能发生的错误。SPA模型定义了子网专用协议来提供上述功能,这些协议通常命名为SPA-x,其中x表示所基于的特定物理层协议(例如SPA-U表示基于USB的子网协议)。对于本身不具有即插即用功能的物理子网类型,数据链路层还负责填补其物理层自发现和异步通信方面的不足,例如SPA-1协议就为I2C总线封装了即插即用功能[14]。
网络层提供不定长度的数据消息从一个网络中的源地址到另一网络中的目的地址的传输方式,即消息路由和逻辑寻址。如有需要,本层可能将消息打断和重组。简言之,网络层负责将来自不同子网的消息流汇聚成独立于子网的消息。网络层还处理可靠性要求,例如消息确认和重传。SPA模型使用SPA逻辑消息来提供这些功能。
传输层的作用是使能网络端点之间的发现和连接。在SPA模型中,服务器和客户端之间的发现和连接是根据一个采用xml文件描述的端点接口规范进行的,这个xml文件就是可扩展传感器电子数据表单(extensible Transducer Electronic Data Sheet,xTEDS)。xTEDS 包含了组件可接受的专用命令、可生成的变量以及可传递的数据消息的描述[15]。所有网络组件的xTEDS文件由一个查找服务收集和索引,任意网络组件可以向查找服务发布查询来找到满足其依赖关系的组件。
应用层是与需要通信的组件直接交互的层。在SPA模型中,组件是使用符合SPA标准的接口连接到SPA网络中的端点,它既可以是运行在处理器资源上的软件应用,也可以是挂载在特定子网中的硬件设备。这些组件包括用于导航、控制和制导的应用,有效载荷管理软件,以及网络健康状态监视进程等。通过先前介绍的下层架构的支持,应用层中的组件可以直接通信,而无需知道数据消息的具体传输过程。
2 基于ROS的SPA软件架构
2.1 ROS
与SPA类似,ROS也具有一个分层结构。如图2所示,ROS的每层代表具有相对独立功能的软件包的集合。图2中的ROS基础框架大类提供了ROS应用开发和系统运行所需的基础功能,包括硬件接口、节点通信、语言支持和软件开发工具,是所有机器人系统开发中可复用的部分。其中,硬件接口层将不同的硬件设备抽象为ROS可以理解的节点;通信层提供ROS节点间通信和节点管理的方法,是形成ROS网络的关键;语言支持层为使用特定编程语言开发ROS应用提供编程接口;而软件开发工具则用于在ROS环境下进行程序编译和调试。机器人学应用框架则包含所有与机器人学中的基本原理相关的软件包,例如用于处理导航、视觉、坐标描述等算法的包。机器人应用层则是实现特定机器人任务的程序集合。
ROS的一个重要特征是分布式进程(即ROS节点)的网络,其中任何节点可通过该网络与其他节点交互,获取其他节点发布的信息,并将自身数据发布到网络上。
ROS的上述一些特征使它可以作为SPA软件架构实现基础。SPA由多个模块化的组件独立运行、相互通信形成的星上网络,正好对应了ROS的分布式进程网络。ROS的通信方法,包括消息、话题、服务和节点管理等机制,很适合实现SPA逻辑消息的封装。此外,ROS中大量用于简化应用程序开发的工具和库,也可以在SPA开发中应用。
图2 ROS的分层软件结构Fig.2 The layered software architecture of ROS
2.2 RSPA 的分层结构
然而ROS也并不是完全符合需求。例如它并不具有SPA网络模型中要求的组件自描述功能,也不具备组件向系统查询数据依赖关系的能力,此外,它的许多用于机器人编程领域的软件包对航天器来说是不需要的。因此要实现符合SPA的软件架构,就要以ROS的方式编写和组织代码,实现SPA功能,并移除掉不需要的ROS功能。将结合了两者特征的软件系统称为基于ROS的空间即插即用架构(ROS-based Space Plug-and-play Architecture,RSPA)。
图3展示的是RSPA的分层组织结构。RSPA承袭了大量ROS的基础功能,而将ROS中与机器人学相关的应用框架替换为SPA的库与核心组件,将机器人应用层替换为空间任务层。
RSPA的空间任务层中包含了与航天器所执行的空间任务有关的软件包,包括导航、轨道调度等。这些软件包是根据航天器的设计功能定制的,属于SPA网络模型中应用层所表示的范畴。
RSPA最重要的一层由SPA库和核心组件的包构成。如图3所示,软件包spa_core封装了实现SPA必要的数据结构和功能,这些代码被编译为一个可供其他软件包调用的核心库。软件包spa_ls称为查找服务,主要实现组件数据查询和xTEDS管理的功能。软件包spa_sm_l称为本地子网管理器,其管理运行在处理器节点上的软件应用,包括这些组件的发现、注册和健康状态监控等。针对采用特定物理总线(如USB等)的设备,为使其能接入到整体系统网络,RSPA还需具有处理相应子网到RSPA系统的通信协议转换的能力。提供这一功能的软件包称为x子网管理器,例如USB子网管理器spa_sm_u负责管理USB子网上的组件,并处理USB数据消息与ROS消息的转换。这种可添加子网管理器的模式使得RSPA成为真正可扩展的系统。
图3 RSPA的分层软件结构Fig.3 The layered software architecture of RSPA
3 采用ROS策略的SPA协议
RSPA的软件实现中的大多数协议功能仍然遵循AIAA发布的SPA系列标准[16],限于篇幅本文不会讲述完整的实现过程,只在接下来几节阐释结合了ROS特性的几个主要策略。
3.1 消息协议转换
根据SPA的思想,整体SPA网络由至少一个SPA-x子网组成,每个子网对应使用的物理层传输协议,例如 SPA-Local使用 UDP套接字,SPA-U使用 USB,SPA-1使用 I2C,SPA-S使用SpaceWire。要实现跨子网的通信,则需要位于不同子网中的组件采用同一套协议,即需要完成特定子网消息到SPA消息的转换。
RSPA有两种策略来实现这样的转换。第一种策略是为每种物理层协议实现一个子网管理器。SPA-x子网管理器(SM-x)负责完成x协议消息到标准的ROS消息的转换,以使硬件设备的数据可以传输到ROS网络中的任意节点。而在x子网内部,SM-x与设备间仍使用x协议通信。如图4所示,SM-x充当了设备与RSPA之间的桥梁,而它们本身作为ROS的节点,处于SPALocal子网管理器即SM-L的管理下。
另一种策略是充分利用ROS分布式框架的特性,即把每个SPA设备封装成一个独立的ROS节点,这样当它们接入到RSPA网络中时,可以直接使用标准的ROS消息通信。
图4 RSPA的子网构成Fig.4 RSPA subnet diagram
3.2 逻辑寻址
为了实现与物理传输无关的通信方法,SPA网络模型采用的重要策略之一就是为每个组件分配一个逻辑地址。逻辑地址是在组件加入SPA网络时由系统自动分配的,在SPA网络中唯一标识该组件的代号,是SPA逻辑消息传输的源和目的。SPA模型的网络层规定了使用一个4字节的编码作为每个组件的逻辑地址,这需要一个称为中央地址服务[12]的专门组件与子网管理器协同负责分配逻辑地址和保证不发生逻辑地址冲突。
RSPA中的逻辑地址方案不同于标准的SPA网络模型,它将在ROS通信层的基础上寻求解决方案。一个ROS系统本身就是由多个相互通信的节点(即SPA组件)组成的分布式网络系统,这些节点由一个叫计算图源名称(graph resource name)的字符串标识。为了使节点的命名更好遵守唯一性的原则,ROS提供了一种称为匿名名称的机制,其通过在节点的基本名称后面追加一段额外的文本,以确保节点名称的唯一性。例如一个使用了匿名机制的程序,它的基本名称为“anon”,则它在系统中启动后的名称类似于这样:
/anon_1376942789079547655
RSPA直接采用这种具有唯一性的节点名作为组件的逻辑地址,而该计算图源名称完全由ROS系统管理,从而替代了SPA网络层的大部分功能。
3.3 RSPA 服务
RSPA服务是利用ROS服务机制实现SPA网络模型中的一类消息协议的方法。SPA中有这样一类协议过程,它们通常由两个组件相互发送一组配对的消息来完成。如图5所示的本地发现协议,当一个SPA-L组件接入系统后,它首先向SPA-Local子网管理器发送一个请求消息LocalHello,当SPA-Local子网管理器返回一个响应消息 LocalAck则表示发现过程完成。LocalHello和LocalAck就是一组配对的消息。这类协议的特点是发起请求消息的组件必须知道消息接收者的位置,而消息的接收者总是被动地回应,而不必关心请求者的身份,就好像是消息的接收者在为请求者提供“服务”。
ROS服务的概念恰好可以用于实现此类消息协议。服务调用(service calls)是ROS系统实现节点间一对一通信的一种方法。由客户节点发起请求,服务节点接收到请求后采取一些行动,然后发送响应给客户节点。因此,图5所示的发现协议在RSPA中的实现方式是:由SPALocal子网管理器节点(spa_sm_l)提供一个spa_sm_l/hello服务,将原来的发现协议中LocalHello和LocalAck两条消息分别封装在spa_sm_l/hello服务的请求和响应部分。类似的协议过程还有子网管理器通过请求组件节点的心跳服务来判断组件是否处于活动状态;组件通过请求查找服务节点(spa_ls)的查询服务来获取满足自身数据依赖关系的xTEDS文件;一个组件节点向另一个组件节点请求订阅服务以建立订阅关系……
图5 Local发现协议Fig.5 Local discovery protocol
3.4 消息路由机制
当一个组件向另一个组件订阅了满足其依赖关系的数据后,它们之间将建立通信链路。SPA网络模型中为了使数据消息准确到达目的地,为每条消息封装了一个包含目的组件逻辑地址的消息头。图6显示的是具有逻辑地址(2,2)的组件向逻辑地址(3,3)上的组件发送消息的过程。消息先被发送到子网管理器,再由子网管理器的路由算法解析出路径中下一个组件的物理地址,重复这样的路由过程直到消息到达目的组件。为了完成此过程,子网管理器需要维护一个包含系统已知组件的物理地址与逻辑地址映射关系的路由表,同时承受大量的路由计算负担。
图6 通过SPA网络路由消息Fig.6 Routing a message through the SPA network
RSPA改用 ROS的方法进行消息路由。ROS消息传递的方法是采用话题机制,当一个节点要分享信息时,它向对应的话题发布消息;当一个节点想要接收信息时,它就订阅相应的话题。消息的发布者和订阅者相互解耦,完全无需知晓对方的存在。RSPA采用这样的方式实现组件之间的消息传递,可以将路由的负担完全交给ROS系统,从而避免了繁杂的地址解析运算。
4 RSPA演示系统开发
RSPA既有成熟的SPA网络模型作为支撑,又充分利用ROS为分布式系统开发提供的基础功能,为即插即用航天器的构建提供了完整的软件解决方案。为了展示RSPA如何实现即插即用航天器的基本功能,开发了一个简化的演示系统。
4.1 硬件
演示系统的硬件组成如图7所示。演示系统利用卡片式计算机树莓派模拟航天器上的星载计算机,其搭载了一个轻量的Linux操作系统,并安装了ROS基础组件和RSPA核心组件;利用Arduino封装每个模拟的硬件设备,包括完成硬件设备的驱动工作,通过USB线缆将设备连接到网络,提供设备到RSPA网络的协议转换,以及提供xTEDS文件的存储功能;另外利用一台桌面计算机用以运行监视程序,它与星载计算机通过Wi-Fi连接,实时监视系统的运行状态。
图7 演示系统的硬件组成Fig.7 Hardware components of the demo system
4.2 软件
RSPA软件结构如图8所示,其主要由运行在ROS框架下的若干应用节点组成。整套软件包括SPA核心组件、用于硬件设备的驱动程序、用于特定任务控制的程序、电源管理程序以及运行在上位机的监视程序。图中节点spa_sm_l表示SPA-Local子网管理器,节点spa_ls表示查找服务,二者为演示系统提供了SPA核心功能。每个硬件组件对应一个驱动节点,组件驱动工作完全由Arduino完成,并向系统提供ROS标准接口,使硬件组件成为了同其他软件应用无差别的节点。用于特定任务控制的程序和用于电源管理的程序可被视为普通的ROS节点,其完全适用ROS的通信方法,可以轻松实现和其他节点的交互。上位机监视程序的开发还充分利用ROS作为分布式系统的特点,即通过配置上位机和星载计算机使用同一个节点管理器,使监视程序和星载计算机上的各节点位于同一个ROS网络下,简化了操作过程。
图8 演示系统的软件结构Fig.8 Software components of the demo system
4.3 系统运行流程
SPA系统的运行流程在SPA网络标准和逻辑接口标准中描述。在标准的基础上,从单个组件的角度来讲,RSPA演示系统运行流程包括:初始化过程、数据源查询和订阅关系建立。
初始化过程是组件发现和组件注册的过程。如图9所示,当一个RSPA组件(硬件设备或软件应用)接入网络时,它向本地子网管理器发送一个请求消息,以通告它的存在。一旦接收到新组件的请求,本地子网管理器将其加入已发现组件的列表,并回复一个应答消息,完成发现过程。组件发现完成后,本地子网管理器通知查找服务有新组件存在,查找服务随后请求、接收并存储新组件的xTEDS文件,此为注册过程。
图9 系统运行流程Fig.9 System operation flow diagram
数据源查询是RSPA中的一个重要机制。在RSPA中,每个组件都携带一份xTEDS文件,完全描述了组件可生成的数据、可提供的服务或可接收的命令等信息。当一个消费者组件完成注册后,它向查找服务发布一条描述自身数据需求的查询(query)消息。一旦接收到查询消息,查找服务检索包含已有组件的xTEDS文件的存储库,找到匹配的生产者组件,并将它们的xTEDS及节点名等信息返回给请求者。基于查询限制条件的不同,可能有多条匹配,查找服务将其全部返回,由请求者筛选最合适的数据源。
获得生产者组件的信息后,消费者组件就可以向生产者组件发送订阅请求,当生产者组件回应请求,则建立起两个组件之间的订阅关系。此后,除了订阅关系的维护仍然依赖于SPA提供的方法,生产者和消费者之间完全依赖于ROS的通信机制形成稳定的连接。当所有具有数据依赖关系的组件建立起相应的订阅关系,航天器系统就可以正常运行。
5 结束语
文章提出基于ROS来解决SPA系统中的软件构建问题,既避免了从零开发一套SPA软件系统的复杂过程,又可以获益于ROS用以构建多节点分布式系统的方法和工具,形成一套完整的空间即插即用软件系统实施方案。所展示的演示系统曾在航天器可更换模块原理样机的研制中得到应用,验证了方案的可行性[17]。相比于SDM这一旧的SPA软件实现,新的方案具有如下优势:
1)依据成熟的SPA网络模型,具有良好的分层结构,更易实现物理层的扩展;
2)有效利用ROS通信层提供的功能,解决了SPA系统中网络层大部分的复杂性;
3)有效利用ROS的编程接口和开发工具,简化了软件构建工作,使开发人员可以专注于系统功能的实现;
4)ROS在机器人、自动驾驶汽车这样具有高可靠性要求的系统开发中得到广泛验证,而真正集成了SDM的即插即用航天器系统还为数不多,使得新方案更具探索价值。