算法更新: delivery v1.2.1、平整度v1.5、测距v2.2、整车配准v1.3 适配器: vehicle-registration 新增、各算法 manifest 和 adapter 更新 后端: taskCadFiles/source 字段迁移、derivedPointClouds 注册、取消任务联动 前端: ElapsedTime 时长显示、两步算法流程、canRun 逻辑修复 文档: 新增5份算法性能分析报告
5.5 KiB
5.5 KiB
车钩面板算法性能分析报告
分析时间:2026-06-25
算法版本:delivery_v1.2.1 / coupler_panel_release
适用场景:ROI 裁剪后的车钩面板局部点云(~数万点)
测试环境:INTEL SSDSC2KB01(SATA SSD,~394 MB/s);A100 40 GB;CPU 128 核
执行流程总览
run_coupler_measurement_pipeline()
├─ load + ROI clip # 流式读取 / 全量加载后裁剪
├─ select_panel_layer() # 可选层隔离(layer_select.enabled)
├─ parse_cad() # 可选 STEP CAD 解析
├─ autotune detection config # 可选参数自适应
├─ denoise_cloud() # 去噪流水线(passthrough/voxel/SOR/ROR)
└─ compute_coupler_measurement()
├─ detect_four_holes() # 占位格 → 圆拟合 → 4 孔检测 ← 主要耗时
├─ plane_fit() # 平面拟合
└─ compute_deflection_metrics()
各步骤详细说明与时间估算
第一阶段:I/O 与 ROI 裁剪
| # | 步骤 | 代码位置 | 说明 | 估算时间 |
|---|---|---|---|---|
| 1 | crop_ply_bbox 流式裁剪 |
pipeline.py:109 |
当提供 ROI 且输入为 binary PLY 时,分块读取,无需全量加载(关键优化) | ~5–30 s(取决于文件大小) |
| 1b | 全量 load_point_cloud |
pipeline.py:117 |
无 ROI 时全量加载;1 亿点 ~2 GB binary PLY | ~15 s |
| 2 | apply_roi 掩码 |
pipeline.py:118 |
O(N) numpy 布尔索引 | < 1 s |
重要:
crop_ply_bbox是 v1.2.1 新增的流式裁剪,避免了整车大点云全量加载。必须在前端配置 ROI 参数,否则回退到全量加载再过滤。
第二阶段:可选层隔离与 CAD 解析
| # | 步骤 | 代码位置 | 说明 | 估算时间 |
|---|---|---|---|---|
| 3 | select_panel_layer |
pipeline.py:137 |
PCA 法向 + 沿法向直方图取单层;仅当 layer_select.enabled=true 时运行 |
~2 s |
| 4 | parse_cad(STEP → mesh + GT) |
data_prep.py:111 |
OCC tessellate STEP + 提取定位孔 GT;仅当传入 cad_stp_path 时运行 |
~5–30 s(取决于 STEP 复杂度) |
| 5 | detection_overlay autotune |
pipeline.py:190 |
从 CAD 孔半径 + 降采样间距自适应调整 detection 参数 | < 1 s |
第三阶段:去噪(denoise_cloud)
去噪流水线按 YAML config 中 denoise.steps 顺序执行,ROI 裁剪后的局部云通常只剩 数千到数万点,各步骤很快。
| # | 步骤 | 代码位置 | 使用 Open3D C++ 实现 | 说明 | 估算时间 |
|---|---|---|---|---|---|
| 6 | passthrough_filter(轴截取) |
denoise/passthrough.py |
是(bbox crop) | 沿轴裁剪额外边界;O(N) | < 0.1 s |
| 7 | voxel_downsample(VGF) |
denoise/voxel.py |
是(o3d.voxel_down_sample) |
体素降采样,C++ 加速 | < 0.5 s |
| 8 | statistical_outlier_removal(SOR) |
denoise/statistical.py |
是(o3d.remove_statistical_outlier) |
k-NN 统计离群,C++ 加速 | < 1 s |
| 9 | radius_outlier_removal(ROR) |
denoise/radius.py |
是(o3d.remove_radius_outlier) |
半径离群,C++ 加速 | < 1 s |
与 underframe-deflection 的 preprocess 对比:去噪用的是 Open3D C++ 实现,不是 scipy Pure Python,在局部云上几乎无延迟。
第四阶段:4 孔检测(主要耗时)
| # | 步骤 | 代码位置 | 说明 | 估算时间 |
|---|---|---|---|---|
| 10 | 投影到面板平面 + 占位格生成 | detection/occupancy_grid.py |
PCA 面板法向投影 → 2D 栅格 | ~1 s |
| 11 | 孔形空腔检测 | detection/detect_holes.py |
连通分量 → 面积/圆度 筛选 4 孔;若参数不匹配则抛 HoleDetectionError |
~2–5 s |
| 12 | circle_fit 精确圆心 |
detection/circle_fit.py |
Taubin 圆拟合,O(M) per hole | ~1 s |
| 13 | four_hole_selector 4 孔配对 |
detection/four_hole_selector.py |
象限排序 + 几何验证 | < 1 s |
瓶颈:孔检测依赖
grid_pixel_mm/hole_*_area_mm2参数匹配。参数不适配会触发HoleDetectionError,需通过autotune或手动指定 profile 解决。
第五阶段:测量与输出
| # | 步骤 | 代码位置 | 说明 | 估算时间 |
|---|---|---|---|---|
| 14 | plane_fit 精确平面拟合 |
api.compute_coupler_measurement |
SVD 平面拟合 | < 1 s |
| 15 | compute_deflection_metrics |
metrics.py |
角度 / 偏移量计算 | < 1 s |
| 16 | 写输出(JSON / PLY / Excel) | pipeline.py |
report JSON + xlsx | ~2 s |
总时间汇总
| 场景 | 估算耗时 | 说明 |
|---|---|---|
| 正常流程(有 ROI + 有 CAD) | ~1–2 min | 主要耗在 STEP 解析和孔检测 |
| 无 ROI 的整车输入(1 亿点) | ~10 min+ | 全量加载 + 全量 SOR/ROR 过滤 |
检测参数不匹配(HoleDetectionError) |
失败 | 需调整 grid_pixel_mm 或使用 autotune |
主要瓶颈与优化建议
| 问题 | 原因 | 解决方案 |
|---|---|---|
HoleDetectionError 频繁发生 |
grid_pixel_mm 过大或 hole_area 范围不含目标孔 |
提供 CAD STEP 启用 autotune,或在 manifest 配置 profile |
| 整车云输入太慢 | 无 ROI 时全量加载 + 全量 SOR/ROR | 必须在前端配置 ROI;或 manifest 中配置合理默认 ROI |
| STEP 解析慢 | OCC tessellate 复杂曲面 | 可预先生成 STL 绕过 OCC;或启用 CAD sample 缓存 |
GPU 使用情况
不使用 GPU。 所有计算为 CPU + numpy + Open3D,无 torch/CUDA 依赖。