ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

线激光扫描三维成像全链路实战:从硬件选型到点云处理

线激光扫描三维成像全链路实战:从硬件选型到点云处理 线激光扫描三维成像这件事我从第一次在实验室搭出能出点云的原型到后来把它做成能在产线上连续跑一整天的检测工位前后折腾了差不多两年。中间踩过的坑比我在任何一篇论文或教程里看到的都多。很多人以为这套东西的核心是那个相机或者那个激光器其实真正决定你能不能拿到可用数据的是标定、同步、以及点云处理里那些不起眼的细节。这篇内容我打算把整个链路从头到尾讲一遍从硬件怎么选、怎么装到软件怎么写、怎么调尽量把那些文档里不会写、但你不做就出不来结果的东西都摊开说。适合正在做三维测量、工业检测、逆向工程或者单纯想入门线激光扫描的工程师和学生参考。不管你是刚接触点云还是已经能跑通demo但结果总是不稳定应该都能从里面找到点能直接用的东西。1. 先想清楚线激光扫描到底在解决什么问题1.1 三角测量原理不是背公式而是理解位移如何变成高度线激光扫描的本质是激光三角测量。一束线激光打到物体表面相机从另一个角度去看这条线。物体表面高度变化时激光线在相机图像里的位置会跟着移动。这个移动量和高度之间是一个几何关系通过标定就能把它换算成真实的三维坐标。我用一个生活化的类比来解释你拿一支激光笔照在墙上然后你从侧面看这个光点。如果你往墙的方向走一步光点在侧面视角里的位置会变。线激光扫描就是把这个侧面看的过程固定下来用相机代替眼睛用标定代替经验判断。关键点在于相机和激光器之间的夹角决定了灵敏度。夹角越大同样的高度变化在图像里位移越大分辨率越高但遮挡和盲区也越严重。夹角太小位移不明显噪声一上来就淹没了信号。实际选型时这个夹角通常在20度到45度之间。我做过一个对比同样是测量0.5毫米的高度差30度夹角下图像位移大约是十几个像素而15度夹角下只有几个像素。前者信噪比明显更好但后者在测量深槽或陡峭边缘时不容易丢线。所以这个参数不是越大越好要看你测的物体形状。1.2 为什么线激光比结构光更适合产线在线检测结构光一次能拿到一整幅深度图速度快、点云密但它对环境光和物体表面反射特性非常敏感。产线上有焊接弧光、有油污、有金属反光结构光经常直接失效。线激光扫描虽然需要相对运动才能拼出完整轮廓但它的抗干扰能力强得多而且单条线的精度可以做得非常高。我自己的经验是如果你测的是静态物体、表面比较漫反射、环境可控结构光是更省事的选择。但如果你要在产线上做在线检测物体在动、环境光复杂、表面还有反光线激光扫描的稳定性会让你省很多心。它的代价是机械运动机构要足够稳否则运动方向的精度会拖累整体结果。1.3 一套完整系统的最小构成一套能出点云的线激光扫描系统最少需要这几样东西线激光器、工业相机、镜头、运动机构或者被测物体运动、同步触发装置、以及一台能跑点云处理的计算机。听起来简单但每一样都有讲究。激光器的波长要和相机的响应匹配。常见的是红色650纳米和蓝色450纳米。红色便宜、通用但在高温物体或某些金属表面反射太强。蓝色波长短在金属和高温场景下散射更好点云质量更稳但价格高不少。相机方面全局快门是必须的卷帘快门在运动扫描时会产生畸变这个坑我踩过点云会整体扭曲怎么调都调不回来。镜头要选低畸变的工业镜头焦距根据工作距离和视野来算。2. 硬件搭建里那些决定成败的细节2.1 相机与激光器的相对位置夹角、工作距离与景深的三角平衡搭建时第一个要定的是工作距离也就是相机和激光器交点到物体的距离。这个距离决定了你需要的镜头焦距和激光器的功率。工作距离越远同样的视野需要越长的焦距景深越浅对机械结构的刚性要求越高。我一般会先确定被测物体的尺寸和需要的精度然后反推工作距离。比如你要测200毫米宽的物体精度要求0.1毫米那相机分辨率至少要2000像素以上配合合适的镜头工作距离大概在300到500毫米之间比较合理。这个距离下激光器的功率选50毫瓦到100毫瓦通常够用具体要看物体表面的反射率。夹角的选择我前面说了20到45度。但还有一个容易被忽略的参数是景深。线激光扫描的景深不是相机镜头的景深而是激光线在相机里保持清晰且不丢线的高度范围。这个范围和工作距离、夹角、镜头光圈都有关系。光圈越小景深越大但进光量少曝光时间要拉长运动扫描时容易拖影。我通常会把光圈开到中间值然后用激光器的功率来补亮度。2.2 运动机构为什么丝杆模组比皮带模组更靠谱运动机构的稳定性直接决定点云在运动方向上的精度。皮带模组便宜、速度快但反向间隙和弹性变形会让点云在运动方向出现周期性误差。丝杆模组贵一些、速度慢一些但刚性好、重复定位精度高。我做过一个对比实验同样扫描一个标准球皮带模组出来的点云在运动方向上有明显的波纹拟合球心时误差在0.05毫米左右波动。换成丝杆模组后误差稳定在0.01毫米以内。如果你测的是平面度或轮廓度这个差异是致命的。所以我的建议是只要预算允许运动机构优先选丝杆或直线电机皮带模组只适合对精度要求不高的场合。还有一个细节是运动机构的直线度。丝杆模组如果安装面不平运动时会有俯仰或偏摆点云会整体倾斜。安装时一定要用大理石平台或铸铁平台做基准用千分表打表调整确保运动全程的直线度在几个微米以内。2.3 同步触发硬件触发永远优于软件触发同步触发是很多人第一次搭系统时最容易忽略的地方。相机曝光和运动机构的位置必须严格对应否则点云在运动方向会被拉伸或压缩。软件触发靠的是计算机发指令延迟不稳定抖动可能到毫秒级。硬件触发用编码器或光栅尺的信号直接触发相机延迟在微秒级稳定得多。我的做法是运动机构上装一个增量式编码器编码器输出A/B相脉冲经过分频后直接接到相机的触发输入。这样相机每走固定的距离就曝光一次点云在运动方向的间距是均匀的。分频比根据你需要的运动方向分辨率来定。比如编码器一圈10000个脉冲丝杆导程10毫米那一个脉冲对应1微米。如果你想要运动方向0.05毫米的分辨率就50分频。注意编码器信号的电平要和相机触发输入匹配常见的是5V差分或24V单端。接错电平可能烧掉相机输入口我见过不止一次。2.4 光源与滤光片别让环境光毁掉你的信噪比线激光扫描虽然抗环境光比结构光强但也不是完全免疫。强烈的环境光会在相机图像里形成背景噪声降低激光线的对比度。解决办法有两个一是加窄带滤光片只让激光波长附近的光通过二是提高激光器功率让激光线在图像里足够亮。窄带滤光片是最有效的。我用的是中心波长650纳米、带宽10纳米的滤光片装上之后环境光的影响基本可以忽略。但滤光片会降低进光量所以激光器功率要相应提高。另外滤光片的安装角度要稍微倾斜一点避免激光在滤光片表面反射回相机形成鬼影。还有一个经验是激光器的线宽和均匀性很重要。便宜的激光器线宽不均匀中间亮两边暗导致点云在视野边缘的信噪比下降。我一般会选线宽均匀性在80%以上的激光器虽然贵一点但省去了后期很多麻烦。3. 标定从像素到毫米的那座桥3.1 相机标定内参、外参和畸变模型的选择相机标定是整套系统的基础。内参包括焦距、主点、像素尺寸外参是相机相对于世界坐标系的位置和姿态。畸变模型常见的有径向畸变和切向畸变一般用五参数模型就够了。标定方法我用的是张正友标定法用棋盘格标定板从不同角度拍十几张照片然后用OpenCV的calibrateCamera函数求解。这里有几个细节标定板要平整打印精度要高拍摄时标定板要覆盖整个视野包括边缘。很多人只拍中间区域结果边缘畸变没标出来点云在视野边缘会弯曲。标定完成后要看重投影误差一般要小于0.1像素。如果误差大可能是标定板不平、拍摄角度太少、或者镜头畸变太大。我遇到过一支镜头畸变特别大五参数模型怎么都拟合不好后来换成八参数模型才解决。所以标定不是一次就能成功的要反复试。3.2 光平面标定线激光扫描独有的关键步骤光平面标定是线激光扫描和普通相机标定最大的区别。普通相机标定只关心相机本身而线激光扫描还需要知道激光平面在相机坐标系里的方程。这个平面方程决定了像素坐标如何映射到三维空间。标定方法有几种我用的是基于棋盘格的方法。把棋盘格放在不同高度让激光线打在棋盘格上拍下图像。激光线在棋盘格上的位置可以通过图像处理提取出来结合棋盘格的已知三维坐标就能拟合出光平面方程。这个过程的关键是激光线提取的精度。激光线在图像里是一条亮线但它的中心位置需要亚像素精度。我用的是灰度重心法对每一列像素计算激光线亮度分布的加权重心。这个方法比简单的最大值法精度高很多尤其是在激光线有噪声的时候。提示光平面标定时棋盘格要覆盖激光线的整个工作范围包括最近和最远的位置。只标中间一段边缘的精度会差很多。3.3 运动方向标定把一维运动变成三维坐标线激光扫描只能拿到一条线的二维坐标要得到完整的三维点云还需要知道运动方向。运动方向标定就是确定运动机构每走一步物体在三维空间里移动了多少。方法很简单扫描一个已知尺寸的标准件比如标准球或标准块然后根据点云的尺寸反推运动方向的尺度因子。但这里有个坑运动方向不一定和相机坐标系的某个轴完全平行可能有微小的夹角。这个夹角如果不修正点云会整体扭曲。我的做法是扫描一个标准球拟合球心然后在不同位置扫描同一个球根据球心位置的变化来同时求解运动方向和尺度因子。这个方法比单纯用标准块更准确因为球心拟合对噪声不敏感。3.4 标定结果的验证用标准件说话标定完成后一定要验证。我一般会扫描一个标准球看拟合出来的球半径和标准值的偏差。如果偏差在0.02毫米以内说明标定基本合格。如果偏差大要回头检查是相机标定、光平面标定还是运动方向标定出了问题。还有一个验证方法是扫描一个已知高度的台阶看台阶的高度测量值和标准值的偏差。这个方法能同时验证高度方向和运动方向的精度。我通常会做三组不同高度的台阶看偏差是否一致。如果偏差随高度变化可能是光平面标定的非线性问题。4. 软件实现从图像到点云的完整链路4.1 图像预处理滤波、去噪和激光线增强相机拍到的原始图像里激光线只是其中一部分还有背景、噪声、反光。预处理的目标是让激光线更清晰、更容易提取。我一般会做这几步先转灰度然后用高斯滤波平滑噪声再用形态学操作增强激光线的连续性。高斯滤波的核大小要选好。核太大激光线会被模糊中心提取不准核太小噪声去不掉。我通常用3x3或5x5的核具体看图像噪声水平。形态学操作我用的是开运算先腐蚀掉小的噪声点再膨胀恢复激光线的宽度。还有一个技巧是背景减除。如果环境光稳定可以先拍一张没有激光的图作为背景然后用当前图减去背景图激光线会非常突出。这个方法在环境光有波动的时候效果会打折扣但在实验室环境下非常好用。4.2 激光线中心提取亚像素精度是怎么做到的激光线中心提取的精度直接决定点云的精度。我试过几种方法极值法、阈值法、灰度重心法、Steger算法。极值法最简单就是找每列最亮的像素但精度只有像素级而且对噪声敏感。阈值法是找亮度超过阈值的像素然后取平均比极值法好一点但阈值不好选。灰度重心法是我最常用的。对每一列计算激光线亮度分布的加权重心。公式很简单就是每个像素的亮度乘以它的位置求和后除以亮度和。这个方法能达到亚像素精度而且对激光线宽度变化不敏感。但它的前提是激光线亮度分布要对称如果激光线一边有拖尾重心会偏移。Steger算法是基于Hessian矩阵的方法精度更高但计算量大而且对参数敏感。我在对精度要求特别高的场合会用但一般产线检测用灰度重心法就够了。注意激光线提取前要去除反光点。金属表面经常有镜面反射在图像里形成很亮的斑点这些斑点会被误认为是激光线。我一般会用亮度阈值和连通域分析把明显的反光点去掉。4.3 从像素到三维坐标变换的完整推导拿到激光线中心像素坐标后要把它转换成三维坐标。这个过程分两步先把像素坐标通过相机内参和光平面方程转换成相机坐标系下的三维点再通过运动方向标定把不同时刻的点云拼接到世界坐标系。具体来说对于图像上的一个激光线中心点(u, v)它对应相机坐标系下的一条射线。这条射线和光平面的交点就是三维点。射线方程由相机内参决定光平面方程由标定得到。联立求解就能得到三维坐标。运动方向的拼接是假设运动方向是向量d每扫描一行物体相对于相机移动了d乘以步长。把每一行的三维点加上对应的位移就得到了完整点云。这里要注意运动方向向量的归一化和步长的准确性。4.4 点云后处理滤波、配准和特征提取原始点云通常有噪声、离群点、还有遮挡造成的空洞。后处理的目标是让点云更干净、更可用。我一般会做这几步统计滤波去除离群点半径滤波平滑表面然后根据应用需求做特征提取。统计滤波的原理是对每个点计算它到最近k个邻居的平均距离如果这个距离超过全局平均值加若干倍标准差就认为是离群点。k一般取20到50标准差倍数取1到2。半径滤波是如果某个点半径r内的邻居数少于阈值就删掉。这两个滤波配合使用能去掉大部分噪声。配准是把多个视角的点云拼到一起。线激光扫描一般不需要多视角配准因为运动扫描已经覆盖了完整表面。但如果物体有遮挡可能需要从不同角度扫描再配准。配准算法我用的是ICP但ICP对初始位置敏感通常需要粗配准加精配准。特征提取根据应用来定。如果是测量尺寸就提取边缘、平面、圆孔如果是缺陷检测就提取表面法线、曲率、深度图。我一般会把点云转成深度图然后用图像处理的方法做特征提取这样比直接在三维点云上做更高效。5. 实测中那些让人头疼的问题与排查思路5.1 点云出现周期性波纹从运动机构查到编码器分频点云在运动方向出现周期性波纹是最常见的问题之一。我第一次遇到时以为是激光器或相机的问题换了设备还是这样。后来才发现是运动机构的反向间隙和编码器分频设置不当。排查思路是这样的先看波纹的周期。如果周期和丝杆导程一致那就是丝杆的问题如果周期和编码器分频后的步长一致那就是分频的问题。我遇到的是后者分频比设得太小运动方向分辨率不够点云在运动方向出现台阶。解决办法是提高编码器分频比让运动方向的分辨率高于你需要的精度。比如你需要0.05毫米的运动分辨率那分频后的步长要小于0.05毫米最好到0.01毫米。这样即使有少量丢步也不会在点云上形成明显波纹。5.2 激光线在边缘处断裂遮挡与反射的联合作用扫描有台阶或凹槽的物体时激光线经常在边缘处断裂。原因是激光器照射不到边缘的另一侧或者相机看不到被遮挡的区域。这是三角测量的固有局限无法完全消除但可以通过调整夹角和扫描方向来缓解。我的经验是如果物体有陡峭边缘尽量让激光器和相机从同一侧照射和观察减少遮挡。另外可以多次扫描每次改变夹角或扫描方向然后把点云融合。这样能补上大部分遮挡区域。还有一个原因是镜面反射。金属边缘经常把激光反射到相机看不到的方向导致激光线在边缘处突然消失。解决办法是给物体表面喷一层显影剂或者用蓝色激光器蓝色激光在金属表面的散射更好。5.3 标定后精度不达标一步步定位问题源头标定后精度不达标可能的原因很多。我一般会按这个顺序排查先看相机标定的重投影误差如果大于0.1像素重新标定相机再看光平面标定的残差如果大于0.05毫米重新标定光平面最后看运动方向标定的尺度因子如果和理论值偏差大检查编码器分频和丝杆导程。还有一个容易被忽略的问题是温度。相机和激光器工作一段时间后会发热导致机械结构微小变形标定参数漂移。我遇到过连续工作两小时后精度下降的情况后来在标定前让设备预热半小时问题就解决了。如果精度要求特别高可能需要定期重新标定。5.4 点云密度不均匀曝光时间与运动速度的匹配点云密度不均匀表现为有些区域点很密有些区域点很稀。这通常是曝光时间和运动速度不匹配造成的。曝光时间太长运动速度快时激光线在图像里会拖影中心提取不准曝光时间太短激光线太暗信噪比低。我的做法是先根据运动速度确定曝光时间。曝光时间内物体移动的距离要小于你需要的运动方向分辨率。比如运动速度100毫米每秒你需要0.05毫米的分辨率那曝光时间要小于0.5毫秒。然后根据曝光时间调整激光器功率让激光线在图像里足够亮但不过曝。如果运动速度变化曝光时间也要跟着变。我一般会用相机的自动曝光功能但自动曝光的响应速度可能跟不上所以更好的办法是用编码器信号触发曝光同时根据速度动态调整曝光时间。6. 从能跑到好用工程化落地的几个关键决策6.1 实时处理还是离线处理算力与延迟的权衡线激光扫描的数据量很大一条线可能几千个点扫描一秒钟就是几百万个点。实时处理需要强大的算力离线处理则对延迟不敏感。我的建议是如果只是做检测和测量离线处理就够了用GPU加速点云处理一帧几毫秒就能出结果。如果需要实时反馈控制那就要用FPGA或专用处理器做前端处理只把特征传给上位机。我做过一个产线项目扫描频率是每秒1000条线每条线2000个点数据率是每秒200万个点。用CPU处理根本来不及后来用GPU做并行计算把激光线提取和坐标变换放到CUDA核里才做到实时。所以算力规划要提前做不要等到系统跑不起来再想办法。6.2 标定参数的长期稳定性温度、振动与定期校验标定参数不是一劳永逸的。温度变化、机械振动、甚至相机镜头的微小松动都会导致标定漂移。我在产线上一般会每周做一次快速校验用标准球扫描一下看球半径偏差。如果偏差超过阈值就重新标定。为了提高长期稳定性机械结构要用低膨胀系数的材料比如铸铁或陶瓷。相机和激光器的安装座要足够刚性避免振动。还有一个技巧是把标定参数存在相机里或者专用的存储芯片里换计算机时不用重新标定。6.3 不同表面材质的适应性从金属到橡胶的调整策略不同表面材质对线激光扫描的影响很大。金属反光强容易产生镜面反射和反光点橡胶和塑料漫反射好但颜色深的话吸光严重激光线很暗透明材料更是难题激光会穿透根本看不到线。我的应对策略是金属表面用蓝色激光器加窄带滤光片必要时喷显影剂深色橡胶提高激光器功率和曝光时间透明材料要么喷显影剂要么用波长更短的紫外激光但紫外激光对相机和镜头有要求成本高。还有一种方法是改变入射角让激光在透明材料表面形成足够的散射。6.4 系统集成和PLC、机器人的配合线激光扫描系统通常不是孤立的要和PLC、机器人、上位机配合。PLC负责运动控制和触发机器人负责上下料上位机负责数据处理和显示。集成的关键是通信协议和时序。我用的是EtherCAT或Profinet做实时通信触发信号用硬件线缆直接连避免通信延迟。数据上传用TCP或UDP点云数据量大UDP比TCP更合适但要注意丢包。我一般会在UDP上加一层简单的重传机制保证数据完整性。还有一个细节是坐标系对齐。扫描系统的坐标系要和机器人的坐标系对齐否则抓取或加工位置会偏。我一般会用标准球做坐标系对齐机器人带着标准球走几个位置扫描系统测量球心然后求解坐标变换矩阵。7. 一些让我少走弯路的实操心得7.1 先用仿真验证方案再动手搭硬件在动手搭硬件之前我强烈建议先用仿真验证方案。用OpenCV或MATLAB建一个简单的三角测量模型输入你选的相机分辨率、镜头焦距、工作距离、夹角看看理论精度能不能达到要求。这个仿真花不了多少时间但能避免你买错设备。我见过有人直接买了相机和激光器搭起来才发现精度不够或者视野覆盖不了只能重新买。仿真能帮你确定关键参数比如相机分辨率、镜头焦距、激光器功率。仿真结果和实际会有偏差但量级是对的。7.2 标定板的选择和保养标定板的精度直接影响标定结果。我用的是一块陶瓷标定板平整度在微米级棋盘格图案是镀铬的对比度高、耐磨。便宜的打印标定板平整度差用几次就磨损了标定结果不稳定。标定板要定期清洁用无水乙醇和镜头纸轻轻擦。不要用手摸棋盘格表面油脂会影响对比度。存放时要放在干燥的地方避免变形。如果标定板摔过或变形了直接换新的不要凑合用。7.3 点云可视化工具的选择点云可视化工具我用过不少CloudCompare、MeshLab、PCL的可视化模块。CloudCompare最方便支持多种格式测量和滤波功能也强。MeshLab适合做网格处理。PCL的可视化模块适合集成到自己的程序里。我一般会在开发阶段用CloudCompare快速查看点云质量调整参数。在集成阶段用PCL的可视化模块方便和代码结合。还有一个技巧是把点云转成深度图用OpenCV显示这样能实时看到处理效果比三维可视化更快。7.4 代码版本管理和参数记录线激光扫描系统的参数很多标定参数、滤波参数、曝光参数每个都会影响结果。我吃过亏调好了一套参数过几天忘了只能重新调。后来我养成了记录参数的习惯每次调参都记下来包括日期、环境温度、参数值、结果评价。代码用Git管理每个版本对应一组参数。这样如果新参数效果不好可以快速回退到旧版本。参数文件用YAML或JSON格式方便读写和版本对比。这个习惯看起来麻烦但长期来看省了很多时间。7.5 和同行交流比自己闷头调更高效线激光扫描涉及光学、机械、电子、算法多个领域一个人很难什么都懂。我遇到问题时除了自己查资料还会在技术社区和同行交流。很多时候别人一句话就能点醒你省去几天甚至几周的摸索。我印象最深的一次是点云在运动方向有周期性误差我调了几天都没解决。后来在一个技术群里问有人提醒我检查编码器分频和丝杆导程的匹配我一查果然是分频比设错了。这种问题在文档里很少提到但做过的人都知道。7.6 留出足够的调试时间线激光扫描系统的调试时间往往比搭建时间长得多。我第一个原型机搭了三天调了三个月才稳定出结果。所以做项目计划时一定要给调试留足够的时间不要指望搭起来就能用。调试的顺序我一般是先调相机标定再调光平面标定再调运动方向标定然后调图像预处理和激光线提取最后调点云后处理。每一步都要验证不要跳过。跳过一步后面出了问题很难定位。7.7 考虑极端工况下的鲁棒性实验室环境是理想的产线环境是残酷的。温度变化、振动、粉尘、油污、电磁干扰都会影响系统。我在设计时会把鲁棒性放在第一位宁可牺牲一点精度也要保证系统能稳定运行。比如相机的防护等级要够镜头要加保护镜激光器要加散热。线缆要用屏蔽线接头要锁紧。软件要有异常处理丢帧、通信中断、数据异常都要能自动恢复。这些细节在实验室里看不出差别但在产线上决定了系统能不能活下去。7.8 从需求反推技术方案而不是从技术出发找应用最后一条心得是不要因为线激光扫描很酷就硬套到所有场景。先想清楚你要解决什么问题精度要求多少速度要求多少环境怎么样然后反推技术方案。有时候一个简单的激光位移传感器就能解决的问题不需要上整套线激光扫描系统。我见过有人为了测一个平面的高度搭了一套线激光扫描结果成本高、调试复杂还不如用几个激光位移传感器。技术方案要和需求匹配不要为了技术而技术。线激光扫描三维成像这套东西说难也难说简单也简单。难在细节多每个环节都有坑简单在原理清晰只要按部就班总能调出来。我这些年最大的体会是不要怕慢不要跳过验证步骤不要忽视那些看起来不起眼的参数。真正决定系统好坏的往往不是最贵的那个设备而是你对整个链路理解得有多深。
返回列表