一.技术背景
在无人系统研发过程中,需要进行大量的运动控制系统半物理实时仿真实验,传统仿真界面的运动轨迹显示多采用的是二维曲线形式,运动过程和状态是通过文本数据显示。随着数据量的增加,该方式缺乏直观性,不易观察、理解和分析,不利于挖掘隐藏于数据中的本质特性;而一幅逼真图像包含的信息则囊括了曲线和文本显示的信息。因此,将三维可视化仿真技术应用到无人系统仿真中,可以使系统数据以更自然、更易理解的图像形式展示出来,逼真的再现无人系统运行全过程。三维仿真实现路线图如下图所示:
二. RflySim平台介绍
在无人系统仿真领域已经出现了不少高逼真三维仿真平台,主要包括以下几个:AirSim;Gazebo;V-REPCARLA;MORSE;FlightGoggles等。
上述平台大多只支持特定载具(多旋翼、无人车、机器人等)的开发,而且适用的开发阶段主要是机器视觉或人工智能等上层算法开发。目前市面上仍然缺乏适用于各类无人系统载具类型,以及覆盖从底层控制器设计、上层智能决策算法开发、后期自动测试与安全评估等的全流程开发平台,这也是RflySim平台开发的初衷,其中的RflySim3D/RflySimUE5的三维引擎也弥补了目前市面上三维引擎对无人系统可视化方面的不足。
RflySim3D与其他软件交互是通过UDP实现的,RflySim平台提供了Python、Simulink的接口,它们都是通过UDP与RflySim3D交互的。RflySim3D在RflySim仿真平台中所处的位置如下图所示:
CopterSim会根据从Pixhawk(或者PX4SITL)传入的电机控制数据解算出无人机当前的状态(主要是位置、姿态数据),随后会将这些数据发送给RflySim3D,而RflySim3D会将这些数据应用至场景里相应的无人机上,从而使我们能更直观的看到无人机的状态。
RflySim3D使用UDP通信,能够接受一些来自外部的命令,例如切换场景、创建无人机、开启UE内置的物理碰撞等,命令的细节将在RflySim3D接口与使用方法介绍中介绍,总之RflySim3D可以接受来自CopterSim、Python、Simulink的UDP命令。
RflySim3D还支持通过XML文件进行一些配置,主要是用XML配置无人机的构型(四旋翼、六旋翼、固定翼等)、模型在列表中的优先级、飞机的名字、飞机的初始位置与姿态、各致动器(一般是旋翼)的初始位置、姿态、材质、旋转轴、运动模式,还可以定义摄像机的位置,还可以定义一些障碍组件(例如柱子、圆环)等等。
三. RflySim3D案例介绍(自定义无人机模型加载实验)
RflySim3D的各种三维模型也是可以自定义的,它需要被处理成RflySim3D能识别的状态。首先三维模型本身需要被UE4烘焙,然后还需要一个xml格式的文件来定义它,其中最重要的是样式ClassID与模型文件的位置,这样RflySim3D才能把样式Type与被渲染的三维模型给关联起来。实验大致流程如下:
1.在3dsMax中处理模型
打开3dsMax
然后在“VehicleModel”目录中找到“DroneyeeX680.max”
在3Dsmax中选中所有组件,点击菜单栏“组”-“组”,就可以将所有组件弄成一个整体,这时候可以调整飞机的位置,姿态,轴的位置,轴的方向等。需要满足以下要求:
1)确保机头方向指向3DsMax的x轴正方向,机顶指向z轴正方向(向上);
2)确保飞机的质心在3DsMax的中心;
3)确保模型中没有隐形(不显示的)组件,如果有需要删除。
如下图,点击工具栏“移动”按钮,再点击选中机身或螺旋桨对象,就可以在下方状态栏中读取对象的三维坐标(将坐标都输入为0就可以将对象挪到中心)。
点击机身就可以看到机身的三维坐标(x,y,z)=[-0.449,-0.363,0]
右上螺旋桨[24.977,-24.439,11.222],左下螺旋桨[-25.99,22.528,11.022],左上螺旋桨[24.977,24.693,11.022],右下螺旋桨[-25.99,-22.274,11.022]
将各个螺旋桨的坐标减去机体的坐标,就可以得到各个螺旋桨相对机体中心的三维坐标。由于3DsMax是采用前左上的右手坐标系,UE采用前右上的左手坐标系,因此需要对y轴进行反向。
这样就得到了右上、左下、右下、左上的坐标序列为:[25.4260,24.0760,11.2220],[-25.5410,-22.8910,11.0220],[25.4260,-25.0560,11.0220],[-25.5410,21.9110,11.0220],这几个坐标值留着备用。然后,记录飞机质心到地面(机体最低端)的距离,这里大约取8cm。
将DroneyeeX680.max复制两份,分别命名为DroneyeeX680Body.max和DroneyeeX680Prop.max。在DroneyeeX680Body.max文件中移除四个螺旋桨,并将机身移动到3DsMax的坐标中心;
导出得到FBX模型文件,分别点击3DsMax的菜单-文件-导出-导出,按下图所示配置:
导出得到DroneyeeX680Body.FBX和DroneyeeX680Prop.FBX文件。
关键导出配置如下图所示(注:摄像机、动画、灯光都不要勾选)
2.将该飞机导入UE中处理并烘培
任意打开一个UE工程,在其Content新建一个文件夹(这里命名为DroneyeeX680),如下图进入该文件夹后,点击导入按钮,依次将DroneyeeX680Body.FBX和DroneyeeX680Prop.FBX导入进来
由于我们的模型没有定义材质,因此导入进来是白色的,并不美观。需要双击DroneyeeX680Body组件,在其中对关键部件添加颜色材质,例如碳纤维的黑色。同时,复制一个DroneyeeX680Prop组件命名为DroneyeeX680Prop_2,将其材质设置为不用的颜色,以区分飞机的靠前的两个螺旋桨和靠后的两个螺旋桨。如果导入其他的其他模型本身拥有材质贴图,则需要保证贴图纹理贴在正确的位置上。
在上图中点击“保存所有内容”,再点击UE菜单栏-文件-打包项目-Windows-Windows64(需要按生成地图的教程方法,启用光线追踪和禁用PAK打包),就可以生成可以识别的三维文件了。去生成文件路径“WindowsNoEditor”-MyProj(项目名)-“Content”下,将整个“DroneyeeX680”目录复制出来备用。
3.编写XML文件并导入RflySim3D
1)导出模型后,我们还需要编写XML文件来帮助RflySim3D识别螺旋桨位置、转动方向、材质等。(RflySim3D的XML文件编写方法见之前的XML接口例程:[RFLYSIM安装位置]\RflySimAPIs\3.RflySim3DUE\0.ApiExps\e8_UAVCtrl\2.ActuatorCtrl\Readme.pdf)。
2)该案例的XML文件:[RFLYSIM安装位置]\RflySimAPIs\3.RflySim3DUE\1.BasicExps\e1_CusLoadDroneyeeX680将编写好的XML文件拷贝到之前生成的DroneyeeX680文件夹中,再一起拷贝到RflySim3D\RflySim3D\Content目录。
3)打开CopterSim和RflySim3D,按下C键可以切换飞机样式,看看自己的飞机模型是否已经导入。
4.最终效果
此文件目录下有一个已经完成的例程,找到VehicleModel\DroneyeeX680目录,将其复制到[RflySim安装位置]\RflySim3D\RflySim3D\Content目录下。最后打开RflySim3D,鼠标双击地面+O+3,就能创建出这个ClassID为3的飞机,然后按C键切换到刚刚导入DroneyeeX680飞机即可。
本例程视频观看地址:
1.优酷:https://v.youku.com/v_show/id_XNDcwNjA4NzIxMg==.html
2.YouTube:https://youtu.be/mKUehJwqqsU
3.B站:https://www.bilibili.com/video/BV1jm4y117sw/?spm_id_from=333.999.0.0&vd_source=1654a620e9867b8f22757a07c243c61d