Files
jsbsim-service/service/F22_COBRA_RESEARCH.md
2026-04-28 17:53:29 +08:00

380 lines
9.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# F-22 Cobra 机动研究记录
本文记录当前 JSBSim 眼镜蛇机动研究的现状、技术方案和已修改位置。范围覆盖 `service` 后端、`web-test` 前端、共享 schema以及为 F-22 Cobra 研究复制出的本地飞机模型。
## 目前现状
项目当前以 `web-test` 为前端、`service` 为后端,通过本地 HTTP API 调用 JSBSim 完成飞行动力学仿真。
当前默认研究对象是:
- 前端 aircraftId: `f22cobra-jsbsim`
- 后端 JSBSim model id: `f22cobra`
- 模型文件: `service/aircraft/f22cobra/f22cobra.xml`
- 后端服务: `http://127.0.0.1:4317`
- 内部积分频率: `integrationRateHz = 120`
- 输出采样频率: `sampleRateHz = 30`
当前 Cobra 默认参数是一个稳定的近似 Cobra 基线,而不是追求极限 120 度迎角的表演级参数:
```json
{
"aircraftId": "f22cobra-jsbsim",
"durationSec": 5,
"sampleRateHz": 30,
"integrationRateHz": 120,
"trim": false,
"initialState": {
"position": [0, 3000, 0],
"velocityMps": 120,
"headingDeg": 0
},
"maneuver": {
"type": "cobra",
"parameters": {
"controlMode": "closed-loop",
"entryDelaySec": 0.15,
"pullDurationSec": 0.7,
"holdDurationSec": 0,
"recoveryDurationSec": 2.0,
"targetAlphaDeg": 80,
"recoveryAlphaDeg": 8,
"pitchRateLimitDegS": 80,
"holdPitchRateDegS": 0,
"maxElevatorCmd": -0.45,
"recoveryElevatorCmd": 0.65,
"throttleCmd": 1,
"pullTvcCmd": -0.05,
"recoveryTvcCmd": 0.85,
"speedbrakeCmd": 0
}
}
}
```
在当前 F-22 模型和上述参数下,直接 JSBSim 验证的典型指标约为:
- 峰值迎角 `maxAlpha`: 约 `71.9 deg`
- 峰值俯仰角速度 `maxPitchRate`: 约 `122.9 deg/s`
- 最低速度 `minSpeed`: 约 `106.4 m/s`
- 5 秒末迎角 `endAlpha`: 约 `9.7 deg`
- 5 秒末俯仰角 `endPitch`: 约 `31.0 deg`
这个状态的意义是:先获得可重复、能恢复、不会突然翻转的基线,再继续向更高 alpha 推进。
## 技术方案
### 1. 后端用 JSBSim 做 6DoF 积分
后端 `service/scripts/jsbsim_runner.py` 是 JSBSim 的 Python runner。Node 后端通过 `service/src/backends/jsbsimBackend.js` 调用该 runner。
关键点:
- `sampleRateHz` 只控制返回给前端的采样密度。
- `integrationRateHz` 控制 JSBSim 内部积分步长,当前默认 120 Hz。
- 仿真过程中内部积分按 `integrationRateHz` 推进,输出样本按 `sampleRateHz` 抽样。
- F-22 研究默认 `trim: false`,因为 bundled F-22 在部分速度点纵向 trim 会失败,但直接 initial condition 可以运行。
### 2. 用本地 F-22 研究模型打开 TVC 控制
原始 bundled F-22 的 TVC 链路不适合直接外部命令控制。当前复制出本地模型:
```text
service/aircraft/f22cobra/f22cobra.xml
```
并加入/改造:
- `fcs/tvc-cmd-norm`
- TVC actuator 输入改为外部命令。
- 输出仍写到 `fcs/tvc-pos-norm` / `fcs/tvc-pos-rad`,供 JSBSim 气动和遥测读取。
这样后端可以通过 `fcs/tvc-cmd-norm` 直接施加 TVC 指令。
### 3. Cobra 从开环时间线升级为闭环控制器
早期 Cobra 使用固定时间线:
```text
某时刻 elevator = X, tvc = Y, throttle = Z
```
这种开环方式容易出现:
- 抬头过猛
- 俯仰角速度尖峰
- 高迎角后恢复不下来
- 轨迹出现不自然的旋转或深失速
现在 `cobra` 默认使用:
```json
{ "controlMode": "closed-loop" }
```
闭环控制器每个积分步读取当前状态:
- `aero/alpha-rad`
- `attitude/theta-rad`
- `velocities/q-rad_sec`
- `velocities/vtrue-fps`
然后计算:
- elevator command
- TVC command
- throttle command
- speedbrake command
控制目标不是“固定时间点打多少杆”,而是:
- 拉起阶段限制 pitch rate
- 接近目标 alpha 时自动减小拉起
- 恢复阶段用 elevator + TVC 把 alpha 拉回低迎角
- 避免过快掉速和深失速
旧的开环 Cobra 仍保留:
```json
{ "controlMode": "open-loop" }
```
这方便后续对比开环和闭环表现。
### 4. 姿态输出改用四元数
前端之前使用 Euler/HPR 处理姿态,在接近 90 度俯仰时容易出现视觉上的突然翻转。
现在后端输出 body-to-local ENU 四元数:
```json
"rotation": [x, y, z, w]
```
前端播放时用 quaternion slerp 插值Cesium 渲染也直接使用四元数路径。这避免了高俯仰角附近的 Euler 奇异跳变。
### 5. 轨迹积分使用 JSBSim 地速分量
位置轨迹不再用 heading/pitch 自己推算水平位移,而是使用 JSBSim 输出的地球坐标速度:
- `velocities/v-east-fps`
- `velocities/v-north-fps`
这避免了姿态大幅变化时轨迹方向和机体方向互相污染。
### 6. 前端加入 Cobra 参数面板和遥测面板
前端现在默认选中 `f22cobra-jsbsim``Cobra`
Cobra 参数面板可以直接调:
- `Target alpha`
- `Pitch-rate cap`
- `Pull time`
- `Recovery time`
- `Pull elevator`
- `Recovery elevator`
- `Pull TVC`
- `Recovery TVC`
右侧遥测面板显示关键曲线和 summary便于判断问题来源
- alpha
- pitch
- pitch rate
- velocity
- altitude delta
- elevator command
- TVC command
- speedbrake command
## 修改的地方
### service 后端
#### `service/scripts/jsbsim_runner.py`
主要改动:
- 新增 `integrationRateHz` 支持,默认 120 Hz。
- 内部积分频率与输出采样频率解耦。
- 新增/扩展 `cobra` maneuver。
- 新增 `controlMode = closed-loop` 的 Cobra 控制器。
- 保留 `controlMode = open-loop` 的时间线控制。
- 控制输入支持:
- elevator
- aileron
- rudder
- throttle
- tvc
- speedbrake
- 输出样本增加:
- `alphaDeg`
- `betaDeg`
- `qbar`
- `verticalSpeedMps`
- `pitchRateDegS`
- `rollRateDegS`
- `yawRateDegS`
- `controlInputs`
- `controlSurfaces`
- `fcs`
- 姿态输出改为 ENU body quaternion。
- 本地位置积分改用 JSBSim east/north velocity。
#### `service/aircraft/f22cobra/f22cobra.xml`
主要改动:
- 从 bundled JSBSim F-22 复制出项目本地研究模型。
- 模型名称改为 F-22 Cobra Research。
- 新增 `fcs/tvc-cmd-norm` property。
- TVC actuator 改为读取 `fcs/tvc-cmd-norm`
- 保证外部控制能驱动 `fcs/tvc-pos-norm`
#### `service/src/backends/jsbsimBackend.js`
主要改动:
- 新增 `f22cobra-jsbsim` aircraft。
-`integrationRateHz` 透传给 Python runner。
- `cobra` / `control-script` 加入 JSBSim 后端支持列表。
- F-22 研究机型标记为 high-alpha / TVC / no-trim experimental。
#### `service/src/backends/mockBackend.js`
主要改动:
- mock backend 同步支持 `integrationRateHz`
- mock 输出结构补齐部分 JSBSim 遥测字段。
- 支持 `control-script` / `cobra` 的视觉测试路径。
#### `service/src/simulator.test.js`
主要改动:
- 增加对 `integrationRateHz = 120` 的断言。
- 增加 `control-script` / `cobra` 基础测试。
#### `service/scripts/sweep_f22_cobra.py`
主要作用:
- 批量扫描 Cobra 参数组合。
- 计算 max alpha、max pitch、min speed、end alpha、end pitch、forward delta 等指标。
- 用 score 排序,辅助后续自动调参。
### shared schema
#### `shared/schemas/flight-sim-api.schema.json`
主要改动:
- 新增 `integrationRateHz`
- 新增 `trim`
- maneuver enum 增加:
- `control-script`
- `cobra`
- sample schema 增加遥测字段:
- `qbar`
- `verticalSpeedMps`
- `pitchRateDegS`
- `rollRateDegS`
- `yawRateDegS`
- `controlInputs`
- `controlSurfaces`
- `fcs`
- Cobra 参数说明中记录 `controlMode=open-loop|closed-loop`
### web-test 前端
#### `web-test/src/api/simulationService.js`
主要改动:
- 默认 aircraft 使用 F-22 Cobra research。
- 默认 `sampleRateHz = 30`
- 默认 `integrationRateHz = 120`
- F-22 research 默认 `trim = false`
- Cobra 默认参数改为稳定闭环基线。
- 支持从前端 Cobra 参数面板覆盖默认参数。
- 参数进入请求前做范围 clamp。
#### `web-test/index.html`
主要改动:
- 默认 maneuver 改为 Cobra。
- 默认 duration 改为 5 秒。
- 默认 speed 改为 120 m/s。
- 新增 Cobra Controller 参数面板。
- 新增遥测 canvas 面板。
#### `web-test/src/ui/controls.js`
主要改动:
- 读取 Cobra 参数面板输入。
- `getValues()` 返回 `cobraParameters`
- 非 Cobra 机动时隐藏 Cobra 参数区。
#### `web-test/src/ui/researchPanel.js`
主要作用:
- 绘制 Cobra 遥测曲线。
- 输出 summary
- max alpha
- max pitch
- max pitch rate
- min speed
- end alpha
- speedbrake 状态
#### `web-test/src/playback/trajectoryPlayer.js`
主要改动:
- 使用四元数 slerp 插值姿态。
- 减少高俯仰角播放时的姿态跳变。
#### `web-test/src/renderer/cesiumScene.js`
主要改动:
- 支持后端 quaternion rotation。
- Cesium aircraft orientation 从本地 ENU body quaternion 转换到世界坐标。
- 保留 HPR fallback。
#### `web-test/src/styles.css`
主要改动:
- 增加 Cobra 参数面板样式。
- 增加遥测面板样式。
- 调整移动端布局。
## 当前限制
1. 当前 F-22 XML 的高迎角 / 失速后气动可信度有限。
2. 目前稳定基线只能做到约 70-72 度 alpha继续推高 alpha 容易进入深失速或恢复困难。
3. `speedbrakeCmd` 在该 F-22 模型中更像离散开关,部分小数指令不会有效展开。
4. 目前闭环控制器是工程研究用,不是完整真实 FCS。
5. 参数 sweep 还没有接入前端,只能通过脚本跑。
## 下一步建议
1.`sweep_f22_cobra.py` 接到 service API支持前端一键 sweep。
2. 增加 Cobra 参数 preset
- stable baseline
- high-alpha attempt
- aggressive TVC recovery
- open-loop comparison
3. 为机动研究抽象统一 controller 接口,后续复用到:
- Herbst maneuver
- Kulbit
- J-turn
- tailslide
4. 进一步寻找或构建更可信的高迎角/失速后 F-22、Su-27、F-16 MATV 等 JSBSim 模型。
5. 增加自动评分指标,把“像不像 Cobra”量化而不是只靠视觉判断。