基于Simulink与Unity3D的制导弹药弹道可视化仿真
2024-05-17谭哲卿辛长范史铭姗
谭哲卿,辛长范,阚 煌,高 鑫,史铭姗
(中北大学 机电工程学院,太原 030051)
0 引言
制导弹药一直是各国重点研究对象,为了节省实验经费,尽可能减少实弹射击次数,研发过程中需要进行大量的仿真实验,其中弹道仿真是研究制导弹药控制系统的重要手段[1-3]。早期常用的弹道仿真多为数值仿真[4-6],研究人员只能使用数值计算结果绘制二维的曲线来判断制导系统的性能。后来出现了比较直观的图形仿真,其使用数值计算结果给图形仿真提供真实的仿真数据。但是目前在弹道可视化研究中,常用的图形仿真方法较为简单,弹药与目标的三维模型比较简陋,作战场景设置得比较理想,大多只能观察制导弹药的飞行姿态,难以展现实战条件下制导弹药从发射到命中目标的全过程。
文献[7-10]在Simulink平台上搭建了制导弹药的六自由度弹道仿真模型并对可视化进行了一定研究,其使用的VRML、Vega Prime软件开发难度高、开发周期长、仅能表现出制导弹药飞行中的姿态,无法对战场环境进行模拟,文献[11]使用的MBVC平台虽能简单地表现战场环境,但场景搭建复杂、画面与现实世界差距较大。文献[12-13]使用了FlightGear、OpenGL作为可视化平台,但搭建过程复杂且缺少弹道的数值仿真部分。文献[14-17]虽然都使用了Unity3D进行可视化仿真,但其中文献[14]完全没有数值计算过程,仅仅是单纯的视景呈现。文献[15-16]的仿真模型部分较为简单,且文章中没有体现数值仿真的计算过程,使仿真的真实度打了一定折扣。文献[17]虽然有较为细致的数值计算过程,但其通过TXT文件将数值计算结果传递给Unity3D,总体仿真步骤较多,过程较为繁琐。
为弥补以上不足,本文选择Unity3D软件作为可视化平台,该软件是一款结合了图形、物理、音频、网络等多方面引擎的专业开发平台,从发布至今已有十余年历史,它的底层架构成熟、平台的稳定性高,成熟的案例较多、开发相对简单、开发周期短,图形技术先进、显示画面生动。本文选择的数值计算平台是在制导弹药弹道仿真中常用的Matlab/Simulink软件,文献[18-19]均进行了详细的研究分析。将Simulink和Unity3D结合起来的联合仿真模型能得到准确的数值仿真结果[20],也能多视角全方位的观察制导弹药的飞行姿态和弹道,从而较为逼真的展现战场环境下制导弹药的运动和对目标的探测和打击过程。
1 可视化系统的开发
本文的联合仿真系统包括Simulink软件中的制导弹药弹道仿真模型和Unity3D软件中的可视化窗口,前者包括描述制导弹药运动的六自由度动力学和运动学方程组,使用Simulink编程工具将方程组搭建为图形化的弹道仿真模型,搭建过程中使用Simulink自带的图形化用户接口,能够快速、准确地搭建仿真模型,且能保证仿真算法的可靠性[21]。可视化部分由Unity3D软件、制导弹药和目标的三维模型、真实世界的高程数据和卫星地图、驱动模型运动的脚本文件组成。Unity3D支持fbx、obj、dxf等多种格式的三维模型,用户可以根据需要添加弹药或目标的模型。本文使用AutoCAD建立制导弹药和目标的三维模型,对模型进行格式转换后再导入到Unity3D中。在Unity3D中使用真实世界的高程数据和卫星地图可以搭建出基于真实数据的三维场景模型,增添了可视化仿真的真实性。
Unity3D中的功能主要由脚本文件实现,脚本支持JavaScript、C#、Boo三种语言。本文中的脚本文件主要由C#语言写成,除了使用UDP通信协议处理Matlab/Simulink端发送来的仿真数据,还可以实现三维模型的移动、摄像机的移动、特效展现等功能。整个系统的架构如图1所示。
图1 可视化平台整体架构
本文在研究制导弹药六自由度弹道可视化仿真的基础上,创造性地加入一种数值可视化技术,在显示制导弹药弹道的同时,也能实时显示制导弹药在飞行过程中所受到的过载。
2 Unity3D可视化关键技术
2.1 数学和三维模型的建立
2.1.1 六自由度弹道仿真模型
在Simulink中搭建数值仿真时,为了方便修改和调试参数,常常将一个庞大且复杂的系统分成多个子模块,并构建出各模块之间清晰的输入输出关系,再将各个子模块连接并封装起来,从而建立起一个完整的Simulink仿真系统。制导弹药的六自由度弹道仿真模型由4个子模块构成,分别是弹体运动学与动力学模块、气动力模块、制导模块和目标运动模块。
弹体动力学与运动学模块用于解算制导弹药在飞行过程中受到的力,力矩与运动相关参数之间的关系。为了设计稳定的姿态控制系统,需设立关于制导弹药的六自由度运动学和动力学模型[22]。
气动力模块用于制导弹药的气动特性仿真,首先根据运动参数计算纵向与横向的气动力系数和气动力矩系数,再根据气动力和气动力矩公式计算轴向力、径向力、侧向力、俯仰力矩、偏航力矩和滚转力矩。具体计算公式取自此文[23]。
本文使用Missile Datcom计算该型制导弹药的气动参数,该软件能够根据飞行器的条件参数进行经验数据的拟合并选取公式计算气动系数和导数。将该弹的外形参数输入Missile Datcom,即可得到带有气动系数、静导数、动导数和操纵系数的“for006.dat”的输出文件。在Matlab中使用命令“datcomimport”即可将Datcom计算结果导入Matlab工作区中以备使用。在仿真过程中将动力学与运动学模块计算出来的飞行状态参数和舵偏角导入到气动力模块即可得到该状态下制导弹药受到的空气动力。
制导模块分为导引头子模块与自动驾驶仪子模块,导引头子模块根据目标和弹体之间的相对位置,计算出弹目距离和视线高低角、方位角等信息,再根据特定的导引规律形成过载指令信号输出给自动驾驶仪模块。自动驾驶仪模块根据制导系统输出的指令,通过一定的控制规律输出舵机控制信号使舵面发生偏转,从而产生改变导弹姿态所需要的力和力矩[24]。
目标的运动模块在整个系统中用于模拟目标的运动状态,各模块的结构如图2所示。
图2 六自由度弹道Simulink模型
2.1.2 目标与制导弹药建模
Unity3D引擎中使用的模型一般先在AutoCAD、3DMax等专业三维建模软件中搭建好再导入到Unity3D中使用,Unity3D自身的建模功能比较简陋,较难完成复杂模型的搭建。本文使用某型火箭弹和某型装甲车作为弹药和目标模型,先在AutoCAD软件中建模后导出为stl格式,再使用blender软件转换为fbx格式后即可导入到Unity3D中使用。导入模型时要注意根据现实世界中的尺寸调整模型的比例,本文所使用的制导弹药模型和目标车辆模型如图3所示。
图3 目标与弹药的三维模型图
2.1.3 三维地形建模
在Unity3D中对环境进行建模有许多成熟的方法和工具[25],一般使用引擎中的Terrian地形作为环境模型使用。Unity3D中的默认Terrian模型为2048 m×2048 m的正方形平面模型,制作者可以使用不同的笔刷来升高或降低Terrian模型的某一块区域来构建各种地形,再对这个Terrian模型进行贴图即可使用。
为了搭建地球上某一地点的真实地形,首先需要获取该位置的高程图和卫星影像图。这两种图片可以使用互联网上的免费或收费资源。高程图的作用是作为Terrian模型的高度图来生成模型的网格,而卫星影像图则是作为Terrian模型的表面贴图。
本文中的地形模型选取某省最高精度为30 m的ASTGTM地形高程数据,该数据为tif格式文件,需要在QGIS软件中转换为raw格式的文件并在Photoshop软件中裁剪为2048 × 2048 像素的尺寸才可供Unity3D使用。
Unity3D也可以储存多个搭建好的地形,仿真时可以根据需求切换不同环境。图4为本文使用的高程图与卫星影像图,图5为处理好后的真实地形模型。
图4 高程图与卫星影像图
图5 Unity3D中搭建好的地形模型
2.2 碰撞检测技术
在高动态可视化场景中,系统需要及时地检测模型之间的碰撞。Unity3D中内置有物理引擎PhysX,该引擎能快速、高效地完成碰撞检测需求。PhysX引擎是通过挂载在三维模型上的以“Collider”(碰撞体)为结尾的组件进行碰撞检测的,若三维模型没有挂载“Collider”组件,则仿真运行时不对该模型进行碰撞检测。Unity3D中的“Collider”组件根据形状分为“BoxCollider”(方形碰撞体)、“SphereCollider”(球形碰撞体)、“CapsuleCollider”(圆柱形碰撞体)这样的默认组件,也有供用户自定义碰撞计算模型的”MeshCollider“(网格碰撞体)组件。
若需要检测碰撞的物体模型几何面较少,可以使用Unity3D自带的“BoxCollider”、“SphereCollider”组件实现碰撞检测。这种默认组件的运行速度快且占用计算资源少,缺点是结构比较单一。对于几何面复杂的目标、为了保证碰撞检测的准确性,需要使用“MeshCollider”组件进行检测,此时可以使用自定义的模型网格作为碰撞体检测网格。本仿真针对制导弹药这样瘦长的物体使用“CapsuleCollider”组件,针对目标车辆则使用“MeshCollider”组件。
设置好碰撞体后,就需要挂载相应的脚本检测模型之间的碰撞并执行碰撞发生后的下一步动作。一般用“OnTriggerEnter”(进入触发器)函数来执行下一步动作,例如碰撞发生后的爆炸特效和被命中目标的燃烧特效等。编写好脚本后需要将其挂载在目标模型上,这样程序开始运行时就可以执行脚本中的代码。本文中制导弹药和目标三维模型设置的碰撞体如图6所示。
图6 碰撞体模型
图7 UDP数据通信协议
2.3 数据传输技术
仿真系统建立完后,Matlab/Simulink需要将计算结果及时地传输到Unity3D中以驱动整个场景,现在主流通讯方式有传输控制协议/网际协议(TCP/IP,transmission control protocol/internet protocol)、控制器局域网总线(CAN,controller area network)等。TCP/IP作为一种以太网接口通信技术被广泛应用在各种工控自动化行业中。TCP/IP中的用户数据报协议(UDP,user datagram protocol)在数据传输前不需要建立连接,因此实时性较高,能快速传输数据。因为本仿真对实时性有较高的要求,故选择UDP协议进行Matlab与Unity3D之间的通信。
为此,需要在Matlab/Simulink端和Unity3D端各自建立数据传输模块,在Matlab端可以使用Simulink模块库中自带的UDP发送与接收模块,设置好IP地址和端口号后就可以进行数据的发送与接收。
在Unity3D端则需要设置数据接收脚本。接收脚本中的IP地址字符串和连接端口号要和Simulink中UDP发送模块的值一样,之后即可设置数据的接收循环。Unity端开始运行后,UDP接受脚本就会时刻监听对应IP地址和端口广播的数据,当Simulink的仿真开始并广播数据后,Unity3D就能接收到制导弹药和目标的位置、速度等数据。
2.4 数值可视化技术
传统意义上的可视化仿真技术使用计算结果驱动模型运动,但在仿真进行时,无法一边观察三维模型的运动一边观察实时计算出来的数值大小。为了满足仿真时能兼顾观察模型运动姿态与数值结果的要求,本文提出一种数值可视化技术,其原理是每隔一个固定的时间间隔或一段固定的移动距离就在物体的运动轨迹上生成这一时刻的指示条,通过指示条的大小和方向来反映弹体在这一时刻的过载情况。
此时Unity3D端设置的生成条件为每隔一段固定的飞行距离就生成指示条。如图8所示,图中轨迹线是制导弹药在飞行过程中质心位置形成的轨迹线,球体为当前时刻的质心位置,数字表示指示条生成时的飞行时间,“n_y=(数字)”表示当前位置弹体所受法向过载的数值大小,指示条的长度代表制导弹药在弹体坐标系中所受法向过载的大小,指示条向下伸长表示此时的法向过载为负值,指示条向上伸长表示此时的过载值为正值。Simulink中的仿真模型设置了舵机在发射后4.00 s开始工作,图8中能直观地看到弹体在4.00 s开始产生向下的过载。
图8 数值可视化示意图
3 攻击过程可视化仿真的实现
3.1 脚本设置
要让仿真环境在运行时产生诸如模型运动、视角跟随、尾焰与爆炸特效的生成、弹体轨迹的绘制等一系列行为,就需要编写相应的行为脚本并挂载到对应的模型组件上运行。
以驱动模型运动的脚本为例,这种脚本就需要以一定的频率从UDP数据接收脚本中获取模型的新坐标,并将物体本身的旧坐标值不断修改为新坐标值,从而转化为三维模型的平动和转动,模型运动脚本的作用原理如图9所示,该脚本的作用为在仿真运行开始时实时从UDP接收脚本中获取目标模型的坐标和姿态角数据,同时将模型本身的旧坐标和姿态角数据更改为新的坐标和姿态角数据。
图9 控制物体运动脚本的工作原理
3.2 跟踪视角设置
视角的设置是整个弹道可视化仿真中最重要的问题,设置的正确与否直接影响到最终的显示结果。在Unity3D中,场景运行的最终结果会统一输出到Game视窗。Game视窗显示的画面通过“Hierarchy”(层次视图)中的“Camera”(摄像机)组件来实现,设置好摄像机组件的画面范围和位置后就可以将其拍摄到的画面显示在Game视窗上。
如图10(a)所示,图中线框显示的就是侧视图摄像机的取景范围。为了满足制导弹药飞行姿态和弹道的观察需求,本文设置了4部摄像机,其中3个摄像机用来拍摄制导弹药的三视图视角,一个摄像机为自由视角,使用鼠标实现摄像机的移动和视角的缩放,如图10(b)所示。
图10 跟踪摄像机的设置
3.3 特效设置
在Unity3D中,火焰、烟雾和爆炸等特效均使用Unity3D编辑器内自带的“ParticleSystem”(粒子系统)组件进行控制,该组件可以控制粒子的形状、大小和持续时间等。本文使用“ParticleSystem”制作发动机尾焰和弹药命中后目标产生爆炸的特效。
本仿真设定该型制导弹药的发动机分为两级工作,第一级工作时间为0.00~0.04 s,第二级工作时间为0.15~2.65 s。因此仿真中需要对发动机尾焰的表现时长进行控制,本文使用一个单独的控制脚本,在检测到发动机推力不为0时开启尾焰特效,其余时间则关闭。同样编写一个脚本控制爆炸特效,使用“OnTriggerEnter”函数监测制导弹药与目标的碰撞,在检测到制导弹药和目标车辆发生碰撞后使用“Instantiate”(实例化)函数生成一个爆炸特效。最终尾焰与爆炸特效的效果如图11所示。
图11 视觉效果图
4 应用实例
搭建好Simulink数值仿真模型和Unity3D三维仿真场景后,即可设定初始仿真参数,本文所使用的主要参数见表1所示。由于激光制导弹药在攻击过程中需要持续对目标进行照射,一旦敌方目标的激光告警器感知到激光的照射,那么敌方就可能启动反制措施使制导弹药无法命中。
表1 制导弹药主要参数
因此,本文对制导弹药攻击目标的过程进行仿真,寻找在敌方存在反制措施的情况下,对不同运动状态的目标进行激光照射的窗口期。
4.1 仿真约束条件
本仿真中主要通过Unity3D中的碰撞检测来判断制导弹药是否命中目标,设置的条件为只要制导弹药的三维模型和目标的三维模型发生接触即判定为命中。此外,攻击过程中需要满足一定的约束条件,若仿真过程中的参数超过下列约束,则可以认为攻击失败:
1)被动段最小飞行速度限制:因本文中制导弹药的弹翼所能提供的升力有限,因此在制导弹药的无动力段速度低于某值时弹翼无法提供足够的升力,从而视为丧失制导能力,本文设定最小飞行速度为180 m/s。
2)敌目标反制限制:在敌方目标的激光告警器感应到激光照射后会在一定时间内采取快速机动或释放烟雾等反制措施使制导弹药失去目标,本文设定敌方目标在感知到威胁后的4.0 s做出反制措施,反制措施执行1.0 s后制导弹药失控。因此制导弹药需要在激光照射有效的5.0 s内命中目标。
3)激光最小照射时间限制:由于反制措施的存在,攻击方的激光照射时间有限,如果激光照射时间过小,则制导系统来不及修正轨迹造成脱靶。
4)飞行高度限制:若制导弹药的飞行高度小于0 m,则视为攻击失败。
5)飞行时间限制:制导弹药需要在弹上自毁装置启动前命中目标,自毁装置的启动时间为飞行开始后的第15.0 s。
4.2 仿真实例
4.2.1 目标为静止状态
假定红方在距离发射点2 100 m处发现蓝方静止目标后发射制导弹药,从发射到命中目标这段时间蓝方目标保持静止,首先假设蓝方激光反制措施不工作,仿真显示制导弹药大约在9.73 s命中目标。那么可以得出在蓝方激光反制措施正常工作时,红方开始激光照射的时间t不能早于4.73 s,否则目标就会启动反制措施使制导弹药脱靶。接着以0.1 s为开启激光照射的时间间隔,得出当激光开始照射的时间晚于8.7 s时,制导弹药就会来不及进行机动而脱靶。从而得出红方开始激光照射的时间既不能早于4.73 s,也不能晚于8.7 s,窗口期一共是3.97 s。仿真部分弹道如图12所示,仿真途中的输出界面如图13所示。
图12 照射开始时间t在8.8 s附近的弹道轨迹图
图13 攻击静止目标时,飞行时间为9.70 s时的输出视图
4.2.2 目标为运动状态
假定红方在距离发射点2 100 m处发现蓝方运动目标后发射制导弹药,从发射到命中目标这段时间蓝方目标以10 m/s的速度向z轴负方向运动,首先假设蓝方激光反制措施不工作,仿真显示制导弹药大约在9.76 s命中目标。那么可以得出在蓝方激光反制措施开始工作时,红方开始激光照射的时间t不能早于4.76 s,否则目标就会启动反制措施。接着以0.1 s为开启激光照射的时间间隔,得出当激光开始照射的时间晚于7.3 s时,制导弹药就会来不及进行机动而脱靶。从而得出红方开始激光照射的时间不能早于4.73 s,也不能晚于7.3 s,窗口期一共有2.57 s。仿真部分弹道如图14所示,仿真过程中的输出界面如图15所示。
图14 照射开始时间t在7.4 s附近的弹道轨迹图
图15 攻击运动目标时,飞行时间为9.70 s时的输出视图
5 结束语
本文基于Siumlink和Unity3D软件,建立了一种制导弹药的六自由度弹道可视化平台,可以实现制导弹药从发射到命中目标的完整攻击过程仿真。本文的应用实例表明该平台能够模拟目标的运动状态对激光照射窗口期的影响,对制导弹药的研制、使用和作战决策提供一定的参考价值。后续将考虑更多的制导手段和场景设置,逐步拓展该平台的仿真能力,进一步逼近真实的攻防对抗过程。