网站首页  词典首页

请输入您要查询的论文:

 

标题 一种基于OSG的双旋翼直升机仿真系统与程序实现
范文 刘春+李翔 +王巍



摘要:介绍了一种共轴双旋翼直升机的仿真建模方法及系统开发,包括整机动力学计算方法、旋翼拉力计算方法、基本飞行控制方法、仿真系统的组成以及程序开发。在旋翼拉力计算中采用了动态入流理论实现了气动载荷的实时计算,并针对共轴双旋翼及机体的气动耦合性提出了修正方法。系统主体及可视化程序采用OSG开源项目开发,而动力学计算程序采用C++编程语言设计,系统不依赖于第三方商业软件,且具有研发效率高、可视化效果好和扩展性好等特点。
关键词:双旋翼直升机;空气动力学建模;OSG;计算机仿真
中图分类号:TP319
文章编号:16727800(2017)004008905
0引言
目前,直升机仿真系统特别是共轴双旋翼直升机仿真系统已经在国内外军事、商业、教育等诸多领域得到广泛应用,并取得了相关研究成果[1]。1985年英国南安普顿大学的MJ Andrew[2]利用自由尾迹模型研究了共轴双旋翼直升机旋翼的尾迹结构,并建立了悬停状态下双旋翼相互干扰的计算方法,但是由于预定尾迹模型的限制,该算法没能推广到其它飞行状态中;1990年加拿大的Valko[3]根据动量理论与叶素理论计算结果相同的原则通过迭代法获得了上下旋翼气动干扰模型,进而建立了轴向飞行和前飞状态下共轴无铰直升机的动力学模型,填补了之前的空白;2008年马里兰大学的Shreyas Ananthan和Leishman[4]利用动量叶素理论建立了悬停状态和垂向运动时共轴双旋翼的气动力模型,虽然两人未能考虑下旋翼对上旋翼的影响,却引领后来研究者普遍采用动量叶素的方法建立模型;2012年夏青云等[5]分析了变转速共轴双旋翼的载荷分布,采用动量叶素理论建立了悬停状态下共轴双旋翼的气动力模型。上述工作解决了各自的建模方法问题,但计算都十分复杂,计算量大很难实现实时解算。天津大学的于琰平[6]利用FlightGear建立了四旋翼无人机的三维可视化仿真系统,该系统使用了GUI界面实现了飞机仪表的开发,并利用C++实现了GUI界面与Flightgear之间的数据传输;吉林大学的吴文建在 MATLAB 中搭建了共轴刚性直升机的数学模型,联合 MATLAB 和 FlightGear[7]建立了共轴刚性直升机全数字视景仿真平台,并以 CFD 分析所得的旋翼参数作为模型参数进行了垂向运动和前飞状态下的联合仿真。 在直升机飞行仿真建模方面,旋翼拉力计算方法是关键,而空气入流速度计算是旋翼拉力计算的组成部分,其直接影响旋翼拉力计算结果,上述工作及其它公开资料主要采用均匀入流假设,其计算简单,但与实际情况存在一定差异;仿真的可信度取决于仿真模型准确度,而仿真模型需要采用有效的校正方法以符合实际情况、提高模型的准确度,但目前尚未见到有效的方法。针对上述问题,本文介绍了共轴双旋翼直升机仿真建模方法及系统开发,在旋翼拉力计算中采用了动态入流理论实现了气动载荷的实时计算,并针对共轴双旋翼及机体的气动耦合性提出了根据实验数据的修正方法。系统程序方面采用OSG开源高级图形库与C++语言开发,其不依赖于第三方软件,具有扩展性好、重用性高等特点。
1共轴双旋翼直升机数学模型
1.1动力学模型
共轴双旋翼直升机动力学仿真系统的核心问题就是建立动力学模型求解不同状态下目标直升机所受到的合力与合力矩,再通过力和力矩求解六自由度运动微分方程从而获得直升机的飞行状态。根据动量及动量矩定理,共轴双旋翼直升机的力和力矩及运动学方程表示如下:
在上述公式中,上下旋翼的合力与合力矩计算是难点。在这一方面有很多学者给出了计算方式,这些计算方式主要分为两种:一种是理论计算法,通过现有的力学、空气动力学等理论计算出双旋翼气动力;第二种是通过实验观察获得实验数据,并通过整理实验数据获得双旋翼气动力曲线。上述两种解算方式中,第一种方式的计算量过于庞大,第二种方式则太过于依赖实验,本系统采用叶素法并根据实验数据引入诱导速度干扰系数K修正结果,该算法首先需要将桨叶分为若干微段,每一段定义为一个叶素,并将每一段的力与力矩以微分的形式表达出来,其表达式如下:
其中,已知量为c桨叶弦长,dr叶素的宽度,ρ为当地空气密度,上述微分项通过積分可求解出旋翼气动力与力矩。其中的未知量CL、CD、CM分别为升力系数、阻力系数、力矩系数,‖Va‖为气动速度的幅值。这两个未知量都需要通过气动速度Va求解,其表达式如下:
上述数学模型由于是基于实际实验数据进行的拟合与求解,因此比单纯理论计算的精度要高,数据量相对较小,并且也不完全依赖于实验获得数据,因此也不会对实验条件有很高的要求,可以适应实时仿真的计算量要求。〖BT2〗〖WTHZ〗〖STHZ〗1.2基本控制模型〖HT〗〖WT〗〖ST〗本系统所用的姿态自动控制方法主要包括总矩控制、反扭矩控制与横纵向周期变矩控制。本系统的总矩控制用半差动控制,该控制方法上旋翼桨距角根据总矩变化进行调整。在总矩一定的情况下,根据上旋翼反扭矩情况再控制下旋翼桨距角从而实现上下旋翼的扭矩平衡。在该方案下,偏航控制也将使用半差动控制来实现,而由于下旋翼桨距角改变而产生的整体升力变化则交给上下旋翼共用的总矩控制,其中下旋翼桨距角调整量表达式如下:
其中,θ为当前偏航角与预期偏航角的差值,ω0为当前偏航角速度,α0为角加速度,Δɑ为下旋翼总矩调整量,a、b、c均为调整参数,需要根据机身x轴方向转动惯量及旋翼参数进行调整。仿真系统中的总矩控制与横、纵向周期变矩控制均主要分为辅助控制与手动控制两部分。其中总矩控制分为下降辅助控制与手动控制,横、纵向周期变矩控制则是在手动控制基础上增加了横向速度抑制控制与横纵向稳定控制。由于目标直升机旋翼半径较小、转速较高,并且仿真程序考虑了桨根处的反流区,所以在下降过程中桨根部分会出现较显著的升力损失,从而导致下降控制困难的问题。因此需要在总矩控制中增加下降控制,更好地限制下降速度,降低下降难度。基于上述原因,设计桨距角控制表达式如下:
2仿真系统结构
分析可知,仿真程序主要包含直升机动力学模型、旋翼动力学模型、机身动力学模型、起落架动力学模型、大气环境模型、姿态控制模型、飞行状态更新、视景显示更新系统,如图1所示。 共轴双旋翼直升机仿真系统可接收来自操纵杆、键盘、鼠标等设备的数据信号并通过接口程序转化为可被动力学模型调用的操纵数据与可被控制程序识别的基本命令。其中的基本控制指令会被控制程序读取,而操纵数据则会与当前大气环境信息一同输入到动力学模型中进行解算。如上节所述,通过解算动力学模型会得到直升机的力与力矩再根据这些力与力矩,便可以求解运动方程,从而得到直升机的运动情况。经过osg的图形处理显示到屏幕或其它输出设备上,同时会通过输出vs窗口记录下需要显示的所有数据信息,并将有用数据反馈给大气环境模型与控制程序从而形成闭环控制。
3仿真程序实现
3.1OSG平台及主程序实现
OSG(OpenSceneGraph)是一套基于OpenGL专为3D计算机图形学而开发的高级跨平台可编程接口[8]。作为一个通用的开源高级跨平台图形库,为用户提供了完整和独立的可视化功能,允许用户仿真程序与可视化程序分开。本系统采用OSG三维仿真平台开发,其OSG主程序代码如下:int main() { osgViewer::Viewer viewer;//创建场景浏览器 osg::ref_ptr root=new osg::Group();//创建根节点 osg::ref_ptrJDUAVNode=createModelNode(osg::Vec3(0.0f,0.0f,0.0f),osg::Vec3(1.0f,1.0f,1.0f),osgDB::readNodeFile("D:/Models/Helicopter/JDUAV_blurproxy.ive"),JDUAVName); //加载共轴双旋翼直升机可视化模型 osg::ref_ptrFireNode=createModelNode(osg::Vec3(0.0f,0.0f,0.0f),osg::Vec3(1.0f,1.0f,1.0f), osgDB::readNodeFile("D:/Models/Helicopter/fire.osg"),Fire_Name); //加载爆炸后的粒子烟火模型 root>addChild(model.get());//添加模型节点 root>addChild(createLights());// 添加全局光照 viewer.setSceneData(root.get());//节点添加到场景 osg::ref_ptr camera=new MyCamera();//添加视景漫游器 root>setEventCallback(new ControlCenter()); //回调函数 ………… return viewer.run();} 为了将各种模型与场景加载到视景之中,主程序通过PositionAttitudeTransform创建了一个根节点与若干叶节点,该命令用以创建空间变换节点,其中createModelNode为创建叶节点命令,其后括号内的命令用以设置该处加载模型的位置坐标、大小、模型储存路径及对象名称,然后将这些叶节点以子节点的形式添加到根节点之下,从而建立一个树状结构的场景逻辑关系;然后viewer.setSceneData(root.get())命令将根节点极其之下子节点加载到场景之中;最后通过定义视景漫游器与回调函数将程序计算的各种动力学与运动参数导入场景之中并将场景信息显示给用户。本程序自定义了一个名为MyCamera的场景浏览器,可实现视点的跟踪与手动转换等功能。通过root>setEventCallback(……)命令,创建事件监听回调函数,将ControlCenter程序中计算的六自由度运动参数导入到主程序中,更新各模型、特效、视点的位置与显示状态。
3.2程序主体类划分及程序实现
按照上文关于动力学建模的介绍,程序主体部分建立了主旋翼、翼型、机身、起落架、发动机、大气、重力等计算模块,此外还有汇总解算、数学函数模块。根据上述模块采用面向对象的方法设计类。考虑到程序的扩展与应用,设计了一些基类,并以此派生出具体机型的计算类,其具体划分与继承关系如图2所示。
在上述所划分模块中的A部分为总类完成动力学模型总体解算,其中的主体部分为JDUAV类也是整个仿真程序的最主要部分;B列从上到下依次为旋翼类与叶素类(左)、桨叶类共同完成旋翼动力学模型的解算;此外还有机身动力学模型解算类、姿态控制类及起落架动力学模型计算类分别对应机身动力学模型解算、姿态控制与起落架动力学模型计算。下面将分别对JDUAV类、主旋翼类与姿态控制类的程序定义进行简单说明。class JDUAV:public Helicopter{public: void initialize();//初始化所有部件的相关参数 void calculate(double deltaT);//重写动力学解算函数 void updateInput(......);//更新输入数据 private: JDUAVMainRotor mainRotorUp; //上旋翼 JDUAVMainRotor mainRotorDown;//下旋翼 JDUAVFuselage fuselage;//机身 JDUAVLandingGear forwardRightGear;//前右起落架 JDUAVOperateData operateData;//操纵器 JDUAVEnvironment atmosphere;//大气环境 }; 上述为JDUAV类的部分源代码,首先通过Initialize函数初始化所有部件的相关参数,其中首先需要初始化如当前时间(currTime)、质量矩阵(Mb)、姿态角(attitude)、某些坐标、速度、加速度、重力这些不变的参数。更重要的是需要创建如起落架(Gear)、尾推(Thruster)这种动力学计算对象,这样就可以实现程序的重用,从而简化程序。最后也会初始化如陀螺力矩、大气环境等计算类。 Calculate函数是该类的主体部分,首先需要记录系统运行时间,并判定直升机是否处于失控状态下,如果处于失控状态则转入失控状态动力学解算程序,如果没有失控则需要将一系列的当前状态数据导入到诸如大气环境解算、姿态控制等类中。并依次解算上下旋翼、机身、起落架、尾推的力合力矩以及重力与陀螺效应产生的力矩。然后计算合力与合力矩updateInput()函数为控制参数更新类,因为通过后续运行与实际考察发现,共轴双旋翼直升机在获得了飞行速度与航程优势的同时也导致了其稳定性的大幅度下降,同时在总矩,横、纵向周期变矩周期的操纵过程中存在着强烈的耦合。这导致直升機在做几乎所有机动动作时都存在不同程度的组合运动。这些耦合作用十分影响直升机的稳定性,因此在仿真系统中加入了多个辅助控制程序:横、纵向周期变矩控制,反扭矩控制,总矩控制等程序。上述程序就是在总类中姿态控制程序数据更新部分再根据1.2节中的控制模型即可完成直升机控制。 最后程序分别创建了直升机各动力学组件的对象,实现程序的重用,以供主程序调用。class JDUAVMainRotor :public MainRotor{public: void initialize(……);//重写初始化方法 void calculate(……);//重写动力学解算方法 void createBlades(int Nb);//生成桨叶对象 double getBeita(int bladeID);//获取桨叶的挥舞角,度private: double K; double theta00;}; 上述为主旋翼动力学解算类的定义程序,主旋翼部分程序首先通过Initialize函数初始化旋翼的各种物理参数及相关常量。然后定义了一个Calculate函数用于实时计算旋翼的气动力及力矩,具体算法参见第1节。 createBlades(int Nb)为创建桨叶对象,其中包含整形变量Nb表示所初始化桨叶的编号,该对象将会在程序中多次重用。getBeita(int bladeID)及之后省略的程序段定义了大量从桨叶中获取各种变量的传递函数,这些传递函数为了区分方便需分别在创建时保存其桨叶编号bladeID。 最后该程序定义了一些私有变量如诱导速度干扰系数(K)、初始桨距角(theta00)等。class HeliOperateData{ public: virtual void initialize(……) double getA1();//获取横向周期变距响应值,弧度 void setData(……);//设置输入量 protected: virtual void controlYaw(……);//偏航控制 virtual void controlPitch(……);//俯仰控制 virtual void controlRoll(……);//滚转控制 double DArrayn_Yaw,DArrayn_Pitch,DArrayn_Roll; //滚转,俯仰,偏航角速度}; 上述为姿态控制类的定义,该部分首先依靠Initialize初始化大量姿态控制函数与变量,随后定义了大量如getA1与setData的传递函数,用于将各种控制变量导入、导出其余各动力学结算类。 该类的主体部分为controlYaw、controlPitch、controlPitch3个函数,分别控制直升机的偏航、俯仰与滚转。程序最后定义了大量参量如滚转角速度DArrayn_Yaw、俯仰角速度DArrayn_Pitch、偏航角速度DArrayn_Roll等飞行状态数值。3.3系统运行结果

共轴双旋翼直升机仿真系统可实现直升机在起飞、降落、偏航、滚转、俯仰、平飞、悬停等飞行状态的仿真,具备自动降落、自动消除侧滑速度、自动悬停等自动飞行控制,同时也可以模擬直升机在不同风速、空气密度下的飞行。通过上述模拟飞行,本系统可帮助评估目标直升机的飞行性能,预测可能出现的设计问题,从而缩短设计周期,降低研究经费。该系统在某无人直升机的设计中进行了成功应用,用于评估飞机机身气动性能、旋翼气动性能和最大飞行速度等指标,其运行效果如图3所示。 为使用方便,右上角显示直升机坐标位置、运行时间、线速度、角速度、姿态角、直升机各气动组件力和力矩、操纵参数、大气数据等信息。并且在debug模式下运行程序可显示任何变量数据并以txt格式保存下来以供后续分析。 城市名之间使用英文逗号隔开,城市名和邮编之间使用一个英文空格隔开,不能用逗号。
4结语
本文研究了共轴双旋翼直升机的仿真建模方法及系统开发。在建模方法上,采用了先进的动态入流速度计算方法,并提出了一种气动耦合校正方法,保证了模型的相对准确性。在系统开发方面,采用OSG开源平台及面向对象技术,使系统开发效率高、扩展性及维护性好,摆脱了对第三方软件的依赖。该仿真系统具备了共轴双旋翼直升机的基本飞行及控制功能,具有一定通用性,可用于直升机设计及培训等领域。该系统在某无人直升机的设计中进行了成功应用。
参考文献:[1]陈铭.共轴双旋翼直升机的技术特点及发展[J].航空制造技术,2009(17): 2631.
[2]ANDREW M J.Coaxial rotor aerodynamics[D].England: Southampton University,1981.
[3]VAIKOV T.Aerodynamic loads computation on coaxial hingeless helicopter rotors[C].Canada.28th Aerospace Sciences Meeting,1990.
[4]GORDON LEISHMAN J.Figure of merit definition for coaxial rotors[J].Journal of The American Helicopter Society,2008,53(3):290300.
[5]夏青云,徐锦法.变转速共轴旋翼载荷建模及实验验证[J].实验力学,2012(4):432439.
[6]于琰平.基于Flight Gear的四旋翼无人机三维可视仿真系统研究[D].天津:天津大学,2010.
[7]吴文建.无人共轴刚性直升机气动特性分析及视景仿真研究[D].长春:吉林大学,2015.
[8]王锐,钱学雷.OpenSceneGraph三维渲染引擎设计与实践[M].北京:清华大学出版社,2009.
(责任编辑:孙娟)
随便看

 

科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。

 

Copyright © 2004-2023 puapp.net All Rights Reserved
更新时间:2024/12/23 3:13:43