毕业论文-基于QT的飞行模拟软件设计与实现_第1页
毕业论文-基于QT的飞行模拟软件设计与实现_第2页
毕业论文-基于QT的飞行模拟软件设计与实现_第3页
毕业论文-基于QT的飞行模拟软件设计与实现_第4页
毕业论文-基于QT的飞行模拟软件设计与实现_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、大连东软信息学院本科毕业设计(论文)系 所: 电子工程系 专 业: 电子信息工程(嵌入式系统工程方向) 学生姓名: 学生学号: 指导教师: 导师职称: 教 授 完成日期: 2014年 5月 2日 大连东软信息学院Dalian 大连东软信息学院毕业设计(论文) 摘要 - 38 -第1章绪 论1.1 课题研究背景航模科技涉及航空、机械、电子、控制等多方面,是航天事业的基础。它具有尺寸小、重量轻、经济性良好等特点,在监察灾情、巡视交通以及航空测绘等方面应用广泛。随着光学研究、计算机理论以及传感器应用理论的日益普及,航模科技得到广泛发展。三维航模系统的位姿显示一直是航模业研究设计的一大焦点,航模飞行器

2、的位置和姿态通过电子设备被人们所追踪和研究,系统的构建和利用能为其稳定飞行提供相关的导航控制信息,定位要求具有稳定性、精确性、实时性和抗干扰性。竞赛用航模、车模、船模的飞速发展更是对航模电子系统提出了更高的要求,因此,三维航模位姿显示追踪技术一直是值得国内外航模界研究的课题,位姿参数也成为近年来飞行器和航模领域的研究热点之一。1.2 课题研究目的、意义三维航模无论在生活和生产活动中都有广泛应用。作为休闲娱乐的工具可以陶冶情操,同时它也可以代替人类从事一些生产和航空拍摄的工作,如也可以用它进行航空拍摄。其主要应用领域有地理测绘、农林业、军事以及灾情控制等方面。军事应用微型无人飞行器在现代军事中得

3、到广泛应用,并且发挥了良好的效果。相对于大型无人机,航模由于体积较小具有灵活性好、隐蔽性强,较难被雷达发现等特点,在侦查领域备受关注。灾情控制航模可以用于在地震、火灾等自然灾害中寻找遇难者和幸存者。它机动灵活可以进行多维度拍摄,有效的弥补了大型机的不足,可以第一时间传输第一手资料,体现出了卓越的优越性。航空模型运动不同于玩具,它是科学性较强,涉及知识面较广,适合广大少年特点,深受青少年喜爱的一项科技体育活动。它融知识性、技能、娱乐、竞技、健身、使用为一体。航模玩家在设计飞行器的时候必须调整陀螺仪的稳定性,因此需要获取陀螺仪的变化数据。拟设计一个基于QT的飞行模拟软件,此软件可以为航模爱好者提供

4、一个省时、省钱的工具。软件功能包括初始化模块,用户设置模块,串口通信模块和模拟飞行模块。要求系统获取数据准确率高,模拟飞行显示效果良好,图形用户界面友好,可扩展性良好。有利于科学兴趣的建立,有利于知识、信息的灌输和积累,有利于各种能力的培养。1.3 课题研究现状国外对航模的研究较早并取得了巨大的成功。美国、英国和法国是最早开展航空模型运动的国家,也是目前航空领域处于领先地位的国家。一些国外研究机构相继开展了航模位姿的研究,并取得了一定的成果。加州大学伯克利分校的无人机研究小组BEAR的Sharp C.S.等人提出一种基于投影关系,应用点信息来求解航模位姿方法。南加州大学嵌入式机器人实验室的 S

5、aripalli S.等人利用通过区域信息,经计算得到地面标志相对航模的位姿参数。国外航模业的蓬勃发展也使得我国航模产业如火如荼的发展壮大,其中以吉林振华和广东奥迪为代表的航模尤为瞩目。吉林振华主要研发航模的遥控设备,集科研开发和生产无线电遥控产品为一体,也是我国首家批量生产航模设备的企业。对于航模位姿,国内多所大学进行了深入的研究,其中吉林大学的刘小杰博士提出了一种对于飞行器的视觉位姿参数估计工程处理方法。由于该项目存在一定的娱乐性,尤其是在航模爱好者中尤为突出,其能够自行的对于飞行器的稳定性做出调整,这样更能对航模飞行这一行有深入了解。而且目前市场上这一软件并不开放源码,与其他软件不同之处

6、就是自己能够对于飞行稳定调控,没有必要去专业性的机构进行维修与维护。1.4课题研究内容与方法项目主要是研究陀螺仪的数据处理、位姿变化和显示等问题,为构建三维航模的控制与显示做好前期的基础积累和探索。本文所设计的系统主要是采集三轴陀螺仪的位姿数据,并对采集到的数据进行滤波,进行相应的数据分析和坐标转换。将数据打包之后通过RS232串口发送到电脑端。电脑端通过QT编写UI程序显示陀螺仪的位姿变化。本文是对嵌入式系统相关技术的综合和全面运用,也对电脑端三维显示方式做了一定的工作,同时为以后相关工作的研究做一定的参考。1.5论文组织结构本文研究的系统要做一个能够用可视化的界面来接受MPU6050陀螺仪

