一种基于组件的机器人编程方法和计算机可读存储介质与流程

文档序号:21691447发布日期:2020-07-31 22:09阅读:165来源:国知局
一种基于组件的机器人编程方法和计算机可读存储介质与流程

本发明涉及机器人领域,具体涉及一种基于组件的机器人编程方法和计算机可读存储介质。



背景技术:

目前,市面上的机器人编程框架分为两种:实时嵌入式编程:控制器采用传统的编程策略,用嵌入式实时系统满足用户的实时要求;分布式节点编程:采用节点进程间通信的方式进行编程,节点间通过网络传输信息。然而,实时嵌入式编程虽然解决了用户对实时系统的要求,但是软件开发采用传统的编程模式(所有的代码在一个应用程序下),造成业务的代码耦合度高,每次的改动甚至要编译整个工程,不利于团队协同开发。分布式节点编程是典型的代表系统ros(机器人操作系统),提供了分布式的编程策略,将代码解耦到各个节点中去,每个节点对外提供接口或服务,但是这种编程方式本身不具备实时的条件,无法满足用户对机器人开发需要的实时环境。



技术实现要素:

本发明的目的在于提供一种实时性更好耦合度更少的基于组件的机器人编程方法和计算机可读存储介质。为实现本发明的目的,本发明的技术方案如下。

一种基于组件的机器人编程方法包括:

创建机器人组件,所述机器人组件包括端口、服务、属性、线程;

创建进程,所述进程包括若干机器人组件;进程之间采用消息队列机制进行数据交换;

将机器人组件和机器人组件的端口、服务、属性、线程代理到corba服务器上;

创建脚本部署组件;

通过脚本部署组件操控代理到corba服务器上的机器人组件。

优选的,基于组件的机器人编程方法还包括:

创建数据捕获组件;

通过数据捕获组件捕获代理到corba服务器上的机器人组件信息。

优选的,基于组件的机器人编程方法还包括:

创建外部扩展组件;

将外部扩展组件与代理到corba服务器上的机器人组件进行通信。

优选的,所述通过脚本部署组件操控代理到corba服务器上的机器人组件包括:

创建corba客户端;

通过corba客户端访问机器人组件;

配置机器人组件的线程的属性;

连接同一进程的若干机器人组件,和/或,连接不同进程的若干机器人组件。

优选的,所述创建机器人组件包括将机器人组件的线程配置为实时模式或非实时模式,以及配置线程的优先级;实时线程与非实时线程采用无锁线程进行数据交换。

优选的,所述通过数据捕获组件捕获代理到corba服务器上的机器人组件信息包括:

获取并显示端口、服务、属性、线程的信息。

优选的,所述机器人组件的以动态链接库的形式发布。

优选的,所述端口采用消息队列机制进行封装。

优选的,所述服务配置为使得机器人组件以阻塞调用,和/或,非阻塞调用的方式被调用。

一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述方法。

相对于现有技术,本发明的有益技术效果在于:本发明提供了一种组件化的编程方式,机器人的各个模块,不论是实时模块还是非实时模块都以组件的方式给出,每个组件对外提供接口和服务,组件间的关系采用动态部署的方式进行创建和连接,即解决了用户对实时环境的要求,也通过类似分布式编程的方式(组件化)将机器人各个代码模块解耦到不同的组件下,减少了代码的耦合度。本发明具有如下有益技术效果:将软件中常用的端口、服务、属性等概念封装到组件中,通过组件的连接配置相互访问,提供一种类似分布式编程的方法,减少了代码的耦合。每个组件即可以是非实时运行,也可以实时运行,解决了用户对实时环境的要求。每个组件的编写完全独立,发布采用动态链接库的形式,通过部署工具动态部署,减少了程序编写环境和运行环境的耦合。通过corba技术,将进程下的各个组件及组件的port、service、property等全部代理到corba上,任何连接到corba上的其他程序都可以远程访问组件的所有信息,像操作本地组件一样操控远程组件,大大提升了代码的可扩展程度。运用corba技术开发的数据捕获工具能够自动捕获corba上的所有组件信息,并可以对关心的数据进行图形绘制,方便了用户的调试,减少代码调试时间。

为使本申请的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。

附图说明

为了更清楚地说明本申请实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。

图1为组件创建示意图;

图2为进程创建示意图;

图3为组件在corba上的结构示意图;

图4为数据捕获示意图。

具体实施方式

为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本申请的实施例的详细描述并非旨在限制要求保护的本申请的范围,而是仅仅表示本申请的选定实施例。基于本申请的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。

