Files
lipan 29f1d45d66 feat: 算法升级、整车配准集成与性能分析文档
算法更新: delivery v1.2.1、平整度v1.5、测距v2.2、整车配准v1.3
适配器: vehicle-registration 新增、各算法 manifest 和 adapter 更新
后端: taskCadFiles/source 字段迁移、derivedPointClouds 注册、取消任务联动
前端: ElapsedTime 时长显示、两步算法流程、canRun 逻辑修复
文档: 新增5份算法性能分析报告
2026-06-25 08:22:20 +00:00

721 lines
21 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# USAGE
本文档面向后续开发人员,说明本项目的运行环境、数据约定、命令输入输出、常用工作流和排错方法。
项目根目录下的 `main.py` 是统一命令行入口。除非特别说明,所有命令都建议在项目根目录执行。
```bash
python main.py --help
```
当前公开命令:
```text
translate-align
cad2mesh
denoise
registration
contour
curvature
plane
full
```
## 1. 环境准备
推荐使用独立 conda 环境。当前项目建议使用 `High-Speed` 环境运行;不要直接在 `base` 环境中安装,尤其不要在 Python 3.12 的 base 环境里安装 `pythonocc-core`。
```bash
conda env create -n High-Speed -f environment.yml
conda activate High-Speed
pip install -r requirements.txt
pip install git+https://github.com/AutodeskAILab/occwl
```
如果环境已经存在:
```bash
conda env update -n High-Speed -f environment.yml
conda activate High-Speed
pip install -r requirements.txt
pip install git+https://github.com/AutodeskAILab/occwl
```
验证依赖:
```bash
python -c "import open3d, trimesh, torch, yaml, OCC.Core.STEPControl; print('env ok')"
```
如果 `torch` 提示 CUDA driver 版本过旧,程序会退回 CPU。功能不受影响,但点云到三角面的距离计算会慢。
## 2. 数据目录约定
默认示例数据放在 `datasets/`:
```text
datasets/
CAD/ # STEP CAD,例如 11.step
Mesh/ # STL/OBJ/PLY Mesh,例如 11.stl
PointCloud/ # 原始/干净点云 PLY,例如 11.ply
Noise_PointCloud/ # 加噪或待配准点云 PLY,例如 11_noisy.ply
shift_test_output/ # translate-align 测试输出,默认读取 shifted_whole_pointcloud.ply
```
同一编号的数据通常应成组存在:
```text
datasets/CAD/11.step
datasets/Mesh/11.stl
datasets/PointCloud/11.ply
datasets/Noise_PointCloud/11_noisy.ply
```
`translate-align` 默认使用下面这组输入:
```text
datasets/CAD/M02.stp
datasets/shift_test_output/shifted_whole_pointcloud.ply
```
数据要求:
- CAD 使用 STEP,扩展名通常是 `.step` 或 `.stp`。
- Mesh 使用 `trimesh` 可读取的格式,例如 `.stl`、`.obj`、`.ply`。
- PointCloud 推荐 PLY,必须包含三维点坐标。
- CAD、Mesh、PointCloud 必须处于同一坐标系和同一单位。
- 示例数据按毫米量级处理。
- `contour` 假设点云已与 CAD/Mesh 对齐。
- `registration` 会模拟旋转后做配准。
## 3. 输出目录约定
建议保留以下输出目录:
```text
vis/ # 日志、热力图点云、曲率点云、中间结果
excel/ # contour 输出的 Excel 表
results/ # translate-align 默认输出目录
```
可以手动创建:
```bash
mkdir -p vis excel results
```
常见输出:
```text
*.stl # CAD 转 Mesh 结果
*.ply # 彩色点云、热力图点云
*.xlsx # 轮廓/平整度/平面度 Excel 汇总
*.log # shell 重定向保存的终端输出
results/T_translation_only.txt
results/aligned_pointcloud_translation_only.ply
```
## 4. 方法输入输出总览
| 方法 | 用途 | 输入 | 输出 |
|------|------|------|------|
| `translate-align` | 点云到标准CAD的配准 | 默认 `--cad datasets/CAD/M02.stp --pointcloud datasets/shift_test_output/`;可调头尾截取和采样参数 | 默认写入 `results/`,输出对齐后点云、4x4 平移矩阵和头尾采样检查文件 |
| `cad2mesh` | STEP CAD 转 STL Mesh | `--cad` STEP 文件 | `--mesh` STL 文件 |
| `denoise` | 给干净点云加噪,并运行滤波方法 | `--pointcloud` 干净 PLY;`--noise-std` 噪声标准差 | 终端输出点数、平均噪声偏移、滤波保留比例、Chamfer Distance |
| `registration` | 点云到 Mesh 配准与距离评估 | `--pointcloud` 待配准 PLY;`--mesh` 参考 Mesh | 终端输出 fitness、RMSE、变换矩阵、配准后距离统计 |
| `contour` | 轮廓/平整度/平面度评估 | 单任务:`--pointcloud` 和 `--cad`;批量:`--tasks` 或 `--all`,并指定 `--data-root`、`--pointcloud-kind` | 终端输出 Mean、Max、RMSE、Min、Std;可保存热力图 PLY 和 Excel |
| `curvature` | 点云曲率估计 | `--pointcloud` PLY;`--radius` 邻域半径;`--max-nn` 最大邻居数 | 终端输出曲率 mean/max;可保存彩色曲率 PLY |
| `plane` | RANSAC 平面拟合 | 可选 `--pointcloud` PLY;不传则生成模拟带噪平面 | 终端输出平面模型、内点比例、法向角度误差、RMSE |
| `full` | 配置驱动的完整流程 | `--config` YAML 配置;默认 `config.yaml` | 串联输出加噪/滤波、配准和距离评估结果 |
## 5. 命令详解
### 5.1 轮廓/平整度/平面度评估:`contour`
功能:统一的轮廓/平整度/平面度评估入口。默认读取 STEP CAD,三角化后计算点云到 CAD 三角面的最近距离。
输入:
- `--pointcloud`:待评估 PLY 点云。
- `--cad`:参考 STEP CAD。
- `--mesh`:可传参考 STL/OBJ/PLY Mesh。传了 `--mesh` 时会走点云到 Mesh 距离计算。
- `--tasks`:批量执行指定任务编号,用英文逗号分隔,例如 `11,31,40`。
- `--all`:批量执行 `--data-root` 下 `CAD/` 中的全部 STEP 数据。
- `--data-root`:批量数据根目录,默认 `datasets`。
- `--pointcloud-kind`:批量点云来源,`noise` 读取 `Noise_PointCloud/{id}_noisy.ply`,`clean` 读取 `PointCloud/{id}.ply`。
- `--mesh-deflection`:STEP 三角化精度,越小越精细,但三角面更多、计算更慢。
- `--point-chunk-size`:点云分块大小。
- `--triangle-chunk-size`:三角面分块大小。
- `--save`:保存距离热力图 PLY。
- `--excel-output`:保存 Excel。
- `--result-template`:Excel 参考模板,默认 `excel/测量结果.xlsx`。
- `--combined-context-pointcloud`:合并热力图时一起加入的完整点云,默认 `datasets/train/train_2_10M.ply`。可指定 `datasets/train/train_2_1T_配准.ply`;保存合并 PLY 时会按块流式写入,避免整体加载完整点云。
- `--no-visualize`:禁用 Open3D 窗口。使用 `train_2_1T_配准.ply` 时必须加该参数,否则窗口展示仍会尝试加载超大点云。
输出:
- 终端距离统计:Mean、Max、RMSE、Min、Std。
- 如果传 `--save`:保存彩色热力图 PLY。
- 如果传 `--excel-output`:保存 Excel。
- 批量模式:所有成功执行的热力图会按原始坐标额外保存成一个合并 PLY;保存阶段支持对 `datasets/train/train_2_1T_配准.ply` 进行流式合并。未传 `--no-visualize` 时也会按原始坐标合并到一个 Open3D 窗口展示,但超大背景点云不适合窗口展示。
- 批量模式会在终端最后打印总执行时间 `Contour batch total execution time`,该时间包含任务计算、Excel 保存和合并 PLY 保存。
Excel 格式:
```text
任务号 | 项点名称 | 公差要求 | 理论尺寸 | 测量结果 | 误差结果 | 测量结论
```
默认读取 `excel/测量结果.xlsx` 作为模板,按 `任务号` 迁移对应行到新 Excel。程序只填本次的 `测量结果` 和 `测量结论`:测量结果为本次测量均值;测量成功填 `成功`,否则填 `失败`。如果需要使用其它模板,传 `--result-template path/to/template.xlsx`。
任务号从 CAD 文件名提取。例如:
```text
datasets/CAD/11.step -> 11
```
Excel 路径规则:
- `--excel-output` 不带值:保存到 `excel/contour.xlsx`
- `--excel-output 11_contour.xlsx`:保存到 `excel/11_contour.xlsx`
- `--excel-output reports/11.xlsx`:保存到 `reports/11.xlsx`
- `--result-template` 不传:默认读取 `excel/测量结果.xlsx`
批量模式路径规则:
- CAD:`{data_root}/CAD/{任务号}.step`
- 加噪点云:`{data_root}/Noise_PointCloud/{任务号}_noisy.ply`
- 干净点云:`{data_root}/PointCloud/{任务号}.ply`
- 如果 `--save` 是目录,例如 `--save vis/contour`,每个任务会保存为 `vis/contour/{任务号}_contour.ply`
- 如果 `--save` 是带 `{task_id}` 的文件模板,例如 `--save vis/{task_id}_contour.ply`,会替换任务号
- 如果 `--save` 是普通 PLY 文件,例如 `--save vis/contour.ply`,批量模式会保存为 `vis/contour_{任务号}.ply`
- 合并点云保存规则:未传 `--save` 时保存为 `vis/combined_contour.ply`;`--save vis/contour` 时保存为 `vis/contour/combined_contour.ply`;`--save vis/{task_id}_contour.ply` 时保存为 `vis/combined_contour.ply`;`--save vis/contour.ply` 时保存为 `vis/contour_combined.ply`
- 合并点云默认会加入 `datasets/train/train_2_10M.ply`;可用 `--combined-context-pointcloud datasets/train/train_2_100M.ply` 或 `datasets/train/train_2_1T_配准.ply` 切换。保存合并 PLY 时,大背景点云按块从输入文件写入输出文件,不再用 Open3D 整体读入内存;输出文件会比原始背景点云更大,因为会额外写入 RGB 颜色。注意:由于 `train_2_100M.ply` 或 `train_2_1T_配准.ply` 太大,通常需要使用者自行导入或修改地址。
- 如果没有传 `--no-visualize`,批量模式会把所有成功热力图合并显示在一个窗口里。使用 `train_2_1T_配准.ply` 时不要打开窗口,必须保留 `--no-visualize`。
快速查看统计结果:
```bash
python main.py contour \
--pointcloud datasets/PointCloud/11.ply \
--cad datasets/CAD/11.step \
--no-visualize
```
保存热力图和 Excel:
```bash
python main.py contour \
--cad datasets/CAD/11.step \
--pointcloud datasets/Noise_PointCloud/11_noisy.ply \
--save vis/11_contour.ply \
--excel-output 11_contour.xlsx \
--no-visualize
```
指定多个任务:
```bash
python main.py contour \
--tasks 11,31,40 \
--data-root datasets \
--pointcloud-kind noise \
--save vis/contour \
--excel-output selected_contour.xlsx \
--no-visualize
```
执行全部任务:
```bash
conda activate High-Speed
python main.py contour \
--all \
--data-root datasets \
--pointcloud-kind noise \
--save vis/contour \
--excel-output all_contour.xlsx \
--combined-context-pointcloud datasets/train/train_2_1T_配准.ply \
--no-visualize
```
注意:使用时,利用combined-context-pointcloud指定配准后的点云路径
该模式只保存合并 PLY,不打开 Open3D 展示窗口。`train_2_1T_配准.ply` 会被流式读取,适合用于生成最终大文件;不要去掉 `--no-visualize`。
显存或内存不足时调小分块:
```bash
python main.py contour \
--cad datasets/CAD/11.step \
--pointcloud datasets/Noise_PointCloud/11_noisy.ply \
--mesh-deflection 0.5 \
--point-chunk-size 512 \
--triangle-chunk-size 1024 \
--excel-output \
--no-visualize
```
### 5.2 CAD 转 Mesh:`cad2mesh`
功能:读取 STEP CAD,离散成 STL 三角网格。
输入:
- `--cad`:输入 STEP 文件。
- `--mesh`:输出 STL 文件。
- `--precision`:离散精度,单位为 mm。值越小通常越精细,生成文件也可能越大。
输出:
- 一个 STL 文件。
- 终端输出 STEP 读取、网格化和 STL 写入进度。
示例:
```bash
python main.py cad2mesh \
--cad datasets/CAD/11.step \
--mesh vis/11_cad2mesh.stl \
--precision 1.0
```
### 5.3 加噪与滤波:`denoise`
功能:读取干净点云,加高斯噪声,并按配置运行滤波方法。
输入:
- `--pointcloud`:干净 PLY 点云。
- `--noise-std`:高斯噪声标准差。
- `--no-visualize`:禁用 Open3D 窗口。
输出:
- 终端输出干净点数、加噪点数、平均噪声偏移。
- 对每个滤波方法输出保留比例和 Chamfer Distance。
- 当前主流程不会自动保存滤波后的点云文件。
示例:
```bash
python main.py denoise \
--pointcloud datasets/PointCloud/11.ply \
--noise-std 4 \
--no-visualize
```
### 5.4 配准:`registration`
功能:对输入点云模拟旋转,然后通过 RANSAC + ICP 配准到 Mesh,并计算配准后距离。
输入:
- `--pointcloud`:待配准 PLY 点云,通常使用 `datasets/Noise_PointCloud/*_noisy.ply`。
- `--mesh`:参考 STL/OBJ/PLY Mesh。
- `--voxel-size`:配准下采样体素大小。
- `--roll`、`--pitch`、`--yaw`:模拟旋转角度,单位为 degree。
- `--trans-range`:随机平移范围。
- `--no-visualize`:禁用 Open3D 窗口。
输出:
- `Fitness`
- `RMSE`
- 4x4 transformation matrix
- 配准后点云到 Mesh 的距离统计:Mean、Max、RMSE、Min、Std
示例:
```bash
python main.py registration \
--pointcloud datasets/Noise_PointCloud/11_noisy.ply \
--mesh datasets/Mesh/11.stl \
--voxel-size 10 \
--roll 10 \
--pitch 10 \
--yaw 10 \
--no-visualize
```
### 5.5 曲率估计:`curvature`
功能:计算点云局部曲率,并按曲率着色。
输入:
- `--pointcloud`:PLY 点云。
- `--radius`:邻域搜索半径。
- `--max-nn`:最大邻居数。
- `--color-scale`:颜色缩放系数。
- `--save`:保存彩色曲率点云。
- `--no-visualize`:禁用 Open3D 窗口。
输出:
- 终端输出曲率 mean 和 max。
- 如果传 `--save`:保存彩色曲率 PLY。
示例:
```bash
python main.py curvature \
--pointcloud datasets/PointCloud/11.ply \
--radius 2 \
--max-nn 30 \
--save vis/11_curvature.ply \
--no-visualize
```
### 5.6 平面拟合:`plane`
功能:使用 RANSAC 拟合平面。
输入:
- `--pointcloud`:可选 PLY 点云。不传时会根据 `config.yaml` 生成模拟带噪平面。
- `--threshold-mm`:RANSAC 距离阈值,单位 mm。
- `--max-iterations`:RANSAC 最大迭代次数。
- `--no-visualize`:禁用 Open3D 窗口。
输出:
- 平面模型参数。
- 内点比例。
- 法向角度误差。
- 平面 RMSE。
示例:
```bash
python main.py plane --no-visualize
```
带输入点云:
```bash
python main.py plane \
--pointcloud datasets/PointCloud/11.ply \
--threshold-mm 0.5 \
--max-iterations 2000 \
--no-visualize
```
### 5.7 完整流程:`full`
功能:按 `config.yaml` 串联运行流程。
当前默认行为:
- 如果 `cad.enabled: false`,不会自动执行 CAD 转 Mesh。
- 如果 `noise.enabled: true`,会先运行 `denoise`,再对加噪点云做配准。
- 最后运行 `contour`。
输入:
- `--config`:配置文件路径。不传时使用内置默认配置。
- `--no-visualize`:禁用 Open3D 窗口。
输出:
- 每个阶段的终端指标。
- Python 调用时会返回一个结果字典。
示例:
```bash
python main.py --config config.yaml full --no-visualize
```
## 6. 配置文件
默认配置在 `config.yaml`。
常用字段:
```yaml
paths:
cad: datasets/CAD/11.step
mesh: datasets/Mesh/11.stl
pointcloud: datasets/PointCloud/11.ply
noisy_pointcloud: datasets/Noise_PointCloud/11_noisy.ply
output_mesh: datasets/Mesh/11.stl
curvature_output:
cad:
enabled: false
precision: 1.0
noise:
enabled: true
std: 4.0
registration:
voxel_size: 10.0
roll: 10.0
pitch: 10.0
yaw: 10.0
trans_range: 0.0
evaluation:
chunk_size: 2048
triangle_chunk_size: 4096
cad_mesh_deflection: 0.1
visualization:
enabled: true
```
命令行参数优先级高于配置文件。例如:
```bash
python main.py --config config.yaml contour \
--cad datasets/CAD/40.step \
--pointcloud datasets/Noise_PointCloud/40_noisy.ply \
--excel-output 40_contour.xlsx \
--no-visualize
```
## 7. Python API 用法
除了命令行,也可以在 Python 中调用:
```python
from pipeline import MeasurementPipeline
pipeline = MeasurementPipeline(config_path="config.yaml")
result = pipeline.run_contour(
cad_path="datasets/CAD/11.step",
pointcloud_path="datasets/Noise_PointCloud/11_noisy.ply",
save_path="vis/11_contour.ply",
excel_output_path="11_contour.xlsx",
result_template_path="excel/测量结果.xlsx",
no_visualize=True,
)
print(result["distance_stats"])
```
常用返回字段:
- `run_contour`:`pointcloud`、`distances`、`distance_stats`、`cad_vertices`、`cad_faces`、`excel_output`
- `run_translate_align_pointcloud_to_cad`:`translation`、`T_final`、`aligned_path`、`matrix_path`
- `run_registration`:`source`、`registration`、`distance_stats`
- `run_curvature`:`pointcloud`、`curvatures`
- `run_plane`:`plane_result`
## 8. 打包使用
生成可安装包源码:
```bash
python packaging/build_package.py
```
本地开发安装:
```bash
pip install -e packaging/build
geometry-measure --help
```
安装后命令与 `main.py` 对应:
```bash
geometry-measure contour \
--cad datasets/CAD/11.step \
--pointcloud datasets/Noise_PointCloud/11_noisy.ply \
--save vis/11_contour.ply \
--excel-output 11_contour.xlsx \
--no-visualize
```
每次修改根目录源码后,如果需要同步到打包目录,重新运行:
```bash
python packaging/build_package.py
```
## 9. 辅助脚本说明
辅助脚本放在 `archive/`。常用流程推荐优先使用 `main.py` 统一入口。
`archive/Contour_Flatness.py` 可用于批量轮廓/平整度/平面度评估:
```bash
python archive/Contour_Flatness.py \
--tasks "11,31,40" \
--data_root High_Speed_Data \
--pointcloud_kind noise \
--excel_output vis/flatness.xlsx
```
单任务模式:
```bash
python archive/Contour_Flatness.py \
--single \
-c High_Speed_Data/CAD/11.step \
-p High_Speed_Data/Noise_PointCloud/11_noisy.ply \
--visualize
```
`archive/translate_align_pointcloud_to_cad.py` 已接入统一入口,推荐用 `main.py translate-align` 调用;需要单独运行脚本时也可以直接执行:
```bash
python archive/translate_align_pointcloud_to_cad.py \
-c datasets/CAD/M02.stp \
-p datasets/shift_test_output/ \
-o results \
--axis x \
--crop_ratio 0.01 \
--no_visualize
```
## 10. 常见开发任务
### 添加一个新数据编号
例如添加编号 `45`:
```text
datasets/CAD/45.step
datasets/Mesh/45.stl
datasets/PointCloud/45.ply
datasets/Noise_PointCloud/45_noisy.ply
```
运行评估:
```bash
python main.py contour \
--tasks 45 \
--data-root datasets \
--pointcloud-kind noise \
--save vis/contour \
--excel-output 45_contour.xlsx \
--no-visualize
```
### 保存命令日志
```bash
python main.py contour \
--cad datasets/CAD/11.step \
--pointcloud datasets/Noise_PointCloud/11_noisy.ply \
--excel-output 11_contour.xlsx \
--no-visualize > vis/11_contour.log 2>&1
```
### 内存不足或显存不足
优先调小:
```bash
--point-chunk-size 512
--triangle-chunk-size 1024
```
如果 CAD 三角面过多,也可以增大:
```bash
--mesh-deflection 0.5
```
注意:`mesh_deflection` 越大,CAD 三角化越粗,速度更快但几何近似更粗。
如果内存错误发生在批量合并完整背景点云阶段,并且使用的是 `datasets/train/train_2_1T_配准.ply`,请确认命令包含 `--no-visualize`。保存合并 PLY 已支持流式写入;Open3D 窗口展示仍不适合 10 亿点背景点云。
## 11. 排错
### `No module named OCC`
说明 CAD 依赖未安装或当前 Python 环境不对。
```bash
conda activate High-Speed
conda env update -n High-Speed -f environment.yml
```
### `pythonocc-core` 无法通过 pip 安装
这是正常情况。`pythonocc-core` 应通过 conda 安装,不要放进纯 pip 安装流程里。
### 找不到文件
检查当前工作目录是否为项目根目录。相对路径都按当前运行目录解析。
推荐:
```bash
pwd
python main.py --help
```
Windows PowerShell 下可以使用:
```powershell
Get-Location
python main.py --help
```
### Open3D 可视化窗口影响自动化运行
加 `--no-visualize`。
```bash
python main.py contour --cad datasets/CAD/11.step --pointcloud datasets/PointCloud/11.ply --no-visualize
```
### 结果距离明显不合理
重点检查:
- CAD 和点云是否同单位。
- CAD 和点云是否已经对齐。
- 是否把干净点云和加噪点云用错目录。
- `mesh_deflection` 是否过大导致 CAD 近似过粗。
### Excel 没有生成
`contour` 只有传了 `--excel-output` 才会生成 Excel:
```bash
python main.py contour \
--cad datasets/CAD/11.step \
--pointcloud datasets/Noise_PointCloud/11_noisy.ply \
--excel-output \
--no-visualize
```
默认输出:
```text
excel/contour.xlsx
```
默认模板:
```text
excel/测量结果.xlsx
```
输出表头保持模板一致,程序只更新 `测量结果` 和 `测量结论`。
### `registration` 或 `contour` 很慢
原因通常是点云超过百万点,且距离计算要遍历大量三角面。可以:
- 调小点云规模。
- 调小 `--point-chunk-size` 和 `--triangle-chunk-size` 以降低内存压力。
- 增大 `--mesh-deflection` 减少 CAD 三角面数量。
- 对配准增加 `--voxel-size` 做更强下采样。
## 12. 开发约定
- 面向用户的新功能优先接入 `main.py` 和 `MeasurementPipeline`。
- `contour` 是轮廓/平整度/平面度评估的唯一公开入口,不再新增其它容易混淆的同类命令。
- 新增输出文件时优先放入已有输出目录:通用可视化和日志放 `vis/`,表格放 `excel/`,对齐结果放 `results/`。
- 修改根目录源码后,如果需要打包版本同步,运行 `python packaging/build_package.py`。
- 不要在文档中引入其它同类距离评估命令名,避免和 `contour` 产生歧义。