基于Unity3D的扑翼飞行器自主寻路的设计与实现

2021-12-29 10:01邵伟平李东洋
成组技术与生产现代化 2021年3期
关键词:脚本引擎飞行器

邵伟平,李东洋

(沈阳理工大学 机械工程学院,辽宁 沈阳 110159)

随着无人飞行器在国内外军事、民生等领域的广泛应用,作为无人飞行器中的重要分支,仿生扑翼飞行器也获得了深入的研究。相较于微小型固定翼飞行器和旋翼飞行器的不稳定性,扑翼飞行器的扑翼结构可以产生稳定的气动力,实现悬停。在遇到外界干扰或者突发情况时,具有更好的稳定性、灵活性和机动性[1-3]。

随着虚拟仿真和虚拟现实等技术的不断迭代,虚拟仿真的应用范围从最初的游戏领域发展到工业仿真、教学培训、航空航天等各领域,在军事领域也有着广阔的前景,无论是武器仿真还是模拟训练等方面都有很强的可研究性[4-5]。

Unity3D引擎是现阶段虚拟现实技术研究使用的主要平台,支持大多数三维建模软件和C#、Java等多种脚本语言,广泛应用于航天、工业、军事、医学、教育、建筑等多个领域[6-7]。传统的仿真软件只能从数据方面呈现设计效果,而虚拟现实可以更直观地感受设计成果。通过Unity3D引擎中的NavMesh功能,配合编写的相关脚本,实现扑翼飞行器的自主寻路的虚拟仿真。

1 模型和场景构建

1.1 扑翼飞行器的绘制和处理

选择UG进行扑80翼飞行器的三维建模,根据设计参数完成扑翼飞行器的模型制作。将模型导入还原度和精细度更好的3DMAX中做进一步处理,拆分分类,对坐标轴等进行修改,以便在Unity3D中使用,进行贴图后导出FBX格式,导入到Unity3D,根据需要对模型部件进行父子关系以及属性的设置,完成扑翼飞行器的准备工作。

1.2 场景搭建

根据实验需要选择设计场景,以街道为主要地形,建筑群作为寻路时的避障物体。将做好的街道模型和需要的纹理及贴图导入到Unity3D引擎。根据街道的形式依次把纹理贴图按照顺序置于地形上,通过纹理贴图的使用,划出马路、公路等区域,处理后的地表模型如图1所示。

图1 处理后的地表模型

将3DMAX做好的建筑物模型导入Unity3D,将建筑物组合分区填入城市,通过建筑物的分割和街道的连接使场景初步具备一个现实的城市样貌。制作一些搭配场景风格的装饰物导入场景,使城市场景看起来更加真实,如花坛、路边长椅、路灯、告示牌、喷泉和垃圾桶等。

完成场景内部对象的外观和形状后,对场景中的环境进行设置,主要包括天空盒和光照系统两部分。天空盒是Unity3D引擎中对环境进行渲染的重要组件,由六个面构成,像盒子一样将场景囊括其中,天空盒可以增加场景的真实感,并且对硬件的负载也较小。将贴图填入Unity3D的Skybox(天空盒)组件,把组件应用到场景摄像机上。光源是配合天空盒的重要组成部分,使场景更具真实感。Unity3D中的光源主要有四种:点光源、平行光、聚光灯和区域光。使用平行光光源搭配阴影效果达到模拟真实太阳光的照射情况,路灯上可添加点光源,场景最终效果如图2所示。

图2 场景最终效果

2 自主寻路方法及原理

2.1 寻路方法的选择

目前寻路方法众多,各有优劣,常用的主流算法有A*算法、NavMesh算法[8-9]。

A*算法是一种传统的智能寻路算法,是使用最广泛的寻路算法之一[10],但在Unity3D内有寻路组件NavMeshAgent,无论是脚本编写方面或是设定网格和烘焙地形方面,NavMesh算法的便捷性均优于A*算法。在算法的效率问题上,在这种非大型场景中,NavMesh算法的效率也更高,因此选择NavMesh算法作为本次实验的寻路算法。

2.2 NavMesh算法原理

NavMesh算法分为Recast算法和Detour算法两部分。Recast算法是NavMesh的核心,将地图数据进行简化和抽象处理,使其变成可用于寻路的网格模型,生成可导航地图,将地图导入Detour算法,Detour算法再基于导航网格进行路径规划。

