飞行器物理模拟-系统设计

飞行动力学

飞行器的空气动力特性

  • 飞行器在空中飞行,作用在飞机上的气动力和气动力矩是外力和外力矩最重要的部分
  • 气动力:物体和空气作相对运动时,空气作用在物体上的力。可压缩的黏性气流流过飞行器各部件表面时,表面压强分布不对称出现压强差;空气对飞行器表面有黏性摩擦,产生黏性摩擦力。这两部分力合在一起形成了作用在飞行器上的空气动力,包括升力 L、侧力Y 和阻力 D
  • 气动力矩:空气动力的作用线不通过飞行器质心时, 形成对质心的空气动力矩。包括俯仰力矩 M、偏航力矩 N、滚转力矩 L
  • 气动力和气动力矩是改变飞行器位置和姿态最主要的控制力和力矩,这些力和力矩的产生与飞行器的气动布局、对操纵面的操纵有直接关系

气动升力

影响因素

  • 空气密度
  • 物体与周围空气之间相对速度的大小和方向
  • 绕流物体的形状
  • 在飞行器外形尺寸、飞行速度和高度(影响空气密度) 给定的情况下, 研究飞行
  • 器飞行中所受的气动升力, 可简化成研究升力系数CL(无量纲比例因数)
  • CL对于每一种机翼是唯一的
  • 通常通过大量风洞实验、试飞测试或CFD研究得出
  • 升力系数CL 基本上取决于马赫数、攻角、升降舵的舵面偏转角、高度等参数
  • 升力随攻角α增加而增加,当 α 介于 100 ~ 150 区间呈线性增长
  • CL CL0 α=0)升到最大 CLmax α=αmax
  • α > αmax,机翼表面气流出现紊乱,CL 开始下降(失速)。失速取决于攻角而不是空速
  • 在机翼后缘增加副翼或者在前缘增加缝翼,可以显著改进升力特性,尤其在起飞、降落阶段非常有用

气动阻力D

产生原因:飞行器在大气中飞行时或者由于空气黏性产生阻力,或者由于流体压缩性影响出现激波产生阻力

阻力系数CD(无量纲比例因数)

  • 每架飞行器都有自己的阻力曲线
  • 通常通过大量风洞实验、试飞测试或CFD研究得出

降低襟翼增加升力,同时增加了与滑流接触的机翼面积,造成阻力增大

装有扰流板或减速板的飞机会增加阻力

阻力会随着起落架的抬起、放下发生变化

气动侧力Y:线性范围内,主要受到方向舵项的影响

俯仰力矩 M

产生原因:升降舵位于平尾后缘,当舵面偏转时改变平尾翼型的有效弯度,产生附加升力,对飞行器质心形成附加的纵向力矩。一般定义舵面后缘向下偏转时,形成的升降舵偏角为正。为了提高超音速飞机的操纵效能,一般采用全动平尾,即整个平尾可以绕铰链轴旋转。

滚转力矩 L

产生原因:副翼对称安装在机翼外段后缘,驾驶员左右移动操纵杆,可使左、右副翼反向等角度偏转,反对称偏转引起的横向力矩。规定右副翼下偏为正。

偏航力矩 N

产生原因:方向舵是引起偏航的主要原因方向舵装在垂尾后缘,驾驶员蹬动脚蹬,使方向舵左右偏转引起作用力矩。左脚蹬前移,方向舵偏向左翼,规定为正。

坐标系

地面坐标系

衡量飞行器位置和姿态的基准

  • 固连于大地,原点在大地中的某点;
  • Z 铅垂向下
  • X 轴在水平面,方向任选,通常与飞行任务相关
  • Y 轴按右手法则。

机体坐标系

  • 原点位于飞行器质心;
  • Z 轴在对称平面,垂直于纵轴,指向下
  • X 轴沿飞行器结构纵轴,指向前
  • Y 轴垂直于对称平面,指向右
  • 气动力矩的三个分量(滚转力矩、偏航力矩、俯仰力矩)定义在机体坐标系中。

气流坐标系

与机体坐标系的区别是,x是沿着空速矢量。因此平飞的时候重叠。

α 迎角: 速度向量在飞机对称面的投影与机体轴夹角,速度在轴下为正。(飞机的姿态“扬起”,相对于速度)

β 侧滑角: 速度向量与飞机对称面的夹角。右侧滑为正