7、状态数据的软件。该系统设计方案:硬件部分的设计,软件部分的设计。硬件部分的设计:通过MPU6050模块去连接51单片机,通过串口来连接主机和单片机。软件部分的设计:利用QT程序设计一个3D模型,利用C+写驱动程序代码,设计一个QT界面,软件系统可初始化,3D模型可根据用户设置进行改变。本文主要从七部分展开,第一部分是绪论,主要阐述一下课题的背景、意义,研究目的现状等,并简单阐述了课题的研究内容和方法。第二章是关键技术的介绍,主要说明陀螺仪的应用方法和三维显示的方法。第三章对系统的需要进行分析。第四、五章是本文的最重要内容,为系统设计和实现。第六章是系统测试部分,第七章对全文进行总结。大连东软信

8、息学院毕业设计(论文)第2章关键技术介绍2.1 陀螺仪概述陀螺仪是一种利用角运动检测的装置。由于相对惯性空间绕正交于自转轴存在一个或二个轴的角运动,主要原理是科里奥利力原理。陀螺仪主要用来测量一个或几个轴运动的角速度,在科学、军事、生活等各个方面有着广泛的应用。陀螺仪还可以用来跟踪并捕捉三维空间的完整运动。在三维航模的位姿监测便使用了陀螺仪。陀螺仪可以分为电子式陀螺仪和机械式陀螺仪。当前电子式的陀螺仪应用比较广泛。电子式陀螺仪又细分为压电陀螺仪,光纤陀螺仪和激光陀螺仪等。陀螺仪可以用于飞机航模运动的自动控制系统中的水平、垂直、俯仰、航向和角速度的监测任务。在对飞机模型的三维航模位姿检测中,主要

9、是通过对三轴方向上的角速度进行检测,就能判别出航模的运动方向。常用的运动方向检测包括 X方向,Y方向,Z方向,即通常所说的三轴角速度传感器,也称三轴陀螺仪。系统设计中使用的传感器设备是MPU-6050,该模块集成了3 轴 MEMS陀螺仪,3 轴MEMS加速度计,并且带有一个可以扩展的数字运动处理器。MPU-6050内部的陀螺仪和加速度计分别使用了16位的ADC转换器,可以实时的精确的将模拟量转化为数字量。其接口为I2C,通过这个接口把数据送入处理器。MPU-6050的QFN封装如下图2.1所示:图2.1 MPU6050QFN封装2.2 OpenGLWindows下的两大3D建模显示工具为Dir

10、ect3D和OpenGL。Direct3D是微软的产品。而OpenGL是一款开源的产品,OpenGL是一个性能卓越的三维图形标准,最近几年发展较为迅速。相对于微软的Direct3D,OpenGL具有自己独特的优势。OpenGL是业界公认的标准,比Direct3D功能更加丰富,而且图像质量要高许多。所以说OpenGL是行业领域中被最为广泛接纳的 2D/3D 图形设计 API, 而且基于OpenGL已经设计出数千款优秀应用程序软件。用OpenGL设计的软件产品包含CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业各个领域中,程序员们使用OpenGL实现了在Windows和Lin

11、ux电脑、服务器、工作站等硬件平台上的视觉表现力强大的图形处理软件的开发。OpenGL是一个开放的三维图形软件包,包括了多个重要的函数,它独立于操作系统和桌面环境,并且与硬件无关,可以无需修改的在Linux下和Windows平台下运行,并且使用简便、高效。OpenGL具有以下主要的功能:(1)建模功能OpenGL绘图函数库提供了基本的点、线和面等图形的绘制函数,而且还可以通过OpenGL绘制负责的三维模型,比如球形,复杂曲面,多面体,贝塞尔曲线等。(2)变换功能OpenGL提供的变换功能有平移、旋转和镜像等基本变换,也包括投影变换,能够实现平行投影和透视投影两种变换。(3)颜色和模式设置功能O

12、penGL主要提供了两种颜色和模式设置,为RGAB模式和颜色索引模式。RGBA模式可以为每个像素点指定具体的颜色,可以提供较为丰富的色彩效果。而对于显示能力不足的硬件,则可以使用颜色索引模式。(4)光照和材质设置功能在现实生活中,物体受到光照射和自身因素的影响,比如吸收,反射等,会呈现出不同的颜色。OpenGL的光照和材质设置有辐射光、环境光、漫反射光和镜面光,能够较好的还原显示色彩。(5)纹理映射功能OpenGL的纹理映射可以通过贴图的方式,为物体表面贴上真实的色彩花纹。我们利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节。(6)位图显示和图像增强功能为了使三维图形更加逼真,具有真

13、实感,需要处理半透明或者透明的物体图像,这就需要OpenGL的融合技术。而且OpenGL还可以模拟自然界中的雾化效果,具有图像增强功能。(7)双缓存功能出色的动画效果是OpenGL的一大优势之处,具有很强大的双缓存功能实现动画设计。双缓存即是前台缓存和后台缓存,前台和后台缓存交替显示缓存图像,可以让图像显示更加自然真实。第3章系统需求分析3.1 系统设计目标本文主要实现一个演示系统,能够通过采集陀螺仪模块的状态,使用OpenGL技术显示3D飞机航模的位姿变化。飞机航模的姿态能够实时的反映在计算机显示界面上。通过此演示系统,我们可以更加迅速、高效、便捷的追踪航模的位姿变化。此演示系统对于航模实际

