第四章:数据采集规范

做激光雷达标定这么多年,我踩过最大的坑,往往不是算法本身,而是数据采集环节。说白了,你算法再牛,喂进去的数据是垃圾,出来的结果也是垃圾。这一章,我就把数据采集的那些门道,掰开了揉碎了讲给你听。

4.1 采集场景要求

先说说场景。不是随便找个空地就能标定的。我见过有人在地下停车场采集数据,结果点云全是墙壁和柱子,标定出来一塌糊涂。

场景选择的核心原则:

  • 开阔空间:至少10m×10m的空旷区域,四周不要有太多遮挡物
  • 光照稳定:避免强光直射或阴影剧烈变化,阴天其实是最理想的
  • 地面平整:地面起伏不要超过5cm,否则会影响地面提取
  • 无动态干扰:行人、车辆等移动物体越少越好
我的小习惯:每次采集前,我会先在场地走一圈,用手机拍几张全景照片。这样后期如果标定结果异常,还能回头排查是不是场景出了问题。

你可能会问:为什么光照会影响激光雷达?嗯,虽然激光雷达不依赖可见光,但标定板上的反光材料在不同光照下反射特性会有变化。我遇到过夏天正午采集的数据,标定板边缘点云明显稀疏,就是因为太阳光太强,干扰了激光接收器。

4.2 标定板摆放策略

标定板怎么摆,这里面学问大了。我刚开始做标定时,随便摆几个位置就开始采,结果算法怎么都收敛不了。后来才明白,标定板的位姿分布,直接决定了标定参数的可观性。

标定板摆放的黄金法则:

  1. 覆盖整个视场:标定板要出现在激光雷达视场的各个角落——左上、右上、左下、右下、正前方
  2. 距离多样化:从2米到15米,每隔2-3米采集一组数据
  3. 角度变化:标定板平面与激光束的夹角从30°到90°都要覆盖
  4. 高度分层:标定板中心高度从0.5m到2.0m,每0.3m一个层级

一个典型的采集方案(我常用的):

  • 距离:2m, 4m, 6m, 8m, 10m, 12m, 15m
  • 水平角度:-45°, -30°, -15°, 0°, 15°, 30°, 45°
  • 俯仰角度:-20°, -10°, 0°, 10°, 20°
  • 每个位姿采集3帧,取平均

这样算下来,一共7×7×5×3 = 735帧数据。听起来多,但实际采集也就半小时。

我曾经在一个项目中偷懒,只摆了5个位置就收工了。结果标定出来的外参,在远距离目标上误差达到了20cm。后来老老实实补采了一轮,误差降到了3cm以内。所以,别嫌麻烦。

4.3 数据质量检查

数据采完了,别急着跑算法。先做一轮质量检查,能帮你省下大量调试时间。

检查清单:

检查项 合格标准 常见问题
标定板点云完整性 标定板表面点云覆盖率 > 80% 标定板反光太强或太弱
点云密度均匀性 相邻扫描线间距偏差 < 20% 激光雷达安装角度不当
地面点云平整度 地面拟合残差 < 2cm 地面有坡度或杂物
帧间一致性 同一位置连续3帧偏差 < 1cm 传感器抖动或环境变化

我写了一个简单的检查脚本,每次采集完都会跑一遍:

import numpy as np
import open3d as o3d

def check_point_cloud_quality(pcd, board_bbox):
    """
    检查标定板点云质量
    pcd: open3d点云对象
    board_bbox: 标定板边界框 [xmin, ymin, zmin, xmax, ymax, zmax]
    """
    # 提取标定板区域点云
    points = np.asarray(pcd.points)
    mask = ((points[:, 0] > board_bbox[0]) & 
            (points[:, 0] < board_bbox[3]) &
            (points[:, 1] > board_bbox[1]) & 
            (points[:, 1] < board_bbox[4]) &
            (points[:, 2] > board_bbox[2]) & 
            (points[:, 2] < board_bbox[5]))
    
    board_points = points[mask]
    
    # 计算覆盖率
    board_area = (board_bbox[3]-board_bbox[0]) * (board_bbox[4]-board_bbox[1])
    point_density = len(board_points) / board_area
    
    print(f"标定板点云数量: {len(board_points)}")
    print(f"点云密度: {point_density:.2f} 点/m²")
    
    # 检查点云是否均匀分布
    if point_density < 100:
        print("⚠️ 警告:点云密度偏低,建议重新采集")
    else:
        print("✅ 点云密度合格")
    
    return board_points
避坑指南:我曾经遇到过标定板点云看起来没问题,但算法就是收敛不了。排查了半天,发现是标定板边缘有反光条,导致边缘点云出现系统性偏移。从那以后,我每次都会用可视化工具把标定板区域的点云放大看一遍,确认没有异常点。

4.4 数据采集流程总结

好了,我把整个流程串起来,给你一个可以直接用的操作手册:

  1. 场地准备(10分钟):选好场地,清理杂物,拍照记录
  2. 设备检查(5分钟):确认激光雷达清洁、标定板完好、供电稳定
  3. 预采集(5分钟):随便摆几个位置,跑一遍检查脚本,确认系统正常
  4. 正式采集(30分钟):按照前面说的位姿方案,逐点采集
  5. 质量检查(10分钟):跑完整检查流程,不合格的位姿重新采集
  6. 数据归档(5分钟):按日期+场景命名文件夹,保存原始数据和检查日志

整个流程下来,大概1小时。别觉得慢,我见过太多人为了省这1小时,后面花了一整天去排查标定误差。

我的经验:数据采集就像做饭前的备菜。菜切得不好,再好的厨艺也白搭。所以,每次采集我都亲自盯着,不放心交给实习生。这不是不信任,而是吃过太多亏了。

最后说一句:数据采集规范这件事,看起来简单,但真正能做到位的人不多。你想想看,标定算法就那么几个参数,能出问题的环节其实很少。大部分标定失败,追根溯源,都是数据采集环节埋下的坑。

数据采集规范知识体系 采集场景要求 标定板摆放策略 数据质量检查 开阔空间 光照稳定 地面平整 无动态干扰 覆盖全视场 距离多样化 角度变化 高度分层 点云完整性 密度均匀性 地面平整度 帧间一致性 数据采集完整流程 场地准备 设备检查 预采集 正式采集 质量检查 总耗时约1小时 | 每个环节缺一不可 | 数据质量决定标定精度

可可精品资料库