你的位置:论文发表 >> 论文下载 >> 工学论文 >> 材料工程学 >> 详细内容 在线投稿

无人机地面监控系统软件的总体设计与接口实现

浏览144次 时间:2014年8月11日 09:50

/王平

本文针对无人机外场发射与回收测控系统的需求,完成了地面监控系统软件的设计开发与调试工作,实现了遥测参数实时获取解析、飞控参数在线调整、航迹规划与显示、数据存储与分析、视频传输与解码等功能,解决了如何提高串口通信实时性和发送遥控数据周期精度,以及如何实现多客户端图像实时稳定传输等难点问题,为地面操作人员提供了一个良好的监视与操控平台,为无人机飞行提供了有利保障。

摘 要

【关键词】无人机 监控系统 串口通信 定时器网络通信

地面监控系统属于无人机测控与信息传输系统的地面部分,完成对无人机的监测与控制功能。地面监控系统软件,按功能可以分成数据通信模块、监控模块和扩展功能模块。无人机地面监控系统通过数据通信模块与无人机进行信息交互,实现了地面人员对无人机的监控,并将采集到的下行图像数据通过网络接口传送给地面图像站和情报,实时播放处理无人机载荷图像;在监控模块中,有专用的窗口为地面人员提供实时直观的无人机飞行状态信息,可在地图上规划出航迹并利用人机交互界面发送各种指令使之完成定高、定姿和定航线飞行;扩展功能模块可实现对飞行数据的回放和分析。

1 系统功能设计及实现

随着无人机自驾系统和通信系统性能的不断提升,实现对无人机远程的监控已成为可能,地面监控系统软件就是实现无人机远程监控的平台,该系统采用Visual C++ 6.0Microsoft SQL Server 进行程序开发和数据管理。

1.1 数据通信模块

数据通信模块是软硬件接口模块,上、下行数据均要通过该接口进行数据交换,是无人机监控系统的重要组成部分。数据通信模块分为两部分:串口通信模块和网络通信模块。串口通信模块包括三部分功能:下行遥测数据的接收和上行遥控数据的发送以及控制键盘指令的接收;网络通信模块用于将采集到的图像数据传送到图像站和情报站。由于这两部分内容较多,将在最后两章中分别介绍其接口实现。

1.2 监控模块

监控模块是地面监控系统的核心,它要能够实时准确显示和记录全程飞行数据,以动态数据显示为主,以数据、文本、图形、动画等多种形式表现,辅助操作人员了解各种飞行模态下参数的变化区间,为操作人员操控提供依据。记录下的数据可以进行事后处理、回放。整个系统根据其功能分为两个子系统:

1.2.1 监测系统

通过对下行信道中数据的解析可以得到遥测数据,分三个窗口进行显示。遥测数据窗口:包含的遥测信息包括左\ 右升降舵指令和偏角、左\ 右副翼指令和偏角、风门指令和偏角、俯仰角速率、滚转角速率、平台方位角、平台俯仰角、爬升虑、垂直误差、地速、飞行开关指令回报、任务开关指令回报等;基本数据窗口:磁航角、俯仰角、倾斜角、海拔高度、气压高度、飞行状态、定位卫星、偏航角、偏航距、GPS 经纬度、发动机状态、空速、UTC 时间等;注入数据回报窗口:航线注入、航迹查询、起点设置、航迹删除、场面气高、磁偏角、工作高度等注入数据的回报。以上数据将为地面操控人员提供重要的信息参考,以快速应对飞行过程中出现的各种状态。

1.2.2 控制系统

包括舵控制、飞行控制和任务设备控制。舵控制是对无人机方向舵、副翼和升降舵中位进行调整,使其自动驾驶仪状态和手动驾驶状态中位一致,该操作是通过控制键盘进行的;飞行控制包括设定目标航点的经度、纬度、高度以及参数补偿等信息,通过上行遥控数据帧上传,控制无人机定高、定姿和定航线飞行,该功能是通过软件的数据注入功能完成的;任务设备控制通过任务设备键盘对任务设备进行控制,实现对任务载荷方位、俯仰和焦距等参数的调整。

1.3 扩展功能模块

1.3.1 地图校正

