Files
massive-cloud/alg/train_measurement_system_v3.2_0629/README.md

9.3 KiB
Raw Blame History

列车点云测量系统 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. 创建并激活环境

# 创建 conda 环境
conda create -n pcc-measurement python=3.9
conda activate pcc-measurement

2. 安装依赖

方式一:使用 requirements.txt

pip install -r requirements.txt

方式二:安装项目

# 正常安装
pip install .

# 或开发模式安装(代码修改立即生效)
pip install -e .

3. 准备点云文件

确保你有完整的列车点云文件(PLY格式),例如:

/path/to/your/train_pointcloud.ply

4. 配置测量任务

编辑 config/measurements.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. 运行测量

# 使用默认配置文件
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(代码编辑)