案例

项目展示与开发记录。

案例/UE项目

飞行仿真

Flight simulation

基于 UE 与 AirSim 的飞行仿真项目,涉及操作输入、飞行控制、观察视角和引擎版本适配。

  • 仿真控制
  • 飞行控制
  • 运动平台
联系合作

封面

返回
本页目录

项目介绍

这是一个基于 UE 与 AirSim 的飞行仿真项目。用户通过操作输入控制飞行器的前后、左右、升降和转向,场景与观察相机同时更新。项目还涉及运动平台联动测试,以及 VR 和相机配置调整。

我的工作集中在飞行控制接入与版本适配:把输入设备的操作意图转换为仿真接口可使用的指令,分开处理移动和机头朝向,并减少控制调用对游戏线程的阻塞。

项目部分主要内容
场景UE 飞行仿真场景
控制接入AirSim、逐帧操作输入与速度指令
版本适配UE 5.6 接口与初始化路径
关联工作六轴联动测试、VR 与观察相机配置
个人职责输入映射、偏航处理、坐标换算、非阻塞调用和相机接入调整

我负责的功能

输入与速度指令组织

将前后、左右和升降输入按轴整理、限幅,再换算为飞行控制指令。Pawn 在 Tick 中读取当前输入并提交目标,使后续帧可以根据操作变化继续更新控制。

水平移动结合当前偏航角换算方向,让“向前”能够跟随机体朝向;垂直输入单独处理,避免把水平转换与升降方向混在一起。

独立的偏航控制

将移动方向与机头朝向分开维护。目标偏航角在初始化时读取飞行器实际估计值,转向输入再按 DeltaTime 累加角度,并处理角度环绕。

这让飞行器能够侧向或斜向移动,同时保留单独的转向意图,不必把速度向量的方向直接解释为机头应该朝向的方向。

UE 与 AirSim 的接口适配

集中处理厘米与米、UE 与 NED 上下方向等边界转换。控制调用改用非阻塞方式,逐帧提交当前目标后继续执行场景、相机和界面逻辑。

同时调整 UE 5.6 下的接口与初始化路径,停用 AirSim CameraDirector 的初始化,减少它与项目相机管理之间的竞争。

解决的难点

持续控制调用影响场景更新

旧控制路径使用带持续时间的接口,等待控制动作会影响游戏线程继续更新。对于需要持续读取操作的仿真程序,这会让输入、画面和相机处理相互牵制。

我改用非阻塞的 setVelocityCommandBodyFrame,由 Pawn 每帧提交当前速度与朝向目标。单次接口调用完成后,游戏线程继续处理其他逻辑;持续控制交给后续帧更新,而不是在一次调用里等待整段动作结束。

斜向移动引起额外偏航

当平移与朝向使用同一套方向判断时,同时输入前后与左右可能引起大幅度偏航。处理时,我单独维护目标偏航,并仅使用当前 yaw 参与水平输入的方向转换。

平移和转向由此有了明确分工:速度指令决定怎样移动,目标角度决定机头朝向。初始化时使用实际偏航值,也避免了程序一开始向默认角度转动。

单位与坐标方向容易混淆

UE 常用厘米,AirSim 的速度接口以米每秒组织数据;NED 的 Z 轴向下,UE 的 Z 轴向上。比例或方向错误可能表现为升降相反、速度不符或控制轴难以解释。

我把单位换算与方向转换集中在接口边界,使输入映射、场景运动和仿真数据各自使用明确的约定,便于检查和调整。

相机变化与飞行状态相互干扰判断

项目相机与 AirSim 自带相机管理同时参与初始化时,观察视角的变化容易被误认为飞行器运动异常。我调整了 CameraDirector 初始化路径,将飞行控制、观察视角和相机归属分开处理,并配合 VR 与相机配置精简完成接入调整。

实现结果与适用范围

控制接入形成了从操作输入、速度与偏航计算、坐标换算到逐帧指令提交的处理路径。非阻塞调用让游戏线程在提交目标后继续更新,平移与朝向也可以分别调整。

现有分轴限幅没有统一限制斜向合成速度;比例参数中 I、D 为零,不应将其描述为完成了完整调校的 PID 飞控。飞行动力学精度、实际帧率与设备响应仍取决于模型、仿真步进和运行环境。

运动平台联动与 VR 配置完成的是对应的接入和测试工作,完整实机同步和 VR 体验仍需结合设备与运行场景验证。

相关记录