在地图显示界面中,我们可以任意选择飞行区域的地图,但该地图使用前必须经过校正,通过三个点即可精确校正地图的经纬度和地图显示坐标的关系。

1.3.2 航迹规划与显示

在经过校正的地图上,可用鼠标任意选取多个目标航点,它们将自动连成航线,并可保存和通过上行数据发送至机载设备,控制飞机从最近的一个目标航点开始沿规划的航线飞行。对已选取的航点还可以通过手动输入经纬度进行精确的航迹规划。最多可以规划7 条航线,所有规划好的航线均被保存,并可以随时选择在地图上显示,方便航线的浏览及飞行实时航迹与规划航线的对比。

1.3.3 数据回放模块

可将存放的数据按日期检索,实现飞行数据的回放。

2 串口通信与定时器设计

地面监控系统软件所有的测控数据都是通过串口通信来实现的,因此串口通信功能在整个程序的设计中起着举足轻重的作用,设计中选用了多线程类串口通信方式,另外,设计了一种基于多线程的高精度定时器,以提高串口通信的实时性和准确性。

2.1串口通信

所有的遥控和遥测数据以及控制键盘数据的接收均是通过串口完成的,它们采用的是同一个类,方法类似,所以下面只分别介绍遥测数据的接收和遥控数据的发送。

2.1.1 常用串口通信方法及其优缺点比较通常实现串口通信的方法有: 使用MSComm 控件;使用Windows API 函数;使用第三方提供的串口通信类;利用Windows的读写端口函数_inp,_inpw,_inpd,_outp,_outpw,_outpd 或者开发驱动程序直接对串口进行操作。使用MSComm 控件实现串口通信方法比较简单,其缺点是在编程时会出现内存不断增大的问题。由于在无人机长时间飞行过程中,有大量的遥控和遥测数据需要通过串口通信来完成,因此实时性成为解决问题的关键所在。如果使用MSComm 控件,就会遇到内存不断增大的问题,使通信速度变慢,严重影响数据链路通信的实时性;使用Windows API 函数和Windows 的读写端口函数适用面广,但函数比较复杂,编程周期长。因此,该系统选用了第三方提供的串口通信类,它功能较为全面,使用简单,缩短了开发周期。

2.1.2 CSerialPort 类及其改进

在本论文中实现串口通信的方法是利用第三方提供的串口类CSerialPort,并在该类基础上对其加以修改,命名为CSerialPortEx 类。该类的实质是利用Windows API 函数,因此必须清楚Windows API 串口通信的方法和步骤,其一般步骤如下:1)打开串口: 利用CreateFile 函数。(2)建立串口通信事件: 利用CreateEvent 函数。(3)初始化串口并设置串口参数: 利用SetCommState 函数。(4)建立读数据的线程。(1)向串口写数据: 利用WriteFile 函数。(5)关闭端口。CSerialPort 类虽然功能较为全面,但也存在读取数据效率不是很高,不能很好地释放串口等问题。由于每20ms 就会有一帧遥测数据到达串口,而且在实际的调试过程中会有大量的遥测数据传输,为了满足串口通信的实时性,对该类进行一定的修改,并将改进后的类命名为CSerialPortEx

1) 对读串口数据的改进。Receive

Char() 函数是类CSerialPort 本身提供的读取数据的函数,ReceiveChar() 函数不需用户调用,串口主线程在有数据到达串口时自动调用该函数,它将读取到的数据通过自定义的消息M_COMM_RXCHAR 发送给父窗口地面监控系统主界面窗口,调用者只需要在该窗口内处理WM_COMM_RXCHAR 消息即可。但ReceiveChar() 函数时每收到一个字符都切换线程处理WM_COMM_RXCHAR 消息,当传输大量数据时,效率比较低。为此,新增加了读取串口数据的函数ReadBlock(),批量读取串口数据。测试后发现,在传输较少的数据时,两个函数的差异不大。当传输大量的遥测数据时,使用ReadBlock() 函数比使用ReceiveChar() 函数快很多。

2)彻底关闭串口,释放串口资源门。在实际的测试过程中,当串口关闭后再重新打开串口时,会出现串口已经打开或者未发现串口的情况,原因在于类CSerialPort 不能很好的释放串口资源,因此对该类进行了优化,增加了释放串口的代码。

