分布式系统中通信协议版本号的更新的制作方法

文档序号:22260189发布日期:2020-09-18 14:26阅读:191来源:国知局
分布式系统中通信协议版本号的更新的制作方法

本发明总地涉及分布式系统的控制技术领域,更具体地涉及一种分布式系统中通信协议版本号的更新。



背景技术:

分布式系统是建立在网络之上的软件系统,其通常包括多个模块,这些模块之间要通过网络采用一定的通信协议进行通信。为了保证通信的准确性,各模块所采用的通信协议应当保持一致。

在现有的分布式系统中,当通信协议发生变化时,是以人工的方式更新通信协议版本,在通信协议中带上协议版本号,在接收方校验版本号。这样的方法存在如下缺点:(1)容易遗漏:当通信协议发生变化肉眼不易区分,例如:某个通信协议包含多级数据结构嵌套,当嵌套层的数据结构发生变化时,维护者非常容易遗漏该变化;(2)效率低下:当分布式系统中存在数量较多的模块时,靠人工方式更新通信协议版本效率非常低下。

因此,需要提供一种分布式系统中自动更新通信协议版本号的方案。



技术实现要素:

为了解决上述问题而提出了本发明。根据本发明一方面,提供了一种分布式系统更新通信协议版本号的方法,所述分布式系统包括多个模块,所述多个模块之间通过预设通信协议进行通信,所述方法包括:生成修改前的代码版本和修改后的代码版本各自的语法结构表示,分别定义为第一语法结构表示和第二语法结构表示;获取所述第一语法结构表示和所述第二语法结构表示中各自的通信协议数据结构,分别定义为第一通信数据结构和第二通信数据结构;基于所述第一通信数据结构的所有语法信息生成第一文本消息,并基于所述第二通信数据结构的所有语法信息生成第二文本消息;计算所述第一文本消息和所述第二文本消息各自的唯一性标识,分别定义为第一唯一性标识和第二唯一性标识;以及比较所述第一唯一性标识和所述第二唯一性标识,并在所述第一唯一性标识和所述第二唯一性标识不同时更新所述预设通信协议的版本号。

在本发明的一个实施例中,所述修改前的代码版本和所述修改后的代码版本中各自的通信协议数据结构均基于预设结构体而生成,所述预设结构体符合预设命名规范。

在本发明的一个实施例中,所述获取所述第一语法结构表示和所述第二语法结构表示中各自的通信协议数据结构包括:解析所述第一语法结构表示和所述第二语法结构表示,以查找符合所述预设命名规范的数据结构;以及获取符合所述预设命名规范的数据结构的首成员的数据类型,以得到所述通信协议数据结构。

在本发明的一个实施例中,所述生成修改前的代码版本和修改后的代码版本各自的语法结构表示,包括:生成修改前的代码版本和修改后的代码版本各自的抽象语法树。

在本发明的一个实施例中,所述基于所述第一通信数据结构的所有语法信息生成第一文本消息,并基于所述第二通信数据结构的所有语法信息生成第二文本消息,包括:将所述第一通信数据结构的所有语法信息组合成第一字符串,并将所述第二通信数据结构的所有语法信息组合成第二字符串。

在本发明的一个实施例中,所述所有语法信息包括通信数据结构的自身信息和子成员信息。

在本发明的一个实施例中,所述自身信息包括域名信息、数据结构类型信息和占用大小信息。

在本发明的一个实施例中,所述子成员信息包括子成员名字信息、基本数据类型信息、结构体/枚举/联合体/定义类型的展开信息和占用大小信息。

在本发明的一个实施例中,所述计算所述第一文本消息和所述第二文本消息各自的唯一性标识,包括:计算所述第一文本消息和所述第二文本消息各自的消息摘要值。

在本发明的一个实施例中,所述方法基于分散式版本控制软件的钩子脚本来实现。

根据本发明另一方面,提供了一种自动驾驶系统,所述自动驾驶系统包括多个模块,所述多个模块之间通过预设通信协议进行通信,所述自动驾驶系统采用上述任一项所述的分布式系统更新通信协议版本号的方法来更新所述预设通信协议的版本号。

根据本发明再一方面,提供了一种车辆,所述车辆包括上述的自动驾驶系统。

根据本发明又一方面,提供了一种无人机,所述无人机包括上述的自动驾驶系统。

根据本发明另一方面,提供了一种计算设备,所述计算设备包括多个模块,所述多个模块之间通过预设通信协议进行通信,所述计算设备采用上述任一项所述的分布式系统更新通信协议版本号的方法来更新所述预设通信协议的版本号。

根据本发明另一方面,提供了一种存储介质,所述存储介质上存储有计算机程序,所述计算机程序在运行时执行上述任一项所述的分布式系统更新通信协议版本号的方法。

