# GAMMA + WSL2 双引擎集成方案 ## Context 当前系统使用 ENVI/SARscape 做 D-InSAR 处理,速度慢(单对处理需数十分钟到数小时)。用户有 GAMMA License,希望在 Windows 服务器的 WSL2 中部署 GAMMA 作为第二处理引擎。ENVI 保留不动,用户可在前端选择用哪个引擎。 GAMMA 通过 WSL2 调用完全可行:`subprocess.run(['wsl', '-d', 'Ubuntu', 'bash', '-c', 'gamma_cmd ...'])`,与现有 ENVI 的 subprocess 模式一致。 --- ## 架构对比 ``` ENVI 链路(保留不动): POST /idl/jobs/dinsar (engine=envi) → SystemJob(IDL_RUN_DINSAR) → envi_runner_cli 子进程 → envi_dinsar.run_dinsar_custom_workflow() → 6步 SARscape → envipyengine → taskengine.exe GAMMA 链路(新增): POST /idl/jobs/dinsar (engine=gamma) → SystemJob(GAMMA_RUN_DINSAR) → gamma_runner_cli 子进程 → gamma_dinsar.run_dinsar_workflow() → 9步 GAMMA CLI → subprocess.run(['wsl', ...]) → GAMMA 原生命令 ``` 两条链路共享:SystemTask/SystemJob 任务队列、progress.json 进度机制、job_worker 监控逻辑。 --- ## 新增文件 | 文件 | 职责 | |------|------| | `backend/app/services/gamma_service.py` | WSL2 执行器、路径转换(win↔wsl)、配置读取、环境检查、进度写入 | | `backend/app/services/gamma_dinsar.py` | GAMMA D-InSAR 9步工作流 | | `backend/app/services/gamma_runner_cli.py` | 子进程 CLI 入口(对标 envi_runner_cli.py) | | `backend/app/services/gamma_import.py` | LT-1 原始数据 → GAMMA SLC 格式导入 | | `scripts/check_gamma_wsl.py` | GAMMA + WSL2 环境诊断脚本 | ## 修改文件 | 文件 | 修改内容 | |------|----------| | `.env` | 新增 `GAMMA_ENABLED`、`GAMMA_WSL_DISTRO`、`GAMMA_HOME`、`GAMMA_ENV_SCRIPT`、`GAMMA_DEM_FILE` 等配置 | | `backend/app/config.py` | Settings 类新增 GAMMA 配置字段 | | `backend/app/services/job_handlers.py` | 新增 `GAMMA_RUN_DINSAR` handler,注册到 `_HANDLERS` | | `backend/app/routers/idl.py` | `DinsarJobRequest` 新增 `engine` 字段(envi/gamma),路由分发 | | `frontend/src/IDLAutomationPanel.jsx` | Step 2 新增引擎选择器(radio:ENVI / GAMMA),GAMMA 不可用时灰显 | | `frontend/src/api/idl.js` | `queueDinsarJob` payload 新增 `engine` | --- ## GAMMA D-InSAR 9步工作流 每步通过 `gamma_service.gamma_exec(cmd, work_dir)` → `wsl -d {distro} bash -c 'source gamma_env.sh && {cmd}'` 执行。 | 步骤 | GAMMA 命令 | 功能 | 对应 ENVI 步骤 | |------|-----------|------|---------------| | 1 | LT-1 导入(自定义) | 原始数据 → .slc + .slc.par | SARsImportLuTan1 | | 2 | `gc_map` | DEM 准备 + lookup table | (ENVI 内置在 Step1) | | 3 | `create_offset` + `offset_pwr` + `offset_fit` + `SLC_interp` | 配准 | InterferogramGeneration 内部 | | 4 | `SLC_intf` + `multi_look` | 干涉图生成 | InterferogramGeneration | | 5 | `adf` | 自适应滤波(Goldstein) | FilterAndCoherence | | 6 | `cc_wave` | 相干性估计 | FilterAndCoherence | | 7 | `mcf` | 相位解缠 | PhaseUnwrapping | | 8 | `dispmap` | 相位→位移 | PhaseToDisplacement | | 9 | `geocode_back` + `data2geotiff` | 地理编码 + 转 GeoTIFF | PhaseToDisplacement | --- ## 关键设计 ### 路径转换 ```python def win_to_wsl(win_path: str) -> str: # Z:\Test_data\Task_001 → /mnt/z/Test_data/Task_001 # D:\SRTM\dem.tif → /mnt/d/SRTM/dem.tif ``` ### 进度跟踪 写入与 ENVI 完全相同格式的 `backend/runtime/idl_worker/job_{id}_progress.json`,job_handler 的 keepalive 无需修改。GAMMA 的 `total_steps=9`(ENVI 为 6),进度公式 `(pair_index-1+step/total)/total_pairs` 天然适配。 ### 输出格式统一 GAMMA 最终输出转为 GeoTIFF(`data2geotiff`),同时生成 ENVI `.hdr`,使 `extract_disp_results()` 和 D-InSAR 结果扫描能统一识别。 ### 前端引擎选择 页面加载时调 `GET /gamma/status` 检查 GAMMA 是否可用。可用时显示 radio 选择器,不可用时 GAMMA 选项灰显标注"(未配置)"。 --- ## .env 配置项 ```ini # ============ GAMMA + WSL2 配置 ============ # 总开关(false 则前端不显示 GAMMA 选项) GAMMA_ENABLED=false # WSL2 发行版名称(wsl -l -v 查看) GAMMA_WSL_DISTRO=Ubuntu-22.04 # GAMMA 安装路径(Linux 路径,WSL2 内部) GAMMA_HOME=/opt/GAMMA_SOFTWARE-20230101 # GAMMA 环境初始化脚本(source 此文件后 GAMMA 命令可用) GAMMA_ENV_SCRIPT=/opt/GAMMA_SOFTWARE-20230101/gamma_env.sh # DEM 文件路径(Windows 路径,自动转为 WSL 路径) GAMMA_DEM_FILE=D:\SRTM30m\srtm_dem.tif # 处理参数 GAMMA_GEOCODE_PIXEL_SIZE_M=10.0 GAMMA_ADF_WINDOW_SIZE=32 GAMMA_MCF_COH_THRESHOLD=0.3 GAMMA_RANGE_LOOKS=4 GAMMA_AZIMUTH_LOOKS=1 ``` --- ## 分阶段实施 ### Phase 1:基础设施 + 环境验证 - `.env` / `config.py` 配置层 - `gamma_service.py`:`win_to_wsl()`、`wsl_exec()`、`gamma_exec()`、`check_gamma_environment()` - `scripts/check_gamma_wsl.py` 诊断脚本 - `GET /gamma/status` 端点 - 手动验证:`wsl -d Ubuntu bash -c 'source gamma_env.sh && which par_S1_SLC'` ### Phase 2:LT-1 数据导入(技术风险最高) - `gamma_import.py`:解析 LT-1 `.meta.xml` → 构建 GAMMA `.slc.par` 参数文件 - **关键验证**:对一个 Task_*/master/ 执行导入,检查 .slc.par 参数是否正确 - 如果 GAMMA 内置 LT-1 支持,直接调用;否则需手工构建参数文件 ### Phase 3:D-InSAR 核心工作流 - `gamma_dinsar.py`:9步工作流 - `gamma_runner_cli.py`:CLI 入口 - 逐步调试,每步验证输入输出 ### Phase 4:任务调度 + 前端集成 - `job_handlers.py`:新增 GAMMA handler - `idl.py`:engine 字段分发 - `IDLAutomationPanel.jsx`:引擎选择器 - 端到端测试 --- ## 风险点 1. **LT-1 导入**(最大风险):GAMMA 是否内置 LT-1 读取器需要安装后确认。Plan B:用 GDAL 读 TIFF + 手工构建 .slc.par 2. **WSL2 跨文件系统 I/O**:`/mnt/z/` 比 WSL 原生文件系统慢 ~5x。初期可接受,后续可优化为先拷贝到 WSL 内部处理 3. **GAMMA License**:WSL2 中需配置 FlexLM `LM_LICENSE_FILE`,在 `gamma_env.sh` 中统一设置 --- ## 验证 1. `py_compile` 所有新增/修改的 .py 文件 2. `npm run build` 前端构建通过 3. `python scripts/check_gamma_wsl.py` 环境诊断通过 4. 前端选 GAMMA 引擎 → 提交任务 → 进度正常更新 → 输出 GeoTIFF 位移图 5. 前端选 ENVI 引擎 → 行为与改造前完全一致(回归测试) 6. GAMMA 未配置时 → 前端 GAMMA 选项灰显,无法选择