发动机系统仿真方法

发动机系统仿真有不同的方法,不同的方法仿真精度不同,仿真逼真度不同。

外特性仿真

把发动机系统看成一个整体,对其主要输入、输出性能进行建模

油门杆位置作为输入参数,推力和转速为主要输出性能参数,飞行高度和速度是影响在某一油门杆位置下的推力的主要因素

系统示意图

整体组织结构

1. base/ 目录 – 基础组件

类似vehicle的基础部件,aircraft需要以下基础组件:

AircraftBase.h/.cpp – 考虑在这个项目中可能只需要一个飞行器,因此可能把基类的设计删去

  • 所有飞行器的基类
  • 提供通用接口:位置、姿态、质量属性等
  • 管理飞行器的基本物理属性

Wing.h/.cpp – 机翼系统

class Wing {
    Vector3 position;           // 机翼在机身的位置
    Real area;                  // 机翼面积
    Real liftCoeff, dragCoeff;  // 升力、阻力系数

    下面四条暂定为不需要
    Real aspectRatio;           // 展弦比
    Real sweep;                 // 后掠角
    Real dihedral;              // 上反角
    AirfoilProfile profile;     // 翼型

    
    // 计算气动力
    Vector3 calculateLift(Real airspeed, Real angleOfAttack);
    Vector3 calculateDrag(Real airspeed);
};

ControlSurface.h/.cpp – 操纵面

class ControlSurface {
    enum Type { ELEVATOR, RUDDER, AILERON, FLAP, SLAT };
    Type type;
    Real maxDeflection;         // 最大偏转角
    Real currentDeflection;     // 当前偏转角
    Real effectiveArea;         // 有效面积
    
    // 计算操纵面产生的力矩
    Vector3 calculateMoment(Real airspeed, Real deflection);
};

Propulsion.h/.cpp – 推进系统基类

class Propulsion {
    Real maxThrust;             // 最大推力
    Real currentThrust;         // 当前推力

    
    virtual Real calculateThrust(Real throttle, Real airspeed) = 0;
    virtual Real calculateFuelFlow(Real throttle) = 0;
};

LandingGear.h/.cpp – 起落架——暂定为不需要

class LandingGear {
    bool isRetracted;           // 是否收起
    Vector3 position;           // 位置
    Real stiffness, damping;    // 刚度、阻尼
    Real friction;              // 摩擦系数
    
    Vector3 calculateGroundForce(const Vector3& velocity);
};

Atmosphere.h/.cpp – 大气环境——暂定为理想模型,即空气密度均匀,风速可能影响(直接与推进力抵消)

class Atmosphere {
    Real density;
    Vector3 windVelocity;
    
    void updateAtmosphericProperties(Real alt);
    Real calculateAirspeed(const Vector3& velocity);
};

2. core/ 目录 – 核心世界管理

AircraftWorld.h/.cpp

类似VehicleWorld,管理整个飞行仿真环境:

class AircraftWorld : public RigidWorld {
    ObjectArray<Ref<AircraftBase>> mAircrafts;
    Ref<Atmosphere> mAtmosphere;
    
public:
    int addAircraft(const Ref<AircraftBase>& aircraft);
    void removeAircraft(int id);
    void updateAerodynamics(Real dt);
    void load(std::string filePath);
    void save(std::string filePath);
};

3. powertrain/ 目录 – 推进系统 – 暂定为提供定值推力的抽象系统


AircraftEngine.h/.cpp – 喷气发动机

class AircraftEngine {
    Real bypassRatio;           // 涵道比
    Real compressionRatio;      // 压缩比
    ObjectArray<ThrustCurve> thrustCurves;  // 推力曲线
    
    Real calculateThrust(Real throttle, Real airspeed) override;
};

4. fixed_wing/ 目录 – 固定翼飞行器

FixedWingAircraft.h/.cpp

class FixedWingAircraft : public AircraftBase {
    Ref<Fuselage> mFuselage;                    // 机身
    ObjectArray<Ref<Wing>> mWings;              // 机翼
    ObjectArray<Ref<ControlSurface>> mControlSurfaces;  // 操纵面
    ObjectArray<Ref<Propulsion>> mEngines;      // 发动机
    Ref<FlightControlSystem> mFCS;              // 飞控系统
    