根据本发明实施例的分布式系统更新通信协议版本号的方法针对修改前后的代码版本生成语法结构表示,从所生成的语法结构表示中获取通信协议数据结构,并通过比较通信协议数据结构的唯一性标识来确定通信协议是否发生变化,如果发生变化则自动更新通信协议版本号,大大提高了分布式系统发现通信协议发生变化的可靠性和更新通信协议版本号的效率,有效解决了人工方式中容易遗漏和效率低下的问题。

附图说明

图1示出根据本发明实施例的分布式系统更新通信协议版本号的方法的示意性流程图;

图2示出根据本发明实施例的分布式系统更新通信协议版本号的方法的更具体的流程图;

图3示出采用根据本发明实施例的分布式系统更新通信协议版本号的方法的示例计算设备的示意性结构框图;

图4示出采用根据本发明实施例的分布式系统更新通信协议版本号的方法的示例自动驾驶系统的示意性结构框图;以及

图5示出采用根据本发明实施例的分布式系统更新通信协议版本号的方法的示例无人机的示意性结构框图。

具体实施方式

为了使得本发明的目的、技术方案和优点更为明显,下面将参照附图详细描述根据本发明的示例实施例。显然,所描述的实施例仅仅是本发明的一部分实施例,而不是本发明的全部实施例,应理解,本发明不受这里描述的示例实施例的限制。基于本发明中描述的本发明实施例,本领域技术人员在没有付出创造性劳动的情况下所得到的所有其它实施例都应落入本发明的保护范围之内。

在下文的描述中,给出了大量具体的细节以便提供对本发明更为彻底的理解。然而,对于本领域技术人员而言显而易见的是,本发明可以无需一个或多个这些细节而得以实施。在其他的例子中,为了避免与本发明发生混淆,对于本领域公知的一些技术特征未进行描述。

应当理解的是,本发明能够以不同形式实施,而不应当解释为局限于这里提出的实施例。相反地,提供这些实施例将使公开彻底和完全,并且将本发明的范围完全地传递给本领域技术人员。

在此使用的术语的目的仅在于描述具体实施例并且不作为本发明的限制。在此使用时,单数形式的“一”、“一个”和“所述/该”也意图包括复数形式,除非上下文清楚指出另外的方式。还应明白术语“组成”和/或“包括”,当在该说明书中使用时,确定所述特征、整数、步骤、操作、元件和/或部件的存在,但不排除一个或更多其它的特征、整数、步骤、操作、元件、部件和/或组的存在或添加。在此使用时,术语“和/或”包括相关所列项目的任何及所有组合。

为了彻底理解本发明,将在下列的描述中提出详细的步骤以及详细的结构,以便阐释本发明提出的技术方案。本发明的较佳实施例详细描述如下,然而除了这些详细描述外,本发明还可以具有其他实施方式。

如前所述,目前的分布式系统以人工方式更新通信协议版本,不仅容易遗漏通信协议的变化,而且效率低下。基于此,本发明提供一种分布式系统更新通信协议版本号的方案,下面结合附图来描述根据本发明实施例的分布式系统更新通信协议版本号的方案。

图1示出根据本发明实施例的分布式系统更新通信协议版本号的方法100的示意性流程图。如图1所示,分布式系统更新通信协议版本号的方法100可以包括如下步骤:

在步骤s110,生成修改前的代码版本和修改后的代码版本各自的语法结构表示,分别定义为第一语法结构表示和第二语法结构表示。

在本发明的实施例中,图1所示的方法可用于包括多个模块的分布式系统自动更新这些模块之间的通信所采用的预设通信协议版本。一般地,通信协议可能在代码版本被修改时发生变化。因此,可以通过比较修改前的代码版本和修改后的代码版本中各自的通信协议数据结构来确定通信协议是否发生了变化。然而,如果直接对源代码进行分析来获取通信协议数据结构,不仅计算量过大,准确性也不高。

基于此,在本发明的实施例中,在步骤s110中,可以先针对修改前的代码版本和修改后的代码版本分别生成其各自的语法结构表示,例如抽象语法结构表示,以通过分析所生成的语法结构表示来快速获取代码中的通信协议数据结构。为了相区分,可以将针对修改前的代码版本生成的语法结构表示定义为第一语法结构表示,并将针对修改后的代码版本生成的语法结构表示定义为第二语法结构表示。此处,第一语法结构表示和第二语法结构表示仅为了相互区分彼此而定义,并无其他限制作用。

示例性地,步骤s110中的生成修改前的代码版本和修改后的代码版本各自的语法结构表示可以进一步包括:生成修改前的代码版本和修改后的代码版本各自的抽象语法树(abstractsyntaxtree,ast)。也就是说,针对修改前和修改后的代码版本分别生成的语法结构表示可以为抽象语法树。其中,可以将针对修改前的代码版本生成的抽象语法树定义为第一抽象语法树,并将针对修改前的代码版本生成的抽象语法树定义为第二抽象语法树。此处,第一抽象语法树和第二抽象语法树仅为了相互区分彼此而定义,并无其他限制作用。

在计算机科学中,抽象语法树(或简称语法树)是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。基于生成修改前后的代码版本各自的抽象语法树来获取修改前后的代码版本中各自的通信协议数据结构不仅效率高,而且可靠性也高。

