CN113961373A - 一种港口自动驾驶单车端通信消息解耦处理方法 - Google Patents
一种港口自动驾驶单车端通信消息解耦处理方法 Download PDFInfo
- Publication number
- CN113961373A CN113961373A CN202111255127.4A CN202111255127A CN113961373A CN 113961373 A CN113961373 A CN 113961373A CN 202111255127 A CN202111255127 A CN 202111255127A CN 113961373 A CN113961373 A CN 113961373A
- Authority
- CN
- China
- Prior art keywords
- message
- subsystem
- function
- pubproxycore
- sub
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/546—Message passing systems or structures, e.g. queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Transfer Between Computers (AREA)
Abstract
本发明为一种港口自动驾驶单车端通信消息解耦处理方法,对Publish侧的中间件消息与子系统消息分离,定义子系统到中间件的消息转换函数ToMsg();然后定义用于发布的PubProxyCore类,实现PubProxyCore::pub()函数;最后封装PubProxyCore成PubProxy类,给子系统提供统一的publish子系统消息接口。对Subscribe侧,定义中间件(ROS2)到子系统的消息转换函数ToInnerData()及映射关系宏INNER_MAPPING_MSG(InnerType,MsgType);然后定义用于订阅的类SubProxyCore,实现SubProxyCore::create_sub()函数;接着控制SubProxyCore::create_sub()的生命周期与回调函数保持一致;最后子系统使用SubProxy::create_sub()即可订阅到子系统消息类型的消息。本发明提高了系统的可维护性和可扩展性,降低了测试成本,提高了开发效率。
Description
技术领域
本发明属于港口自动驾驶、单车智能以及软件架构设计领域,适用场景是单车自动驾驶系统各子系统间消息通信处理方法,具体涉及一种港口自动驾驶单车端通信消息解耦处理方法。
背景技术
在港口自动驾驶单车智能中,各子系统(包括作业处理、规划控制、感知、定位、高精地图等)间的通信必不可少。
业界普遍使用的通信方案为:利用ROS这样的消息中间件,规定好各子系统间交互的topic和message。若某个子系统需将自己的数据发送出去,则它publish对应topic,那么它就将数据以对应message的格式广播出去了。此时subscribe了此topic的其他子系统,就能收到对应的message,进而进行后续业务处理。Publish和subscribe的消息格式都依赖于ROS,须符合ROS 的消息格式规范。
上述方案的缺点在于,随着作业场景的变化,若哪天需要更换消息中间件(如ROS2或自研消息中间件),则原先程序中所有使用ROS1 message 的部分都需要修改,适配成符合新中间件的message格式。这不仅带来了修改上的麻烦(修改每一处容易出错,每一个修改处都须重新测试),更不符合软件设计上的“对扩展开放,对更改封闭”的设计原则。
发明内容
本发明的目的在于提供一种港口自动驾驶单车端通信消息解耦处理方法,旨在解耦消息中间件消息格式与子系统业务处理的消息格式。分离出中间件消息到子系统消息转换模块,当更换消息中间件,只需适配此消息转换模块,子系统处理部分无需做任何变动。
为实现上述目的,本发明提供如下技术方案:
一种港口自动驾驶单车端通信消息解耦处理方法,其特征在于,
对Publish侧的中间件消息与子系统消息分离,即:
定义子系统消息转换成ROS2消息函数ToMsg();
定义用于pubilsh的类PubProxyCore,实现PubProxycore::pub()函数;
定义PubProxy类,封装PubProxyCore,用于对子系统提供统一调用接口;
对Subscribe侧的中间件消息与子系统消息分离,即:
定义ROS2消息类型到子系统消息类型的转换函数ToInnerData()及映射关系;
定义用于subscribe的类SubProxyCore,实现SubProxyCore::create_sub ()函数;
控制SubProxyCore::create_sub()的生命周期,对子系统提供统一订阅子系统消息接口SubProxy::create_sub()。
本发明进一步设置,定义子系统消息转换成ROS2消息函数ToMsg() 时,以子系统消息类型为形参,不同的子系统消息类型构成ToMsg()的函数重载;
本发明进一步设置,定义用于publish的类PubProxyCore,实现 PubProxyCore::pub(T inner_msg)函数时,类型T根据传入的实参,具象化为具体的子系统消息类型。由传入的子系统消息类型和ToMsg(),可得到对应的ROS2消息类型,从而创建出此ROS2消息类型的publisher对象,最后,调用publisher对象的publish()方法,将转换成ROS2消息的子系统消息发送出去。
本发明进一步设置,定义PubProxy类,封装了PubProxyCore,用于对子系统提供统一调用接口。PubProxy将需publish的每个topic对应的 PubProxyCore存入unordered_map,作为成员变量;当子系统需要publish 某topic时,直接调用PubProxy对象pub()成员函数。同时,将PubProxy 定义成单例类,其对外调用接口为:
PubProxy::Instance().pub(topic,inner_msg);
本发明进一步设置,定义用于subscribe的类SubProxyCore,实现SubProxyCore::create_sub()函数时,obj::fp()为用户需实现的回调函数,入参为子系统消息类型,create_sub()实现中,调用了ros2的subscribe ()方法,并转换成调用使用子系统消息类型的obj::fp()方法。
本发明进一步设置,控制SubProxyCore::create_sub()的生命周期时,为SubProxyCore再封装一层,定义一个SubProxy类,根据其vector成员变量,vector的元素为SubProxyCore::create_sub()的返回值,子系统类通过包括一个SubProxy的成员变量对象,来使用SubProxy::create_sub()来订阅topic,当SubProxy成员对象被销毁时,创建的subscriber对象也会被销毁。
本发明进一步设置,若消息中间件变更成除ros2之外的其他中间件时,再扩展一个对应的PubProxy/PubProxyCore/SubProxy/SubProxyCore/中间件消息与子系统消息转换函数即可。
本发明的有益效果:提出了单车端各子系统间通信消息解耦处理方法。该方法解耦了消息中间件消息格式与子系统处理消息格式,发明提出分离出中间件消息到子系统消息转换模块,当更换消息中间件,只需用预定义宏控制,适配此消息转换模块即可,子系统处理部分无需做任何变动。这提高了系统的可维护性和可扩展性,降低了测试成本,提高了开发效率。
附图说明
图1为本发明实施例定义子系统消息转换成ROS2消息函数ToMsg() 的示意图。
图2为本发明实施例中PubproxyCore::pub()函数模板的示意图。
图3为本发明实施例中定义PubProxy类,封装PubProxycore,用于对子系统提供统一调用接口的示意图。
图4为本发明实施例中PubProxy定义成单例类的示意图。
图5为本发明实施例中ROS2消息转换成子系统消息ToInnerData() 的示意图。
图6为本发明实施例定义子系统消息到ROS2消息映射关系的示意图。
图7为本发明实施例中create_sub()实现的示意图。
图8为本发明实施例中为SubProxyCore再封装成SubProxy的示意图。
图9为-图11为本发明实施例中子系统类使用SubProxy对象subscribe topic/message方法的示意图。
具体实施方式
以下将配合实施例来详细说明本申请的实施方式,借此对本申请如何应用技术手段来解决技术问题并达成技术功效的实现过程能充分理解并据以实施。
本发明采用如下技术方案,一种港口自动驾驶单车端通信消息解耦处理方法,
对Publish侧的中间件消息与子系统消息分离,即:
定义子系统消息转换成ROS2消息函数ToMsg();
定义用于pubilsh的类PubProxyCore,实现PubProxycore::pub()函数;
定义PubProxy类,封装PubProxycore,用于对子系统提供统一调用接口;对Subscribe侧的中间件消息与子系统消息分离,即:
定义ROS2消息类型到子系统消息类型的转换函数ToInnerData()及映射关系;
定义用于subscribe的类SubProxyCore,实现SubProxyCore::create_sub ()函数;
控制SubProxyCore::create_sub()的生命周期,对子系统提供统一订阅子系统消息接口SubProxy::create_sub()。
其中定义子系统消息转换成ROS2消息函数ToMsg()时,以子系统消息类型为形参,不同的子系统消息类型构成ToMsg()的函数重载;定义用于publish的类PubProxyCore,实现PubProxyCore::pub(T inner_msg) 函数时,类型T根据传入的实参,具象化为具体的子系统消息类型。由传入的子系统消息类型和ToMsg(),可得到对应的ROS2消息类型,从而创建出此ROS2消息类型的publisher对象,最后,调用publisher对象的publish ()方法,将转换成ROS2消息的子系统消息发送出去;定义PubProxy类,封装了PubProxyCore,用于对子系统提供统一调用接口。PubProxy将需 publish的每个topic对应的PubProxyCore存入unordered_map,作为成员变量;当子系统需要publish某topic时,直接调用PubProxy对象pub()成员函数。同时,将PubProxy定义成单例类,其对外调用接口为:
PubProxy::Instance().pub(topic,inner_msg);
此外在定义用于subscribe的类SubProxyCore,实现SubProxyCore:: create_sub()函数时,obj::fp()为用户需实现的回调函数,入参为子系统消息类型,create_sub()实现中,调用了ros2的subscribe()方法,并帮助转换成使用子系统消息类型的obj::fp()方法。控制 SubProxyCore::create_sub()的生命周期时,为SubProxyCore再封装一层,定义一个SubProxy类,根据其vector成员变量,vector的元素为 SubProxyCore::create_sub()的返回值,子系统类通过包括一个SubProxy 的成员变量对象,来使用SubProxyCore::create_sub()来订阅topic,当 SubProxy成员对象被销毁时,创建的subscribe()对象也会被销毁。
若消息中间件变更成除ros2之外的其他中间件时,再扩展一个对应的 PubProxy/PubProxyCore/SubProxy/SubProxyCore/中间件消息与子系统消息转换函数即可。
现就具体的实施过程对本发明作进一步的阐述:
一、Publish的中间件消息与子系统消息分离
步骤一、定义子系统消息(或称内部消息)转换成ROS2消息函数 ToMsg();
如图1所示,实现内部消息到ROS2消息的转换函数ToMsg()。以内部消息类型为形参,不同的内部消息类型构成ToMsg()的函数重载。
步骤二、定义用于publish的类PubProxyCore,实现PubProxyCore:: pub()函数;
如图2所示,PubProxyCore::pub()为函数模板。类型T根据传入的实参,具象化为具体的内部消息类型。由传入的内部消息类型和 ToMsg(),可得到对应的ROS2消息类型,从而创建出此ROS2消息类型的publisher对象,最后,调用publisher对象的publish()方法,
将转换成ROS2消息的内部消息发送出去。
步骤三、定义PubProxy类,封装了PubProxyCore,用于对子系统提供统一调用接口;
如图3所示,PubProxy将需publish的每个topic对应的PubProxyCore 存入unordered_map,作为成员变量。当用户(即子系统)需要publish 某topic时,直接调用PubProxy对象pub()成员函数即可,不需要每遇到一个topic创建一个PubProxyCore对象。并且,将PubProxy定义成单例类,如图4所示:这样就统一了对外调用接口:
PubProxy::Instance().pub(topic,inner_msg)
方便了子系统的使用。由上述调用接口可见,子系统代码只需填入 topic和对应的内部消息结构的消息,即可publish成功。
二、Subscribe的中间件消息与子系统消息分离
步骤一、定义ROS2消息类型到子系统消息(或称内部消息)类型的转换函数ToInnerData()及映射关系
如图5所示,ROS2消息转换成内部消息ToInnerData();
如图6所示,定义内部消息到ROS2消息的映射关系;
步骤二、定义用于subscribe的类SubProxyCore,实现SubProxyCore::create_sub()函数;
如图7所示,上述create_sub()实现,obj::fp()为用户需实现的回调函数,入参为内部消息类型。create_sub()实现中,调用了ros2的 subscribe()方法,并转换成调用使用内部消息类型的obj::fp()方法。
步骤三、控制SubProxyCore::create_sub()的生命周期;
港口自动驾驶场景中,通常create_sub()的回调函数入参为类的成员函数,故它的生命周期与对象的生命周期一致。为此,为
SubProxyCore再封装一层,定义一个SubProxy类,它有一个vector 成员变量,vector的元素为SubProxyCore::create_sub()的返回值。用户类(即子系统类)通过包括一个SubProxy的成员变量对象,来使用SubProxy::create_sub()来订阅topic。当SubProxy成员对象被销毁时,创建的subscriber对象也会被销毁。实现方法如图8所示:用户类使用SubProxy对象subscribe topic/message方法:如图9-11 所示;
三、对扩展开放,对更改封闭
若消息中间件变更成其他中间件,只需再扩展一个对应的 PubProxy/PubProxyCore/SubProxy/SubProxyCore/中间件消息与内部消息转换函数即可。预定义宏,控制使用哪种中间件。子系统代码不需要做修改。
本发明的有益效果为,提出了单车端各子系统间通信消息解耦处理方法。该方法解耦了消息中间件消息格式与子系统处理消息格式。发明提出分离出中间件消息到子系统消息转换模块,当更换消息中间件,只须需用预定义宏控制,适配此消息转换模块即可,子系统处理部分无需做任何变动。这提高了系统的可维护性和可扩展性,降低了测试成本,提高了开发效率。
如在说明书及权利要求当中使用了某些词汇来指称特定组件。本领域技术人员应可理解,硬件制造商可能会用不同名词来称呼同一个组件。本说明书及权利要求并不以名称的差异来作为区分组件的方式,而是以组件在功能上的差异来作为区分的准则。如在通篇说明书及权利要求当中所提及的“包含”为一开放式用语,故应解释成“包含但不限定于”。“大致”是指在可接收的误差范围内,本领域技术人员能够在一定误差范围内解决所述技术问题,基本达到所述技术效果。
需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的商品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种商品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的商品或者系统中还存在另外的相同要素。
上述说明示出并描述了本发明的若干优选实施例,但如前所述,应当理解本发明并非局限于本文所披露的形式,不应看作是对其他实施例的排除,而可用于各种其他组合、修改和环境,并能够在本文所述发明构想范围内,通过上述教导或相关领域的技术或知识进行改动。而本领域人员所进行的改动和变化不脱离本发明的精神和范围,则都应在本发明所附权利要求的保护范围内。
Claims (7)
1.一种港口自动驾驶单车端通信消息解耦处理方法,其特征在于,
对Publish侧的中间件消息与子系统消息分离,即:
定义子系统消息转换成ROS2消息函数ToMsg();
定义用于pubilsh的类PubProxyCore,实现PubProxycore::pub()函数;
定义PubProxy类,封装PubProxyCore,用于对子系统提供统一调用接口;
对Subscribe侧的中间件消息与子系统消息分离,即:
定义ROS2消息类型到子系统消息类型的转换函数ToInnerData()及映射关系;
定义用于subscribe的类SubProxyCore,实现SubProxyCore::create_sub()函数;
控制SubProxyCore::create_sub()的生命周期,对子系统提供统一订阅子系统消息接口SubProxy::create_sub()。
2.根据权利要求1所述的一种港口自动驾驶单车端通信消息解耦处理方法,其特征在于,定义子系统消息转换成ROS2消息函数ToMsg()时,以子系统消息类型为形参,不同的子系统消息类型构成ToMsg()的函数重载。
3.根据权利要求2所述的一种港口自动驾驶单车端通信消息解耦处理方法,其特征在于,定义用于publish的类PubProxyCore,实现PubProxyCore::pub(T inner_msg)函数时,类型T根据传入的实参,具象化为具体的子系统消息类型;由传入的子系统消息类型和ToMsg(),可得到对应的ROS2消息类型,从而创建出此ROS2消息类型的publisher对象,最后,调用publisher对象的publish()方法,将转换成ROS2消息的子系统消息发送出去。
4.根据权利要求3所述的一种港口自动驾驶单车端通信消息解耦处理方法,其特征在于,定义PubProxy类,封装了PubProxyCore,用于对子系统提供统一调用接口,PubProxy将需publish的每个topic对应的PubProxyCore存入unordered_map,作为成员变量;当子系统需要publish某topic时,直接调用PubProxy对象pub()成员函数;同时,将PubProxy定义成单例类,其对外调用接口为:
PubProxy::Instance().pub(topic,inner_msg)。
5.根据权利要求4所述的一种港口自动驾驶单车端通信消息解耦处理方法,其特征在于,定义用于subscribe的类SubProxyCore,实现SubProxyCore::create_sub()函数时,obj::fp()为用户须实现的回调函数,入参为子系统消息类型,create_sub()实现中,调用了ros2的subscribe()方法,并转换成调用使用子系统消息类型的obj::fp()方法。
6.根据权利要求5所述的一种港口自动驾驶单车端通信消息解耦处理方法,其特征在于,控制SubProxyCore::create_sub()的生命周期时,为SubProxyCore再封装一层,定义一个SubProxy类,根据其vector成员变量,vector的元素为SubProxyCore::create_sub()的返回值,子系统类通过包括一个SubProxy的成员变量对象,来使用SubProxy::create_sub()来订阅topic,当SubProxy成员对象被销毁时,创建的subscriber对象也会被销毁。
7.根据权利要求1或6所述的一种港口自动驾驶单车端通信消息解耦处理方法,其特征在于,若消息中间件变更成除ros2之外的其他中间件时,再扩展一个对应的PubProxy/PubProxyCore/SubProxy/SubProxyCore/中间件消息与子系统消息转换函数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111255127.4A CN113961373A (zh) | 2021-10-27 | 2021-10-27 | 一种港口自动驾驶单车端通信消息解耦处理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111255127.4A CN113961373A (zh) | 2021-10-27 | 2021-10-27 | 一种港口自动驾驶单车端通信消息解耦处理方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113961373A true CN113961373A (zh) | 2022-01-21 |
Family
ID=79467472
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111255127.4A Pending CN113961373A (zh) | 2021-10-27 | 2021-10-27 | 一种港口自动驾驶单车端通信消息解耦处理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113961373A (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20130091295A1 (en) * | 2011-10-06 | 2013-04-11 | Microsoft Corporation | Publish/subscribe system interoperability |
CN108594670A (zh) * | 2018-01-10 | 2018-09-28 | 河海大学常州校区 | 一种机器人跨平台通信协议和控制方法 |
CN110569135A (zh) * | 2019-09-07 | 2019-12-13 | 武汉中海庭数据技术有限公司 | 一种基于发布订阅模式的进程间通信方法及系统 |
-
2021
- 2021-10-27 CN CN202111255127.4A patent/CN113961373A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20130091295A1 (en) * | 2011-10-06 | 2013-04-11 | Microsoft Corporation | Publish/subscribe system interoperability |
CN108594670A (zh) * | 2018-01-10 | 2018-09-28 | 河海大学常州校区 | 一种机器人跨平台通信协议和控制方法 |
CN110569135A (zh) * | 2019-09-07 | 2019-12-13 | 武汉中海庭数据技术有限公司 | 一种基于发布订阅模式的进程间通信方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108540361B (zh) | 用于车辆联网的增强的中央网关 | |
US8078357B1 (en) | Application-independent and component-isolated system and system of systems framework | |
KR20070077447A (ko) | 스케줄링된 장치관리를 수행하는 단말 및 방법 | |
KR101923511B1 (ko) | 차량 진단 통신 장치 및 그 방법 | |
CN112492094A (zh) | 远程驾驶移动终端、远程驾驶系统及远程驾驶方法 | |
CN109960516B (zh) | 一种集群式物联应用开发系统及其方法 | |
EP2608585B1 (en) | Method, device and system for triggering terminal operation | |
CN110213163B (zh) | 一种基于nginx和zuul的路由转发方法及装置 | |
US20230105045A1 (en) | Method of Configuring a Field Device | |
US20200228478A1 (en) | Electronic message control | |
WO2008061457A1 (fr) | Procédé pour emballer l'uoml dans une interface de programmation d'applications | |
CN104301401A (zh) | 一种基于快速服务封装的移动应用平台 | |
CN113961373A (zh) | 一种港口自动驾驶单车端通信消息解耦处理方法 | |
CN113656164B (zh) | 任务执行方法、系统、电子设备及计算机存储介质 | |
CN113296979B (zh) | 一种虚幻引擎与外部程序的数据通信方法 | |
JP2008059312A (ja) | 制御装置およびその開発システム | |
US8660693B2 (en) | Component integration apparatus and method for collaboration of heterogeneous robot | |
US11294656B2 (en) | System and method for developing third-party application | |
KR101331852B1 (ko) | 이기종 로봇의 협업을 위한 컴포넌트 연동 장치 및 그에 따른 방법 | |
CN115333943A (zh) | 确定性网络资源配置系统、方法、设备及存储介质 | |
KR100302332B1 (ko) | 통신운영시스템 감시 터미널의 수신 메시지 처리 방법 | |
KR20190005001A (ko) | 로봇 제어 시스템 및 방법 | |
Lang | Compositional verification using SVL scripts | |
CN111596898A (zh) | 一种基于corba组件的sca组件及服务器 | |
CN115035892A (zh) | 一种车辆的语音控制系统及方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |