Files
2026-02-06 13:00:56 +08:00

199 lines
6.2 KiB
Markdown

# AeroEngine Control Challenge: 航空发动机智能全包线控制挑战赛
## 📖 项目简介 (Introduction)
本项目提供了一个高保真的双转子涡扇发动机仿真环境,旨在探索**深度强化学习 (Deep RL)** 在复杂工业控制系统中的应用。
参赛者需要设计一个智能 Agent(替代传统的 FADEC 电子控制器),在**全飞行包线**内实现对航空发动机的精准控制。任务涵盖了从**地面冷态起动**、**慢车维持**到**高空巡航**的全过程,要求在满足严苛的安全约束(温度、压力、转速限制)前提下,实现对双转子转速的快速、无静差追踪。
---
## 🌟 核心特性 (Key Features)
* **高保真物理模型**:底层基于 C++ 编译的 DLL 热力学模型,能够真实反映发动机在不同工况下的非线性、强耦合特性。
* **Gymnasium 标准接口**:完全兼容 OpenAI/Farama Gymnasium API,可直接接入 PPO, SAC, TD3 等主流强化学习算法。
* **多变量解耦控制**:涉及燃油流量 () 与尾喷管面积 () 的协同控制 (2-DOF Control)。
* **全流程仿真**:支持从静止状态 () 开始的起动过程模拟,包含起动机介入与点火逻辑。
* **官方 PID 基准**:内置增量式 PID 控制器基准代码,展示了无扰切换与解耦控制策略。
---
## 🛠️ 安装说明 (Installation)
1. **环境依赖**
建议使用 Python 3.8 或更高版本。
2. **安装步骤**
在项目根目录下运行以下命令进行安装:
```bash
cd AeroEngineChallenge
pip install -e .
```
3. **验证安装**
运行随机测试脚本,确保环境无报错:
```bash
python test_random.py
```
---
## 🎮 环境说明 (Environment Specs)
### 1. 状态空间 (Observation Space)
维度:`Box(8,)`,包含物理状态、控制目标及误差。
| 索引 | 名称 | 描述 | 单位/备注 |
| --- | --- | --- | --- |
| 0 | `NH` | 高压转子转速 | 归一化 (0~1.0) |
| 1 | `NL` | 低压转子转速 | 归一化 (0~1.0) |
| 2 | `T5` | 涡轮后温度 | K (开尔文) |
| 3 | `P3` | 压气机出口压力 | kPa |
| 4 | `Target_NH` | 高压转速目标 | 由 PLA 查表得到 |
| 5 | `Target_NL` | 低压转速目标 | 由 PLA 查表得到 |
| 6 | `Error_NH` | `Target_NH - NH` | 误差 |
| 7 | `Error_NL` | `Target_NL - NL` | 误差 |
### 2. 动作空间 (Action Space)
维度:`Box(5,)`,范围 `[-1.0, 1.0]`。Agent 输出后会被映射到物理范围。
| 索引 | 名称 | 物理范围 | 说明 |
| --- | --- | --- | --- |
| 0 | `FanVane` | -20° ~ 20° | 风扇导叶 (辅助) |
| 1 | `CompVane` | -20° ~ 20° | 压气机导叶 (辅助) |
| 2 | `AddPower` | 0 ~ 100 kW | **起动电机功率** (仅起动阶段使用) |
| 3 | `Wf` | 50 ~ 5000 kg/h | **燃油流量** (主控变量) |
| 4 | `A8` | 0.2 ~ 0.6 | **尾喷管面积** (主控变量) |
### 3. 任务输入:PLA (Power Lever Angle)
环境不自动生成任务曲线,需通过外部接口设置油门杆角度:
```python
env.set_pla(60.0) # 设置当前油门为 60度
```
* **0° ~ 15°**: 起动/慢车区
* **15° ~ 110°**: 工作区 (推力增加)
---
## 🏆 评价指标 (Evaluation Metrics)
比赛的最终得分由环境返回的 `Reward` 决定,包含以下几个维度:
1. **跟踪精度 (Tracking Accuracy)**:
* 核心指标。计算 和 与目标的均方误差。
2. **起动性能 (Startup Performance)**:
* 起动耗时越短越好。
* 消耗的起动功率 (`AddPower`) 越少越好。
3. **动态品质 (Dynamic Quality)**:
* **超调量**: 超过目标值会有额外惩罚。
* **调节时间**: 快速进入 2% 误差带内。
4. **动作平滑性 (Smoothness)**:
* 惩罚控制量(特别是燃油和喷管)的剧烈高频抖动。
5. **安全约束 (Safety Constraints)**:
* **硬约束 (Terminated)**: 触发即任务失败 (Reward -1000)。
* (超温)
* 或 (超转)
* **软约束 (Penalty)**: 超过控制计划限制但未达硬限,持续扣分。
---
## 🚀 快速开始 (Quick Start)
### 1. 运行 PID 基准
我们提供了一个基于**增量式 PID** 和 **解耦控制策略** 的强力 Baseline。
* **策略**: 燃油控制高压转子 (),喷管控制低压转子 ()。
* **运行**:
```bash
python test_pid_correct_pairs.py
```
*运行后将生成详细的仿真曲线图,展示起动及加速全过程。*
### 2. 训练强化学习 Agent (示例)
```python
import gymnasium as gym
from engine_env.envs.engine_env import AeroEngineGymEnv
# 1. 初始化环境
env = AeroEngineGymEnv()
obs, info = env.reset(options={'pla': 0.0})
# 2. 模拟训练循环
for step in range(1000):
# 设定任务:前200步起动(15度),之后巡航(60度)
pla_cmd = 15.0 if step < 200 else 60.0
env.set_pla(pla_cmd)
# 随机动作 (替换为你的 RL Policy)
action = env.action_space.sample()
# 环境交互
obs, reward, terminated, truncated, info = env.step(action)
if terminated:
print("Crash! Resetting env...")
obs, info = env.reset()
env.close()
```
---
## 📂 项目结构
```text
AeroEngineChallenge/
├── README.md # 项目说明书
├── setup.py # 安装脚本
├── test_pid_correct_pairs.py # 官方 PID 基准测试 (推荐)
├── test_random.py # 随机动作测试
└── engine_env/ # 核心包
├── __init__.py
├── core_model.py # DLL 调用接口
├── libEngine.dll # 发动机物理模型库
├── schedule.py # 控制计划 (PLA插值)
└── envs/
├── __init__.py
└── engine_env.py # Gym 环境主程序
```
---
## 💡 参赛 Tips
1. **物理直觉**: 喷管面积 () 对低压转子 () 影响直接,且呈现负相关特性(关小喷管 增加背压 转速上升)。不要忽视物理规律。
2. **起动难点**: 在 的起动阶段,必须配合使用 `AddPower` 和合适的燃油供给,防止熄火或超温悬挂。
3. **奖励设计**: 官方 Reward 函数较为严格,训练初期建议使用 `RewardWrapper` 进行适当的 Reward Shaping (如放宽误差容忍度) 以加速收敛。
---
**祝各位选手挑战成功,飞出完美包线!** ✈️