2.1.3 串口接收发送数据的流程

1)遥测数据接收流程。当串口接收缓 .区有数据时,程序就会产生一个WM_COMM-RXCHARX 消息而触发OnComm() 函数,开始接收遥测数据。首先进行帧头判别,如果帧头正确,则直接读取一帧数据, 并根据帧头特征判定副帧号,然后进行校验,如果校验正确,则进行解码,提取帧中相应位置上的各种数据信息。应当注意的是,遥测帧分为十二个副帧,相邻两帧的数据是完全不同的,所以必须注意防止缓冲区数据在未被处理完的情况下被下帧数据覆盖,一方面要提高遥测数据的处理速度,另一方面要开辟双缓冲区,不允许数据直接填充到正在处理的缓冲区。

2)遥控数据发送流程。当地面站监控

系统软件运行以后,程序就开始定时向无人机自驾仪发送遥控指令。首先打开串口,为了检测通信信道是否保持正常工作,只要串口打开,即使不进行任何操作,程序也按设定值定时自动发送空帧。如果无人机自驾仪可正常接收地面站监控系统软件发送来的控制帧,则通过遥测数据中反馈链路正常信息。如有任何对无人机的操作,就会在遥控帧中相应的位置上添加遥控指令信息,组合成完整的帧以后就自动发送遥控指令,开关指令通常连续发送三次已确保无人机自驾仪收到。.

遥控指令的发送周期是40ms 一帧,由于Windows 不是实时操作系统,当设定周期小于55 毫秒时,定时就不准确,所以必须重新考虑产生定时器的方法。

2.2 高精度定时器设计

2.2.1 普通的定时和延时方法

VC 中常用的普通的定时和延时方法有:方法一:SetTimer() 函数是Windows 自带的一个系统定时器,是VC 中最常用的定时器,该定时器是使用中断的工作方式,而计算机8253 定时器芯片产生硬件中断08H 的时间间隔是54.915ms 一次,再加上该定时器消息的优先级较低,所以要用于设计40ms 的定时发送精度是无法保证的。方法二:用于函数Sleep()Sleep 函数是使调用Sleep 函数的线程休眠,线程主动放弃时间片。当经过指定的时间间隔后,再启动线程,继续执行代码。Sleep 函数本身并不能起到定时的作用,主要作用是延时,可以结合多线程技术,启动一个发送线程,在线程中的while 语句中使用Sleep 函数延时,完成定时发送的功能。Sleep 函数的精度较低,它的精度取决于线程自身的优先级、其他线程的优先级,以及线程的数量等因素。如果系统开销不大,可以考虑用此方法。

2.2.1 高精度定时方法

