首页 > 范文大全 > 正文

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

开篇:润墨网以专业的文秘视角,为您筛选了一篇无人机地面监控系统软件的总体设计与接口实现范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要

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

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

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

1 系统功能设计及实现

随着无人机自驾系统和通信系统性能的不断提升,实现对无人机远程的监控已成为可能,地面监控系统软件就是实现无人机远程监控的平台,该系统采用Visual C++ 6.0和Microsoft 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。

2.1.2.1 对读串口数据的改进

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

2.1.2.2 彻底关闭串口,释放串口资源门

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

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

2.1.3.1 遥测数据接收流程

当串口接收缓冲区有数据时,程序就会产生一个WM_COMM-RXCHARX消息而触发OnComm()函数,开始接收遥测数据。首先进行帧头判别,如果帧头正确,则直接读取一帧数据,并根据帧头特征判定副帧号,然后进行校验,如果校验正确,则进行解码,提取帧中相应位置上的各种数据信息。

应当注意的是,遥测帧分为十二个副帧,相邻两帧的数据是完全不同的,所以必须注意防止缓冲区数据在未被处理完的情况下被下帧数据覆盖,一方面要提高遥测数据的处理速度,另一方面要开辟双缓冲区,不允许数据直接填充到正在处理的缓冲区。

2.1.3.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.2 高精度定时方法

高精确的定时操作,可以使用函数QueryPerformanceCounter()和QueryPerformanceFrequency(),其原理如下:

计算确切的时间是通过调用计时通过两次调用计时函数QueryPerformanceCounter()来计算精确的时间,计时函数的返回值是滴答数,通过频率换算就得到了从开始到结束的时间的秒数,计算机内部定时器的固定频率可通过调用函数QueryPerformanceFrequency()获取。该方法定时误差不超过1微秒,定时精度与CPU等计算机配置相关。

其计算公式如公式3-1所示:

Elapsed Time=(StopCounter一StartCounter)/Frequency (3-1)

考虑到无人机系统对实时性和可靠性的要求,在遥控数据发送程序设计了一种基于多线程技术的高精度定时器,关键代码如下所示: