基于OpenGL的无人机三维仿真训练系统
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2 O penGL 基础知识
OpenGL 是一个硬件图形发生器的软件接口 ,它包括了 100 多个图形操作函数 ,开发者可以利用这些函数来构造景 物模型 ,进行三维图形交互软件的开发 。以下是 OpenGL 在 计算机屏幕上绘制出三维场景的基本步骤 :
1) 根据基本图形单元建立景物模型 ,并且对所建立的 模型进行数学描述 。
— 38 —
}; 其中指针 pVerts、pNormals、pTexVerts、pFaces分别指向 读入的三维模型的顶点链表 、法向量链表纹理 、UV 坐标链 表 、对象的面信息链表 ,这些信息用于在场景中绘制三维模 型 。CLoad3DS类的成员函数将 3DS文件中的有关信息读入 并存入相应的链表 ,随后就可以根据链表中的信息绘制模 型 。下面是绘制三维模型的示意性代码 ,这些代码位于函数 RenderScene ( )中 。 glBegin ( ) / /绘制开始 “循环读取对象的顶点 法向量 纹理 UV坐标 ”;
3 3D S模型的读取与绘制
3DS文件由许多块组成 ,每个块首先描述其信息类别 , 即该块是如何组成的 。块的前两项信息分别是 :块的 ID 和 块的长度 (也即下一块相对于该块的字节偏移量 ) ,块的信息 类别用 ID来识别 。每个块实际上是一个层次结构 ,不同类 型的块 ,其层次结构也不相同 。 3DS文件中有一个基本快 , 其 ID 是 4D4D ,每一个 3DS文件的开头都是由这样一个块构 成的 。基本块内的块成为主块 。每个主块又包含各自的子 块。
第 23卷 第 11期 文章编号 : 1006 - 9348 ( 2006) 11 - 0039 - 03
计 算 机 仿 真
2006年 11月
基于 O penGL 的无人机三维仿真训练系统
樊崇斌 ,卢京潮 ,吴春英
(西北工业大学自动化学院 ,陕西 西安 710072)
摘要 :针对无人机模拟飞行训练的需要 ,提出一种基于 OpenGL (开放图形库 )的无人机三维仿真训练系统解决方案 :用三维 图形开发软件 (如 3DMAX)制作无人机三维模型 ,在 V isual C + +中利用一定的图形算法将模型读入 OpenGL 场景 ,通过串 口获得遥控发射机输入的控制量后 ,用龙格 - 库塔方法的矩阵形式求解无人机状态方程以得到无人机状态量 ,最后在 Open2 GL场景中仿真无人机的飞行状态 ,如实地反映出无人机的飞行特性 。给出了具体的实现方法 ,设计了仿真界面 。 关键词 :开放图形库 ;三维仿真 ;无人机 ;龙格 - 库塔方法 中图分类号 : TP391. 9 文献标识码 : A
— 37 —
图 1 O penGL 基本操作过程
OpenGL中有两个函数可以实现模型的平移和旋转 ,它 们是平移 变 换 函 数 void glTranslate { fd} ( TYPE x, TYPE y, TYPE z) ,三个函数参数就是目标分别沿三个轴向平移的偏 移量 ;旋转变换函数 void glRotate{ fd} ( TYPE angle, TYPE x, TYPE y, TYPE z) 函数中第一个参数是表示目标沿从点 ( x, y, z)到原点的方向逆时针旋转的角度 ,后三个参数是旋转的 方向点坐标 。
下面定义 3DS文件的读入类 CLoad3DS,这个类主要用 于处理 3DS文件中的各种块 ,如对象块 、纹理块 、材质块等 , 类中主要的函数有 :
bool Import3DS ( ) ,装入 3ds文件到模型结构中 ; void ProcessNextM aterialChunk ( ) ,读下一个材质块 ; void ReadVertices( ) ,读对象的顶点 ; void ReadVertexIndices( ) ,读对象的面信息 ; void ReadTexture ( ) , 读对象的纹理坐标 ; void ComputeNormals( ) ,计算对象顶点的法向量 。 还有一个重要的数据结构 ,定义了三维模型的有关信 息: struct t3DObject
UAV’s 3D S im ula tion Tra in ing System Ba sed on O penGL
FAN Chong - bin, LU J ing - chao,WU Chun - ying
(Automatic Institute, Northwestern Polytechnic University , Xi’an Shanxi 710072, China)
求解状态方程涉及到矩阵运算 ,为此在 V isual C + +中 新建一个类 class M atrix,定义如下 :
class M atrix
{p rivate:
int Rows; int Columns;
p ub lic: M atrix ( ) ; M atrix (M atrix A ) ; V irtual ~M atrix ( ) ; Friend M atrix &operator 3 (M atrix A , M atrix B ) ; / /该 函数完成矩阵的乘法运算 Friend M atrix &operator + ( M atrix A , M atrix B ) ; / / 该函数完成矩阵的加法运算
目前大多数的模拟训练系统一方面没有加入飞机状态 方程 ,难以全面反映飞机的特性 ;另一方面多以键盘而不是 训练中实际使用的遥控发射机作为输入控制 ,缺乏真实性 。 本文通过实时解算无人机状态方程 ,可以更好的仿真无人机 的飞行状况 ;通过串口读取由遥控发射机发出的指令 ,作为 无人机小扰动状态方程的控制量 ,可以达到更好的训练效 果。
2) 把视景模型放在三维空间合适的位置 ,并且设置视 点以观察感兴趣的场景 。
3) 计算模型中所有物体的颜色 ,其中的色彩根据应用 要求来确定 ,同时确定光照条件 、纹理映射方式 。
4) 把景物模型的数学描述及其色彩信息转换至计算机 屏幕的像素 ,这个过程就是光栅化 。OpenGL 基本图形操作 过程如图 1 所示 。
1 引言
在试飞阶段 ,利用操作手对无人机进行遥控飞行 ,是完 成无人机起飞 、降落和系统调试的主要手段 ,也是在可视范 围内控制无人机的重要方式 。遥控飞行对操作手遥控水平 的要求很高 ,训练一名出色的操作手需要大量的训练 ,如果 使用真无人机训练 ,其风险和代价将十分高昂 。用三维仿真 系统进行模拟训练是国内外通常采用的有效方法 。OpenGL 是一个开放式的针对图形硬件的三维图形软件包 ,具有良好 的平台无关性 ,开发者可以利用它来建立三维模型和进行三 维实时交互 ,从而实现所谓的“虚拟的真实 ”,所以多采用 OpenGL 进行无人机三维仿真 [2 ] 。
} 无人机状态方程的求解可以采用矩阵形式的四阶龙格 - 库塔方法 ,算法表示如下 :
xi+1
=
xi
+
h 6
( k0
+ 2k1
+ 2k2
+ k3 )
(3)
其中 : k0 = A xi + B ui,
k1
= A ( xi +
h 2
k0 )
+ B ui,
k2
= A ( xi +
h 2
k1 )
+ B ui,
glEnd ( ) 这样就实现了 3DS模型的读取与绘制 。
4 无人机状态方程的求解
无人机全状态方程阶次较高 ( 9阶 ) ,求解起来运算量太 大 ,难以满足实时性要求 。一般情况下 ,由于无人固定翼飞 机纵向运动和侧向运动之间耦合较小 ,所以可以将全状态方 程分解为纵向和横侧向两组方程来分别研究 ,这样可以减小 状态矩阵阶数 ,从而大大降低运算量 。本文中所提及的某型 无人机由状态方程分析和实际数字仿真来看 ,其纵向运动和 侧向运动之间的耦合极小 ,甚至可以忽略不计 ,因此也从纵 向和侧向两方面来分别研究 。
无人机纵向状态方程 :
xz = A z xz + B z uz
(1)
yz = Cz xz + D z uz
wk.baidu.com
其中 xz = ( v,α,ωz , ; ) T
yz = ( v,α,ωz , ; ) T
uz = (δz ,δp )
V、α、ωz、; 、δz、δp分别表示速度 、迎角 、俯仰角速度 、俯仰
角 、偏航角 、方向舵偏角 、副翼偏角 。升降舵面偏角 、油门开
度 、方向舵偏角 、副翼偏角作为输入量 。这些输入量由遥控发
射机通过串口传递给 PC机 ,在 V isual C + + 中读取发送过 来的输入量 ,再解算无人机状态方程从而得出无人机的运动 状态 ,包括无人机的姿态信息和速度信息 。整个过程如图 2 所示 。
ABSTRACT:A imed at UAV ’s(Unmanned Aero Vehicle) simulation training field, a scheme of 3D simulation sys2 tem based on OpenGL (Open Graphic L ibrary) is designed in this paper. The UAV ’s 3D model made by the 3D de2 velopment software , such as 3DMAX is read into OpneGL scene and the control input of radio transm itter too. The UAV ’s flying states are got by solving the state equation and are simulated in the OpenGL scene very vividly. The ways and means are p resented and the simulation interface is designed. KEYW O RD S:OpenGL; 3D simulation; UAV; Runge - Kutta
{ int numOfVerts; / /模型中顶点的数目 int numOfFaces; / / 模型中面的数目 int numText; / / 模型中纹理坐标数目 int materialID; / / 纹理 ID bool bHasTexture; / /是否具有纹理映射 char strName[ 255 ]; / / 对象的名称 CVector3 3 pVerts; / / 对象的顶点链表 CVector3 3 pNormals; / /法向量链表 CVector2 3 pTexVerts; / / 纹理坐标链表 tFace 3 pFaces; / / 对象的面信息链表
收稿日期 : 2005 - 09 - 17
由于 OpenGL只提供了一些简单的图元函数 ,直接利用 这些函数来构建复杂模型比较困难 [3 ] 。所以本文将 OpenGL 和其它功能强大的三维建模软件 (如 3DM ax)相结合 ,利用一 定算法 ,将三维建模软件创建的模型数据读出来 ,然后利用 这些数据在 OpenGL环境中重新构建三维模型 ,大大简化了 无人机三维建模过程 。
k3 = A ( xi + hk2 ) + B ui ,步长 h = 20m s。
图 3 程序流程
图 2 系统结构
5 O penGL 模型的控制
在 V isual C + +中利用 W in32 App lication 生成工程 Real Control,进入“Project”菜单 , 选 择“Setting”项 , 弹出“Project Setting”对 话 框 , 选 择“L ink ”项 , 在“L ibrary”栏 目 中 加 入 OpenGL提供的函数库 :“opengl32. lib glu32. lib glaux. lib”。 (注 意 : 在 执 行 程 序 时 , W indow s 的 system 目 录 下 要 包 含 opengl32. dll及 glu32. dll两个动态连接库 。整个程序的流程 如图 3所示 。
角 、升降舵面偏角 、油门开度 ;
无人机横侧向状态方程 :
xc = A c xc + B c uc
(2)
yc = Cc xc + D c uc
其中 xc = (β,ωx ,ωy ,γ)
yc = (β,ωx ,ωy ,γ)
uc = (δx ,δy )
β,ωx ,ωy ,γ,δx ,δy 分别表示侧滑角 、滚转角速度 、滚转
OpenGL 是一个硬件图形发生器的软件接口 ,它包括了 100 多个图形操作函数 ,开发者可以利用这些函数来构造景 物模型 ,进行三维图形交互软件的开发 。以下是 OpenGL 在 计算机屏幕上绘制出三维场景的基本步骤 :
1) 根据基本图形单元建立景物模型 ,并且对所建立的 模型进行数学描述 。
— 38 —
}; 其中指针 pVerts、pNormals、pTexVerts、pFaces分别指向 读入的三维模型的顶点链表 、法向量链表纹理 、UV 坐标链 表 、对象的面信息链表 ,这些信息用于在场景中绘制三维模 型 。CLoad3DS类的成员函数将 3DS文件中的有关信息读入 并存入相应的链表 ,随后就可以根据链表中的信息绘制模 型 。下面是绘制三维模型的示意性代码 ,这些代码位于函数 RenderScene ( )中 。 glBegin ( ) / /绘制开始 “循环读取对象的顶点 法向量 纹理 UV坐标 ”;
3 3D S模型的读取与绘制
3DS文件由许多块组成 ,每个块首先描述其信息类别 , 即该块是如何组成的 。块的前两项信息分别是 :块的 ID 和 块的长度 (也即下一块相对于该块的字节偏移量 ) ,块的信息 类别用 ID来识别 。每个块实际上是一个层次结构 ,不同类 型的块 ,其层次结构也不相同 。 3DS文件中有一个基本快 , 其 ID 是 4D4D ,每一个 3DS文件的开头都是由这样一个块构 成的 。基本块内的块成为主块 。每个主块又包含各自的子 块。
第 23卷 第 11期 文章编号 : 1006 - 9348 ( 2006) 11 - 0039 - 03
计 算 机 仿 真
2006年 11月
基于 O penGL 的无人机三维仿真训练系统
樊崇斌 ,卢京潮 ,吴春英
(西北工业大学自动化学院 ,陕西 西安 710072)
摘要 :针对无人机模拟飞行训练的需要 ,提出一种基于 OpenGL (开放图形库 )的无人机三维仿真训练系统解决方案 :用三维 图形开发软件 (如 3DMAX)制作无人机三维模型 ,在 V isual C + +中利用一定的图形算法将模型读入 OpenGL 场景 ,通过串 口获得遥控发射机输入的控制量后 ,用龙格 - 库塔方法的矩阵形式求解无人机状态方程以得到无人机状态量 ,最后在 Open2 GL场景中仿真无人机的飞行状态 ,如实地反映出无人机的飞行特性 。给出了具体的实现方法 ,设计了仿真界面 。 关键词 :开放图形库 ;三维仿真 ;无人机 ;龙格 - 库塔方法 中图分类号 : TP391. 9 文献标识码 : A
— 37 —
图 1 O penGL 基本操作过程
OpenGL中有两个函数可以实现模型的平移和旋转 ,它 们是平移 变 换 函 数 void glTranslate { fd} ( TYPE x, TYPE y, TYPE z) ,三个函数参数就是目标分别沿三个轴向平移的偏 移量 ;旋转变换函数 void glRotate{ fd} ( TYPE angle, TYPE x, TYPE y, TYPE z) 函数中第一个参数是表示目标沿从点 ( x, y, z)到原点的方向逆时针旋转的角度 ,后三个参数是旋转的 方向点坐标 。
下面定义 3DS文件的读入类 CLoad3DS,这个类主要用 于处理 3DS文件中的各种块 ,如对象块 、纹理块 、材质块等 , 类中主要的函数有 :
bool Import3DS ( ) ,装入 3ds文件到模型结构中 ; void ProcessNextM aterialChunk ( ) ,读下一个材质块 ; void ReadVertices( ) ,读对象的顶点 ; void ReadVertexIndices( ) ,读对象的面信息 ; void ReadTexture ( ) , 读对象的纹理坐标 ; void ComputeNormals( ) ,计算对象顶点的法向量 。 还有一个重要的数据结构 ,定义了三维模型的有关信 息: struct t3DObject
UAV’s 3D S im ula tion Tra in ing System Ba sed on O penGL
FAN Chong - bin, LU J ing - chao,WU Chun - ying
(Automatic Institute, Northwestern Polytechnic University , Xi’an Shanxi 710072, China)
求解状态方程涉及到矩阵运算 ,为此在 V isual C + +中 新建一个类 class M atrix,定义如下 :
class M atrix
{p rivate:
int Rows; int Columns;
p ub lic: M atrix ( ) ; M atrix (M atrix A ) ; V irtual ~M atrix ( ) ; Friend M atrix &operator 3 (M atrix A , M atrix B ) ; / /该 函数完成矩阵的乘法运算 Friend M atrix &operator + ( M atrix A , M atrix B ) ; / / 该函数完成矩阵的加法运算
目前大多数的模拟训练系统一方面没有加入飞机状态 方程 ,难以全面反映飞机的特性 ;另一方面多以键盘而不是 训练中实际使用的遥控发射机作为输入控制 ,缺乏真实性 。 本文通过实时解算无人机状态方程 ,可以更好的仿真无人机 的飞行状况 ;通过串口读取由遥控发射机发出的指令 ,作为 无人机小扰动状态方程的控制量 ,可以达到更好的训练效 果。
2) 把视景模型放在三维空间合适的位置 ,并且设置视 点以观察感兴趣的场景 。
3) 计算模型中所有物体的颜色 ,其中的色彩根据应用 要求来确定 ,同时确定光照条件 、纹理映射方式 。
4) 把景物模型的数学描述及其色彩信息转换至计算机 屏幕的像素 ,这个过程就是光栅化 。OpenGL 基本图形操作 过程如图 1 所示 。
1 引言
在试飞阶段 ,利用操作手对无人机进行遥控飞行 ,是完 成无人机起飞 、降落和系统调试的主要手段 ,也是在可视范 围内控制无人机的重要方式 。遥控飞行对操作手遥控水平 的要求很高 ,训练一名出色的操作手需要大量的训练 ,如果 使用真无人机训练 ,其风险和代价将十分高昂 。用三维仿真 系统进行模拟训练是国内外通常采用的有效方法 。OpenGL 是一个开放式的针对图形硬件的三维图形软件包 ,具有良好 的平台无关性 ,开发者可以利用它来建立三维模型和进行三 维实时交互 ,从而实现所谓的“虚拟的真实 ”,所以多采用 OpenGL 进行无人机三维仿真 [2 ] 。
} 无人机状态方程的求解可以采用矩阵形式的四阶龙格 - 库塔方法 ,算法表示如下 :
xi+1
=
xi
+
h 6
( k0
+ 2k1
+ 2k2
+ k3 )
(3)
其中 : k0 = A xi + B ui,
k1
= A ( xi +
h 2
k0 )
+ B ui,
k2
= A ( xi +
h 2
k1 )
+ B ui,
glEnd ( ) 这样就实现了 3DS模型的读取与绘制 。
4 无人机状态方程的求解
无人机全状态方程阶次较高 ( 9阶 ) ,求解起来运算量太 大 ,难以满足实时性要求 。一般情况下 ,由于无人固定翼飞 机纵向运动和侧向运动之间耦合较小 ,所以可以将全状态方 程分解为纵向和横侧向两组方程来分别研究 ,这样可以减小 状态矩阵阶数 ,从而大大降低运算量 。本文中所提及的某型 无人机由状态方程分析和实际数字仿真来看 ,其纵向运动和 侧向运动之间的耦合极小 ,甚至可以忽略不计 ,因此也从纵 向和侧向两方面来分别研究 。
无人机纵向状态方程 :
xz = A z xz + B z uz
(1)
yz = Cz xz + D z uz
wk.baidu.com
其中 xz = ( v,α,ωz , ; ) T
yz = ( v,α,ωz , ; ) T
uz = (δz ,δp )
V、α、ωz、; 、δz、δp分别表示速度 、迎角 、俯仰角速度 、俯仰
角 、偏航角 、方向舵偏角 、副翼偏角 。升降舵面偏角 、油门开
度 、方向舵偏角 、副翼偏角作为输入量 。这些输入量由遥控发
射机通过串口传递给 PC机 ,在 V isual C + + 中读取发送过 来的输入量 ,再解算无人机状态方程从而得出无人机的运动 状态 ,包括无人机的姿态信息和速度信息 。整个过程如图 2 所示 。
ABSTRACT:A imed at UAV ’s(Unmanned Aero Vehicle) simulation training field, a scheme of 3D simulation sys2 tem based on OpenGL (Open Graphic L ibrary) is designed in this paper. The UAV ’s 3D model made by the 3D de2 velopment software , such as 3DMAX is read into OpneGL scene and the control input of radio transm itter too. The UAV ’s flying states are got by solving the state equation and are simulated in the OpenGL scene very vividly. The ways and means are p resented and the simulation interface is designed. KEYW O RD S:OpenGL; 3D simulation; UAV; Runge - Kutta
{ int numOfVerts; / /模型中顶点的数目 int numOfFaces; / / 模型中面的数目 int numText; / / 模型中纹理坐标数目 int materialID; / / 纹理 ID bool bHasTexture; / /是否具有纹理映射 char strName[ 255 ]; / / 对象的名称 CVector3 3 pVerts; / / 对象的顶点链表 CVector3 3 pNormals; / /法向量链表 CVector2 3 pTexVerts; / / 纹理坐标链表 tFace 3 pFaces; / / 对象的面信息链表
收稿日期 : 2005 - 09 - 17
由于 OpenGL只提供了一些简单的图元函数 ,直接利用 这些函数来构建复杂模型比较困难 [3 ] 。所以本文将 OpenGL 和其它功能强大的三维建模软件 (如 3DM ax)相结合 ,利用一 定算法 ,将三维建模软件创建的模型数据读出来 ,然后利用 这些数据在 OpenGL环境中重新构建三维模型 ,大大简化了 无人机三维建模过程 。
k3 = A ( xi + hk2 ) + B ui ,步长 h = 20m s。
图 3 程序流程
图 2 系统结构
5 O penGL 模型的控制
在 V isual C + +中利用 W in32 App lication 生成工程 Real Control,进入“Project”菜单 , 选 择“Setting”项 , 弹出“Project Setting”对 话 框 , 选 择“L ink ”项 , 在“L ibrary”栏 目 中 加 入 OpenGL提供的函数库 :“opengl32. lib glu32. lib glaux. lib”。 (注 意 : 在 执 行 程 序 时 , W indow s 的 system 目 录 下 要 包 含 opengl32. dll及 glu32. dll两个动态连接库 。整个程序的流程 如图 3所示 。
角 、升降舵面偏角 、油门开度 ;
无人机横侧向状态方程 :
xc = A c xc + B c uc
(2)
yc = Cc xc + D c uc
其中 xc = (β,ωx ,ωy ,γ)
yc = (β,ωx ,ωy ,γ)
uc = (δx ,δy )
β,ωx ,ωy ,γ,δx ,δy 分别表示侧滑角 、滚转角速度 、滚转