在一个示例中,可以使用castxml工具生成修改前后的代码版本各自的抽象语法树文件。castxml工具能根据c/c++的语法,生成输入代码的结构组织关系,并以xml文件格式描述语法树。在其他示例中,也可以采用任何其他合适的方法或工具来生成修改前后的代码版本各自的抽象语法树文件。

下面继续参考图1,描述根据本发明实施例的分布式系统更新通信协议版本号的方法100的后续步骤。

在步骤s120,获取所述第一语法结构表示和所述第二语法结构表示中各自的通信协议数据结构,分别定义为第一通信数据结构和第二通信数据结构。

基于在步骤s110针对修改前后的代码版本分别生成的其各自的语法结构表示(如抽象语法树),可以通过解析所生成的抽象语法树文件,来获取修改前后的代码版本中各自的通信协议数据结构。在本发明的实施例中,为了便于快速从修改前后的代码版本的抽象语法树中获取到其各自的通信协议数据结构,可以定义符合预设命名规范的预设结构体(例如定义一个宏,其前缀可以为communication_api),并使得修改前后的代码版本中各自的通信协议数据结构均基于该预设结构体而生成。这样,可以事先将通信协议数据结构标识出来,使得更高效地从抽象语法数中查找到通信协议数据类型。

基于此,步骤s120中的获取所述第一语法结构表示和所述第二语法结构表示中各自的通信协议数据结构可以进一步包括:解析所述第一语法结构表示和所述第二语法结构表示,以查找符合所述预设命名规范的数据结构;以及获取符合所述预设命名规范的数据结构的首成员的数据类型,以得到所述通信协议数据结构。具体地,可以遍历步骤s110中针对修改前后的代码版本各自生成的语法结构表示文件(例如抽象语法树文件),并从中查找符合所述预设命名规范的数据结构,例如前缀为communication_api的结构体,然后获取这些结构体的首成员的数据类型,即得到语法结构表示文件中的通信协议数据结构。

为了相区分,可以将从与修改前的代码版本相对应的语法结构表示中获取的通信协议数据类型定义为第一通信协议数据结构(可以简称为第一通信数据结构),并将从与修改后的代码版本相对应的语法结构表示中获取的通信协议数据类型定义为第二通信协议数据结构(可以简称为第二通信数据结构)。此处,第一通信数据结构和第二通信数据结构仅为了相互区分彼此而定义,并无其他限制作用。

在步骤s130,基于所述第一通信数据结构的所有语法信息生成第一文本消息,并基于所述第二通信数据结构的所有语法信息生成第二文本消息。

基于在步骤s120获取的修改前后的代码版本中各自的通信协议数据结构,可以生成修改前后的代码版本中各自的通信协议数据结构的唯一性标识,以用于基于该唯一性标识来确定修改前后通信协议数据结构是否发生了变化。在本发明的实施例中,可以基于通信协议数据结构的所有语法信息来生成该通信协议数据结构的文本消息,并基于该文本消息生成该通信协议数据结构的唯一性标识。

示例性地,该文本消息可以是基于该通信协议数据结构的所有语法信息生成的字符串,例如,可以将该通信协议数据结构的所有语法信息组合成字符串。示例性地,通信协议数据结构的所有语法信息可以包括通信数据结构的自身信息和子成员信息。其中,所述自身信息可以包括域名信息(即namespace名)、数据结构类型(如struct/union)信息和占用大小信息。所述子成员信息可以包括子成员名字信息、基本数据类型(如int/char/float/long)信息、结构体/枚举/联合体/定义类型(typedef)的展开信息和占用大小信息。

为了相区分,可以将基于修改前的代码版本中的通信协议数据类型的所有语法信息生成的文本信息定义为第一文本信息,并将基于修改后的代码版本中的通信协议数据类型的所有语法信息生成的文本信息定义为第二文本信息。此处,第一文本信息和第二文本信息仅为了相互区分彼此而定义,并无其他限制作用。

在步骤s140,计算所述第一文本消息和所述第二文本消息各自的唯一性标识,分别定义为第一唯一性标识和第二唯一性标识。

如前所述的,在本发明的实施例中,可以基于一个通信协议数据结构的所有语法信息来生成该通信协议数据结构的文本消息,并基于该文本消息生成该通信协议数据结构的唯一性标识。示例性地,该唯一性标识可以是该文本消息的消息摘要值(如md5值)。也就是说,可以计算第一文本消息的消息摘要值,以作为修改前的代码版本中的通信协议数据类型的唯一性标识,并计算第二文本消息的消息摘要值,以作为修改后的代码版本中的通信协议数据类型的唯一性标识。

为了相区分,可以将第一文本信息的唯一性标识定义为第一唯一性标,并将第二文本信息的唯一性标识定义为第二唯一性标。此处,第一唯一性标识和第二唯一性标识仅为了相互区分彼此而定义,并无其他限制作用。