14、应用有重大的意义。它可以使得我们实现对航模的追踪,从科研上,对于我们研究航模位姿变化有重要的意义,同时也可应用于工业实践,给我们的生产生活带来很多便捷。3.2 系统功能需求根据需求调研结果确定本系统的主要功能模块。本控制系统是一个具有单输入单输出的系统,输入信号是MPU-6050的姿态检测信号,对于这些信号的处理和控制需要采用数据处理模块;输出信号包括由单片机发出的串口数据信号,该信号按照一定的协议打包成数据,数据要加校验码,防止在传输的过程中出错。传输的数据用于测量航模位姿。电脑端需要编写软件来接受串口发送过来的数据,并将模型的位姿显示出来。功能性需求主要有: (1)飞机模型在上电前要进行初

15、始化等工作,保证位姿和角度等信息能够与3D模型显示状态相一致。(2)陀螺仪能够采集飞机模型的位姿变化状态信息,并将信息滤波,计算出陀螺仪的角度变化情况。单片机将数据按照既定的协议打包,通过串口发送。(3)飞机模型能够与电脑之间通过串口进行通信,通信协议需要由数据头,数据帧和校验三部分组成。(4)电脑端需要由Qt编写3D显示程序,程序调用OpenGL三维模型库来构建显示模型。(5)系统软件通过电脑串口接收数据,可以通过软件选择打开的串口号,以及选择波特率等。(6)三维显示软件需要显示陀螺仪模块的姿态变化。并且可以放大或者缩小模型,可以使用鼠标对模型进行转动操作。(7)三维显示窗口上需要显示姿态角

16、度的具体参数信息。根据系统功能性需求的分析,我们将系统分为下面几个模块:(1)数据采集模块数据采集模块是采集陀螺仪的信息,滤波打包之后将信息通过串口发送。(2)传感器模块传感器模块即为MPU6050陀螺仪和其基本工作电路。(3)数据传输模块数据传输模块为数据采集模块与电脑直接通过RS-232串口传送数据。数据传送需要一定的协议。(4)数据显示模块数据显示模块即为飞机模型的3D显示。3.3 系统非功能需求(1)性能本系统采用陀螺仪具有数据噪声小,短时间内误差小的特点。MPU-6050是集陀螺仪和加速度计于一体,本身具有可扩展的数字运动。在本系统中使用卡尔曼滤波的方式对系统状态量的估计和加速度计测

17、量得到的值,对3D航模的状态进行验证,从而得到最优的状态量,并可以实时的更新系统参数。能够实时的通过3D显示陀螺仪位姿的变化。(2)成本主要器件和成本如下表3.1所示:表3.1 主要器件和成本元器件价格(元)MPU-60502051单片机5外围电路5串口线10还需要一台Windows或者是Linux系统的电脑,系统安装模型显示程序。3.4 系统开发环境 (1)采集处理模块Keil软件是目前最流行开发MCS-51系列单片机的软件,Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。Keil

18、C51软件的程序主界面如图3.1所示。图3.1 Keil软件主界面在源程序编译好之后,若编译和调试通过,我们便可以将程序烧入单片机中。如果我们使用KeilC51软件仿真,会可以生成一个HEX后缀的文件,这就是我们烧录需要的文件。(2)显示模块软件界面设计使用QT技术,Qt是一个1991年由奇趣科技开发的跨平台C+图形用户界面应用程序开发框架。Qt是面向对象语言,易于扩展,并且允许组件编程。2008年,Qt被诺基亚公司收购,2012年诺基亚宣布将Qt软件业务出售给芬兰IT服务公司Digia。Qt是一个跨平台应用程序和UI开发框架。使用Qt只需要一次性开发应用程序,无须重新编写源代码,便可以跨不同

19、的桌面和操作系统部署应用程序。Qt具有一个强大的无缝对象通信机制信号(Signals)和槽(Slots)的机制。信号和槽可以使两个对象之间方便的通信,这也是Qt不同于其他开发框架的最突出的特征。这个机制也增加了程序开发的效率。Qt Creator是跨平台的 Qt IDE, Qt Creator 是 Qt 被 Nokia 收购后推出的一款新的轻量级集成开发环境(IDE)。此 IDE 能够跨平台运行,支持的系统包括 Linux(32 位及 64 位)、Mac OS X 以及 Windows。根据官方描述,Qt Creator 的设计目标是使开发人员能够利用 Qt 这个应用程序框架更加快速及轻易的完

