无人机飞行仿真系统设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第28卷第7期 兵工自动化 Vol. 28, No. 7 2009年7月 Ordnance Industry Automation Jul. 2009

·80·

doi: 10.3969/j.issn.1006-1576.2009.07.028

无人机飞行仿真系统设计

李大雨,刘新文,汪新兵

(防空兵指挥学院 靶机教研室,河南 郑州 450052)

摘要:采用三维建模工具(如3DS MAX 等)建立无人机模型,然后利用VC++将提供的图形函数读入到OpenGL 所绘制的飞行场景中。由遥控发射机发出控制指令,通过计算机串口输入,控制无人机完成各种动作,从而实现无人机飞行状态的仿真。

关键词:无人机;三维模型;串口;仿真系统 中图分类号:N945.13; V279 文献标识码:A

Design for UAV Flight Simulation System

LI Da-yu, LIU Xin-wen, WANG Xin-bing

(Staff Room of Target Drone, Air Defense Forces Command Academy, Zhengzhou 450052, China)

Abstract: Use 3D modeling tools to build Unmanned Aerial Vehicle (UAV) model, then, by adopting VC++, the offering graphical function was read into flight scene that OpenGL plotted. UAV flight simulation can be realized through the following steps: the telecontrol transmitter sent control instructions, which later was inputted through serial ports of computers, thereby, actions of UAV could be fulfilled.

Keywords: UAV; 3D model; Serial port; Simulation system

0 引言

利用开放式图形函数库(OpenGL )提供二维和三维建模、光线处理、投影变换、纹理映射等功能,可显示三维物体运动仿真画面。故提出无人机飞行三维仿真系统的设计方法,并以Visual C++和OpenGL 作为编程工具,将3DS 格式的三维飞机模型文件读入到飞行场景中,以仿真飞机的飞行特性。

1 无人机三维模型的读取

OpenGL 通过基本的几何图元—点、线及多边形来建立三维立体模型,比较繁琐。目前有许多优秀的三维图形软件如3DS MAX 、AUTOCAD 等,可方便地建立物体模型。把这些模型(3DS 格式)读取到OpenGL 中,再对其控制则是较理想的方法。

3DS 文件由许多块组成,每块首先描述其信息类别,即该块如何组成。块的前两项信息分别是块的ID 和块的长度(也即下一块相对于该块的字节偏移量),块的信息类别用ID 来识别。每个块实际上是一个层次结构,不同类型的块,其层次结构也不相同。3DS 文件中有一个基本块,其ID 是4D4D ,每个3DS 文件的开头都是由这样一个块构成的。基本块内的块成为主块。每个主块又包含各自的子块。

在OpenGL 中读取3DS 格式文件,可分为两步:文件内容的读入和3D 对象的绘制。

1) 文件内容的读入

根据3DS 文件的结构定义,采用面向对象的技术,把3DS 文件对3D 模型的描述信息进行数据抽象,先定义一系列的结构(struct ),用于存放对象的材质、位置矢量、关键帧等,后定义用于处理3DS 文件对象的CTriObject 类和处理对象序列的CTriList ,最后定义3DS 文件的读入类C3dsReader ,用于将3DS 文件中的内容读入到上述2个对象中。

2) 3D 对象的绘制

通过C3dsReader 类可以把3DS 文件的信息读入到CTriObject 类的对象中,对象的绘制就是根据CTriObject 类中保存的信息,用OpenGL 绘图命令绘制出来,对象的外部形状主要是采用三角形来近

似的,并通过OpenGL 赋予对象材质、纹理等效果。

2 串口控制指令的输入与判别

为了和遥控发射机进行串行通信,必须进行串

口程序设计,主要包括以下步骤:

1) 加载MSComm 控件

在VC++主界面中,单击“工程”- >“添加工程”,选择“Components and Controls ”命令,在弹出对话框中,打开“Registered ActiveX Controls ”文件夹,选择“Microsoft Communications Control, Version 6.0”选项,单击“Insert ”按钮确认。

2) 在单文档接口(SDI )程序中使用控件 为了使创建的控件实例在整个程序中都可以访问,系统将其创建在视图类(CPlaneView )的实例

收稿日期:2009-01-03;修回日期:2009-02-26 作者简介:李大雨(1978-),男,安徽人,国防科技大学硕士毕业,从事遥控靶机研究。

李大雨,等:无人机飞机仿真系统设计

·81·

中,创建过程如下:

(1) 在视图类头文件PlaneView.h 中添加代码:

#include “mscomm.h”

//加入对MSComm 控件类头文件的引用 CMSComm myComm ;

//声明CMSComm 类的对象myComm Afx_msg void OnCommMscomm() ; //声明mycomm 控件事件的响应函数 DECLARE_EVENTSINK_MAP( ) //声明mycomm 控件的事件引用宏

(2) 在视图类的实现文件PlaneView.cpp 中,添加如下代码:

//myComm 控件引用宏的实现代码

BEGIN_EVENTSINK_MAP(CPlaneView, CView)

ON_EVENT(CPlaneView,myID,1,OnCommMscomm,VTS_NONE)

END_EVENTSINK_MAP()

(3) 在资源文件plane.rc2中添加如下代码:

#define myID 999

3) 初始化及打开串口

串口的初始化包括指定串口号、设置通信参数、指定接收缓冲区、设置数据获取方式及每次读取数据长度等内容,可根据需要合理配置,最后用代码myComm.SetPortOpen(1)打开串口。相关代码如下:

myComm.SetCommPort(1); //指定串口号

myComm.SetSettings("4800,n,8,1"); //通信参数设置

myComm.SetInBufferSize(512); //指定接收缓冲区大小

myComm.SetInBufferCount(0); //清空接收缓冲区

myComm.SetInputMode(1);

//设置数据获取方式(1为二进制方式,0为文本方式) myComm.SetInputLen(0);

//设置每次读取长度(0为全部读取)

myComm.SetRThreshold(3); //设置接收OnComm 事件门限值

myComm.SetPortOpen(true); //打开串口

4) 串口事件处理

串口事件处理包括实时接收串行数据、对数据格式进行判别,并产生相应的控制量等。利用控件的OnComm 事件接收数据,将接收到的VARIANT 类型的数据先转换成二进制类型,再转换为十六进制类型的数据,与预定义的指令编码格式相比较,从而产生相应的控制量。例如串口接收到的数据是"A5 DB 24",与系统预定义的指令格式比较,发现是“左盘旋”指令格式也为"A5 DB 24",则将无人机的横倾角度(plane_y_angle )设置为40,表明要控制飞机以40°的角度左转弯飞行。

3 无人机飞行状态的控制

无人机的飞行状态通过以下变量来控制: 1) 位置坐标(plane_x, plane_y, plane_z )

无人机位置由飞行速度结合转动角度来求得。其中:

plane_y=plane_y+sin(plane_z_angle)*plane_speed; //无人机位置的Y 坐标

plane_x=plane_x+cos(plane_z_angle)*cos(plane_y_angle )*plane_speed; //无人机位置的X 坐标

plane_z=plane_z-cos(plane_z_angle)*sin(plane_y_angle)*plane_speed; //无人机位置的Z 坐标

2) 机身转动状态(plane_x_angle, plane_y_angle, plane_z_angle )

机身转动状态由遥控发射机输入的指令来控制。其中第1个变量(plane_x_angle )为机身的横倾角度(绕飞机轴线的偏转角度),第2个变量(plane_y_angle )为无人机的航向偏转角度,第3个变量(plane_z_angle )为无人机的俯仰角度。

3) 速度(plane_speed )

速度的初始值为0,在飞行过程中速度的变化由加速度(speed_a )来调节。

(plane_speed=speed_a ) 4) 加速度(speed_a )

在飞行中,加速度由发动机的拉力或推力(plane_F)、空气阻力(plane_f)和无人机质量(plane _m)、所受重力(plane_G)及无人机俯仰角度(plane _z_angle)决定,可用公式Speed_a=[plane_F- plane_f - plane_G* sin(plane_z_angle)]/ plane_m 表示。

通过实时解算飞机状态方程,可仿真飞机的飞行状况。图1是飞机飞行仿真效果图。

图1 飞行仿真效果图

4 结束语

通过对飞机实体、飞行场景和飞行姿态的变化等进行仿真,创建了一个逼真的飞行仿真环境。

参考文献:

[1] Richard S. Wright. OpenGL 超级宝典[M]. 徐波, 译. 北

京: 人民邮电出版社, 2005: 9.

[2] 和平鸽工作室. OpenGL 高级编程与可视化系统开发[M].

北京: 中国水利水电出版社, 2006. 1.

[3] 向世明. OpenGL 编程与实例[M]. 北京: 电子工业出版

社, 1999: 9.

相关文档
最新文档