飞行输入与场景更新
飞行汽车仿真需要持续接收操作输入,同时更新飞行器、场景和相机。我参与的工作集中在 AirSim 控制接入、偏航处理和 UE 5.6 版本适配。输入设备给出前后、左右、升降和转向意图,需要转换成飞控接口所用坐标系下的速度与朝向。接口的调用方式还会影响游戏线程能否继续更新。
从操作轴到飞行指令
输入先按轴整理,再交给 Pawn 的逐帧逻辑。平移和转向分别维护,最终组合成当前帧的速度指令与目标偏航角。
| 输入或状态 | 处理方式 | 作用 |
|---|---|---|
| 前后、左右输入 | 分轴限幅并换算水平速度 | 控制水平移动 |
| 升降输入 | 换算垂直速度并处理 Z 轴方向 | 对齐 UE 与 NED 的上下定义 |
| 转向输入 | 按 DeltaTime 累加目标角度 | 让转向量与经过的时间关联 |
| 当前偏航角 | 参与水平输入的方向转换 | 使“向前”跟随机体朝向 |
分轴限幅限制的是各轴输入,斜向输入的合成速度仍可能大于单轴速度。如果项目要求任意方向保持同一最大速度,需要另行定义合成向量的限制规则。
避免控制指令阻塞游戏线程
旧的控制路径使用带持续时间的接口,调用等待会影响游戏线程。这里改用非阻塞的 setVelocityCommandBodyFrame:Pawn 每次 Tick 提交当前输入对应的命令,随后继续处理场景逻辑。持续控制由后续帧更新承担,单次调用不再等待整段动作结束。
每帧的运动目标与控制持续时间由此分开处理。设备输入变化后,下一帧可以重新计算目标,游戏线程也能继续处理界面、相机和其他交互。实际响应仍受仿真步进和运行环境影响,非阻塞接口本身并不保证固定帧率。
平移与朝向分别处理
飞行器斜向移动时,移动方向不应自动变成新的机头方向。实现单独维护 TargetYaw,初始化时取飞行器实际估计的偏航角,避免一开始就向默认角度转动。转向轴按帧时间积累角度,并做角度环绕处理。
水平速度转换只使用当前 yaw,把机体前后、左右输入转到世界 XY 平面;升降量单独处理。这样可以区分平移意图与朝向控制,减少斜向移动引起的额外偏航。目标偏航采用角度模式,操作上的转向输入与飞控内部使用的角速度控制也有了明确分工。
单位、坐标与控制参数
UE 常用厘米,AirSim 速度接口以米每秒组织数据,两侧交换时需要进行单位换算。NED 的 Z 轴向下,UE 的 Z 轴向上,垂直分量还要转换符号。单位与方向如果混在操作映射里,问题容易表现成升降相反或速度比例不对,因此在接口边界集中处理。
角度、速度和角速度的增益项也分别设置。目前这些配置使用比例项 P,I、D 为零,采用的是比例控制参数;不能仅凭参数结构就称其为经过完整调校的 PID 飞控。
版本适配与联动范围
我处理了 AirSim 在 UE 5.6 下的接口和初始化适配。相机方面停用了 CameraDirector 的初始化,减少它与项目相机管理之间的竞争;飞行控制、观察视角和相机归属分别处理,避免把镜头变化误判为飞行器运动异常。
项目还涉及六轴联动测试、VR 与相机配置精简,平台侧的软件处理见六自由度运动平台案例。这些工作对应具体接入与调整,完整 VR 体验、飞行动力学精度和设备响应仍需结合所用模型与运行环境测试。