发明内容
为了解决上述技术问题或者至少部分地解决上述技术问题,本申请提供了一种交互方法、装置、电子设备及存储介质。
第一方面,本申请提供了一种交互方法,应用于软件开发工具包SDK客户端,所述方法包括:
接收请求与机器人操作系统ROS交互的交互请求,所述交互请求包括:交互数据;
利用预设ROS接口协议对所述交互数据进行封装,得到有效数据;
利用预设传输层协议对所述有效数据进行封装,得到传输数据包;
向SDK服务端发送所述传输数据包;
接收所述SDK服务端返回的交互结果。
可选地,所述方法还包括:
确定所述交互结果中是否包含用于表示所述SDK服务端需要接收反馈的需要接收反馈标识;
若所述交互结果包含所述需要接收反馈标识,则向所述SDK服务端发送接收反馈信息;
若接收到重发接收反馈通知,重新向所述SDK服务端发送所述接收反馈信息。
可选地,所述有效数据包括:多个TLV数据元,每个所述TLV数据元包括:Tag字段、Length字段和Value字段;
其中,所述Tag字段表示报文类型,报文类型包括:序列号、命令类型、消息体、身份认证数据、接收反馈标识、执行结果或者执行结果描述;
所述Length字段表示报文长度,所述Length字段最高位的数值用于表示后续连续数值是否为长度内容;
所述Value字段用于存放长度为报文长度的报文内容。
第二方面,本申请提供了一种交互方法,应用于SDK服务端,所述方法包括:
接收SDK客户端发送的传输数据包;
利用预设传输层协议解封装所述传输数据包,得到有效数据;
利用预设ROS接口协议对所述有效数据进行解封装,得到交互数据;
按照所述交互数据执行相应的处理操作,得到交互结果;
向所述SDK客户端返回所述交互结果。
可选地,若所述交互结果中包含需要接收反馈标识,所述方法还包括:
检测所述SDK客户端是否未在预设反馈时间段内返回接收反馈信息;
若所述SDK客户端未在预设反馈时间段内返回接收反馈信息,向所述SDK客户端发送重发接收反馈通知;
若仍未接收到所述接收反馈信息,重新向所述SDK客户端发送所述重发接收反馈通知;
若接收到所述接收反馈信息,停止发送所述重发接收反馈通知。
可选地,若所述交互数据中包括待调用ROS接口的接口标识,所述按照所述交互数据执行相应的处理操作,得到交互结果的步骤包括:
调用与所述接口标识对应的ROS接口;
若接收到ROS接口返回的调用结果,将所述调用结果确定为交互结果。
第三方面,本申请提供了一种交互装置,应用于软件开发工具包SDK客户端,所述装置包括:
第一接收模块,用于接收请求与机器人操作系统ROS交互的交互请求,所述交互请求包括:交互数据;
第一封装模块,用于利用预设ROS接口协议对所述交互数据进行封装,得到有效数据;
第二封装模块,用于利用预设传输层协议对所述有效数据进行封装,得到传输数据包;
发送模块,用于向SDK服务端发送所述传输数据包;
第二接收模块,用于接收所述SDK服务端返回的交互结果。
第四方面,本申请提供了一种交互装置,应用于SDK服务端,所述装置包括:
第三接收模块,用于接收SDK客户端发送的传输数据包;
第一解封装模块,用于利用预设传输层协议解封装所述传输数据包,得到有效数据;
第二解封装模块,用于利用预设ROS接口协议对所述有效数据进行解封装,得到交互数据;
执行模块,用于按照所述交互数据执行相应的处理操作,得到交互结果;
返回模块,用于向所述SDK客户端返回所述交互结果。
第五方面,本申请提供了一种电子设备,包括处理器、通信接口、存储器和通信总线,其中,处理器,通信接口,存储器通过通信总线完成相互间的通信;
存储器,用于存放计算机程序;
处理器,用于执行存储器上所存放的程序时,实现第一方面或第二方面任一所述的交互方法。
第六方面,本申请提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有交互方法的程序,所述交互方法的程序被处理器执行时实现第一方面或第二方面任一所述的交互方法的步骤。
本申请实施例提供的上述技术方案与现有技术相比具有如下优点:
本发明实施例在接收到请求与机器人操作系统ROS交互的交互请求时,利用预设ROS接口协议对交互请求中携带的交互数据进行封装,得到有效数据,然后再利用预设传输层协议对所述有效数据进行封装,得到传输数据包,向SDK服务端发送所述传输数据包,最后可以接收所述SDK服务端返回的交互结果。
本发明实施例通过预设ROS接口协议对交互数据封装成有效数据,可以便于ROS系统解析后直接使用,通过预设传输层协议可以将有效数据以传输数据包的形式传送给SDK服务端,实现SDK客户端与SDK服务端的交互,进而实现SDK客户端所在的Windows或者IOS等系统与SDK服务端所在的ROS系统的交互。
而且,本发明实施例在接收到SDK客户端发送的传输数据包时,可以首先利用预设传输层协议解封装所述传输数据包,得到有效数据,然后利用预设ROS接口协议对所述有效数据进行解封装,得到交互数据,再按照所述交互数据执行相应的处理操作,得到交互结果,最后可以向所述SDK客户端返回所述交互结果。
本发明实施例能够对SDK客户端发送的传输数据包依次利用预设传输层协议和预设ROS接口协议进行解封装,并按照解封装得到的交互数据执行相应的处理操作,实现SDK客户端与SDK服务端的交互,进而实现SDK客户端所在的Windows或者IOS等系统与SDK服务端所在的ROS系统的交互。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请的一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。
由于当前ROS系统运行环境受限(仅限于linux和Android系统),对于Windows或者IOS等系统不能直接运行,并且搭建ROS系统和进行机器人系统应用开发,学习成本很高,不适用于普通用户开发群体。为此,本发明实施例提供了一种交互方法、装置、电子设备及存储介质,所述交互方法可以应用于软件开发工具包SDK客户端,在实际应用中,SDK客户端可以设置于不能直接运行ROS系统的Windows或者IOS等系统中,SDK客户端可以通过SDK接口与Windows或者IOS等系统进行数据传输(例如:接收交互请求)等,SDK接口和SDK客户端可以支持C++、Java、Pythond等编程语言,以便适应于各个开发平台,如图1所示,所述SDK客户端可以与设置于ROS系统中的SDK服务端通信连接,SDK服务端基于ROS系统环境,运行在现有的ROS系统中,作为SDK客户端与ROS系统进行交互的桥梁。
如图2所示,所述交互方法可以包括以下步骤:
步骤S101,接收请求与机器人操作系统ROS交互的交互请求,所述交互请求包括:交互数据;
在本发明实施例中,交互请求可以指请求调用ROS系统中ROS接口的接口调用请求(可以把ROS系统中各种ROS接口转换为Windows或者IOS等系统自定义的通用调用接口)、请求在SDK服务端进行注册的注册请求或者请求SDK服务端进行注销的注销请求等等。
相应的,在接收到接口调用请求时,交互数据可以包括待调用接口的接口标识等;在接收到注册请求时,交互数据可以包括身份认证数据等;在接收到注销请求时,交互数据可以包括客户端断开连接标识等等。
在该步骤中,可以接收不能直接运行ROS系统的Windows或者IOS等系统发送的交互请求,解析交互请求,得到交互数据。
步骤S102,利用预设ROS接口协议对所述交互数据进行封装,得到有效数据;
在本发明实施例中,预设ROS接口协议可以将交互数据中的各个数据内容分别封装成多个TLV数据元,最终得到有效数据,也就是说,多个TLV数据元拼接得到有效数据。
预设ROS接口协议规定:每个所述TLV数据元包括:Tag字段、Length字段和Value字段;
其中,所述Tag字段表示报文类型,Tag字段的值为某一预先设置的TAG名称,示例性的,可以为1Byte长度,示例性的,报文类型包括:序列号、命令类型、消息体、身份认证数据、接收反馈标识、执行结果或者执行结果描述;各报文类型的描述/作用可以如下表1所示:
表1
序号 |
TAG名称 |
描述/作用 |
01 |
序列号 |
用以区分每次交互的唯一性 |
02 |
命令类型 |
自定义命令类型 |
03 |
消息体(请求/反馈结果的数据) |
消息体数据 |
04 |
身份认证数据 |
用以进行身份认证 |
05 |
接收反馈标识 |
接收方基于此标识做反馈 |
06 |
执行结果 |
反馈执行结果 |
07 |
执行结果描述 |
错误详情描述 |
其中,命令类型可以包括如下表2的多个类型:
表2
所述Length字段表示报文长度,所述Length字段最高位的数值用于表示后续连续数值是否为长度内容,在本发明实施例中,为了节省资源,Length字段的长度是可以发生变化的,示例性的,可以使用Byte的低7Bit表示报文长度,Byte的最高位Bit表示后续连续数值是否为长度内容(最高位1-后续连续数值为长度内容,最高位0-长度位结束),多字节采用小端模式(低字节在前);
示例性的,若某个Length字段Length=82B403,由于82二进制1000 0010最高位是1,有效长度2,所以第一个字节的长度为2*128;由于B4二进制1011 0100有效数据011 0100十进制52,所以第二个字节需要加上第一个字节2*128再乘以128;03最高位为0,那么长度就这三个字节,所以第三个字节的长度+03,最后得到总长度=((2)*128+52)*128+03。
所述Value字段用于存放长度为报文长度的报文内容。
在该步骤中,可以利用预设ROS接口协议对所述交互数据进行封装后得到某一有效数据,该有效数据中包括多个TLV数据元。
步骤S103,利用预设传输层协议对所述有效数据进行封装,得到传输数据包;
在本发明实施例中,示例性的,由于ROS系统、Windows和IOS等系统均支持Socket协议,所以可以使用通用的Socket协议对有效数据进行封装,得到传输数据包,在实际应用中,也可以使用其它ROS系统、Windows和IOS等系统均支持的传输层协议对有效数据进行封装,此处仅为举例说明,不对本申请做出限定。
socket传输协议的格式:
步骤S104,向SDK服务端发送所述传输数据包;
步骤S105,接收所述SDK服务端返回的交互结果。
本发明实施例在接收到请求与机器人操作系统ROS交互的交互请求时,利用预设ROS接口协议对交互请求中携带的交互数据进行封装,得到有效数据,然后再利用预设传输层协议对所述有效数据进行封装,得到传输数据包,向SDK服务端发送所述传输数据包,最后可以接收所述SDK服务端返回的交互结果。
本发明实施例通过预设ROS接口协议对交互数据封装成有效数据,可以便于ROS系统解析后直接使用,通过预设传输层协议可以将有效数据以传输数据包的形式传送给SDK服务端,实现SDK客户端与SDK服务端的交互,进而实现SDK客户端所在的Windows或者IOS等系统与SDK服务端所在的ROS系统的交互。
在本发明的又一实施例中,如图3所示,所述方法还包括:
步骤S201,确定所述交互结果中是否包含用于表示所述SDK服务端需要接收反馈的需要接收反馈标识;
在该步骤中,SDK客户端可以利用预设传输层协议对交互结果进行解封装,得到有效数据,在利用预设ROS接口协议对有效数据进行解封装,得到接收反馈标识,接收反馈标识可以指表1中序号05对应的内容。
步骤S202,若所述交互结果包含所述需要接收反馈标识,则向所述SDK服务端发送接收反馈信息;
步骤S203,若接收到重发接收反馈通知,重新向所述SDK服务端发送所述接收反馈信息。
本发明实施例能够在接收到SDK服务端返回的接收反馈标识时,自动向服务端发送接收反馈信息,并且在接收到SDK服务端发送的重发接收反馈通知,重新向所述SDK服务端发送所述接收反馈信息,可以在SDK服务端要求SDK客户端接收到交互结果后给予反馈时,自动向SDK发送反馈,若未接收到调用结果,将不会向SDK服务端发送接受反馈信息,保证交互过程的准确性,避免SDK服务器误认为SDK客户端已接收到交互结果的情况出现。
在本发明的又一实施例中,还提供一种交互方法,应用于SDK服务端,如图4所示,所述方法包括:
步骤S301,接收SDK客户端发送的传输数据包;
步骤S302,利用预设传输层协议解封装所述传输数据包,得到有效数据;
在该步骤中,在接收到SDK客户端发送的传输数据包后,可以利用预设传输层协议对传输数据包进行解封装,基于前述实施例,示例性的,预设传输层协议可以指socket协议等等。
示例性的,某一有效数据为:
“0102A113020200030335010E2F736D6F6B655F302F736D6F6B6503116465766963655F6D7367732F536D6F6B6504104e4e0a2f099984ac3f235a473c193a460416120000000000000037C3575D452D5B3B000000000A00050A0102ED5B02041305693E”。
步骤S303,利用预设ROS接口协议对所述有效数据进行解封装,得到交互数据;
示例性的,对有效数据按照表1进行解析,得到:
“01 02 A113
02 02 0003
03 35 010E2F736D6F6B655F302F736D6F6B6503116465766963655F6D7367732F536D6F6B6504104e4e0a2f099984ac3f235a473c193a46
04 16 120000000000000037C3575D452D5B3B000000000A00
05 0A 0102ED5B02041305693E”
其中,“01 02 A113”为一个TLV数据元,“01”为Tag字段的值,对应表1中的序号01序列号,“02”为Length字段的值,“A113”为Value字段的值,所以,“01 02 A113”表示本次交互的序列号为A113;
其中,“02 02 0003”为一个TLV数据元,第一个“02”为Tag字段的值,对应表1中的序号02命令类型,第二个“02”为Length字段的值,“0003”为Value字段的值,所以,“02 020003”表示本次交互的命令类型为0003;命令类型0003在表2中对应“client_release”,表示客户端断开连接。
由于Tag字段的值为“03”,在表1中对应消息体,消息体为请求/反馈结果的数据,所以需要对消息体按照表1进行进一步的解析,也就是说,需要对TLV数据元“03 35 010E2F736D6F6B655F302F736D6F6B6503116465766963655F6D7367732F536D6F6B6504104e4e0a2f099984ac3f235a473c193a46”中的Value字段“010E2F736D6F6B655F302F736D6F6B6503116465766963655F6D7367732F536D6F6B6504104e4e0a2f099984ac3f235a473c193a46”根据表1进行数据解析,得到:
“01 0E 2F736D6F6B655F302F736D6F6B65
03 116465766963655F6D7367732F536D6F6B65
04 10 4e4e0a2f099984ac3f235a473c193a46”
其中,“01 0E 2F736D6F6B655F302F736D6F6B65”中,Tag字段为“01”,Length字段“0E”,Value字段“2F736D6F6B655F302F736D6F6B65”。
后续TLV数据元均可依次方式进行解析,此处不再赘述。
步骤S304,按照所述交互数据执行相应的处理操作,得到交互结果;
在该步骤中,SDK服务端可以按照交互数据执行与交互数据相对应的处理操作,得到交互结果。
基于前述实施例,由于交互数据可以包括待调用接口的接口标识等;所以,在本发明实施例中,在交互数据包括待调用接口的接口标识时,SDK服务端可以调用与所述接口标识对应的ROS接口,若接收到ROS接口返回的调用结果,将所述调用结果确定为交互结果;
基于前述实施例,在交互数据包括身份认证数据时,SDK服务端可以对身份认证数据进行验证,以确定SDK客户端的身份认证数据是否合法,得到验证结果即为交互结果;
基于前述实施例,在交互数据包括客户端断开连接标识时,可以注销与客户端断开连接标识对应的SDK客户端等等。
步骤S305,向所述SDK客户端返回所述交互结果。
本发明实施例在接收到SDK客户端发送的传输数据包时,可以首先利用预设传输层协议解封装所述传输数据包,得到有效数据,然后利用预设ROS接口协议对所述有效数据进行解封装,得到交互数据,再按照所述交互数据执行相应的处理操作,得到交互结果,最后可以向所述SDK客户端返回所述交互结果。
本发明实施例能够对SDK客户端发送的传输数据包依次利用预设传输层协议和预设ROS接口协议进行解封装,并按照解封装得到的交互数据执行相应的处理操作,实现SDK客户端与SDK服务端的交互,进而实现SDK客户端所在的Windows或者IOS等系统与SDK服务端所在的ROS系统的交互。
在本发明的又一实施例中,在SDK服务端需要SDK客户端接收到交互结果后给予反馈时,可以在交互结果中添加需要接收反馈标识,所以在所述交互结果中包含需要接收反馈标识时,所述方法还包括:
检测所述SDK客户端是否未在预设反馈时间段内返回接收反馈信息;
在该步骤中,可以记录向SDK客户端返回交互结果的返回时刻,若在当前时刻仍未接收到接受反馈信息,则可以获取当前时刻,计算当前时刻与返回时刻之间的时间差,将时间差与预设反馈时间段比较,若时间差大于预设反馈时间段,则可以确定SDK客户端未在预设反馈时间段内返回接收反馈信息。
若所述SDK客户端未在预设反馈时间段内返回接收反馈信息,向所述SDK客户端发送重发接收反馈通知;
若仍未接收到所述接收反馈信息,重新向所述SDK客户端发送所述重发接收反馈通知;
在实际应用中,可以设置重新向SDK客户端发送重发接收反馈通知的最大重发次数,在达到最大重发次数时,则可以报错,以提示维护人员进行维护。
若接收到所述接收反馈信息,停止发送所述重发接收反馈通知。
在本发明实施例中,在接收到SDK客户端发送的接收反馈信息时,则可以确定SDK客户端接收到交互结果,无需再向SDK客户端发送重发接收反馈通知。
本发明实施例能够再SDK客户端未在预设反馈时间段内返回接收反馈信息时,自动向SDK客户端发送重发接收反馈通知,若仍未接收到所述接收反馈信息,重新向所述SDK客户端发送所述重发接收反馈通知,若接收到所述接收反馈信息,停止发送所述重发接收反馈通知,保证交互过程的准确性,避免SDK服务器误认为SDK客户端已接收到交互结果的情况出现。
基于前述实施例,为了便于理解,本发明实施例还提供了一种SDK客户端与SDK服务器交互的实施例,在本发明实施例中,SDK客户端与SDK服务器交互的过程如下:
SDK客户端接收请求与机器人操作系统ROS交互的交互请求,所述交互请求包括:交互数据;
SDK客户端利用预设ROS接口协议对所述交互数据进行封装,得到有效数据;
SDK客户端利用预设传输层协议对所述有效数据进行封装,得到传输数据包;
SDK客户端向SDK服务端发送所述传输数据包;
SDK服务端接收SDK客户端发送的传输数据包;
SDK服务端利用预设传输层协议解封装所述传输数据包,得到有效数据;
SDK服务端利用预设ROS接口协议对所述有效数据进行解封装,得到交互数据;
SDK服务端按照所述交互数据执行相应的处理操作,得到交互结果;
SDK服务端向所述SDK客户端返回所述交互结果;
SDK客户端接收所述SDK服务端返回的交互结果。
本发明实施例的SDK客户端通过预设ROS接口协议对交互数据封装成有效数据,可以便于ROS系统解析后直接使用,通过预设传输层协议可以将有效数据以传输数据包的形式传送给SDK服务端,实现SDK客户端与SDK服务端的交互,进而实现SDK客户端所在的Windows或者IOS等系统与SDK服务端所在的ROS系统的交互;而且,本发明实施例的SDK服务端能够对SDK客户端发送的传输数据包依次利用预设传输层协议和预设ROS接口协议进行解封装,并按照解封装得到的交互数据执行相应的处理操作,实现SDK客户端与SDK服务端的交互,进而实现SDK客户端所在的Windows或者IOS等系统与SDK服务端所在的ROS系统的交互。
在本发明的又一实施例中,还提供一种交互装置,应用于软件开发工具包SDK客户端,如图5所示,所述装置包括:
第一接收模块11,用于接收请求与机器人操作系统ROS交互的交互请求,所述交互请求包括:交互数据;
第一封装模块12,用于利用预设ROS接口协议对所述交互数据进行封装,得到有效数据;
第二封装模块13,用于利用预设传输层协议对所述有效数据进行封装,得到传输数据包;
发送模块14,用于向SDK服务端发送所述传输数据包;
第二接收模块15,用于接收所述SDK服务端返回的交互结果。
在本发明的又一实施例中,还提供一种交互装置,应用于SDK服务端,如图6所示,所述装置包括:
第三接收模块21,用于接收SDK客户端发送的传输数据包;
第一解封装模块22,用于利用预设传输层协议解封装所述传输数据包,得到有效数据;
第二解封装模块23,用于利用预设ROS接口协议对所述有效数据进行解封装,得到交互数据;
执行模块24,用于按照所述交互数据执行相应的处理操作,得到交互结果;
返回模块25,用于向所述SDK客户端返回所述交互结果。
在本发明的又一实施例中,还提供一种电子设备,包括处理器、通信接口、存储器和通信总线,其中,处理器,通信接口,存储器通过通信总线完成相互间的通信;
存储器,用于存放计算机程序;
处理器,用于执行存储器上所存放的程序时,实现前述应用于SDK客户端的交互方法或者应用于SDK服务端的交互方法。
本发明实施例提供的电子设备,处理器通过执行存储器上所存放的程序实现了在接收到请求与机器人操作系统ROS交互的交互请求时,利用预设ROS接口协议对交互请求中携带的交互数据进行封装,得到有效数据,然后再利用预设传输层协议对所述有效数据进行封装,得到传输数据包,向SDK服务端发送所述传输数据包,最后可以接收所述SDK服务端返回的交互结果,保证通过预设ROS接口协议对交互数据封装成有效数据,可以便于ROS系统解析后直接使用,通过预设传输层协议可以将有效数据以传输数据包的形式传送给SDK服务端,实现SDK客户端与SDK服务端的交互,进而实现SDK客户端所在的Windows或者IOS等系统与SDK服务端所在的ROS系统的交互。
或者,本发明实施例提供的电子设备,处理器通过执行存储器上所存放的程序实现了在接收到SDK客户端发送的传输数据包时,可以首先利用预设传输层协议解封装所述传输数据包,得到有效数据,然后利用预设ROS接口协议对所述有效数据进行解封装,得到交互数据,再按照所述交互数据执行相应的处理操作,得到交互结果,最后可以向所述SDK客户端返回所述交互结果,保证能够对SDK客户端发送的传输数据包依次利用预设传输层协议和预设ROS接口协议进行解封装,并按照解封装得到的交互数据执行相应的处理操作,实现SDK客户端与SDK服务端的交互,进而实现SDK客户端所在的Windows或者IOS等系统与SDK服务端所在的ROS系统的交互。
上述电子设备提到的通信总线1140可以是外设部件互连标准(PeripheralComponentInterconnect,简称PCI)总线或扩展工业标准结构(ExtendedIndustryStandardArchitecture,简称EISA)总线等。该通信总线1140可以分为地址总线、数据总线、控制总线等。为便于表示,图7中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
通信接口1120用于上述电子设备与其他设备之间的通信。
存储器1130可以包括随机存取存储器(RandomAccessMemory,简称RAM),也可以包括非易失性存储器(non-volatilememory),例如至少一个磁盘存储器。可选的,存储器还可以是至少一个位于远离前述处理器的存储装置。
上述的处理器1110可以是通用处理器,包括中央处理器(CentralProcessingUnit,简称CPU)、网络处理器(NetworkProcessor,简称NP)等;还可以是数字信号处理器(DigitalSignalProcessing,简称DSP)、专用集成电路(ApplicationSpecificIntegratedCircuit,简称ASIC)、现场可编程门阵列(Field-ProgrammableGateArray,简称FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
在本发明的又一实施例中,还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有交互方法的程序,所述交互方法的程序被处理器执行时实现应用于SDK客户端的交互方法或者应用于SDK服务端的交互方法的步骤。
需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅是本发明的具体实施方式,使本领域技术人员能够理解或实现本发明。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所申请的原理和新颖特点相一致的最宽的范围。