高精确的定时操作, 可以使用函数Qu e r yPe r f o rma n c eCo u n t e r ( ) QueryPerformanceFrequency(),其原理如下:计算确切的时间是通过调用计时通过两次调用计时函数QueryPerformanceCounter() 来计算精确的时间,计时函数的返回值是滴答数,通过频率换算就得到了从开始到结束的时间的秒数,计算机内部定时器的固定频率可通过调用函数QueryPerformanceFrequency() 获取。该方法定时误差不超过1 微秒,定时精度与CPU 等计算机配置相关。其计算公式如公式3-1 所示:E l a p s e d T i m e = ( S t o p C o u n t e r StartCounter)/Frequency 3-1)考虑到无人机系统对实时性和可靠性的要求,在遥控数据发送程序设计了一种基于多线程技术的高精度定时器,关键代码如下所示:1) 在打开串口的函数中开启线程。m_SendThread=CreateThread(NULL,0,SendThread,(LPVOID)this,0,NULL);while(1){QueryPerformanceFrequency(&litmp);freqg = (double)litmp.QuadPart; // 获得固定时钟频率QueryPerformanceCounter(&litmp);dp2 = litmp.QuadPart; // 获得初始值dfMinus = (double)(dp2-dp1);dfTim = (dfMinus / dfFreq)*1000.; // 转换成msif(dfTim>40)// 发送遥控指令的定时器周期40ms{dp1 = dp2;OnSendData()// 发送数据}}

3 网络通信设计

图像显示与处理是侦察类型无人机的重要功能,地面监控系统不仅要将采集的数据传送到地面图像站用于图像显示,还要将数据送到地面情报站用于图像处理和情报生成。本文设计了可以用于多客户端传输的网络通信功能,满足了图像传输的要求。

3.1 网络通信基础

套接字(Socket) 是一种网络编程接口,是TCP/IP 协议的网络通信的基本操作单元,可分为两类,数据报套接字和流式套接字。流式套接字使用基于连接的协议,它的使用方法与数据报套接字不同。在发送和接收数据之前必须先建立连接。首先服务器创建一个用户监听的套接字,为该套接字分配地址后,调用listen() 函数使之处于监听状态,客户端在创建套接字完毕之后,为套接字分配地址,然后调用connection() 函数,向服务器发出连接请求;服务器套接字在接收到客户端的连接请求后,调用accept() 函数,该函数创建一个用于连接的套接字。然后,就可以在服务器和客户端之间进行数据传输。在数据传输结束之后,客户端调用closesocekt() 函数关闭套接字,服务器也调用该函数关闭该套接字。在地面监控系统中,监控系统采集的图像数据不仅要通过网络发送到地面图像站,还要发送到情报站做情报处理,所以地面监控系统这个服务器必须能够处理多个用户的请求,因此在流式套接字的编程中,服务器首先创建一个监听套接字用于监听客户端的连接请求;每接收到一个客户端的连接请求,就为此连接创建一个用于连接的套接字,并把该套接字加入到连接套接字队列中。

3.2 工作流程

3.2.1 服务器的工作流程

在启动服务器后,服务器按下列流程运行:设置服务器端口号,程序将创建监听套接字并在指定端口监听客户端的连接请求。当一个客户端发出连接请求时,将触发监听套接字的OnAccept 事件,在事件处理函数中动态创建一个连接套接字,并把该套接字加入到连接套接字队列中。m_connectionList.Add(client);当客户端断开连接时,服务器释放连接套接字队列中相应的套接字。当服务器终止服务时,释放连接套接字队列中所有的套接字。

3.2.2 客户端的工作流程

设置服务器地址、端口,创建套接字并连接服务器当客户端离开时,断开连接。

3.3 数据的发送

一旦客户端收到来自服务器的接受信号,表示建立连接,即可进行数据传输,调用send函数用于发送数据,其函数原型如下:Int send(SOCKET s,const char FAR *buf,intlen,int flags);S 表示已建立连接的套接字,buf 表示发送数据缓冲区,len 表示发送数据缓冲区长度,返回值为成功发送的数据长度。由于支持多客户端的数据发送,所以每次发送前应检测当前连接套接字队列中的连接个数,并向每一个建立的连接都发送一次数据,对于已断连接应立即删除,不再向该连接发送数据。

socket send 函数是将数据拷贝到TCP协议栈的待发送缓冲区。如果TCP 的缓冲区放不下所有的数据,就会只拷贝一部分,造成send 返回的小于发送缓冲区的长度。当TCP实际将数据发送走后,TCP 缓冲区会空出来,此时可以继续调用send,将剩余的数据拷贝进TCP 缓冲区。所以为防止丢失数据,send 必须循环调用,直至发送完全。while(sendtotal<len){s e n d l e n=s e n d ( s , b u f+s e n d t o t a l , l e n -sendtotal,0);sendtotal+=sendlen;}Socket 内部默认的收发缓冲区大小是8K左右,可以用SetSockOpt() 函数来改变缓冲区的大小。

4 结论

经过系统联试和飞行实验验证,整个系统运行良好,实时性高,很好地实现了对无人机的监控。

参考文献

[1] 刘栋. 某型无人机地面飞控站的设计与实现[C]. 西北工业大学硕士学位论文,2007.

[2] 于歌, 刘刚. 小型无人机地面监控系统软件设计与实现[J]. 机械与电子,2007.

[3]MSDN Library Visual Studio 6.0[J].USA:Microsoft Corporation,1991.

[4] 梁普选.Visual C++ 程序设计与实践[M].清华大学出版社,2006.

[5] 孔鹏.Visual C++6.0 完全自学手册[M].机械工业出版社,2007.

[6]

TAG: 监控系统 接口 软件 无人机
上一篇 下一篇

论文发表 论文投稿 热点图片