20、成开发任务。Qt Creator 包括项目生成向导、高级的 C+ 代码编辑器、浏览文件及类的工具、集成了 Qt Designer、Qt Assistant、Qt Linguist、图形化的 GDB 调试前端,集成 qmake 构建工具等。整个软件系统的构建即是基于这个IDE平台的。第4章系统设计4.1 系统设计指导原则系统设计的指导原则可以概括为准确度、可靠性、稳定性和直观性。准确性和可靠性保证系统能够可靠的运行,不能出现错误数据,要保证整个系统持续稳定的运行。直观性需要保证显示方面,能够直观的显示系统的状态,并对某些参数实时的显示。4.2 体系结构设计系统体系架构如图4.1所示。图4.1 系

21、统体系架构4.3 硬件设计4.3.1 单片机与外围存储器连接电路设计单片机即单片微型计算机,是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。现在的单片机种类很多,生产单片机的公司也很多,但是和MCS-51系列的单片机基本是兼容的,都是在Intel的8051的内核基础上发展起来的。本文使用STC公司的单片机STC89C52单片机,这款单片机实用性比较强,具有众

22、多的优点,而且可以通过串口直接下载程序。如果需要单片机开始正常工作,则需要一个最小的外围电路,这就是所谓的单片机最小系统。其构成的电路也很简单,如图4.2所示:图4.2 单片机最小系统有了对单片机管脚的基本认识,我们再来研究一下单片机最小系统外围电路基本构成:(1)晶体振荡电路XTAL1和XTAL2引脚分别是芯片内振荡器的输入端和输出端。51单片机的时钟有两种方式:一种是片内时钟振荡方式,需要XTAL1和XTAL2接晶体振荡器和两个30pF的电容;另一种方法是使用外部时钟的方式,即外部输入信号需要从XTALI引脚中输入,而XTAL2引脚悬空。一般我们常用的是使用晶振和两个电容并联以产生工作时钟

23、,其线路接法如图4.3所示。图4.3 时钟接线方式一般晶振的频率可在212MHz之间任意选择,对外接电容来说,也没有严格的要求,但是电容的大小会影响振荡频率的高低、振荡器的稳定、起振的快速性。外接晶体振荡器时,一般选用30PF的电容。并且需要注意的是在焊接电路或者是印刷电路板的时候,晶振和电容应尽可能安装得与单片机芯片靠近,这样可以保证系统更稳定的工作。(2)复位电路复位电路分为上电复位和人工复位两种。上电自动复位是指系统在上电时提供复位信号,直到系统电源稳定后撤销复位信号。对于51单片机来说,只要在RST复位端接一个电容到VCC和一个电阻到VSS(即低电平)即可。除了上电复位外,在单片机运行

24、的过程中,如果出现问题我们就需要人工复位。在上电复位的基础之上,我们在RST和VCC之间安装一个弹跳开关就可以实现一个比较简单的人工复位电路。当在51的RST复位引脚上有一个超过两个机械周期的高电位脉冲时,单片机就会被置位。(3)31号引脚EA当EA=0时,则只使用片外的ROM,也就是说当我们使用的单片机扩展了外部程序存储器的时候,必须将EA端接地。但是在一般情况下,我们仅仅使用单片机内部的存储器(51系列为4K,52系列为8K),所以此引脚一般直接接电源电压VCC就可以了。(4)供电电路单片机的供电系统和其他芯片类似,需要+5V电压供电。管脚20接地,管脚40接+5V。4.3.2 陀螺仪传感

25、器采集陀螺仪MPU6050的输出接口为I2C。因为51单片机没有SPI接口,就需要用软件模拟I2C的时序。因此在电路连接上,只需要把I2C的SCL与SDA与单片机的两个管脚连接即可。如图4.4所示。图4.4 MPU6050外围接线方式MPU-6050 有主 I2C 接口和辅助 I2C 接口两种接口,主 I2C 接口与微处理器STC89C52单片机相连,MPU-6050 作为从设备。下面主要介绍一下主 I2C 接口: I2C 接口是一个二线接口,包括串行数据线(SDA)和串行时钟线(SCL)。连接到 I2C 接口的设备可做主设备或从设备。主设备将 Slave 地址传到总线上,从设备用与其匹配的地

26、址来识别主设备。当连接到系统芯片时,MPU-6050 总是充当从设备。MPU-6050 的 SDA 和 SCL 信号线通常需要接上拉电阻到VDD。 I2C 总线的最大总线速率为 400kHz。 MPU-6050 的 Slave 地址为 b110100X, 7 位字长,最低有效位 X 由 AD0 管脚上的逻辑电平决定。这样就可以允许两个 MPU-60X0连接到同一条 I2C 总线,此时,一个设备的地址为 b1101000(AD0 为逻辑低电平),另一个为 b1101001(AD1 为逻辑高)。4.3.3 数据传输使用电脑和传感器模块进行通信,首先我们需要接触的部件是计算机的接口。目前,用于计算机

27、出输入/输出接口有串行接口和并行接口两类。两种串口的主要区别是并行接口一次传输多个字节,串行接口一次则只能传送一个字节。计算机上面的串行接口有RS-232型(COM)接口,通用串行总线接口(USB),IEEE 1394接口。并行接口有LPT打印机接口等。各种不同类型的接口有不同的传输速率,用于不同的通信要求。我们利用电脑的RS232串口与下层的控制系统进行通信,传输所需要的控制指令并且可以接受反馈信息。51 单片机内部有一个全双工串行接口。一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位