Recast算法首先将原地图网格光栅化,形成一个高度场。进一步定义可通过部分,将这些部分划分为连续的地区,同时剔除不可通过的部分。再将划分好的可通过地区转换为简单的多边形,然后进行简化,简化边界和相近多边形的边缘,变成更利于寻路的凸多边形。将凸多边形网格三角化,并对细节进行优化,完成导航网格。Detour算法基于Recast算法生成导航多边形网格,通过算法寻找起止点多边形,进行路径规划。提高了一定的效率,平衡了算法的运行效率和路径的准确性,因此,NavMesh算法在非大型场景中的表现较为优秀。

3 自主寻路的实现

3.1 NavMesh导航组件

在Unity3D引擎的编辑器中,打开Navigation面板,包括4种标签,如图3所示。

图3 Navigation面板的4种标签

(1) 代理:设定导航时寻路对象与障碍物的接近程度,寻路对象可达到的高度等。

(2) 区域:对地图上的物体进行分类,用层来表示,默认有三个,也可自己添加。

(3) 对象:对当前选择的场景中的物体进行操作,其中Navigation Static判断此物体是否作为寻路过程的一部分,所以前面制作的场景地图和地图上设置的障碍物等都要勾选此项。

(4) 烘焙:对当前地图进行烘焙。完成上面几项的设置后,点击烘焙,生成可行走的Navmesh导航区域,如图4所示。

图4 Navmesh导航区域

为扑翼飞行器添加NavMesh Agent组件,对寻路对象的参数进行初步设置,如必要的速度、角速度、加速度和制动距离等,其中制动距离表示离障碍多远时开始减速。此外,还有对障碍进行躲避时的半径、高度等参数以及寻路的一些设置。

3.2 编写脚本

Unity3D引擎支持JAVA语言和C#语言进行脚本的编写,由于C#语言在Unity3D中使用更方便,所以选择C#作为编程语言,来配合Navigation面板和NavMesh Agent组件完成自主寻路。脚本设计以鼠标点击位置为寻路的目标终点,且在寻路途中再次点击其他地点,可以随时更改目标,其部分代码如下:

NavMeshAgent agent;

private LineRenderer lr;

void Start()

{

agent = GetComponent();

//获取组件

lr = GetComponent();

InitLine();

}

……

if (Input.GetMouseButtonDown(0))

{

Ray ray = Camera.main.ScreenPointToRay

(Input.mousePosition);

RaycastHit hit;

……

}

为了更好地看到寻路时的情况,再编写一个脚本使场景内的摄影机跟随扑翼飞行器,将脚本搭载在摄影机上。

3.3 实验测试

将扑翼飞行器放入搭建好的场景中,添加Navigation面板,设置参数,进行烘焙生成导航网格。为扑翼飞行器添加NavMesh Agent组件,设置各种参数,将写好的脚本搭载到扑翼飞行器上。

在运行场景中点击无障碍处作为目标点,扑翼飞行器能避开障碍物,准确地进行寻路。为方便查看,使用着色小球作为目标点进行测试,如图5所示,在扑翼飞行器寻路过程中点击其他地点,可做到即时重新寻路,并且路线准确。图6所示为扑翼飞行器寻路时的飞行姿态。

图5 扑翼飞行器到达的目标点

图6 扑翼飞行器寻路时的飞行姿态

4 结束语

基于Unity3D引擎,研究扑翼飞行器的自主寻路,建立相关模型并且进行处理。搭建适于实验的场景地图,选择NavMesh算法作为寻路算法,配合Unity3D内组件的使用,大大简化了脚本的编写,通过鼠标点击进行自主寻路并随时更换目标,实现了扑翼飞行器自主寻路的虚拟仿真。

由于Unity3D引擎的可视化,打破了传统仿真只能用数据表现的单一形式,实时可见扑翼飞行器的状态和寻路过程。Unity3D引擎作为专业的虚拟现实产品,暂时还无法与外部的飞行器系统对接输出。随着Unity3D在各场景应用的越来越广泛,不仅会有更完善的寻路方法,也会与外部系统有良好的配合应用。

猜你喜欢
脚本引擎飞行器
酒驾
高超声速飞行器
安奇奇与小cool 龙(第二回)
复杂飞行器的容错控制
蓝谷: “涉蓝”新引擎
快乐假期
小编的新年愿望
无形的引擎
神秘的飞行器
基于Cocos2d引擎的PuzzleGame开发