实施例一

本实例的机器人编程方法,包括:

创建机器人组件。

示例性的,如图1所示,一个机器人组件包含4个部分,端口port、服务service、属性property、线程runthread。

port(端口):负责和其他组件进行数据传输;

service(组件服务):组件对外提供的组件服务,其他组件可以调用

property(属性):组件可以添加额外的属性

runthread(线程):每一个组件拥有一个线程,可配置成实时模式,或者非实时模式,并可配置线程优先级,线程是用来进行服务响应或者进行额外的用户操作。

具体的,port(端口),在一个进程下,port为进程间组件间数据传输的通道,进程内组件的port采用无锁线程安全机制,能够保证实时-实时组件,实时-非实时组件,非实时-非实时组件下的数据传输,保证了实时组件的实时性要求;同时,对于不同进程下的组件,port采用posix下的消息队列机制进行封装,保证了进程间的组件数据通信的实时性,port编程伪代码如下所示:

service(组件服务):一个组件a能够对外提供接口和服务,其他组件b通过定义相同的接口并连接,就可以调用a中的服务,调用过程分为阻塞调用和非阻塞调用,函数真正的执行端在a端,伪代码如下所示:

intdata=com.getproperty(“proa”);//组件获取property,存入data

runthread(线程):每个组件所包含的可配置线程,具有实时或者非实时配置,优先级属性配置,周期配置等接口,实时配置主要用来进行实时组件的周期控制,非实时配置主要用来执行其他非实时用户程序,比如io操作,日志读写,网络配置、传输等等操作,伪代码如下:

组件的连接:组件定义好了端口和服务后,需要将组件a和组件b的端口及服务连接起来,伪代码如下:

componentcoma;

componentcomb;

coma.connect(comb);//组件a和组件b进行连接,端口和服务会根据名称和类型自动匹配并连接起来,这样,组件a和组件b的端口就可以进行数据传输,接口服务的互相调用,属性的互相访问等。

组件的启动:组件中的runthread属性有周期线程和非周期线程,周期线程运行后伪代码如下:

非周期组件运行时没有周期循环,仅仅运行一次runthread的代码。

组件的打包形式:组件为了实现代码的解耦,提升代码的可维护性,所以组件的发布和程序的运行是完全独立的,每一个组件都以动态链接库的形式发布(.so文件),部署程序通过动态加载动态链接库的形式获取每个组件,构建程序运行环境。

创建进程。

示例性的,如图2所示,创建了5个进程,分别为:

进程1:机器人a的控制器代码程序;

进程2:机器人b的控制器代码程序;

进程3:脚本部署工具,远程控制机器人a和机器人b的程序环境部署;

进程4:数据捕获,远程捕获机器人a和机器人b下的组件中的数据定义及交互,包括service、port和property。

进程5:外部扩展程序,用户可以通过组件结构封装自己的上层应用程序,比如机器人示教器界面,其他额外的调试工具等等。

将机器人组件和机器人组件的端口、服务、属性、线程代理到corba服务器上。

corba是一种远程对象代理技术,主要应用在分布式框架下,能够将一个进程下的对象代理到corba服务器上,不同进程下的程序能够像访问本地对象方一样访问这个对象,为了方便说明,以伪代码的形式表示:

进程1:

componentcom(“coma”);//创建对象com

corbaservicecorbaserver(“server”);//创建corba服务器

corbaserver.proxy(com);//corba代理com对象

进程2:

corbaclientcorbaclient;//创建corba客户端

corbaclient.connect(“server”);//连接服务器

componentcom=corbaclient.getcomponent(“coma”);//从corba中获取com组件

com.test()//在进程2下调用com的接口函数

如图3所示,通过corba技术,将进程下的各个组件及组件的port、service、property等全部代理到corba上,这样,脚本部署工具和数据捕获程序可以远程的对机器人a和机器人b部署软件环境和进行数据的捕获,外部扩展程序也可以通过corba调用机器人控制器的服务或者进行数据通信。

创建脚本部署组件;通过脚本部署组件操控代理到corba服务器上的机器人组件。

脚本部署工具是一个以脚本程序为入口的,通过远程控制组件的连接、断开、运行、停止等功能,能够远程操控所有机器人组件提供的服务,控制端口行为等功能,能够很方便的实现远程机器人的部署及控制功能,伪代码如下:

corbaclientcorbaclient;//创建corba客户端

corbaclient.connect(“controller”);//客户端连接底层控制器

componentcoma_1=corbaclient.getcomponent(“coma_1”);//通过corba获得coma_1组件

