# sim_hub — 仿真集成台 构建与出图 ## 产物 | 文件 | 落点 | 用途 | |---|---|---| | `仿真集成台.html` | `outputs/rudong/windscada/_demo/sim/` | **本机版**:13 个仿真入口全可点(本机服务 + 本地文件),演示用 | | `仿真集成台_分享版.html` | 同上 | **分享版**:入口列清单不外链,可发出去 | **单一内容源 = `build_hub.py`。** 分享版由 `mk_share.py` 后处理产出,不单独维护。 改内容改 `build_hub.py`,两版重跑一次即可,不要直接手改 HTML(会与脚本脱钩)。 ```bash python3 build_hub.py && python3 mk_share.py ``` `mk_share.py` 带断言:13 个本机链接必须全部转成 nolink 卡片,转换后残留必须为 0,否则失败。 ## 结构(改内容时对照) 01 仿真架构(四层 SVG)· 02 整体价值 · 03 我们能做什么(四组入口 + 场级尾流)· 04 培训编排(前置一篇 + 正课六篇) 「需要的基础条件」一节按 2026-09-08 用户裁决**未写**。 ## 出图脚本 | 脚本 | 出什么 | 依赖 | |---|---|---| | `wake_real.py` | 真实山地风场尾流静态图 → `assets/wake_real.png` | ⚠ 见下 | | `wake_anim.py` | 风向扫过的动态仿真帧 → 再用 ffmpeg 合成 `assets/wake_anim.mp4` | ⚠ 见下 | | `wake.py` | 叶轮直径 vs 间距的示意三联图(合成布局,非真实场) | 仅 PyWake | **⚠ 两条外部依赖,换机器会断:** 1. **Python 环境** = `~/.venvs/windsim`(仓外隔离,装了 PyWake / ROSCO / pyproj)。 **不要装进生产 venv** —— PyWake 会拉动 numpy/pandas 版本,可能打坏分析主链。 ```bash python3 -m venv ~/.venvs/windsim && ~/.venvs/windsim/bin/pip install py_wake rosco pyproj ``` 2. **机位坐标源**写死在 `wake_real.py` / `wake_anim.py` 里,指向**另一个仓**: `/Users/yuanying/wind-analytics/configs/contracts/mawang_machine_map.csv`。 assets/ 里已存好出图结果,所以**日常重建集成台不需要它**;只有要重出尾流图时才需要。 合成视频: ```bash ffmpeg -y -framerate 8 -i frames/f%03d.png -vf "scale=1600:-2:flags=lanczos" \ -c:v libx264 -pix_fmt yuv420p -crf 20 assets/wake_anim.mp4 ``` ## 出图时踩过的两个坑(都不报错,只出错结果) 1. **机位坐标表混两套坐标系。** 源表 90 台里 50 台是经纬度、40 台是 3 度带投影米制 (中央经线 108°E,**EPSG:4545**;4547 是 CM114E,别记岔)。按期别干净分开 = 两期不同单位测绘。 当经纬度直读 → 场跨度算成 1e11 量级而**不抛异常**。脚本里已加跨度断言。 2. **旋转脱敏时风向符号。** 机位逆时针转 θ,风向必须 `wd_true − θ`(气象风向自北顺时针量)。 写成 `+θ` 尾流朝错误方向拖,**看图看不出来**。 唯一可靠检出:刚性变换下逐台亏损须与不旋转基准**逐位相同**(实测差 0.0000;符号错时差 73–84 个百分点)。 另:`flow_map` 的 `WS_eff` 本就是 `(len(Y), len(X))`,不要用 shape 相等去猜方向——网格常是方阵,必然误判。已改断言。 详见主仓 `TASKS.md` 的 `[2026-09-08] 培训中心仿真集成线`。