28、地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。RS-232是美国电子工业协会EIA(Electronic Industry Association)制定的一种串行物理接口标准。在许多单片机的应用中都会使用到串行口与电脑的串行口相连接,进行数据的传输或控制命令的发送与接收。单片机的串口有很大一部分是使用TTL电平标准的,它的逻辑1电平是5V,逻辑0电平是0V,而电脑串行口所使用的是RS232的电平标准,它的逻辑1电平是-3V-12V,逻辑0电平是+3V+12V。两者的电平范围相差很远,所以连接时需要用到电平转换电路。这样电路有好多种

29、,一般来说商业化的成品会用到MAX232,DS275等专用的RS232、TTL电平转换集成电路。由于我们使用的51单片机的管脚电平为TTL,单片机与RS-232 标准的串行口进行通信时,首先要解决的便是电平转换的问题。系统使用MAX232转换芯片对电平进行转换。MAX232 芯片内部集成了电压倍增电路,单电源供电即可完成电平转换,而且工作电压宽,3V5.5V 间均能正常工作。其典型应用如图中所示,其外围所接的电容对传输速率有影响,在试验套件中采用的是0.1F。如图4.5所示。图4.5 MAX232原理图计算机相连的DB-9 型RS-232的引脚结构如图4.6所示。图4.6 DB-9连接器接口其

30、各管脚定义如下表4.1所示。表4.1 DB-9型接口管脚定义针号功能说明缩写1数据载波检测DCD2接收数据RXD3发送数据TXD4数据终端准备DTR5信号地GND6数据设备准备好DSR7请求发送RTS8清除发送CTS9振铃指示DELL在系统通信中,我们只需要连接三根线就可以实现串口通信:接受数据RXD,发送数据TXD,信号地SG。三根线分别与单片机的TXD,RXD,GND连接就可以实现串口通信。串口通信的设置,一个主要的参数是波特率。这是一个衡量符号传输速率的参数。它表示每秒钟传送的符号的个数。例如300波特表示每秒钟发送300个符号。我们在实际的使用过程中一般使用9600和115200等数值

31、。而波特率的数据位,校验位和停止位一般设置为8个数据位,没有校验位和一个停止位。4.4 软件设计4.4.1 控制流程设计程序的设计流程图如图4.7所示,程序启动之后,首先需要配置串口,设置串口的波特率、校验位和停止位等信息。配置完成之后打开串口,通过串口采集由传感器模块发送过来的角度信息。采集到的信息为滚动角(Roll)、俯仰角(Pitch)和偏航角(Yaw)。图4.7 程序设计流程图采集到滚动角(Roll)、俯仰角(Pitch)和偏航角(Yaw)三个参数之后,需要进行参数转换,转换成四元数。然后进行三维模型显示。4.4.2 UI界面设计系统的UI界面设计主要包括主界面,串口配置界面和场景界面

32、三部分。如图4.8所示:图4.8 UI界面设计系统启动之后首先进入主系统界面。主界面比较简单,为了美观性,增加一张背景图片,还有两个button按钮。两个按钮控件分别为串口配置和场景显示。串口配置按钮连接的槽函数为打开串口设置界面。场景显示按钮的槽函数为打开场景显示界面。如图4.9所示。图4.9 主界面点击串口按钮之后进入串口设置界面。串口的设置包括设置串口号,设置波特率,设置校验位、数据位和停止位。如图4.10所示。图4.10 串口设置界面串口号、波特率等参数的配置均为QComboBox控件,点击控件的下拉列表框,会对应相应的参数选项。确定按钮为一个PushButton控件,点击确定之后关闭

33、该窗口。返回主窗口之后,点击场景按钮,会显示飞机模型的3D视图显示窗口。如图4.11所示。图4.11 场景显示界面窗体的左侧为配置信息显示部分,为一系列QCheckBox控件,控件前面有一个单选按钮,选中即为是,不选即为否。用来设置是否选择模型,是否全屏显示视图,是否显示坐标轴等信息。右侧为该窗体的主要部分,显示飞机模型的视图,3D视图上可以实时的显示姿态四元数和姿态角等信息。4.4.4 功能模块设计(1)串口数据接收串口数据的接收主要包含两部分,打开串口和串口数据解析。在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类来进行串

34、口编程。我们在windows下只需要使用其中的6个文件:qextserialbase.cpp和qextserialbase.h,qextserialport.cpp和qextserialport.h,win_qextserialport.cpp和win_qextserialport.h。接收到串口发送来的数据,需要根据协议进行数据解析,数据协议为,如表4. 2所示。表4.2 串口定义(2)姿态角转换姿态角结算时所使用的坐标系为东北天坐标系,正方向放置模块,向左为X轴,向前为Y轴,向上为Z轴。欧拉角表示姿态时的坐标系旋转顺序定义为为z-y-x,即先绕z轴转,再绕y轴转,再绕x轴转。滚转角的范围虽

