287 lines
9.3 KiB
Markdown
287 lines
9.3 KiB
Markdown
# 列车点云测量系统 V3
|
||
|
||
基于配置驱动的点云测量系统,支持多种测量任务类型和ROI提取方法。通过YAML配置文件定义测量任务,自动完成ROI提取、平面拟合、孔中心检测、距离计算,并生成Excel报告和可视化点云文件。
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
train_measurement_system_v3_0626/
|
||
├── main.py # 主程序入口
|
||
├── requirements.txt # 依赖清单
|
||
├── setup.py # 安装脚本
|
||
├── pyproject.toml # 项目配置
|
||
├── README.md # 本文件
|
||
├── config/ # 配置文件目录
|
||
│ ├── measurements.yaml # 主配置文件
|
||
├── src/ # 源代码目录
|
||
│ ├── __init__.py
|
||
│ ├── config_loader.py # 配置加载器
|
||
│ ├── task_manager.py # 任务管理器
|
||
│ ├── pointcloud_loader.py # 点云加载器
|
||
│ ├── roi_extractor.py # ROI提取器
|
||
│ ├── plane_fitter.py # 平面拟合器(RANSAC)
|
||
│ ├── hole_detector.py # 高精度孔检测器 V2
|
||
│ ├── hole_center_fitter.py # 孔中心拟合适配器
|
||
│ ├── excel_exporter.py # Excel结果导出器
|
||
│ ├── visualizer.py # 可视化工具
|
||
│ ├── performance_logger.py # 性能日志记录器
|
||
│ ├── measurement_logger.py # 详细测量日志记录器
|
||
│ ├── measurements/ # 测量类型模块
|
||
│ │ ├── __init__.py
|
||
│ │ ├── base.py # 测量任务基类
|
||
│ │ ├── plane_distance.py # 平面到平面距离测量
|
||
│ │ ├── point_to_plane.py # 点到平面距离测量
|
||
│ │ ├── point_to_point.py # 点到点距离测量
|
||
│ │ ├── plane_with_holes.py # 带孔平面测量
|
||
│ │ ├── point_to_plane_with_holes.py
|
||
│ │ └── point_to_point_with_holes.py
|
||
│ └── spatial_index/ # 空间索引模块(ROI提取优化)
|
||
│ ├── __init__.py
|
||
│ ├── base.py # 索引基类
|
||
│ ├── linear_scan.py # 线性扫描(无索引)
|
||
│ ├── grid_index.py # Grid网格索引
|
||
│ ├── grid_index_optimized.py # Grid网格索引(优化版)
|
||
│ ├── octree_index.py # Octree八叉树索引
|
||
│ └── kdtree_index.py # KDTree索引
|
||
├── results/ # 测量结果输出目录(自动创建)
|
||
└── visualizations/ # 可视化点云输出目录(自动创建)
|
||
```
|
||
|
||
## 功能特性
|
||
|
||
- **配置驱动**: 通过YAML配置文件定义测量任务,无需修改代码
|
||
- **多任务类型**: 支持平面到平面、点到平面、点到点三种测量类型,以及带孔中心检测的测量
|
||
- **多种ROI提取方法**: Linear、Grid、Grid优化版、Octree、KDTree,性能和精度可调
|
||
- **高精度孔检测**: 基于RANSAC和几何优化的孔中心检测算法(V2),精度<0.1mm
|
||
- **宽度差值检查**: 支持门口宽度差值自动检查(任务19)
|
||
- **批量处理**: 一次运行可执行多个测量任务,点云只加载一次
|
||
- **自动可视化**: 可选保存每个任务的ROI点云(PLY格式)
|
||
- **结果导出**: 自动生成格式化的Excel报告和详细日志
|
||
- **鲁棒性强**: RANSAC平面拟合,自动处理离群点和噪声
|
||
- **性能优化**: 点云缓存、空间索引加速、详细性能分析报告
|
||
- **错误处理**: 单个任务失败不影响其他任务执行
|
||
|
||
## 环境要求
|
||
|
||
- Python 3.9+
|
||
- 推荐使用 conda 环境管理
|
||
|
||
## 快速开始
|
||
|
||
### 1. 创建并激活环境
|
||
|
||
```bash
|
||
# 创建 conda 环境
|
||
conda create -n pcc-measurement python=3.9
|
||
conda activate pcc-measurement
|
||
```
|
||
|
||
### 2. 安装依赖
|
||
|
||
**方式一:使用 requirements.txt**
|
||
```bash
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
**方式二:安装项目**
|
||
```bash
|
||
# 正常安装
|
||
pip install .
|
||
|
||
# 或开发模式安装(代码修改立即生效)
|
||
pip install -e .
|
||
```
|
||
|
||
### 3. 准备点云文件
|
||
|
||
确保你有完整的列车点云文件(PLY格式),例如:
|
||
```
|
||
/path/to/your/train_pointcloud.ply
|
||
```
|
||
|
||
### 4. 配置测量任务
|
||
|
||
编辑 `config/measurements.yaml`,设置点云文件路径和测量任务。
|
||
|
||
**基本配置示例:**
|
||
|
||
```yaml
|
||
# 点云文件路径(支持相对路径或绝对路径)
|
||
pointcloud_file: "/path/to/your/train_pointcloud.ply"
|
||
|
||
# ROI提取方法配置
|
||
roi_extraction:
|
||
method: "grid" # 可选: linear, grid, octree, kdtree
|
||
grid_size: 100.0 # Grid方法的网格大小(mm)
|
||
use_optimized: true # 使用优化版Grid(numpy向量化)
|
||
|
||
# 测量任务列表
|
||
tasks:
|
||
- name: "任务43_窗口下沿高度"
|
||
type: "plane_to_plane"
|
||
enabled: true
|
||
description: "测量窗口下沿到地面的距离"
|
||
theoretical_dimension: 803
|
||
tolerance:
|
||
upper: 6.5
|
||
lower: -4
|
||
|
||
source_roi:
|
||
bbox_min: [5562, 1981, 1672]
|
||
bbox_max: [6772, 1983, 1677]
|
||
|
||
target_roi:
|
||
bbox_min: [-10222, 1179, -302]
|
||
bbox_max: [12428, 1181, 302]
|
||
|
||
params:
|
||
sample_points: 100
|
||
ransac_threshold: 0.5
|
||
ransac_max_iterations: 1000
|
||
min_inlier_ratio: 0.6
|
||
|
||
visualization: false # 是否保存可视化点云
|
||
```
|
||
|
||
### 5. 运行测量
|
||
|
||
```bash
|
||
# 使用默认配置文件
|
||
python main.py
|
||
|
||
# 指定配置文件
|
||
python main.py -c config/measurements.yaml
|
||
|
||
# 指定点云文件(覆盖配置文件中的路径)
|
||
python main.py -p /path/to/your/pointcloud.ply
|
||
|
||
# 指定输出目录
|
||
python main.py -o /path/to/output
|
||
|
||
# 组合使用
|
||
python main.py -c config/measurements.yaml -o results/
|
||
```
|
||
|
||
**命令行参数:**
|
||
- `-c, --config`: 配置文件路径
|
||
- `-p, --pointcloud`: 点云文件路径(覆盖配置文件)
|
||
- `-o, --output`: 结果输出目录(默认: results/)
|
||
|
||
### 6. 查看结果
|
||
|
||
**Excel报告:** 保存在 `results/` 目录下
|
||
- 文件名格式:`measurement_results_YYYYMMDD_HHMMSS.xlsx`
|
||
- 包含每个任务的详细统计信息:
|
||
- 项目名称、理论尺寸、公差要求
|
||
- 测量结果(平均距离)、精度(标准差)
|
||
- 误差范围、测量结论(通过/不通过)
|
||
- 执行时间、错误信息(如有)
|
||
|
||
**详细日志:** `measurement_detail_YYYYMMDD_HHMMSS.log`
|
||
- 每个任务的详细执行过程
|
||
- ROI提取信息、RANSAC拟合详情
|
||
- 宽度差值检查详情(如适用)
|
||
|
||
**性能报告:** `performance_YYYYMMDD_HHMMSS.log`
|
||
- 各任务执行时间
|
||
- 详细的时间分布(ROI提取、平面拟合、距离计算等)
|
||
- 空间索引构建时间和方法
|
||
|
||
**可视化点云:** 保存在 `visualizations/` 目录下
|
||
- 文件格式:PLY
|
||
- 可使用CloudCompare或Open3D查看
|
||
- 用于验证ROI提取和测量点位置
|
||
|
||
## 测量类型
|
||
|
||
### 1. plane_to_plane(平面到平面距离)
|
||
|
||
从源平面采样点,计算到目标平面的距离。适用于测量车门高度、车体长度、窗口高度等。
|
||
|
||
### 2. point_to_plane(点到平面距离)
|
||
|
||
测量指定点到参考平面的距离。支持精确坐标查找和包围盒筛选模式。
|
||
|
||
### 3. point_to_point(点到点距离)
|
||
|
||
测量点对之间的欧氏距离。支持对称点自动配对。
|
||
|
||
### 4. 带孔中心检测的测量
|
||
|
||
支持基于孔中心的平面拟合和距离测量(`plane_with_holes`, `point_to_plane_with_holes`, `point_to_point_with_holes`)。
|
||
|
||
## ROI提取方法
|
||
|
||
系统支持多种空间索引方法,可在配置文件中选择:
|
||
|
||
- **linear**: 线性扫描(无索引)- 最简单,适合小点云
|
||
- **grid**: Grid网格索引 - 平衡性能和精度
|
||
- **grid (optimized)**: Grid网格索引优化版 - 使用numpy向量化,性能提升显著
|
||
- **octree**: Octree八叉树索引 - 适合大规模点云
|
||
- **kdtree**: KDTree索引 - 高效的空间查询
|
||
|
||
## 技术细节
|
||
|
||
### 平面拟合算法
|
||
|
||
系统使用Open3D的RANSAC算法进行平面拟合:
|
||
1. 随机采样3个点拟合平面
|
||
2. 统计内点(距离小于阈值)
|
||
3. 迭代优化选择最佳平面
|
||
4. 使用所有内点进行最小二乘拟合(SVD)
|
||
|
||
**平面方程:** ax + by + cz + d = 0
|
||
|
||
### 孔检测算法
|
||
|
||
高精度孔检测器V2特点:
|
||
- 自动检测圆柱轴向
|
||
- 多次RANSAC粗拟合
|
||
- 高质量点筛选
|
||
- 几何拟合精化
|
||
- 圆心精度 < 0.1mm
|
||
|
||
### 距离计算
|
||
|
||
**点到平面距离:**
|
||
```
|
||
distance = |ax + by + cz + d|
|
||
```
|
||
|
||
**点到点距离(欧氏距离):**
|
||
```
|
||
distance = sqrt((x2-x1)² + (y2-y1)² + (z2-z1)²)
|
||
```
|
||
|
||
## 性能优化
|
||
|
||
- **点云缓存**: 点云文件只加载一次,所有任务共享
|
||
- **空间索引**: 使用Grid/Octree/KDTree加速ROI提取
|
||
- **自动降采样**: ROI超过10000点时自动降采样
|
||
- **并行安全**: 多个任务顺序执行,单个任务失败不影响其他任务
|
||
|
||
## 依赖包
|
||
|
||
- `numpy>=2.0.0` - 数值计算
|
||
- `open3d>=0.18.0` - 点云处理
|
||
- `scipy>=1.10.0` - 科学计算
|
||
- `pandas>=2.0.0` - 数据处理
|
||
- `openpyxl>=3.1.0` - Excel导出
|
||
- `PyYAML>=6.0.0` - 配置文件解析
|
||
- `matplotlib>=3.7.0` - 可视化(可选)
|
||
- `plotly>=5.0.0` - 可视化(可选)
|
||
|
||
## 版本更新
|
||
|
||
### V3 (2024-06-26)
|
||
- 重构代码结构,模块化更清晰
|
||
- 集成高精度孔检测器V2到src目录
|
||
- 优化导入路径,移除路径hack
|
||
- 精简配置文件
|
||
- 更新文档
|
||
|
||
---
|
||
|
||
**开发环境:** Python 3.9+
|
||
**推荐工具:** CloudCompare(点云查看)、VS Code(代码编辑)
|