在步骤s150,比较所述第一唯一性标识和所述第二唯一性标识,并在所述第一唯一性标识和所述第二唯一性标识不同时更新所述预设通信协议的版本号。

基于在步骤s140计算得到的修改前后的代码版本中各自的通信协议数据结构的唯一性标识,可以通过确定修改前后的代码版本中各自的通信协议数据结构的唯一性标识是否相同来确定修改前后通信协议是否发生了变化。如果修改前后的代码版本中各自的通信协议数据结构的唯一性标识相同,则表明修改前后通信协议没有发生变化;如果修改前后的代码版本中各自的通信协议数据结构的唯一性标识不同,则表明修改前后通信协议发生了变化,则可以更新与被比较的通信协议数据结构相对应的通信协议(如前述的分布式系统各模块之间通信采用的预设通信协议)的版本号,例如可以将该通信协议的版本号累加1。如此,即实现了根据本发明实施例的分布式系统更新通信协议版本号的方法。

在本发明的实施例中,上述分布式系统更新通信协议版本号的方法可以基于分散式版本控制软件(git)的钩子脚本来实现。具体地,开发者使用gitcommit提交代码,git客户端自动触发gitpost-commit脚本,在post-commit脚本中,可以实施上述步骤s110到s150,当提交前后的代码版本中各自的通信协议数据结构的唯一性标识不同时,可以更新对应的通信协议的版本号,并用gitcommit-amend追加提交。

基于上面的描述,根据本发明实施例的分布式系统更新通信协议版本号的方法针对修改前后的代码版本生成语法结构表示,从所生成的语法结构表示中获取通信协议数据结构,并通过比较通信协议数据结构的唯一性标识来确定通信协议是否发生变化,如果发生变化则自动更新通信协议版本号,大大提高了分布式系统发现通信协议发生变化的可靠性和更新通信协议版本号的效率,有效解决了人工方式中容易遗漏和效率低下的问题。

图2示出根据本发明实施例的分布式系统更新通信协议版本号的方法的更具体的流程图。如图2所示,根据本发明实施例的分布式系统更新通信协议版本号的方法可以包括如下步骤:

首先,在步骤s1,使用gitcommit提交代码,生成commit节点a(即一个代码版本),git客户端自动触发gitpost-commit钩子脚本。

其中,git是一个分散式版本控制软件,最初由linustorvalds创作,于2005年以gpl发布。git可支持多种hook脚本,由部分git命令触发,用于完成使用者自定义的自动化操作。

在步骤s1之后的5个步骤均分为左右两支分流进行,其中,左边分流是针对commit节点a对应的代码版本执行的,右边分流是针对commit节点a之前的代码版本执行的。为了将其两者进行区分,将这5个步骤的左边分支标记为s2a到s6a,右边分支标记为s2b到s6b。应理解,这5个步骤中每一步骤的左右两支分流的执行顺序可以是不分先后的。

在步骤s2a,生成commit节点a对应的代码版本的c/c++抽象语法树。在步骤s2b,生成commit节点a之前的代码版本的c/c++抽象语法树。

在计算机科学中,抽象语法树(abstractsyntaxtree,ast),或简称语法树(syntaxtree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。常见的实现工具是castxml,能根据c/c++的语法,生成输入代码的结构组织关系,并以xml文件格式描述语法树。使用castxml工具生成语法树文件之后,可解析此文件,获取通信协议数据结构的全展开字符串,展开的字符串用于计算md5值,md5值发生变化时表示通信协议版本号需要更新,如下文将描述的。

在步骤s3a,解析语法树,找出所有以communication_api开头的数据结构。在步骤s3b,解析语法树,找出所有以communication_api开头的数据结构。

在步骤s4a,获取这些数据结构的首成员的数据类型,即得到所有通信协议数据结构。在步骤s4b,获取这些数据结构的首成员的数据类型,即得到所有通信协议数据结构。

在post-commit脚本中,生成提交前后的抽象语法树,根据预先定义的通信协议数据结构的标识找出通信协议数据结构。其中,可以通过下面的方式来标识通信协议数据结构:首先,定义通信协议声明的宏:#definecomm_api_export(type)structcommunication_api##type{typea;};然后,在通信协议数据结构的定义处使用comm_api_export声明。基于此,可利用castxml(或者其他工具)生成抽象语法树,过滤语法树中的结构体,当名字符合communication_api开头时,获取其首成员类型,即为通信协议数据结构。

在步骤s5a,解析语法树,展开数据协议的完整数据结构,生成字符串。在步骤s5b,解析语法树,展开数据协议的完整数据结构,生成字符串。

在步骤s6a,计算字符串的摘要信息。在步骤s6b,计算字符串的摘要信息。

在抽象语法树中,查找通信数据结构的所有信息,包括其域名信息、基本数据类型、用户定义类型展开、类型数据长度信息等,组合成字符串,计算此字符串的md5值,作为此通信数据结构的唯一标识符。其中,md5(message-digestalgorithm,消息摘要算法)是一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hashvalue),可用于表示数据摘要信息。