componentcoma_2=corbaclient.getcomponent(“coma_2”);//通过corba获得coma_2组件

componentcoma_3=corbaclient.getcomponent(“coma_3”);//通过corba获得coma_3组件

componentcomb_1=corbaclient.getcomponent(“comb_1”);//通过corba获得comb_1组件

componentcomb_2=corbaclient.getcomponent(“comb_2”);//通过corba获得comb_2组件

componentcomb_3=corbaclient.getcomponent(“comb_3”);//通过corba获得comb_3组件

//配置组件线程属性

coma_1.run_thread.setrealtimestrategy(rt);//设置实时策略(实时)

coma_1.run_thread.setpriority(95);//设置优先级95

coma_1.run_thread.setperiod(0.001);//设置运行周期1ms

coma_3.run_thread.setrealtimestrategy(nort);//设置实时策略(实时)

coma_3.run_thread.setpriority(95);//设置优先级95,非周期运行

……

//以下程序部署组件的运行连接环境

coma_1.connect(coma_2);//组件coma_1和组件coma_2连接

coma_1.connect(coma_3);//组件coma_1和组件coma_3连接

coma_2.connect(coma_3);//组件coma_2和组件coma_3连接

comb_1.connect(comb_2);//组件comb_1和组件comb_2连接

comb_1.connect(comb_3);//组件comb_1和组件comb_3连接

comb_2.connect(comb_3);//组件comb_2和组件comb_3连接

coma_3.connect(comb_3);//跨进程的组件coma_3和组件comb_3连接

//组件配置

coma_1.config();

coma_2.config();

……

//开启所有组件

coma_1.start();

coma_2.start();

……

//组件其他操作

intdata=coma_1.getproperty(“proa”);

………

doothers

//关闭组件

coma_1.stop();

coma_2.stop();

……

创建数据捕获组件;通过数据捕获组件捕获代理到corba服务器上的机器人组件信息。

数据捕获作为一个非实时组件,能够自动捕获其他所有挂载到corba服务器上的组件信息,包括port、service、property、runthread等信息,并通过界面显示出来。如图4所示,选中其中某一行拥有数值属性的项目,比如coma_1的port(dataport),点击绘图中的添加,将会根据port中的数值动态绘制出实时变化的曲线图像。

实施例二

本实施例提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现实施例一所述方法。

本发明编程方法通过对linux打实时补丁,使linux内核具有实时的能力。将编程中常用的端口、服务、属性、线程等封装在组件中,通过组件的编程实现代码的解耦。每个组件可以与其他组件进行配置连接,连接后的组件能够相互访问端口、服务和组件属性。通过对组件线程属性的配置能够配置组件运行环境(实时/非实时,周期/非周期等)。每个组件发布时都是以动态链接库的形式发布。部署工具加载每个组件,在部署工具中完成组件的初始化、配置连接、启动等工作。通过corba技术,将进程下的各个组件及组件的port、service、property等全部代理到corba上,这样,脚本部署工具和数据捕获程序可以远程的对机器人a和机器人b部署软件环境和进行数据的捕获,外部扩展程序也可以通过corba调用机器人控制器的服务或者进行数据通信。数据捕获工具通过corba服务器能够自动捕获挂载到服务器上的组件及组件的端口、服务等,通过显示工具动态的显示组件的所有信息,并可以选取所关心的信息进行图形显示绘制。

为了满足线程编程下的实时性策略,采用了以下方法

1.为了使实时线程下内存分配/释放的执行时间可预期,采用tlsf算法技术和内存池技术管理内存分配,同时也解决了内存分配的碎片化问题。

2.为了能够让实时线程与非实时线程进行数据交换,采用无锁线程安全技术,保证:

a.数据的安全访问;

b.实时线程的优先级不发生翻转;

3.为了满足进程间的实时通信问题,在进程间进行数据交换时,采用进程间posix下的消息队列机制来保证进程间通信的实时性。

组件的所有对外接口(端口、组件服务、属性、线程配置)的内部底层均采用以上方法实现,保证了组件能够在实时环境下实时周期运行。

上面是解决组件在实时环境和非实时环境下使用的方式。

本申请实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本申请提供的实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。

所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。

应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释,此外,术语“第一”、“第二”、“第三”等仅用于区分描述,而不能理解为指示或暗示相对重要性。

最后应说明的是:以上所述实施例,仅为本申请的具体实施方式,用以说明本申请的技术方案,而非对其限制,本申请的保护范围并不局限于此,尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本申请实施例技术方案的精神和范围。都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。

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