用于跨平台通信的接口装置和方法与流程

未命名 09-29 阅读:120 评论:0


1.本发明涉及一种用于跨平台通信的接口装置、一种用于跨平台通信的系统、一种用于跨平台通信的方法和一种机器可读程序载体。


背景技术:

2.目前ros系统被广泛应用于机器人开发和控制领域,其通过机器人软件平台提供标准化的操作系统服务,例如底层设备控制、常用功能实现、进程间消息以及数据包管理等。
3.然而在具体应用过程中注意到,ros系统(robot operating system,机器人操作系统)在跨平台控制和通信方面存在一定问题。一方面,ros系统只能在有限平台上进行安装运行,这对开发环境有着严格限制。另一方面,ros官方仅支持c++和python等语言,因此例如需要在机器人编译配置中添加很多依赖库,这导致过多的资源占用,对于机器人终端和业务平台来说都造成了负担。
4.在这种背景下,随着机器人研发项目规模的扩大,对非ros平台接入ros平台的需求日益增多。因此期待提供一种轻量级通用接口系统,旨在通过统一转换标准实现灵活高效的跨平台交互,让业务层开发更便捷、更专注,让被控对象易操作性更强。


技术实现要素:

5.本发明涉及一种用于跨平台通信的接口装置、一种用于跨平台通信的系统、一种用于跨平台通信的方法和一种机器可读程序载体,以至少解决现有技术的部分问题。
6.根据本发明的第一方面,提出一种用于跨平台通信的接口装置,所述接口装置包括:
7.第一类接口,其被配置为能够通过基于go语言的第一类函数调用将非ros平台对象转换为二进制可执行文件并发送给ros平台;以及
8.第二类接口,其被配置为能够通过基于go语言的第二类函数调用将ros平台对象转换为非ros平台对象并发送给非ros平台。
9.本发明尤其包括以下技术构思:由于go语言的平台独立性及其模块化设计,go项目能够被编译并转换为尽可能小的二进制形式。因此,目标机器平台上只需要一个基础操作系统和必要管理,而完全不需要关心编译所需的各种包、库的依赖关系,大大减轻了运算负担。
10.在总体上,通过采用go语言对接ros系统,为更多机器人业务平台提供了轻量级的通用接口,有利克服了当项目规模涉及跨平台交互时出现的兼容性问题。如此一来,即使无法让所有机器人业务平台都统一搭载ros操作环境,也能轻松实现被控对象的联合调度,避免了从底层将ros系统嵌入其他平台的复杂性。
11.可选地,第一类接口被配置为在接收到来自非ros平台的触发事件时执行第一类函数调用,第二类接口被配置为在接收到来自ros平台的触发事件时执行第二类函数调用。
12.在此,尤其实现以下技术优点:通过所定义的函数调用触发机制,实现了双向通信需求,不论是从外部向ros端的接入还是从ros平台向外推送消息,都能很好地满足通信需求。
13.可选地,接收到来自非ros平台的触发事件包括接收到对第一类函数的调用指令,接收到来自ros平台的触发事件包括监听到确定类型的事件信息。
14.可选地,所述非ros平台对象以go结构体的形式存在,所述ros平台对象以ros消息文件的形式存在。
15.可选地,所述第一类函数调用包括:将go结构体转换为ros消息文件,并且将ros消息文件压缩为二进制字节流;
16.所述第二类函数调用包括:将二进制字节流解析为ros消息文件,并且将ros消息文件转换为go结构体。
17.在此,尤其实现以下技术优点:第一类接口和第二类接口都是用go实现的接口型函数,基于go语言的非侵入性特征,能够实现接口调用者和实现者的真正解耦,从调用函数时无须关心底层逻辑,编译速度能够真正提高。
18.可选地,所述第一类函数调用和/或第二类函数调用包括以下过程:
19.通过预定义的数据转换函数将go结构体的名字与ros消息文件的名字相互转换;以及
20.通过预定义的数据转换函数将go结构体遵循的数据格式与ros消息文件遵循的数据格式相互转换。
21.在此,尤其实现以下技术优点:通过预编写脚本调用实现了ros消息节点与go数据结构体之间的精准链接关系确定,可以向后兼容数据协议的扩展,方便了对象的传输与还原。
22.可选地,第一类接口被配置为借助第一通信协议与ros平台建立通信连接,第二类接口被配置为借助第二通信协议与ros平台建立通信连接,所述第一通信协议尤其是tcp通信协议,所述第二通信协议尤其是udp通信协议。
23.在此,尤其实现以下技术优点:在ros通信架构下,取决于服务类型的不同,默认采用tcp/udp方式进行通信。通过让接口装置使用这两种通信协议收发数据,能够使接口与ros平台交互时的通信方式遵循ros内部通信机制,从而简化了跨平台通信的复杂性。
24.可选地,第一类接口还被配置为能够将第一类函数调用的返回结果发送给非ros平台。
25.在此,尤其实现以下技术优点:一个接口函数声明既可以包括也可以不包括返回值列表,如果包含返回值列表,那么函数体执行完毕后,将会把函数执行结果以返回值形式反馈给调用者。由此可以使响应结果的反馈良好适配于具体通信需求。
26.可选地,所述第一类接口包括控制接口和信息查询接口。
27.可选地,在第一类接口被构造为控制接口的情况下,非ros平台对象表示用于控制ros平台执行确定操作的控制指令;在第一类接口被构造为信息查询接口的情况下,非ros平台对象表示用于请求ros平台反馈状态信息的信息监测指令。
28.在此,尤其实现以下技术优点:通过第一类接口的这种划分,提供了从外部控制机器人的能力以及对机器人状态的查询能力,扩展了跨平台应用类型。
29.可选地,在第一类接口被构造为控制接口的情况下,第一类函数调用的返回结果包括ros平台开始执行确定操作的有效性判断;以及
30.在第一类接口被构造为信息查询接口的情况下,第一类函数调用的返回结果包括所请求反馈的ros平台的状态信息。
31.在此,尤其实现以下技术优点:由此实现了被控对象指令有效性的判断,并实现了被控对象状态信息的获取。
32.可选地,第二类接口被构造为数据推送接口,对于第二类接口而言,所述非ros平台对象表示由ros平台待推送给非ros平台的事件信息,其中,所述第二类接口还被配置为通过预定义的消息通道将非ros平台对象推送给与消息通道绑定的订阅者。
33.在此,尤其实现以下技术优点:通过建立基于通道的订阅/发布机制,利用go语言的并发特性和channel队列结构,每条消息都会通过相应通道遵循先入先出规则按序发送给多个订阅者。避免了多个线程争抢数据导致的低效资源使用和交换,提高了数据交换效率。
34.可选地,第二类接口被配置为响应于订阅者的注册而动态增加订阅者数量,以及,响应于订阅者的注销而动态减少订阅者数量。
35.在此,尤其实现以下技术优点:第二类接口可以直接将消息发布到对应通道,而不需要知道这些通道对应于哪些订阅者,由此确保可以随着数据传输的进行动态增减订阅者,而不会对接口的数据推送造成影响。这种发布者与订阅者的解耦可以带来更大的扩展性和更动态的网络拓扑。
36.可选地,第一类接口包括多个子接口,第一类函数包括多个接口动作函数,每个子接口对应于一种类型的接口动作函数。
37.在此,尤其实现以下技术优点:通过这种一对一的映射方式,可以直接通过对个体接口调用满足多样化通信需求,而无需关心底层实现逻辑,实现了代码重复利用率并提升了操作友好性。
38.可选地,第二类函数被构造为监听函数,并被配置为当从ros平台监听到确定类型的事件信息时执行所述监听函数。
39.在此,尤其实现以下技术优点:通过为ros事件绑定监听函数,以简单的方式触发数据推送,降低了代码之间的耦合度。
40.根据本发明的第二方面,提供一种用于跨平台通信的系统,所述系统包括:
41.ros平台;
42.非ros平台;以及
43.根据本发明的第一方面所述的接口装置。
44.根据本发明的第三方面,提供一种用于跨平台通信的方法,所述方法用于借助根据本发明的第一方面所述的接口装置和/或根据本发明的第二方面所述的系统执行,所述方法包括以下步骤:
45.监测ros平台与非ros平台之间的通信需求;以及
46.响应于监测到ros平台与非ros平台之间的通信需求,通过基于go语言的第一类函数调用将非ros平台对象转换为二进制可执行文件并发送给ros平台,和/或,通过基于go语言的第二类函数调用将ros平台对象转换为非ros平台对象并发送给非ros平台。
47.根据本发明的第四方面,提供一种机器可读程序载体,在其上存储有计算机程序,所述计算机程序用于当其在计算机上运行时能够实施根据本发明的第三方面所述的方法。
附图说明
48.下面,通过参看附图更详细地描述本发明,可以更好地理解本发明的原理、特点和优点。附图包括:
49.图1示出了根据本发明的一个示例性实施例的用于跨平台通信的接口装置的框图;
50.图2示出了根据本发明的一个示例性实施例的用于跨平台通信的系统的框图;
51.图3示出了根据本发明的一个示例性实施例的用于跨平台通信的方法的流程图;
52.图4示出了在一个具体应用场景中借助第一类函数调用实现跨平台通信的代码范例;
53.图5示出了在一个具体应用场景中借助第二类函数调用实现跨平台通信的代码范例;以及
54.图6a示出了借助根据本发明的第一类接口实现数据转换过程的示意图;以及
55.图6b示出了借助根据本发明的第二类接口实现数据转换过程的示意图。
具体实施方式
56.为了使本发明所要解决的技术问题、技术方案以及有益的技术效果更加清楚明白,以下将结合附图以及多个示例性实施例对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用于解释本发明,而不是用于限定本发明的保护范围。
57.图1示出了根据本发明的一个示例性实施例的用于跨平台通信的接口装置10的框图。
58.参考图1,接口装置10也理解为基于go语言的函数式接口,每个接口对应于一个抽象方法(函数)并能够通过调用操作来执对应的函数。go语言也称为golang,是一种静态强类型、编译型、并发型并具有垃圾回收功能的编程语言,无论是自己的代码还是第三方代码,go语言的程序编写基本以源码方式,并且以gopath作为工作目录和完整工程目录规则。因此go语言日常编译时无须像c++一样配置各种包含路径、链接库地址等,编译速度非常快。
59.接口装置10所涉及的函数均是基于go语言预编写好的、可重复使用的,并且可用来实现单一或相关联功能的代码段。这些函数通过触发调用来执行具体函数体,因此能够显著提高代码的重复利用率。
60.对于非ros平台上的进程运行而言,当发出接口函数的调用指令后,可以让当前代码跳转到被调用的函数中进行执行,调用前的函数局部变量都会保存起来不会丢失。被调用的接口函数运行结束后,恢复到调用函数的下一行继续执行代码,之前的局部变量也能继续访问。
61.这里,接口装置10充当ros平台与非ros平台之间的通信中间件,其按照通信需求的接入方向可以进一步划分为第一类接口100和第二类接口200。
62.第一类接口100例如被配置为在接收到来自非ros平台的触发事件时执行基于go
语言的第一类函数调用,并由此将非ros平台对象转换为二进制可执行文件并发送给ros平台。go语言代码可直接编译输出为二进制可执行文件,编译出的二进制可执行文件可以运行在任何操作环境中。
63.第二类接口200例如被配置为在接收到来自ros平台的触发事件时执行基于go语言的第二类函数调用,并由此将ros平台对象转换为非ros平台对象并发送给非ros平台。
64.在此,对于第一类接口100而言,例如将go结构体形式的非ros平台对象转化为ros消息文件格式,再通过序列化操作将其压缩为二进制数据流。对于第二类接口200而言,例如通过反序列化操作将所接收到的二进制字节流解析还原出ros消息文件(ros平台对象),然后再将其写入对应的go结构体。
65.这里,来自非ros平台的触发事件可以理解为非ros平台对接口函数的调用指令。来自ros平台的触发事件可以理解为确定类型的事件信息。
66.对于第一类接口100来说,非ros平台对象例如可以代表从非ros平台对ros平台的信息监测指令和/或控制指令。具体地,控制指令用于使非ros平台控制机器平台完成特定动作。信息监测指令用于请求机器平台反馈特定类型的状态信息。对于第二类接口200来说,非ros平台对象可以表示由ros平台待推送给非ros平台的事件信息。从通信需求的具体类别出发,第一类接口100还可以包括控制接口101和信息查询接口102。第二类接口200则还可以构造为数据推送接口。此外,除了在此实施例中列出的具体接口构型之外,第一类接口100和第二类接口200还可包括其他结构化数据传输接口,本发明在此不进行具体限制。
67.图2示出了根据本发明的一个示例性实施例的用于跨平台通信的系统1的框图。
68.参考图2,根据本发明的系统1包括至少一个ros平台20、至少一个非ros平台30以及用于使它们之间相互通信的接口装置10。在此,尽管仅示出了单个ros平台20,但本技术不仅适用于存在单个搭载有ros系统的机器平台的环境,而且也适用于存在两个以上所述机器平台的环境。
69.ros(robot operating system,机器人操作系统)作为一种用于机器人开发的灵活框架,提供了工具和库的集合,能够为异质计算机集群提供类似操作系统的功能。在本发明的意义上,将搭载有ros环境的设备、基于ros框架的设备或ros网络中的ros兼容设备都统称为ros平台20。具体地,ros平台20例如包括但不限于物流机器人、工业机械臂、无人驾驶设备等智能终端。
70.非ros平台30则理解为不需要或无法安装ros系统的设备,该平台上例如安装有windows、linux、macos等其他操作环境。具体地,非ros平台30例如包括但不限于机器人业务端、开发测试设备、机器人控制设备、自动驾驶信号采集设备。
71.为了在ros平台20与接口装置10之间建立通信连接,例如可以在ros平台20与接口装置10之间覆盖wifi网络,并通过配置wifi模块而支持多样化的通信协议。考虑到ros平台20内部架构下的专用通信方式,在此例如采用传输控制协议(tcp,transmission control protocol)作为第一通信协议来实现ros平台20与第一类接口100之间的无线通信连接,并采用用户数据报协议(udp,user datagram protocol)协议作为第二通信协议实现ros平台20与第二类接口200之间的无线通信连接。
72.在ros平台20中,基于功能把整个系统分成多个节点,每个节点相当于一个独立进程并负责自己接收的消息、处理、发布,当节点间需要联合调度时,通过分布式框架可以把
各节点集成到一起。
73.在ros平台20和接口装置100的第一类接口100之间,当发起通信时,第一类接口100接收来自非ros平台30侧的接口函数调用指令。响应于接收到相应指令,触发第一类函数调用,并由此将第一类函数中包含的go结构体转化为二进制字节流,以便通过tcp协议发送给ros平台20。
74.在此,第一类接口100例如包括多个子接口,第一类函数包括多个接口动作函数,每个子接口对应于一种类型的接口动作函数。因此,当期望从非ros平台30实现对ros平台20的不同通信需求时,则可以直接通过调用对应接口来完成。
75.在第一类接口100被构造为控制接口101的前提下,非ros平台对象、进而被转换而成的二进制可执行文件例如包括用于控制ros平台20执行确定操作的控制指令。在该示例中,第一类函数调用例如包括:开始导航、停止导航、开始精准对接、停止精准对接、开始相对检测、停止相对检测、开始校准、停止校准、开始跟随、停止跟随、上装控制、设置定位、创建地图、保存地图、使用地图、开始充电、停止充电、扬声器控制、参数更新、灯带控制。
76.在第一类接口100被构造为信息查询接口102的前提下,非ros平台对象、进而被转换而成的二进制可执行文件例如包括用于请求ros平台20反馈状态信息的信息监测指令。在该示例中,第一类函数调用包括:请求导航状态、请求精准对接状态、请求上装设备状态、请求地图信息、请求参数信息、请求定位信息、请求速度信息、请求电池电量信息、请求摄像头数据。
77.在图2所示实施例中,使用标识符“call”和“return”分别表示函数调用请求标识符和相应的函数返回值标识符。在此,第一类函数的函数声明既可以包括也可以不包括返回值列表,如果不包含返回值列表,那么函数体执行完毕后,不会返回任何值。如果函数在声明时包括返回值列表,那么该函数以return结尾。
78.作为示例,当借助控制接口101接收到来自非ros平台30的运动控制指令(例如开始跟随)时,控制接口101将运动控制指令转换为二进制可执行文件并将其发送给ros平台20,在这种接口动作函数执行完毕后可以选择性地发送预定义确认值(例如“y”)给接口调用方,以便让接口调用方知晓ros平台已开始执行接口函数所反映的控制指令。
79.作为另一示例,当借助信息查询接口102接收到来自非ros平台30的请求定位信息的指令时,信息查询接口102将这种信息监测指令转换为二进制可执行文件并提供给ros平台20。于是,在接收到ros平台返回信息之后将定位信息以返回值形式发送给接口调用方。
80.通过基于go语言的脚本描述文件对ros反馈消息进行动态解析,并将解析后得到的二进制数组类型消息作为服务响应数据返回给接口请求方,在这一过程中无需测试人员重复编写程序,即可通过接口调用实现数据请求和反馈交互,有效提高了通信效率,节省了人力和时间成本。
81.在ros平台20和基于go语言的接口装置10之间,向外实现数据推送的一种可能性是让接口装置10中的第二类接口200作为虚拟节点预先在ros平台10的节点管理器上注册,由此让其以订阅者身份通过预定义话题(topic)与ros平台20交互,并向下层用户进一步传递消息。因此,当ros平台20中的节点通过publish函数发布数据之后,这些数据会被自动传输给第二通信接口200以及ros平台20内部的其他订阅节点。第二通信接口200例如通过适当的监听函数来监听ros平台对象,并在监听到特定事件类型时触发监听函数声明中定义
的具体行为。
82.在第二类接口200被构造为数据推送接口的前提下,第二类函数被构造为监听函数并例如从ros平台20监听到如下触发事件时触发具体函数调用:急停事件、碰撞事件、硬件诊断事件、软件诊断事件、充电事件、低电事件、安全区域触发事件、跟随目标丢失事件。
83.在第二类接口200监听到二进制字节流之后,会将其按照预定义协议(通过脚本描述文件)还原为go结构体,然后将其放入相应消息通道(chan)210。在此,通过建立基于go语言的订阅/发布机制(pub/sub),第二类接口200不是将消息推送给特定的接收者(订阅者)221、222、223,而是发布消息到消息通道210。订阅者221、222、223可以通过注册而与一个或多个消息通道210绑定,从而一旦有新消息被推送到相应消息通道210中时,消息就会被发送给订阅该消息通道的所有订阅者221、222、223。这里,消息通道210的数量取决于待发布的消息类型,订阅者221、222、223的数量能够自由增减。因此,第二类接口200例如还被配置为能够响应于订阅者221、222、223的注册而动态增加订阅者数量,以及响应于订阅者221、222、223的注销而动态减少订阅者数量。
84.图3示出了根据本发明的一个示例性实施例的用于跨平台通信的方法的流程图。该方法例如能够借助图1所示的接口装置10和/或图2所示的系统1实施,并且该方法示例性地包括步骤s1和s2。
85.在步骤s1中,监测ros平台与非ros平台之间的通信需求。这种通信需求尤其可以是双向的,也就是说,这不仅包括由非ros平台向ros平台的通信需求,而且也包括由ros平台向非ros平台的通信需求。
86.在步骤s2中,响应于监测到ros平台与非ros平台之间的通信需求,通过基于go语言的第一类函数调用将非ros平台对象转换为二进制可执行文件并发送给ros平台,和/或,通过基于go语言的第二类函数调用将ros平台对象转换为非ros平台对象并发送给非ros平台。这里,取决于由接口装置10所接收到的不同类型的通信需求(尤其以接口函数中包含的go结构体的形式存在),可以触发第一类函数调用或第二类函数调用,由此可以实现基于go语言的跨平台交互。
87.图4示出了在一个具体应用场景中借助第一类函数调用实现跨平台通信的代码范例。在该应用场景中,图像处理数据、内部建模是在非ros平台(例如windows平台下)进行的,而搭载有ros的搬运机器人的开发确是在ros环境中进行,因此需要进行跨系统的信息传输,以将关于导航的目标位置信息传递给搬运机器人。
88.在图4所示代码范例中,以go语言编码消息实现如下交互功能:由非ros平台向ros平台传输开始导航操作的指令。
89.首先,在方块401中示出了来自非ros平台的接口函数调用指令startnavigation(x,y,z),由此旨在通过调用接口函数来将导航目的地坐标(x,y,z)传递给ros平台。
90.接下来,在方块402中示出了具体的函数执行过程。响应于借助接口装置接收到上述调用指令,接口装置通过语句func startnavigation(x,y,zfloat32)error{}开始执行具体的接口函数。在该接口函数中预先定义了go结构体,在其中指定了结构体的名字为“msg”,以用于后续声明结构体变量。首先,通过标签msg.package`ros:"navigation"`指定对象关系映射,在本示例中例如指定ros消息文件所在的ros包的名字是navigation。
91.在ros通信框架范畴内,依赖于topic、service、action等通信方式,并使用简化消
息描述语言来描述ros节点间传递的内容,因此msg消息也可理解为ros平台内部业务间数据的抽象化。在该示例中,导航消息描述例如存储在ros包“navigation”子目录中的.msg文件中,其通过自定义ros消息文件的数据类型来规范待导航坐标信息的格式标准。作为示例,ros平台中navigation.msg消息文件中约定如下消息格式:
92.float32 posex
93.float32 posey
94.float32 posez
95.除此之外,基本的msg消息文件例如还可包括bool、int8、int16、int32、int64(以及uint)、float、float64、string、time、duration、header、可变长数组array[]、固定长度数组array[c]等数据格式。开发者可根据消息类型而在创建消息文件中自定义所需的消息格式,由于消息文件中的字段类型来自特定功能包,因此需要在go结构体中指定包含定义字段类型的功能包(package)。
[0096]
接下来,在go结构体中还以pose,float32标识结构体各成员变量。
[0097]
随后,通过双向数据转换函数convert完成go结构体与ros平台的msg消息文件之间的格式互换,该函数内部处理逻辑将在图6中进一步描述。此处涉及的不仅仅是基本数据类型的转换,实质涉及的是函数封装中的值传递和结构体链接关系确定。
[0098]
经过上述格式转换,非ros平台对象已变为可在ros通讯架构下被识别的msg消息格式,但该消息文件仍以计算机高级语言形式存在,因此还需要将navigationrosmsg压缩为二进制字节流,并通过tcp协议发送给ros平台。由此,该导航指令文件可以以独立于操作环境的方式被ros平台执行。
[0099]
在该示例中,还可想到的是,在接口函数最后通过return语句返回该函数执行结果,以便让接口调用方知晓开始导航成功/失败的结果。
[0100]
图5示出了在一个具体应用场景中借助第二类函数调用实现跨平台通信的代码范例。
[0101]
在该示例性应用场景中,同样对应于ros平台的导航控制过程,然而此时不再涉及由非ros平台向ros平台的主动控制,而是期望由ros平台自发地向非ros平台(业务平台)上报导航完成事件。
[0102]
因此,需要借助第二类接口(即,数据推送接口)的第二类函数调用来实现这种数据交互。如图5中方块500所示,此时不再通过ros平台或非ros平台发出的函数调用指令来触发函数体执行,而是将第二类接口对应的第二类函数设置成监听函数listenevent(),并通过监听确定类型的事件信息来执行相应函数。
[0103]
在ros平台执行完成导航指令之后,会发送导航完成事件,该事件通过udp协议推送出来。于是第二类接口(数据推送接口)通过函数listenevent()一直监听机器人事件。
[0104]
在语句rawdate:=make([]byte,1024)中,rawdate表示接收到的来自ros平台的字节流,此处所使用的make函数是go语言的内置函数,它的作用是初始化特定数组封装结构并为其分配内存。在该示例中,这例如理解为生成的rawdate为[]byte对象,里面包含长度为1024的元素。然后,通过n,_,err:=connection.readfromudp(rawdate)监听得到rawdate。由此,ros发送的完成导航事件被成功接收且并被监听到,通过预定函数(省略)可从rawdate解析出该事件的结果值event。
[0105]
接下来,在该函数中定义名字为result的go结构体,其中同样以标签指定消息来源的ros包“navigation”,并声明成员变量。
[0106]
然后,通过预定义的convert函数实现ros消息文件(msg文件)与go结构体之间的相应格式转换,以便将msg文件包含的数据内容放到非ros平台能够识别的go结构体中。
[0107]
最后,为了将导航完成事件通知给非ros平台上的所有订阅者,把该go结构体(事件信息)放入到eventchan通道。于是,订阅该消息通道的所有用户都能够收到该事件信息。
[0108]
图6a示出了借助根据本发明的第一类接口实现数据转换过程的示意图。
[0109]
通过观察图6a左侧.msg文件可知,ros平台下的.msg文件自定义数据类型的过程其实与go结构体类似,所以这两者之间的转换实则涉及两种不同类型的结构体的转换。在该示例中,在导航msg文件中约定一个含有三个一维数组作为成员的结构体类型,由此导航目的地在特定参考坐标系中的xyz坐标来规范位置信息格式。
[0110]
在执行图4所示的第一类函数调用时,采用了convert函数来实现go结构体与ros消息文件msg之间的转换。由图6a可见,convert函数的内部处理逻辑如下:
[0111]
通过预定义脚本将ros消息文件(msg文件)名字和非ros平台对象(go结构体)名字相互转换,这种名字互换可用于使ros平台与非ros平台的待传输消息相关联,在该示例中,通过这种转换操作例如使生成的ros消息的名字指向navigation。
[0112]
此外,通过预定义脚本将go结构体遵循的数据格式与ros消息文件遵循的数据格式相互转换。由此,使对应字段的数据相互转换,这种转换例如体现在数据类型、成员定义方式、字段类型顺序上。
[0113]
在未经转换的情况下,非ros对象以go结构体形式存在,这例如在图6a右侧示出。
[0114]
通过上述转换操作,例如可以将非ros平台指定的导航位置坐标存放到navigation.msg文件中,其结构如图6a左侧所示。
[0115]
图6b示出了借助根据本发明的第二类接口实现数据转换过程的示意图。
[0116]
在该示例中,例如借助数据推送接口(第二类接口)将ros平台的电池状态信息推送给非ros平台。
[0117]
由此,在第二类函数调用时例如借助convert函数实现相应格式转换,其基础逻辑如下:
[0118]
将ros.msg文件名字和go结构体名字相互转换,由此实现发布数据的ros消息节点和go数据结构体之间的链接关系确定。在该示例中,通过这种转换操作例如使生成的go结构体名字(即,类别名)为batteryinfo。
[0119]
接下来,与图6a所示实施例类似地,将ros的msg文件的消息格式转换为go结构体消息格式,这体现在成员变量的定义和表达方式上。
[0120]
在未经转换的情况下,ros平台对象例如以.msg文件形式表示,这在图6b左侧示出。
[0121]
通过上述转换操作,例如可以将batteryinfo.msg文件中的电池状态信息放到go结构体中,由此生成的go结构体如图6b右侧所示。
[0122]
对比图6a和图6b可知,通过go语言接口装置实现函数转换的最大好处是可以把ros平台下的msg描述文件迁移到go结构体下,由此能够实现良好的平台兼容性。
[0123]
尽管这里详细描述了本发明的特定实施方式,但它们仅仅是为了解释的目的而给
出的,而不应认为它们对本发明的范围构成限制。在不脱离本发明精神和范围的前提下,各种替换、变更和改造可被构想出来。