35、然是180度,但实际上由于坐标旋转顺序是Z-Y-X,在表示姿态的时候,俯仰角(Y轴)的范围只有90度超过90度后会变换到小于90度,同时让X轴的角度大于180度。由于三轴是耦合的,只有在小角度的时候会表现出独立变化,在大角度的时候姿态角度会耦合变化,比如当X轴接近90度时,即使姿态只绕X轴转动,Y轴的角度也会跟着发生较大变化,这是欧拉角表示姿态的固有问题。可见,直接用欧拉角变量建立的数学模型难以用于大姿态角飞行仿真。目前也已经有很多改进的姿态解算方法,如改进的Rodriguez(MRP)、方向余弦矩阵(DCM)以及四元数等,其中四元数法参数简洁,计算方便,因而在姿态求解中获得广泛应用。因为姿态

36、解算需要频繁组合旋转和用旋转变换向量,所以采用四元数保存组合姿态、辅以矩阵来变换向量的方案。欧拉角表示姿态的视图,如图4.12所示。图4.12 欧拉角表示姿态视图四元数表示的姿态视图,如图4.13所示。图4.13 四元数表示姿态试图欧拉角到四元数的转换,如图4.14所示。图4.14 欧拉角与四元数的转换四元数到欧拉角的转换,如图4.15所示。图4.15 四元数到欧拉角的转换欧拉角转换成四元数之后,便可以在基于Qt的OpenGL下显示模型的姿态。(3)模型显示OpenGL有一个跨平台的用来渲染3D图形的标准API。Qt中提供了QtQpenGL模块,从而很轻松的实现了在Qt应用程序中使用OpenG

37、L。这主要是在QGLWidget类中完成的。QGLWidget提供了三个方便的虚函数,可以在子类中通过重新实现他们来执行典型的OpenGL任务。其中主要的三个函数是:initializeGL()注册函数,在此设置GL的渲染绘制属性、定义显示列表、载入固定纹理等初始化工作。在initializeGL()在调用paintGL()之前只被调用一次,之后不再调用。paintGL()绘制函数,在此使用OpenGL中的接口进行场景绘制,QGLWidget的paintEvent( QPaintEvent* )将会自动调用 paintGL()进行部件的显示绘制。也可在需要重绘时通过updateGL()时调用p

38、aintGL()。resizeGL()该函数用于处理当部件大小发生改变时,对OpenGL绘图管线各矩阵需要进行的操作。该函数paintGL()第一次调用之前,initializeGL()调用之后被第一次被调用,之后每当QGLWidget的不见大小发生改变时,都将调用该函数来对视图、投影矩阵等进行相应的设置。大连东软信息学院毕业设计(论文)第5章系统实现5.1环境配置该系统的运行需要一定的外部环境。首先为保证单片机的运行,需要5V直流电源供电,可以使用电脑的USB转串口直接供电。但是USB的输出电流最大为500mA,左右建议使用直流5V供电。QT的运行需要QT运行库,如果之前没有安装过Qt开发环

39、境,则需要复制一些必要的动态链接库到系统可执行文件的目录下。主要的库文件有libgcc_s_dw2-1.dll、mingwm10.dll、QtCore4.dll、QtOpenGL4.dll、QtGui4.dll等。如果安装过Qt开发环境,那么可以不复制库文件。找到安装Qt的目录,如C:Qt4.7.2bin,找到这个目录之后,将这个目录加入到系统的Path环境变量中,这样程序就可以直接运行了,系统运行的时候自动找到bin目录下的dll文件。具体做法是,右击“计算机”,在弹出的菜单上选择“属性”,然后在弹出的系统属性对话框中选择“高级”一项。单击“编辑”弹出编辑系统变量对话框,在变量值的最后添加上

40、“;C:Qt4.7.2bin”,主要不要拉下最前面的英文的分号,然后点击确定就可以了。电脑端与数据采集模块之间需要用USB转串口线连接。5.2功能模块实现5.2.1数据采集部分该数据采集模块已经集成了处理器,模块可以通过串口输出陀螺仪姿态信息,也可以通过SCL、SDA直接通过SPI接口输出陀螺仪的原始信息。如下图5.1所示。如果模块的波特率设置成115200,则数据采集模块的数据输出频率是100Hz,如果波特率设置成9600,则数据的输出频率是10Hz。图5.1 数据采集模块5.2.2串口通信部分因为很多笔记本上已经没有串口,所以我们需要USB转串口模块。下面的模块就可以实现这个功能,将USB

41、协议转换成RS232串口协议。如图5.2所示。查看我们使用的是几号COM端口的方法是:右键点击我的电脑,选择管理,选择左侧栏的设备管理器,然后我们就可以在右边的选项中找到我们使用的端口是几号端口了。图5.2 串口模块5.2.3视图显示部分视图显示部分主要由三个。启动视图、串口配置窗口和场景视图。如图5.3,5.4,5.5所示。图5.3 启动视图图5.4 串口配置窗口图5.5 场景视图5.3代码实现5.3.1 Qt串口使用Qt是跨平台程序解决方案,又因为串口是电脑上的硬件设备,需要和硬件交互,在windows平台下和linux平台下的代码是不共用的。在这里说明如何在windows平台下使用串口进

