Add JSBSim service backend
This commit is contained in:
379
service/F22_COBRA_RESEARCH.md
Normal file
379
service/F22_COBRA_RESEARCH.md
Normal file
@@ -0,0 +1,379 @@
|
||||
# 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”量化,而不是只靠视觉判断。
|
||||
Reference in New Issue
Block a user