在步骤s7,对比提交前后所有通信数据结构的md5值,若发生变化,则在步骤s8更新对应通信数据结构的版本号(即将md5发生变化的通信协议的版本号累加1),并在步骤s9用gitcommit--amend追加提交到commita。在步骤s10,post-commit钩子脚本结束。对于md5值未发生变化的通信数据结构,其对应的通信协议的版本号则无需更新,流程直接行进到步骤s10。

以上结合图2描述了根据本发明实施例的分布式系统更新通信协议版本号的方法的更具体的操作。基于上面的描述,根据本发明实施例的分布式系统更新通信协议版本号的方法具有通信协议的数据结构的自动识别方法:即基于宏声明及抽象语法树,可使用脚本自动识别出描述通信协议的数据结构。此外,根据本发明实施例的分布式系统更新通信协议版本号的方法能够对数据结构的变化进行识别:即基于抽象语法树,获取某个数据结构的所有语法信息(含数据结构成员名字、类型展开、内存占用大小等),生成字符串,计算摘要信息md5,若md5发生变化,则表示数据结构发生变化。

总体上,根据本发明实施例的分布式系统更新通信协议版本号的方法可以通过git的post-commit与pre-push钩子脚本,实现自动更新并提交通信协议版本号的功能,只需在通信数据结构定义处,使用宏声明为通信协议,后续的所有版本号的更新都由git的钩子脚本完成。该基于git的自动更新通信协议版本的方法可以避免人工维护带来的人力成本、效率低下、出错概率高的问题,可应用于进程间通信系统的通信协议一致性保障领域。进程间通信系统指运行于计算机(或嵌入式设备)上的软件间的通信系统。进程间通信协议指不同进程间协商好的通信信息结构及其定义,通信的链路可以是多种多样的:如网口、usb、串口等。进程间通信系统中包含多个不同程序安装包,各个程序间通信协议需要保持一致性,从而保证通信内容能正确传递和响应。因此,根据本发明实施例的分布式系统更新通信协议版本号的方法可应用于需要大量进程间通信的应用(如机器人系统)中,大大提高通信协议的维护效率,并保证通信的正确性。

以上示例性地描述了根据本发明实施例的分布式系统更新通信协议版本号的方法。示例性地,根据本发明实施例的分布式系统更新通信协议版本号的方法可以在分布式系统中实现,也可以在任何具有存储器和处理器的设备、装置或者系统中实现。此外,根据本发明实施例的分布式系统更新通信协议版本号的方法也可以在任何进程间通信系统中实现。

根据本发明另一方面,提供了一种计算设备,所述计算设备包括多个模块,所述多个模块之间通过预设通信协议进行通信,所述计算设备采用上文参照图1和图2描述的分布式系统更新通信协议版本号的方法来更新所述预设通信协议的版本号。下面结合图3描述采用根据本发明实施例的分布式系统更新通信协议版本号的方法的计算设备。图3示出了采用根据本发明实施例的分布式系统更新通信协议版本号的方法的示例计算设备300的示意性结构框图。

如图3所示,计算设备300包括多个组件(或称为模块),分别为一个或多个处理器302、一个或多个存储装置304、输入装置306、输出装置308,这些模块通过总线系统310和/或其它形式的连接机构(未示出)互连。应当注意,图3所示的计算设备300的组件和结构只是示例性的,而非限制性的,根据需要,所述计算设备也可以具有其他组件和结构。

所述处理器302可以是中央处理单元(cpu)或者具有数据处理能力和/或指令执行能力的其它形式的处理单元,并且可以控制所述计算设备300中的其它组件以执行期望的功能。

所述存储装置304可以包括一个或多个计算机程序产品,所述计算机程序产品可以包括各种形式的计算机可读存储介质,例如易失性存储器和/或非易失性存储器。所述易失性存储器例如可以包括随机存取存储器(ram)和/或高速缓冲存储器(cache)等。所述非易失性存储器例如可以包括只读存储器(rom)、硬盘、闪存等。在所述计算机可读存储介质上可以存储一个或多个计算机程序指令,处理器302可以运行所述程序指令,以实现上文所述的本发明实施例中(由处理器实现)的更新通信协议版本号的功能以及/或者其它期望的功能。在所述计算机可读存储介质中还可以存储各种应用程序和各种数据,例如所述应用程序使用和/或产生的各种数据等。

所述输入装置306可以是用户用来输入指令的装置,并且可以包括键盘、鼠标、麦克风和触摸屏等中的一个或多个。

所述输出装置308可以向外部(例如用户)输出各种信息(例如图像或声音),并且可以包括显示器、扬声器等中的一个或多个。

计算设备300的上述组件之间可以通过预设通信协议进行通信,并采用前述的根据本发明实施例的分布式系统更新通信协议版本号的方法来自动更新所述预设通信协议的版本号。

示例性地,可采用根据本发明实施例的分布式系统更新通信协议版本号的方法的示例计算设备300可以被实现为诸如智能手机、平板电脑等终端,或任何具有计算能力的电子设备。