技术特征:
1.一种用于跨平台通信的接口装置(10),所述接口装置(10)包括:第一类接口(100),其被配置为能够通过基于go语言的第一类函数调用将非ros平台对象转换为二进制可执行文件并发送给ros平台(20);以及第二类接口(200),其被配置为能够通过基于go语言的第二类函数调用将ros平台对象转换为非ros平台对象并发送给非ros平台(30)。2.根据权利要求1所述的接口装置(10),其中,第一类接口(100)被配置为在接收到来自非ros平台(30)的触发事件时执行第一类函数调用,第二类接口(200)被配置为在接收到来自ros平台(20)的触发事件时执行第二类函数调用。3.根据权利要求2所述的接口装置(10),其中,接收到来自非ros平台(30)的触发事件包括接收到对第一类函数的调用指令,接收到来自ros平台(20)的触发事件包括监听到确定类型的事件信息。4.根据权利要求1至3中任一项所述的接口装置(10),其中,所述非ros平台对象以go结构体的形式存在,所述ros平台对象以ros消息文件的形式存在。5.根据权利要求1至4中任一项所述的接口装置(10),其中,所述第一类函数调用包括:将go结构体转换为ros消息文件,并且将ros消息文件压缩为二进制字节流;所述第二类函数调用包括:将二进制字节流解析为ros消息文件,并且将ros消息文件转换为go结构体。6.根据权利要求1至5中任一项所述的接口装置(10),其中,所述第一类函数调用和/或第二类函数调用包括以下过程:通过预定义的数据转换函数将go结构体的名字与ros消息文件的名字相互转换;以及通过预定义的数据转换函数将go结构体遵循的数据格式与ros消息文件遵循的数据格式相互转换。7.根据权利要求1至6中任一项所述的接口装置(10),其中,第一类接口(100)被配置为借助第一通信协议与ros平台(20)建立通信连接,第二类接口(200)被配置为借助第二通信协议与ros平台(20)建立通信连接,所述第一通信协议尤其是tcp通信协议,所述第二通信协议尤其是udp通信协议。8.根据权利要求1至7中任一项所述的接口装置(10),其中,第一类接口(100)还被配置为能够将第一类函数调用的返回结果发送给非ros平台(30)。9.根据权利要求1至8中任一项所述的接口装置(10),其中,所述第一类接口(100)包括控制接口(101)和信息查询接口(102)。10.根据权利要求9所述的接口装置(10),其中,在第一类接口(100)被构造为控制接口(101)的情况下,非ros平台对象表示用于控制ros平台(20)执行确定操作的控制指令;以及在第一类接口(100)被构造为信息查询接口(102)的情况下,非ros平台对象表示用于请求ros平台(20)反馈状态信息的信息监测指令。11.根据权利要求9或10所述的接口装置(10),其中,在第一类接口(100)被构造为控制接口(101)的情况下,第一类函数调用的返回结果包括ros平台(20)开始执行确定操作的有效性判断;以及
在第一类接口(100)被构造为信息查询接口(102)的情况下,第一类函数调用的返回结果包括所请求反馈的ros平台(20)的状态信息。12.根据权利要求1至11中任一项所述的接口装置(10),其中,所述第二类接口(200)被构造为数据推送接口,对于第二类接口(200)而言,所述非ros平台对象表示由ros平台(20)待推送给非ros平台(30)的事件信息,其中,所述第二类接口(200)还被配置为通过预定义的消息通道(210)将非ros平台对象推送给与消息通道(210)绑定的订阅者(221,222,223)。13.根据权利要求1至12中任一项所述的接口装置(10),其中,第二类接口(200)被配置为响应于订阅者(221,222,223)的注册而动态增加订阅者(221,222,223)数量,以及,响应于订阅者(221,222,223)的注销而动态减少订阅者(221,222,223)数量。14.根据权利要求1至13中任一项所述的接口装置(10),其中,所述第一类接口(100)包括多个子接口,所述第一类函数包括多个接口动作函数,每个子接口对应于一种类型的接口动作函数。15.根据权利要求1至14中任一项所述的接口装置(10),其中,第二类函数被构造为监听函数,并被配置为当从ros平台(20)监听到确定类型的事件信息时执行所述监听函数。16.一种用于跨平台通信的系统(1),所述系统(1)包括:ros平台(20);非ros平台(30);以及根据权利要求1至15中任一项所述的接口装置(10)。17.一种用于跨平台通信的方法,所述方法用于借助根据权利要求1至15中任一项所述的接口装置(10)和/或根据权利要求16所述的系统(1)执行,所述方法包括以下步骤:监测ros平台(20)与非ros平台(30)之间的通信需求;以及响应于监测到ros平台(20)与非ros平台(30)之间的通信需求,通过基于go语言的第一类函数调用将非ros平台对象转换为二进制可执行文件并发送给ros平台(20),和/或,通过基于go语言的第二类函数调用将ros平台对象转换为非ros平台对象并发送给非ros平台(30)。18.一种机器可读程序载体,在其上存储有计算机程序,所述计算机程序用于当其在计算机上运行时能够实施根据权利要求17所述的方法。

技术总结
本发明涉及机器人技术领域。本发明提供一种用于跨平台通信的接口装置,所述接口装置包括:第一类接口,其被配置为能够通过基于GO语言的第一类函数调用将非ROS平台对象转换为二进制可执行文件并发送给ROS平台;以及,第二类接口,其被配置为能够通过基于GO语言的第二类函数调用将ROS平台对象转换为非ROS平台对象并发送给非ROS平台。本发明还提供一种用于跨平台通信的系统、一种用于跨平台通信的方法和一种机器可读程序载体。本发明通过采用GO语言对接ROS系统,为更多机器人业务平台提供了轻量级的通用接口,有利克服了当项目规模涉及跨平台交互时出现的兼容性问题。平台交互时出现的兼容性问题。平台交互时出现的兼容性问题。


技术研发人员:彭晶
受保护的技术使用者:灵动科技(北京)有限公司
技术研发日:2022.03.17
技术公布日:2023/9/23
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

飞机超市 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

相关推荐