一种支持IROS自定义消息类型的irosBridge实现方法技术

技术编号:36788445 阅读:13 留言:0更新日期:2023-03-08 22:34
本发明专利技术提供一种支持IROS自定义消息类型的irosBridge实现方法,属于机器人通信领域,本发明专利技术使用C++基类和多态的特性实现类的反射机制,并对外提供注册类和创建类实例的接口;修改生成IROS消息类型头文件的generate工具,使其生成的头文件中加入上述类的反射机制,并使用注册类的接口对消息类型的类进行注册。使任何非IROS设备都能够借助irosBridge实现与IROS机器人之间通信,同时使irosBridge能够在运行的状态下完成新增自定义消息类型的通信。运行的状态下完成新增自定义消息类型的通信。运行的状态下完成新增自定义消息类型的通信。

【技术实现步骤摘要】
一种支持IROS自定义消息类型的irosBridge实现方法


[0001]本专利技术涉及机器人通信领域,尤其涉及一种支持IROS自定义消息类型的irosBridge实现方法。

技术介绍

[0002]IROS作为一种机器人操作系统,采用分布式节点的方式实现了机器人之间的通信,但实际需求中并不只有机器人之间需要通信,有时更希望在手机、网页等终端设备上与IROS通信,从而控制机器人的行为。为此,需要基于IROS开发irosBridge工具,实现各种设备与IROS通信的需求。
[0003]irosBridge在通信中作为中间消息代理节点,是C/S通信模型的Server端,需要保持长时间运行。在实际工作场景的IROS机器人中,用户往往会创建一些自定义的消息类型,C++这种编译型语言导致这些自定义的消息类型对于运行中的irosBridge而言是未知的,常规做法是将自定义消息类型的头文件包含到irosBridge后重新编译运行,这显然不满足Server端的特性,并且还需要用户去关心和完成irosBridge的编译和运行,这不仅暴露了irosBridge的源码,也增加了用户的工作量。
[0004]因此,有必要基于IROS实现支持自定义消息类型的irosBridge工具,来满足各种设备与IROS通信的需求,同时使irosBridge能够在运行的状态下完成新增自定义消息类型的通信。

技术实现思路