根据本发明再一方面,提供了一种存储介质,在所述存储介质上存储了程序指令,在所述程序指令被计算机或处理器运行时用于执行本发明实施例的分布式系统更新通信协议版本号的方法的相应步骤。所述存储介质例如可以包括智能电话的存储卡、平板电脑的存储部件、个人计算机的硬盘、只读存储器(rom)、可擦除可编程只读存储器(eprom)、便携式紧致盘只读存储器(cd-rom)、usb存储器、或者上述存储介质的任意组合。所述计算机可读存储介质可以是一个或多个计算机可读存储介质的任意组合。

根据本发明又一方面,提供了一种自动驾驶系统,所述自动驾驶系统包括多个模块,所述多个模块之间通过预设通信协议进行通信,所述自动驾驶系统采用上文参照图1和图2描述的分布式系统更新通信协议版本号的方法来更新所述预设通信协议的版本号。下面结合图4描述采用根据本发明实施例的分布式系统更新通信协议版本号的方法的示例自动驾驶系统。图4示出了采用根据本发明实施例的分布式系统更新通信协议版本号的方法的示例自动驾驶系统400的示意性结构框图。

如图4所示,自动驾驶系统400包括车辆位置识别模块410、车辆状态识别模块420、外部环境识别模块430、行驶计划生成模块440以及车辆控制模块450。其中,车辆位置识别模块410配置为识别车辆在地图上的位置。车辆状态识别模块420配置为识别车辆的车辆状态。外部环境识别模块430配置为识别车辆的外部环境。行驶计划生成模块440配置为基于车辆位置识别模块410识别的车辆位置、车辆状态识别模块420识别的车辆状态以及外部环境识别模块430识别的外部环境,生成行驶计划,该行驶计划包括车辆的自动驾驶控制的控制目标值。车辆控制模块450配置为基于行驶计划生成模块440生成的行驶计划的控制目标值向车辆的制动器发送指令,从而执行自动驾驶控制。

如图4所示,自动驾驶系统400包括多个模块,分别为车辆位置识别模块410、车辆状态识别模块420、外部环境识别模块430、行驶计划生成模块440以及车辆控制模块450。其中,车辆位置识别模块410、车辆状态识别模块420和外部环境识别模块430均需要与行驶计划生成模块440进行通信(即,将它们的识别结果传送至行驶计划生成模块440),行驶计划生成模块440需要与车辆控制模块450进行通信(即,将它生成的行驶计划传送至车辆控制模块450),因此,这些模块之间的这些通信均需要采用一定的通信协议,且这些模块之间的通信协议必须保持一致才能保证通信的正确实施。基于此,自动驾驶系统400可以采用根据上文参照图1和图2描述的分布式系统更新通信协议版本号的方法来检测其各模块之间的通信协议是否发生变化(是否保持一致),如果发生变化,则自动进行更新,以正确地保持通信,从而确保可靠、安全的自动驾驶。

下面具体描述自动驾驶系统400采用根据上文参照图1和图2描述的分布式系统更新通信协议版本号的方法对车辆位置识别模块410、车辆状态识别模块420、外部环境识别模块430、行驶计划生成模块440以及车辆控制模块450这些模块之间的通信协议的一致性进行检测、以及检测到通信协议发生变化时更新通信协议版本号的过程。

首先,如前所述,车辆位置识别模块410、车辆状态识别模块420和外部环境识别模块430均需要与行驶计划生成模块440进行通信(即,将它们的识别结果传送至行驶计划生成模块440),行驶计划生成模块440需要与车辆控制模块450进行通信(即,将它生成的行驶计划传送至车辆控制模块450),车辆位置识别模块410、车辆状态识别模块420、外部环境识别模块430和车辆控制模块450分别可以采用相同的通信协议与行驶计划生成模块440通信。因此,需要确定实现车辆位置识别模块410、车辆状态识别模块420、外部环境识别模块430、行驶计划生成模块440以及车辆控制模块450这些模块的代码中的通信协议数据结构是否在其各自代码版本的修改中发生变化。

为了相区别,将实现车辆位置识别模块410的代码定义为车辆位置识别代码,将实现车辆状态识别模块420的代码定义为车辆状态识别代码,将实现外部环境识别模块430的定义为外部环境识别代码,将实现行驶计划生成模块440的定义为行驶计划生成代码,并将实现车辆控制模块450的定义为车辆控制代码。在这些代码中,均采用符合预设命名规范的相同结构体来定义通信协议数据结构(例如前述的以communication_api为开头的数据结构)。基于此,可以在实现前述五个模块中各模块的代码版本的修改后检测其通信协议数据结构是否发生变化。