42、行通信。在QtCreator工程下添加上面的六个文件。在mainwindow.h的相应位置添加头文件#include win_qextserialport.h,添加对象声明Win_QextSerialPort *myCom;添加槽函数声明 void readMyCom();。串口的使用流程如图5.6所示。图5.6 串口流程图具体的实现方式为在mainwindow.cpp的类的构造函数中添加如下语句。 MainWindow:MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui:MainWindow)ui-setupUi(this)

43、;struct PortSettings myComSetting = BAUD9600,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,500;/定义一个结构体,用来存放串口各个参数myCom = new Win_QextSerialPort(com1,myComSetting,QextSerialBase:EventDriven);/定义串口对象,并传递参数,在构造函数里对其进行初始化myCom -open(QIODevice:ReadWrite);/以可读写方式打开串口connect(myCom,SIGNAL(readyRead(),this,SLOT(readMyCom

44、();/信号和槽函数关联,当串口缓冲区有数据时,进行读串口操作串口的基本设置为:(1)BaudRateType BaudRate;波特率设置,我们设置为9600,即程序中用BAUD9600;(2)DataBitsType DataBits;数据位设置,我们设置为8位数据位,即DATA_8;(3)ParityType Parity;奇偶校验设置,我们设置为无校验,即PAR_NONE;(4)StopBitsType StopBits;停止位设置,我们设置为1位停止位,即STOP_1;(5)FlowType FlowControl;数据流控制设置,我们设置为无数据流控制,即FLOW_OFF;(6)l

45、ong Timeout_Millisec;延时设置,我们设置为延时500ms,即500;设置打开串口1,并且设置串口的属性。打开串口之后,将串口的信号和槽函数关联,当串口缓冲区有数据时,进行读串口操作。槽函数为readMyCom()。然后在readMyCom()函数中添加如下代码。void MainWindow:readMyCom() /读串口函数QByteArray temp = myCom-readAll();/读取串口缓冲区的所有数据给临时变量temp这样整个串口发送过来的数据就被保存到了QByteArray temp中。在windows下支持事件形式的串口交互,当有数据进入串口缓冲区之

46、后,触发串口的可以读信号readyRead(),槽函数readMyCom()使用readAll()来接受串口缓冲区中的数据,保存到变量中。5.3.2 串口数据接收Qt的串口在槽函数readMyCom()中接收到数据之后,需要根据协议的约定对数据进行解析,才可以使用数据。如图5.7所示。图5.7 信号与槽关系图对于连续发送来的数据,首先要寻找数据帧头,即0 x55,0 x53,连续监测到这两个数据之后,连续接收后面的9个数据,完整一整包的数据接收。接收完之后首先要通过校验和校验数据的正确性,保证数据才传输的过程中没有出现错误。然后根据协议,将高低字节的两组数据组合成一个16位的数据,完整整包数据

47、的解析。具体实现代码如下:void GLWidget:readComm() QByteArray recvbuf; double Angle3; QByteArray temp = myCom-readAll(); recvbuf.append(temp); static const char SOIData=0 x55,0 x53; QByteArray SOIstr=QByteArray:fromRawData(SOIData,sizeof(SOIData); int SOIPos=0; if(SOIPos=recvbuf.indexOf(SOIstr)!= -1) if(SOIPos+1

48、1=recvbuf.size() QByteArray ba; ba=recvbuf.mid(SOIPos,SOIPos+11);/校验 int sum= 0; for(int i=0;i10;i+) char a = (char)bai; sum+=(int)a; if(char)sum = ( char)ba10) Angle0 = (short( unsigned char)ba38|( unsigned char)ba2)/32768.0*180; Angle1 = (short( unsigned char)ba58|( unsigned char)ba4)/32768.0*180;

49、 Angle2= (short(unsigned char)ba78|( unsigned char)ba6)/32768.0*180; ba.clear(); recvbuf.remove(0,SOIPos+11); 解析完成之后在数组Angle中即保存了姿态角的三个数值。为之后的数据转换和显示做好准备。5.3.3 模型显示部分程序实现(1)欧拉角与四元数的转换代码根据之前公式的介绍,可以归纳为下面的转换代码。void Quaternion:fromAngle(float yaw, float pitch, float roll) float sin_yaw2 = sin(yaw/90);

50、float cos_yaw2 = cos(yaw/90); float sin_pitch2 = sin(pitch/90); float cos_pitch2 = cos(pitch/90); float sin_roll2 = sin(roll/90); float cos_roll2 = cos(roll/90); / m_value0 =( cos_roll2*cos_pitch2*cos_yaw2 + sin_roll2*sin_pitch2*sin_yaw2); m_value1 =(sin_roll2*cos_pitch2*cos_yaw2 - cos_roll2*sin_pit

51、ch2*sin_yaw2); m_value2 = (cos_roll2*sin_pitch2*cos_yaw2 +sin_roll2*cos_pitch2*sin_yaw2); m_value3 = (cos_roll2*cos_pitch2*sin_yaw2 -sin_roll2*sin_pitch2*cos_yaw2); yam_ = yaw; pitch_ = pitch; roll_ = roll;(2)三维模型的OpenGL初始化三维模型的OpenGL初始化主要为initializeGL()函数,此函数为注册函数,只执行一次。主要用来设置GL的渲染绘制属性、定义显示列表、载入固定纹

52、理等初始化工作。void GLWidget:initializeGL() glClearColor(0.5,0.5,0.5,1.0f); glEnable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH); glEnable(GL_MULTISAMPLE); / 光滑。 glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); / / 线优先,把线向前偏移。 glEnable(GL_POLYGON_OFFSET_FILL); glPolygonMode(GL_FRONT, GL_F

53、ILL); glPolygonOffset(0.6,1.1); / 开启光源。 glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); / 光源位置。 static GLfloat lightPosition4 = 1e6,1e6,1e6,1.0; glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); / 光源颜色,白色。 const GLfloat light0_ambient4 = 1.0,1.0,1.0,1.0; const GLfloat light0_diffuse4 = 1.0,1.0,1.0,1.0;

