近年来,随着无线网络技术的发展和日益成熟,利用WLAN和LAN的混和组网,使基于网络的机器人远程控制成为一个热门的研究领域。
本文设计了一套移动机器人远程控制系统。该系统可用于如时延网络环境下控制系统的稳定性理论、实时控制系统的网络通信协议、基于事件驱动方式的网络系统控制策略、目标识别技术等方面的研究。
1 硬件环境
被控的机器人采用了美国Activmedia Robotics公司的P3-DX多功能智能移动机器人。它配备了车载计算机(装有无线网卡、视频采集卡)、带抓手的5自由度手臂、水平转动/倾斜摄像头及4组共16个声纳。
在实验室内搭建了无线网络环境, 无线路由器通过其广域连接端口连接到校园网,并能通过校园网访问Internet,从而构成了一个广域网系统。机器人通过其车载计算机上的无线网卡与实验室内的无线局域网互联,从网络的任何节点都可以远程控制机器人。
2 机器人实时远程控制系统的设计
本机器人远程控制系统以实时性及可靠性为前提进行设计。
2.1 基本结构
如图1所示,整个远程控制系统由远程控制平台、本地控制系统两部分组成。整套软件系统建立在Windows2000上。
图1 系统结构图
图2 系统的数据流程图
如图2左半部分所示,整个远程控制平台分为控制区和状态反馈区。在控制区,用户通过图形化控制接口触发指令发送模块中的相应指令,并按照命令包的协议进行封包(根据所设计的通信协议,可以选择是否进行加密和压缩),通过网络发送给本地控制系统。
状态反馈区负责接收从本地控制系统实时发送过来的机器人状态反馈信息和视频数据并显示。
2.3 本地控制系统
如图2右半部分所示,整个本地控制系统分为控制执行区和反馈发送区。
在控制执行区,当收到命令包并解包后,可以选择进行命令包的实时性检查,然后通过指令转发模块将指令转发:如果是基本的控制指令则直接通过ARIA接口发送给机器人;如果是高级任务指令则转发给高级任务模块,调用高级任务模块中对应的子模块进行控制,由它发送一系列的命令给机器人。
在反馈发送区,系统定时接收从串口发来的机器人状态数据并打包发送给远程控制平台,同时采集现场的视频数据,并进行压缩编码,然后根据视频数据包的协议打包发送到远程控制平台。此外状态和视频数据将作为高级任务模块的输入数据来源。图2中的心跳包用于处理通信异常断开的情况。
3 关键技术
3.1 采用UDP协议
TCP协议提供了可靠的数据传输,但是其拥塞控制、数据校验、重传机制的网络开销很大,不适合实时通信,所以选择开销很小的UDP协议来传输数据。
UDP 协议是无连接的数据传输协议并且无重传机制,会发生丢包、收到重复包、乱序等情况。而对于数据精确性要求不高的状态数据以及视频数据,丢包的影响不大。因为会不断收到新的包,丢失的个别包会有新的包来覆盖,所以只需在远程控制系统的通信部分自行处理乱序及重复包的问题,而对于丢包的问题一般不作处理。
但对于命令包这种需要精确收发的数据, 可在程序的开发中加入丢包重发和超时丢弃的处理。
当然,如果开发的是对于实时性要求不高的事件型控制命令的传输,不希望发生指令的丢失也可以直接采用TCP协议。TCP的重传机制正好适合这种情况。
3.2 使用非阻塞套接字结合多线程进行通信
整个系统的通信部分采用Winsock API进行开发,摒弃了其他远程控制系统中多采用的阻塞字加多线程的编程模式,而使用了非阻塞套接字并采用了异步事件选择I/O模型。这是因为非阻塞套接字能更好地在非占先的Windows环境下工作,而阻塞套接字在性能上要差一些。基于整个系统的实时性要求,采用了非阻塞的套接字。
由于状态数据和视频数据的收发量大而且频繁,所以仍需采用多线程技术将数据的收发放到子线程中,否则将影响主线程的运行。
3.3 本地控制系统中的高级任务模块的作用
位于本地控制系统中的高级任务模块使得本地控制系统具有自动避障、目标识别、自主漫游等高级任务的决策能力。这一设计的实质是将属于远程控制的复杂控制功能下放到本地控制系统实现。如图2所示,只需从远程控制平台发出启动某高级任务指令给本地控制系统,本地控制系统的高级任务模块调用相应的子模块并以本地实时更新的状态数据和视频数据作为输入数据进行处理,实时发出一系列的指令给机器人,便可完成特定的任务。
该设计虽然增加了车载计算机的运算负荷,但是由于可以直接在本地实时收到状态数据以及视频数据,既避免了将这些数据发送到远程控制平台以及控制指令发回到本地控制系统所需的网络时延, 又降低了网络的不可预测性造成的系统不可靠性,从而加快了系统的控制响应速度,保证了控制的实时性。同时也提高了远程控制平台操作的集成度、机器人的自主性和系统的可靠性。
3.4 心跳包的使用
图2中的心跳包用于处理通信异常断开的情况,例如突然断电、网络中断等。心跳包是一个非常小的数据包,包里只包含时间戳、包的序号等信息,并使用UDP协议传输。远程控制平台每隔一定的时间(如1分钟)就向本地控制系统发送一个心跳包。当本地控制系统收到该包,只需简单地将该包发回来以表明它收到了这个包。
如果远程控制平台在超过一定的时间(如3分钟)没有收到已发送的心跳包的回包,就可以认为本地控制系统和远程控制平台已经异常断开,从而停止发送心跳包,并立即启动紧急处理模块,执行如操作人员发出警报、重新建立网络连接或者重新启动远程控制平台等应急功能。
如果本地控制系统在一定的时间(如3分钟)内都没有收到从远程控制平台发来的心跳包,就可以认为本地控制系统已经与远程控制平台异常断开,从而立即启动本地控制系统中的紧急处理模块,由该模块发出如停止机器人或启动自主控制程序的指令给机器人。同时如果网络未断,将恢复监听网络上的连接请求,以等待建立新的连接。
通过使用心跳包使系统的应急处理能力得到提高,从而提升了整个系统的可靠性。
3.5 应用层协议的设计
根据实时性要求,包的大小应尽可能小,以减少带宽的占用,所以整套应用层传输协议的设计应该力求简洁。以下的协议都是建立在UDP传输协议之上。
(1)命令包协议
|包头|时间戳|序列号|命令|参数类型|参数|校验和|包尾|
(2)状态包协议
|包头|时间戳|序列号|状态数据块|校验和|包尾|
(3)心跳包协议
|包头||时间戳|序列号|校验和|包尾|
(4)视频数据协议
|包头|时间戳|序列号|同一时间戳数据块数量|数据块序号|数据块|校验和|包尾|
在以上协议中:时间戳用于实时性检查;序列号用于丢包的检测和统计;校验和用于检查包的完整性。
以上所设计的协议具有可扩展性,可根据设计要求增减字段。例如当需要考虑信息传输的安全性,可加入加密字段;当不考虑延时,可删除时间戳字段等。
3.6 自适应实时视频传输方案
但是针对本机器人远程控制系统,该协议并不完全合适。由于该远程控制系统是一对一的传输模式,只传输视频数据而无其他多媒体数据流,所以具有特殊性。而RTP协议具有一般性,它的很多字段并不适合该系统。例如关于数据源的同步以及关于组播的部分,由于不断发送 RTCP包将占用有限的网络带宽,不如直接在远程控制平台进行丢包统计并在视频质量明显变化时发送调节视频质量的命令给本地控制系统。根据这一思路,本系统以RTP协议的基本思想为基础,针对系统的特殊性开发了一套自适应实时视频传输方案。
如图3所示,本地控制系统将采集的一帧视频数据使用MPEG4或M-JPEG协议进行压缩编码;然后按照一定的大小(一般比MTU稍微小点,因为IP和UDP包头要占用一定的字节数)对编码后的视频数据进行分块,并使用视频数据协议进行数据块的封装;最后使用UDP协议发送到远程控制平台。其中时间戳用于表明这些数据块属于同一视频帧,数据块序号用于表明该数据块在此帧中的位置。
由于UDP协议的不可靠性会引发包的乱序、重复包以及丢包等情况,所以远程控制平台采用多级缓存池接收视频数据。该缓存池是一个可以容纳0.2s~0.4s视频数据的多级缓存,每一级是一个缓存链表,用于存储具有相同时间戳的所有数据块。
该多级缓存池的基本算法是:
(1)当接收到的数据块的时间戳在多级缓存中不存在时:如果该时间戳比缓存中最旧的时间戳要新,则在多级缓存池中插入属于该时间戳的缓存链表,在该链表中加入该数据块,并删除时间戳最旧的数据链表;如果该时间戳比缓存中最旧的时间戳还要旧,就丢弃该数据块。
(2)当接收到的视频数据块的时间戳在多级缓存中存在时:检查该时间戳对应缓存链表,通过该数据块序号判断该数据块是否存在该时间戳的缓存链表中。若不存在就加入该数据块,否则丢弃。
(3)当接收到的数据块使得同一时间戳的视频数据完全收到,就将其解码并显示,然后释放包括该时间戳在内的、所有小于该时间戳的缓存链表。
视频的压缩标准采用MJPEG或者MPEG4。MJPEG属于帧内编码,传输中发生丢帧不会影响其他的帧;而MPEG4属于帧间编码,传输中发生丢帧,特别是关键帧的丢失将严重影响其他帧的完整。所以在实际的系统设计中,如果网络的通信状况很好,则选择MPEG4,因为它的压缩比高;如果网络的通信状况很差,则选择MJPEG,虽然压缩比相对较小,但是发生丢帧时不会影响其他帧。
在接收视频数据的同时,应根据时间戳和序列等进行视频传输状况统计,主要是丢包及延时统计。根据统计信息,当视频传输状况发生了明显变化时,就发送调节视频质量的命令给本地控制系统:
(1) 当传输的状况变差(如丢包、延时严重等)时就给本地控制系统发送降低视频质量的命令,使其降低视频采集的频率或者提高压缩比率。至于是降低视频采集的频率还是提高压缩比率,将根据当前机器人的移动速度来决定:当机器人移动较快时,并不需要非常高的画面质量,所以优先采用提高图像压缩比率的方法。当只提高压缩比率效果不明显时,再同时采用降低视频采集频率的方法;当机器人移动速度很慢时如抓取东西时,需要更高的视频清晰度,此时优先采用降低视频采集频率的方法。当只降低视频采集频率效果不明显时,再同时采用提高压缩比率的方法。
(2)同理,如果传输的状况较好,则可以发送提高视频质量的命令给本地控制系统,根据移动速度决定采取优先提高视频采集的频率或者优先降低压缩比率的方法来提高视频的质量。
4 机器人远程控制系统开发库
4.1 目的与用处
提供一套使开发者摆脱编程细节的、快速开发的、模块化的、可扩展的机器人远程控制开发库,可以方便研究人员进行软件的开发,降低其在软件编程方面的重复劳动。
4.2 设计原则
(1)采用面向对象的思想,以C++类进行设计,并将类封装到动态链接库中。
(2)开发库具有多选择性,使开发库的使用者有多种技术可选,如提供多种视频编码库。
(3)在类中对多线程进行封装 ,并加入线程的同步,使类具有线程安全性。
(4)函数中的算法要力求效率高、运算速度快,以减少因为占用过多的计算时间造成的网络时延。
(5)类中定义的接口应设计完整,不可随便改动,以保证今后升级和扩展时接口的一致性。
(6)类的代码要多采用基本C/C++标准库函数来开发,而尽量不要使用依靠平台的如MFC库,以方便移植到Linux平台。
4.3 开发库CyLib介绍
图4是依照以上设计原则设计的机器人远程控制系统开发库CyLib的类层次图。该库由4个动态链接库文件组成:CyCore.dll、CyTools.dll、CyRobot.dll、CyGUI.dll。其中基类加阴影显示,其他的为派生类。
图4 开发库的类层次图
图5 远程控制平台
CyCore.dll封装了应用层数据包协议、远程控制命令、数据传输接口、延时及丢包模拟等。
CyRobot.dll包含了对机器人编程接口ARIA的封装、控制指令的执行、状态数据的轮询和发送、视频的采集压缩发送以及色彩识别、漫游等智能控制功能等。
CyTools.dll提供了一系列的工具类用于辅助研究人员的程序开发。其中包含线程进程同步类、时间类、算术类、日志功能、压缩解压缩、加密解密、视频采集等。
CyGUI.dll提供了图形化显示类,如多功能按钮、地图生成、声纳图形显示等。
5 开发实例
根据以上的系统结构设计并利用开发库CyLib,开发了一套P3-DX机器人远程控制系统。图5展示了机器人远程控制平台的控制现场。该平台实现了机器人本体、机械臂和摄像头的控制、状态数据的显示、声纳罗盘数据图形化显示、视频监控以及自动漫游、色彩识别等智能控制功能。机器人本地控制系统的软件开发为车载计算机的一个Windows2000常驻服务程序。它实现了命令的解析和中转、智能任务控制的执行、状态及视频数据的采集、打包、发送等功能。
本机器人远程控制系统开发库目前还不够完善,需要继续改进和扩展。最后介绍的开发实例基本达到了设计的要求,但是部分高级任务如机械臂智能控制、自主控制等尚未完成,需要进一步加以研究和开发。