例如,对于车辆状态识别代码的一个代码版本,可以基于分散式版本控制软件的钩子脚本中生成该代码版本和该代码版本之前的代码版本各自的语法结构表示(例如抽象语法树),分别定义为第一语法结构表示和第二语法结构表示;然后获取所述第一语法结构表示和所述第二语法结构表示中各自的通信协议数据结构(例如解析所述第一语法结构表示和所述第二语法结构表示,以查找符合所述预设命名规范的数据结构,然后获取符合所述预设命名规范的数据结构的首成员的数据类型,以得到所述通信协议数据结构),分别定义为第一通信数据结构和第二通信数据结构;接着基于所述第一通信数据结构的所有语法信息生成第一文本消息,并基于所述第二通信数据结构的所有语法信息生成第二文本消息(例如将所述第一通信数据结构的所有语法信息组合成第一字符串,并将所述第二通信数据结构的所有语法信息组合成第二字符串);然后计算所述第一文本消息和所述第二文本消息各自的唯一性标识(例如计算所述第一文本消息和所述第二文本消息各自的md5值),分别定义为第一唯一性标识和第二唯一性标识;最后比较所述第一唯一性标识和所述第二唯一性标识,并在所述第一唯一性标识和所述第二唯一性标识不同时更新所述第一通信协议的版本号。也就是说,对于车辆状态识别代码的一个代码版本,如果该代码版本与该代码版本之前的代码版本相比,其各自的通信协议数据结构的所有信息组合成的字符串的md5值不相等,则说明该代码版本与该代码版本之前的代码版本相比,通信协议数据结构发生了变化,此时应当修改与该通信协议数据结构相对应的通信协议版本号(如将版本号累加1)。如果该代码版本与该代码版本之前的代码版本相比,其各自的通信协议数据结构的所有信息组合成的字符串的md5值相等,则说明该代码版本与该代码版本之前的代码版本相比,通信协议数据结构未发生变化,则无需修改与该通信协议数据结构相对应的通信协议版本号。

类似地,对于车辆状态识别代码、外部环境识别代码、行驶计划生成代码和车辆控制代码,都可以采用采用上述的方法来检测其中的通信协议数据结构是否发生变化,以及在变化时采用上述方法自动更新通信协议版本号。

以上示例性地描述了根据本发明实施方式的自动驾驶系统及其各模块之间的通信协议版本号的自动更新方法,应理解,图4中所示的自动驾驶系统仅是示例性的,自动驾驶系统还可以包括其他任何未示出的需要的模块,这些模块之间的通信协议也可以采用根据本发明实施例的分布式系统更新通信协议版本号的方法来更新。

根据本发明的再一方面,还提供了一种车辆,所述车辆可以包括上文中所述的自动驾驶系统,该车辆的自动驾驶系统可以根据本发明实施例的分布式系统更新通信协议版本号的方法来更新其各模块之间用于通信的通信协议,本领域技术人员可以结合前文所述来理解更新通信协议的方法,为了简洁,此处不再赘述。

根据本发明的又一方面,还提供了一种无人机,所述无人机可以包括飞行控制系统,所述飞行控制系统包括多个模块,所述多个模块之间通过预设通信协议进行通信,所述无人机采用上文参照图1和图2描述的分布式系统更新通信协议版本号的方法来更新所述预设通信协议的版本号。下面结合图5描述采用根据本发明实施例的分布式系统更新通信协议版本号的方法的示例无人机。图5示出了采用根据本发明实施例的分布式系统更新通信协议版本号的方法的示例无人机500的示意性结构框图。

如图5所示,无人机500包括飞行控制系统,所述飞行控制系统包括指令信号接收模块510、传感器数据处理模块520以及控制量计算模块530。其中,所述指令信号接收模块510用于接收来自无人机500的遥控器(未示出)的指令和来自传感器的传感器信号,并将接收到的传感器信号传送至传感器数据处理模块520,并将接收到的遥控器的指令传送至控制量计算模块530。所述传感器数据处理模块520用于对所述传感器信号进行处理和运算,得到诸如无人机500的位置姿态信息等,并将其处理得到的位置姿态信息传送至控制量计算模块530。所述控制量计算模块530用于基于所述遥控器的指令和所述位置姿态信息计算相应控制器的控制量,并将控制量输出至驱动机构。

如上所述,无人机500包括飞行控制系统,所述飞行控制系统包括多个模块,分别为指令信号接收模块510、传感器数据处理模块520以及控制量计算模块530。其中,指令信号接收模块510、传感器数据处理模块520以及控制量计算模块530这三者之间彼此均需要进行通信。因此,这些模块之间的这些通信均需要采用一定的通信协议,且这些模块之间的通信协议必须保持一致才能保证通信的正确实施。基于此,无人机500可以采用根据上文参照图1和图2描述的分布式系统更新通信协议版本号的方法来检测其飞行控制系统的各模块之间的通信协议是否发生变化(是否保持一致),如果发生变化,则自动进行更新,以正确地保持通信,从而实现无人机的正确安全运行。

下面具体描述无人机500采用根据上文参照图1和图2描述的分布式系统更新通信协议版本号的方法对指令信号接收模块510、传感器数据处理模块520以及控制量计算模块530这些模块之间的通信协议的一致性进行检测、以及检测到通信协议发生变化时更新通信协议版本号的过程。

