Unity 无人机物理模拟开发:打造穿越机真实手感
环境:Unity 2022.3.57c1f1
一、功能介绍
输入系统
最初的实现使用键盘鼠标控制,但这对于模拟穿越机来说完全不够。真实的穿越机需要细腻的模拟量输入。
核心物理引擎
Unity 的 Rigidbody 提供了基础物理,但要飞得像穿越机,必须手动计算力和力矩。
PID 控制器 (Rate Loop)
这是飞控的灵魂。我们实现了三个独立的 PID 控制器分别控制 Pitch、Roll 和 Yaw 的角速度。PID 算法原理可参考相关技术文档。
- 目标:摇杆输入 = 目标角速度(例如满杆 200 度/秒)。
- 反馈:
rb.angularVelocity。 - 输出:PID 计算出的修正力矩。
混控器 (Mixer)
将 PID 输出分配到四个电机。采用标准的 Quad X 布局:
// FL (左前): +Pitch +Roll -Yaw
// FR (右前): +Pitch -Roll +Yaw
// BL (左后): -Pitch +Roll +Yaw
// BR (右后): -Pitch -Roll -Yaw
物理细节的打磨
基础 PID 能飞,但手感像'在真空中飞行'或者'完美的刚体'。为了真实感,我引入了三个关键特性:
电机惯性 (Motor Inertia)
真实的电机从 0 加速到 100% 需要时间。
- 实现:使用
Mathf.Lerp对油门输入进行低通滤波。 - 效果:消除了'瞬移般'的响应,给油门带来了一丝'肉'感和延迟,极大提升了重量感。
// 更新动力 (在 FlightController 的 FixedUpdate 中调用)
public void UpdatePhysics(float targetThrottle)
{
// 模拟电机惯性 (一阶低通滤波)
// 从当前油门平滑过渡到目标油门
float dt = Time.fixedDeltaTime;
currentThrottle = Mathf.Lerp(currentThrottle, targetThrottle, dt * motorResponseSpeed);
// 1. 施加升力 (垂直于机臂向上)
Vector3 force = transform.up * (currentThrottle * maxThrust);
rb.AddForceAtPosition(force, transform.position);
// 2. 施加反扭矩 (Yaw 控制)
// 顺时针旋转的电机,会给机身施加逆时针的扭矩,反之亦然
torqueDir = isClockwise ? : ;
torqueMagnitude = currentThrottle * maxThrust * torqueFactor * torqueDir;
rb.AddTorque(transform.up * torqueMagnitude, ForceMode.Force);
}