    void updateAerodynamics(Real dt, const Ref<Atmosphere>& atmosphere);
    void updatePropulsion(Real dt);
    void updateFlightControls(Real dt);
};

5. flight_control/ 目录 – 飞行控制系统

FlightControlSystem.h/.cpp

class FlightControlSystem {
    PIDController pitchController;
    PIDController rollController;
    PIDController yawController;
    
    void updateControlInputs(const FlightCommand& command, 
                           const FlightState& currentState);
};

Autopilot.h/.cpp – 自动驾驶

class Autopilot {
    enum Mode { MANUAL, ALTITUDE_HOLD, HEADING_HOLD, NAV_MODE };
    Mode currentMode;
    
    void updateAutopilot(Real dt, const FlightState& state);
};

实现思路和关键功能

1. 飞机模型建立

机身,主翼,左右副翼,方向舵,升降舵,连接的铰链结构?

2. 气动力计算

  • 基于升力线理论计算机翼升力
  • 实现操纵面效率和失效模拟

3. 飞行动力学

  • 六自由度运动方程

4. 飞行控制

  • PID控制器实现基本稳定性
  • 模式切换和包线保护
  • 故障检测和应急处理

5. 环境建模(较为复杂,初始可以不考虑)

  • 标准大气模型
  • 风场和湍流模拟
  • 地形和障碍物检测

6. 数据管理

  • XML格式的飞行器配置文件
  • 飞行数据记录和回放
  • 实时性能监控

https://zhuanlan.zhihu.com/p/683084005 动力学方程

JSBSim(开源飞行器仿真框架)

FlightGear(真实飞行模拟器,可读取JSBSim模型)

核心问题

  1. 需要一个飞行器的建模文件 jsbsim? airsim?

✈️ 一、两种建模方式对比

建模方式特点优点缺点适合场景
基础形状堆叠法用立方体、圆柱、翼面等基本体构建机体各部件,再组合模块清晰、计算方便、可动态修改尺寸不够精细,无法捕捉复杂空气动力学细节教学、早期建模、实时仿真、游戏物理
整体模型法使用整机模型(网格/CAD)、或者根据风洞或仿真数据整体处理真实还原飞行器,适合CFD/气动数据匹配模型复杂、数据准备多、实时性能差高精度仿真、控制器测试、CFD匹配仿真

✅ 二、在你的物理引擎中,推荐做法是:

如果目标是:实时飞行仿真(如模拟器、游戏引擎、自研飞控测试平台)

推荐用基础形状堆叠建模法

做法是:

  • 主翼 → 长矩形
  • 副翼 → 可以旋转调整的矩形
  • 机身 → 圆柱
  • 尾翼 → 可以旋转的两个小矩形翅片(竖的方向,横的升降舵
  • 引擎简化成定向推力源,不需要实体的建模,可以仅仅设计为一个提供定向推力给整个模型的系统
  • 将各部件组合,各自贡献空气动力和力矩

示例:

// 假设你有多个飞行部件
Wing mainWing;
Tail elevator;
Propeller prop;

Vec3 totalForce = mainWing.getForce(state) + elevator.getForce(state) + prop.getThrust(state);
Vec3 totalMoment = mainWing.getMoment(state) + elevator.getMoment(state) + prop.getTorque(state);

这使你可以:

  • 快速修改参数(如翼展、位置)
  • 清楚控制每个部件的力与贡献
  • 易于调试、性能开销小

如果目标是:气动精度优先(如风洞匹配、CFD校验、控制器测试)

✅ 可以考虑整体建模或基于模型数据的集中建模法

你需要提供一套:

  • 空气动力数据表(lookup tables):如 CL(α),CD(α)C_L(\alpha), C_D(\alpha)
  • 机体惯性参数:Ixx,Iyy,IzzI_{xx}, I_{yy}, I_{zz}
  • 整体升力/阻力/力矩的合成点(气动中心)

此时不必处理每个部件,而是:

totalForce = aerodynamicModel.getTotalForce(state);
totalMoment = aerodynamicModel.getTotalMoment(state);

🔍 总结建议:

你想要…推荐方式
快速构建可调模型、用于调试和教学✅ 基础形状堆叠法
实时仿真、接入飞控算法测试✅ 基础形状 + 简化气动模型
高精度仿真(例如需要匹配风洞或控制律验证)✅ 整体模型(或CFD数据驱动)

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
下一篇