[0005]为了解决以上技术问题,本专利技术提供了一种支持IROS自定义消息类型的irosBridge实现方法
[0006]本专利技术的技术方案是:
[0007]一种支持IROS自定义消息类型的irosBridge实现方法,使用C++基类和多态的特性编写类的反射库,用来实现类的反射机制,反射库在基类中定义虚函数以实现多态,并对外提供注册类和创建类实例的接口。修改生成IROS消息类型头文件的generate工具,使其生成的头文件中加入上述类的反射机制,其中,消息类型的类派生自反射库的基类,重写基类的虚函数,并使用反射库中注册类的接口完成消息类型的注册。irosBridge是实现非IROS设备与IROS机器人之间通信的工具,为了使irosBridge在运行状态下能够识别并完成IROS新增的自定义消息类型的通信,本权利采用动态加载库的方式注册和创建消息类型的类实例。
[0008]进一步的,
[0009]通过修改generate工具,在生成消息类型的头文件后将其编译成动态库,动态库的文件名与消息类型存在一对一的映射关系,generate工具通过读取环境变量的方式得到IROS的库目录,将编译好的消息类型动态库移到IROS库目录中。基于上述思想,irosBridge的编译和运行只依赖反射库,无需依赖消息类型的头文件,对于新增的自定义消息类型,只
要将其对应的动态库放到IROS库目录,irosBridge即可动态加载自定义消息类型的库文件,完成类的注册和实例的创建,进而通过基类的虚函数访问和操作派生类(消息类型的类)的成员变量,完成消息格式的转换,实现通信。
[0010]进一步的,
[0011]irosBridge作为websocket的server端,采用动态加载库的方式创建消息类型的类实例,并遵循rosbridge协议,协议将JSON字符串作为消息传输的格式,该协议为现有技术,本文不再赘述。对于publish这种非IROS设备请求将消息发往IROS的操作,irosBridge在收到非IROS设备发来JSON消息时,首先动态加载消息类型的库文件创建类实例返回给基类指针,并调用派生类重写的json2obj()函数将消息由JSON格式的数据填充给类实例的成员变量,在将消息发往IROS之前,调用派生类重写的serialize()函数,在函数体中执行派生类的消息序列化函数,将序列化后的数据和数据长度分别保存在基类的msg和msg_len中,随后调用将消息发往IROS的publish接口,接口中会基于模板调用消息类型的序列化函数,基类指针导致实际调用的是基类的序列化函数,该函数体中将基类的msg和msg_len赋值给传出参数,进而发送给IROS。
[0012]进一步的,
[0013]对于subscribe这种非IROS设备请求接收IROS消息的操作,irosBridge会将参数类型为基类指针的函数注册为用于处理IROS消息的回调函数,IROS将消息传给回调函数之前会基于模板调用消息类型的反序列化函数,基类指针导致实际调用的是基类的反序列化函数,该函数体中将传入的消息和消息长度分别赋值给基类的msg和msg_len,这里的msg并未作真正的序列化,在回调函数中,irosBridge首先使用动态加载库的方式创建消息类型的类实例返回给基类指针,并调用派生类重写的deserialize()函数,在函数体中基于基类msg和msg_len,执行派生类的消息反序列化函数,将反序列化后的数据填充到类实例,再调用派生类重写的obj2json()函数将消息由类实例的成员变量转化为JSON格式,进而发送给非IROS设备。
[0014]本专利技术的有益效果是
[0015]使任何非IROS设备都能够借助irosBridge实现与IROS机器人之间通信,同时使irosBridge能够在运行的状态下完成新增自定义消息类型的通信。
附图说明
[0016]图1是本专利技术的工作流程示意图;
[0017]图2是本专利技术中generate工具的工作流程示意图;
[0018]图3是本专利技术中irosBridge的实现思路示意图。
具体实施方式
[0019]为使本专利技术实施例的目的、技术方案和优点更加清楚,下面将结合本专利技术实施例中的附图,对本专利技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本专利技术一部分实施例,而不是全部的实施例,基于本专利技术中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本专利技术保护的范围。
[0020]本专利技术提供了一种支持IROS自定义消息类型的irosBridge实现方法,如图1所示,
使用C++基类和虚函数多态的特性编写类的反射库,用来实现类的反射机制,反射库在基类中定义JSON格式与类实例格式之间转换等虚函数来实现多态,并对外提供注册类和创建类实例的接口。在IROS消息类型的头文件中加入上述类的反射机制,消息类型的类派生自反射库的基类,重新基类的虚函数,并使用注册接口在反射库中注册消息类型的类。C++反射技术的核心是基类和多态,具体实现方案本文不再详细探讨。IROS是使用generate工具自动生成消息类型的头文件,因此需要修改generate的程序来完成上述对消息类型头文件的修改。
[0021]如图2所示,irosBridge是实现非IROS设备与IROS机器人之间通信的工具,其作为中间消息代理节点要保持长时间运行,为了让irosBridge能够在运行的状态下注册和创建新增的自定义消息类型,必须本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种支持IROS自定义消息类型的irosBridge实现方法,其特征在于,使用C++基类和多态的特性编写类的反射库,用来实现类的反射机制,反射库在基类中定义虚函数以实现多态,并对外提供注册类和创建类实例的接口;修改生成IROS消息类型头文件的generate工具,使其生成的头文件中加入上述类的反射机制,其中,消息类型的类派生自反射库的基类,重写基类的虚函数,并使用反射库中注册类的接口完成消息类型的注册;采用动态加载库的方式注册和创建消息类型的类实例。2.根据权利要求1所述的方法,其特征在于,采用动态加载库的方式注册类和创建实例,通过修改generate工具,在生成消息类型的头文件后将其编译成动态库,动态库的文件名与消息类型存在一对一的映射关系,generate工具通过读取环境变量的方式得到IROS的库目录,将编译好的消息类型动态库移到IROS库目录中。3.根据权利要求2所述的方法,其特征在于,对于新增的自定义消息类型,只要将其对应的动态库放到IROS库目录,irosBridge即可动态加载自定义消息类型的库文件,完成类的注册和实例的创建,进而通过基类的虚函数访问和操作派生类即消息类型的类的成员变量,完成消息格式的转换,实现通信。4.根据权利要求3所述的方法,其特征在于,对于publish这种非IROS设备请求将消息发往IROS的操作,irosBridge在收到非IROS设备发来JSON消息时,首先采用动态加载库文件的方式,创建消息类型的类实例返回给基类指针,并调用派生类重写的json2obj()函数将消息由JSON格式的数...

【专利技术属性】
技术研发人员:赵洪宇李朝铭马辰
申请(专利权)人:山东新一代信息产业技术研究院有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1