首先,如前所述,指令信号接收模块510、传感器数据处理模块520以及控制量计算模块530这三者之间彼此均需要进行通信。因此,需要确定实现指令信号接收模块510、传感器数据处理模块520以及控制量计算模块530这些模块的代码中的通信协议数据结构是否在其各自代码版本的修改中发生变化。

为了相区别,将实现指令信号接收模块510的代码定义为指令信号接收代码,将实现传感器数据处理模块520的代码定义为传感器数据处理代码,并将实现控制量计算模块530的定义为控制量计算代码。在这些代码中,均采用符合预设命名规范的相同结构体来定义通信协议数据结构(例如前述的以communication_api为开头的数据结构)。基于此,可以在实现前述三个模块中各模块的代码版本的修改后检测其通信协议数据结构是否发生变化。

例如,对于指令信号接收代码的一个代码版本,可以基于分散式版本控制软件的钩子脚本中生成该代码版本和该代码版本之前的代码版本各自的语法结构表示(例如抽象语法树),分别定义为第一语法结构表示和第二语法结构表示;然后获取所述第一语法结构表示和所述第二语法结构表示中各自的通信协议数据结构(例如解析所述第一语法结构表示和所述第二语法结构表示,以查找符合所述预设命名规范的数据结构,然后获取符合所述预设命名规范的数据结构的首成员的数据类型,以得到所述通信协议数据结构),分别定义为第一通信数据结构和第二通信数据结构;接着基于所述第一通信数据结构的所有语法信息生成第一文本消息,并基于所述第二通信数据结构的所有语法信息生成第二文本消息(例如将所述第一通信数据结构的所有语法信息组合成第一字符串,并将所述第二通信数据结构的所有语法信息组合成第二字符串);然后计算所述第一文本消息和所述第二文本消息各自的唯一性标识(例如计算所述第一文本消息和所述第二文本消息各自的md5值),分别定义为第一唯一性标识和第二唯一性标识;最后比较所述第一唯一性标识和所述第二唯一性标识,并在所述第一唯一性标识和所述第二唯一性标识不同时更新所述第一通信协议的版本号。也就是说,对于指令信号接收代码的一个代码版本,如果该代码版本与该代码版本之前的代码版本相比,其各自的通信协议数据结构的所有信息组合成的字符串的md5值不相等,则说明该代码版本与该代码版本之前的代码版本相比,通信协议数据结构发生了变化,此时应当修改与该通信协议数据结构相对应的通信协议版本号(如将版本号累加1)。如果该代码版本与该代码版本之前的代码版本相比,其各自的通信协议数据结构的所有信息组合成的字符串的md5值相等,则说明该代码版本与该代码版本之前的代码版本相比,通信协议数据结构未发生变化,则无需修改与该通信协议数据结构相对应的通信协议版本号。

类似地,对于传感器数据处理代码和控制量计算代码,都可以采用采用上述的方法来检测其中的通信协议数据结构是否发生变化,以及在变化时采用上述方法自动更新通信协议版本号。

以上示例性地描述了根据本发明实施方式的无人机及其飞行控制系统的各模块之间的通信协议版本号的自动更新方法,应理解,图5中所示的无人机及其飞行控制系统仅是示例性的,无人机及其飞行控制系统还可以包括其他任何未示出的需要的模块,这些模块之间的通信协议也可以采用根据本发明实施例的分布式系统更新通信协议版本号的方法来更新。

以上示例性地描述了根据本发明实施例的分布式系统更新通信协议版本号的方法的应用场景。基于上面的描述,根据本发明实施例的分布式系统更新通信协议版本号的方法及其使用其的设备或系统针对修改前后的代码版本生成语法结构表示,从所生成的语法结构表示中获取通信协议数据结构,并通过比较通信协议数据结构的唯一性标识来确定通信协议是否发生变化,如果发生变化则自动更新通信协议版本号,大大提高了分布式系统发现通信协议发生变化的可靠性和更新通信协议版本号的效率,有效解决了人工方式中容易遗漏和效率低下的问题。

尽管这里已经参考附图描述了示例实施例,应理解上述示例实施例仅仅是示例性的,并且不意图将本发明的范围限制于此。本领域普通技术人员可以在其中进行各种改变和修改,而不偏离本发明的范围和精神。所有这些改变和修改意在被包括在所附权利要求所要求的本发明的范围之内。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

在本申请所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。例如,以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个设备,或一些特征可以忽略,或不执行。

在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。

类似地,应当理解,为了精简本发明并帮助理解各个发明方面中的一个或多个,在对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该本发明的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如相应的权利要求书所反映的那样,其发明点在于可以用少于某个公开的单个实施例的所有特征的特征来解决相应的技术问题。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。

本领域的技术人员可以理解,除了特征之间相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。

此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。

本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(dsp)来实现根据本发明实施例的一些模块的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。

应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。

以上所述,仅为本发明的具体实施方式或对具体实施方式的说明,本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。本发明的保护范围应以权利要求的保护范围为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1