54、const GLfloat light0_specular4 = 1.0,1.0,1.0,1.0; glLightfv(GL_LIGHT0,GL_AMBIENT,light0_ambient); glLightfv(GL_LIGHT0,GL_DIFFUSE,light0_diffuse); glLightfv(GL_LIGHT0,GL_SPECULAR,light0_specular); / 启动计时器。 m_timer.setInterval(30); connect(&m_timer,SIGNAL(timeout(),this,SLOT(every30ms(); m_timer.start

55、();(3)三维模型的显示在之前的关于OpenGL的介绍中,我们了解到paintGL()绘制函数,在此使用OpenGL中的接口进行场景绘制。void GLWidget:paintGL() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); / 加载视角矩阵。 m_glView.useViewMatrix(); / 画世界坐标系的坐标轴。 if(m_needDisplayWorldAxes) m_worldAxes.draw(); if(m_needDisplayWall) m_axesWall.draw(); / 画轨迹。 m_transla

56、tionTrace.draw(); / 画四轴飞行器。 / 先平移,然后乘上姿态矩阵。 if(m_needDisplayModel | m_needDisplayModelAxes) glPushMatrix(); glTranslatef(m_position0,m_position1,m_position2); Quaternion tmp; tmp = m_attitude; tmp.inversion(); float mat16; tmp.toMatrix(mat); glMultMatrixf(mat); if(m_needDisplayModel) quadcopter.draw

57、(); if(m_needDisplayModelAxes) m_modelAxes.draw(); glPopMatrix(); (4)三维模型的更新重绘resizeGL()该函数用于处理当部件大小发生改变时,对OpenGL绘图管线各矩阵需要进行的操作。void GLWidget:resizeGL(int width, int height) m_glView.resize(width,height);该函数调用类GLView的对象m_glView。GLView类主要用于视图的显示。5.4 系统集成与调试将USB转串口模块插到USB串口上,将陀螺仪数据采集模块与通信模块的相应接口连接。打开电

58、脑终端的模型姿态显示软件。首先配置串口,将波特率设置为115200,然后打开串口。然后点击场景按钮,这样,我们就可以实时的观察陀螺仪的姿态信息。调试过程中可能会出现串口打开失败的情况,这时候需要我们查看这个USB转串口在系统下映射出的串口号是多少,查看软件中的串口号的设置是否正确。如果串口号设置也正确,可以把USB转串口从电脑上拔下来,插到另一个USB接口上试试,因为有时候USB接口松动导致接触不好。如果从电脑的设备中查看串口号是大于10的,建议修改串口号,因为USB转串口的映射出的串口号如果比较大,会出现接收数据不稳定的情况。有时候Qt的串口打开失败,这个时候可以使用其他的串口调试助手先打开

59、串口试验一下是否可以接收到陀螺仪的数据,然后关闭串口,再使用Qt模型显示程序打开串口,这时候便可以显示数据。因为有时候Qt的串口类兼容性不是很好,可能会出现这种问题。大连东软信息学院毕业设计(论文)第6章系统测试搭建完整个系统之后,还需要对系统进行测试,以保证系统的稳定运行。本章主要对系统进行测试,主要内容包括测试概述和测试方案两部分。6.1 测试概述系统测试,英文是System Testing。是将已经确认的软件、计算机硬件、外设、网络等其他元素结合在一起,进行信息系统的各种组装测试和确认测试,系统测试是针对整个产品系统进行的测试,目的是验证系统是否满足了需求规格的定义,找出与需求规格不符或

60、与之矛盾的地方,从而提出更加完善的方案。该系统的测试方案主要包含三部分,开机测试,通信测试和模型显示测试。旨在综合测试模块的性能和软件的显示能力。6.2 测试方案6.2.1 开机测试系统开机测试用例如表6.1所示。表6.1 系统开机测试编号测试项操作步骤预期结果输入数据实际结果结果比较说明001系统开机对系统加电系统有10秒初始化时间,初始化陀螺仪,然后默认进入数据输出模式有在10秒初始完成后,输出数据符合002初始化测试上电静止10秒计算三个轴输出角度数据为0有三个轴的数据都接近0符合系统开机测试主要测试陀螺仪的初始化情况。模块上电以后需先保持静止,模块内部的处理器会在模块静止的时候进行自动

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论