一、激光三角测距原理:从几何到实战

激光三角测距,说白了就是利用几何关系算距离。

我刚开始接触这个原理时,觉得它太简单了——不就是相似三角形吗?但真正做项目时才发现,越简单的原理,坑越多。

1.1 基本原理

想象一下:你有一束激光,打在被测物体上。物体表面会形成一个光斑。这个光斑被相机拍到,在图像上有一个像素位置。

物体离得近,光斑在图像上的位置偏左;离得远,偏右。就这么简单。

数学上,我们用这个公式:

Z = (f * b) / (d + f * tan(θ))

其中:

  • Z:物体到激光器的距离(我们要算的值)
  • f:相机焦距
  • b:激光器与相机之间的基线长度
  • d:光斑在图像上的偏移量(像素)
  • θ:激光器与相机光轴之间的夹角

核心要点:基线b越长,测量精度越高,但盲区也越大。这是个trade-off。

1.2 我在项目中踩过的坑

有一次做高精度扫描,我选了很长的基线,觉得精度肯定没问题。结果被测物体表面有镜面反射,光斑直接飞了,根本拍不到。

后来我学乖了:

  • 对于高反光物体,适当缩短基线,让入射角更垂直
  • 或者加偏振片,滤掉镜面反射

小技巧:实际调试时,先用一张白纸放在目标位置,看看光斑是否清晰。如果光斑散得厉害,先调激光聚焦,再动相机光圈。

二、线激光 vs 点激光:选对工具干对活

点激光和线激光,名字听着像,但用法完全不同。

2.1 点激光

点激光只打一个点。你想想看,一次只能测一个点的距离。

优点:

  • 精度高,通常能到微米级
  • 对表面要求低,粗糙、反光都能对付
  • 数据处理简单,就一个点

缺点:

  • 慢!要扫描一个面,得一点一点挪
  • 需要配合运动机构,成本高

我个人习惯用点激光做高精度检测,比如测量某个关键尺寸。但做三维重建?太慢了,不推荐。

2.2 线激光

线激光打出一条线。相机一拍,整条线上的深度信息全有了。

优点:

  • 快!一次采集一条线,效率高
  • 适合扫描大范围物体
  • 配合运动平台,可以快速生成点云

缺点:

  • 精度不如点激光,因为线激光的光斑更粗
  • 对表面纹理敏感,纯黑或透明物体容易丢线

注意:线激光扫描时,如果物体表面有深色区域,激光线可能会断掉。我曾经扫描一个黑色塑料件,结果中间一段完全没数据。后来喷了显影剂才搞定。

2.3 怎么选?

场景 推荐方案 原因
精密尺寸测量 点激光 精度优先
三维重建(小物体) 线激光 效率高
三维重建(大场景) 线激光 + 多线 覆盖范围大
高反光表面 点激光 + 偏振 抗干扰强

三、相机与激光的标定基础

标定,说白了就是让相机和激光「对齐」。不标定,你测出来的数据全是歪的。

3.1 为什么要标定?

你想想看,相机和激光器是分开装的。它们之间的位置关系,安装时不可能完全精确。哪怕差0.1毫米,测出来的距离可能差好几毫米。

标定的目的就是算出这个位置关系——我们叫它「外参」。

3.2 标定流程

我一般分三步走:

  1. 相机内参标定:用棋盘格,拍十几张照片,算出相机的焦距、畸变参数
  2. 激光平面标定:让激光打在棋盘格上,拍下不同位置的照片,算出激光平面在相机坐标系下的方程
  3. 联合标定:把前两步的结果合起来,算出最终的转换关系

关键点:第二步最容易出错。激光线在棋盘格上的位置,必须精确提取到亚像素级别。我习惯用高斯拟合来找激光线的中心,比直接取最大值稳定得多。

3.3 代码示例:激光线中心提取

// 伪代码:提取激光线中心
function extractLaserCenter(image, row) {
    // 1. 取该行的像素灰度值
    int[] intensities = image.getRow(row);
    
    // 2. 找到最大值位置
    int maxIdx = argmax(intensities);
    
    // 3. 在最大值附近做高斯拟合
    //    取 maxIdx-2 到 maxIdx+2 共5个点
    double center = gaussianFit(intensities, maxIdx);
    
    return center;  // 亚像素精度
}

这段代码看着简单,但实际调试时,我遇到过激光线太粗、太细、断线等各种情况。嗯,这里要注意:如果激光线宽度超过10个像素,先调激光焦距,别急着改代码。

3.4 标定验证

标定完怎么知道对不对?

我的做法是:找一个已知高度的标准块(比如10mm高的量块),放在扫描区域内。用标定好的系统测一下,看误差在不在允许范围内。

如果误差超过0.1mm,我会重新检查标定数据。最常见的问题是:

  • 棋盘格照片拍得太少(至少15张)
  • 激光线提取不准(试试调小相机光圈)
  • 棋盘格不平整(换玻璃基板的棋盘格)

避坑指南:我曾经用打印在纸上的棋盘格做标定,结果纸有褶皱,标定出来的参数全是错的。后来换了陶瓷棋盘格,一次搞定。

四、本章知识体系

下面这张图,是我自己总结的本章知识结构。你可以把它当成一个「地图」,学完本章后对照着检查自己掌握了多少。

核心传感器原理(一)知识体系 激光三角测距原理 • 几何关系:相似三角形 • 核心公式:Z = f*b/(d+f*tanθ) • 关键参数:基线b、焦距f • 精度与盲区的trade-off • 镜面反射的坑 点激光 vs 线激光 • 点激光:精度高、速度慢 • 线激光:速度快、精度适中 • 适用场景对比 • 高反光/深色表面处理 • 选型决策表 相机与激光标定 • 相机内参标定 • 激光平面标定 • 联合标定 • 亚像素激光中心提取 • 标定验证方法 实战要点总结 理解原理 → 选对激光类型 → 精确标定 → 验证结果 每一步都有坑,但踩过之后就是经验 —— 资深工程师的实战笔记 ——

这张图把本章的三个核心内容串起来了。你从左上角开始看:先理解三角测距的几何原理,然后根据应用场景选点激光还是线激光,最后通过标定把系统校准到最佳状态。

嗯,这三步缺一不可。我见过有人跳过标定直接扫描,结果点云全是扭曲的,白费功夫。