380 lines
9.9 KiB
Markdown
380 lines
9.9 KiB
Markdown
# 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”量化,而不是只靠视觉判断。
|