1. 拆垛这件事,为什么3D相机选型比算法更让人头疼
做视觉引导拆垛项目,十个人里有八个会把精力砸在算法上——点云分割、位姿估计、抓取规划,听起来就高级。但真正在产线现场摸爬滚打过的人都知道,项目能不能验收,七成取决于3D相机选得对不对。算法再漂亮,相机给出来的点云缺一块、噪点满天飞、节拍跟不上,后面全是白搭。
我前后参与过十几个拆垛项目,从纸箱、编织袋到金属铸件、轮胎,踩过的坑基本都和相机选型有关。有的项目用结构光相机拍黑色哑光纸箱,点云直接消失;有的用ToF相机拍高反光金属件,深度值跳得亲妈都不认识;还有的相机标称精度0.1mm,实际装到产线上因为环境光干扰,重复精度掉到2mm开外。这些问题不是调参能解决的,是选型阶段就埋下的雷。
这篇内容就是把我这些年交的学费整理出来,围绕3D相机选型、点云质量评估、手眼标定、现场落地调试这几个核心环节,讲清楚每一步该怎么想、怎么做、怎么避坑。适合正在做或准备做视觉引导拆垛的工程师、集成商,也适合刚接触3D视觉想了解实际项目怎么落地的新手。我不会堆一堆参数表让你自己悟,而是把每个选择背后的逻辑讲透,让你看完能直接拿着去和供应商对话、去现场做验证。
2. 3D相机选型:先搞清楚你要拍什么,再谈参数
2.1 拆垛场景的三种典型工况与相机匹配逻辑
拆垛看起来都是“从垛上抓东西”,但实际工况差异巨大,直接决定了相机技术路线的选择。我习惯把拆垛场景分成三类:
第一类:规则纸箱/周转箱拆垛。这是最常见的场景,箱子表面平整、颜色统一、排列整齐。这种工况对相机的要求相对宽松,结构光相机是性价比最高的选择。结构光通过投射编码光斑图案,能在近距离获得很高的深度精度,典型工作距离在0.5m到1.5m之间,精度可以做到0.1mm到0.5mm。但要注意,如果纸箱是黑色或深色哑光材质,结构光的红外图案会被吸收,点云质量会明显下降。我遇到过某品牌结构光相机拍黑色纸箱时,点云缺失率超过40%,后来换成主动双目方案才解决。
第二类:袋装物料拆垛。编织袋、塑料袋表面有褶皱、反光不均匀,而且袋子之间挤压变形严重。这种场景我推荐ToF(飞行时间)相机或主动双目相机。ToF相机通过测量光飞行时间获取深度,对表面纹理不敏感,但精度相对较低,典型精度在1mm到5mm。主动双目结合了双目立体视觉和红外投射,在中等距离(1m到3m)表现比较均衡。袋装物料的关键问题是袋子之间的缝隙很小,点云分割难度大,所以相机的横向分辨率比深度精度更重要——分辨率不够,两个袋子在点云里粘在一起,算法根本分不开。
第三类:金属件/铸件拆垛。这是最难的工况。金属表面要么高反光(像镜面),要么有油污,而且工件形状复杂。这种场景我强烈建议用抗高反光的结构光相机或者激光轮廓扫描仪。有些高端结构光相机支持HDR模式,通过多次曝光合成,能同时保留高反光和暗部区域的深度信息。但即便如此,现场也经常需要调整相机角度,避免镜面反射直接进入镜头。如果工件是回转体,还要考虑多相机从不同角度拍摄再融合点云。
下面这张表是我根据实际项目经验整理的选型对照,参数是典型值,具体型号需要根据工作距离和视野再细化:
| 工况类型 | 推荐技术路线 | 典型精度 | 工作距离 | 关键注意事项 |
|---|---|---|---|---|
| 规则纸箱 | 结构光 | 0.1-0.5mm | 0.5-1.5m | 黑色/深色纸箱需验证点云缺失率 |
| 袋装物料 | ToF/主动双目 | 1-5mm | 1-3m | 横向分辨率优先,关注袋子缝隙分辨能力 |
| 金属铸件 | 抗高反结构光/激光轮廓 | 0.05-0.2mm | 0.3-1m | 需HDR模式,注意镜面反射角度 |
| 混合垛型 | 主动双目+结构光融合 | 0.5-2mm | 0.8-2m | 标定复杂度高,但适应性强 |
2.2 点云质量评估:别只看精度参数,现场实测才是真的
供应商给的规格书里,精度、分辨率、帧率写得漂漂亮亮,但那些数据是在标准实验室环境下测的。现场有环境光、有振动、有粉尘,实际表现可能打对折。我总结了一套现场点云质量评估方法,你拿着这套流程去测,基本能判断相机能不能用。
第一步:拍标准件。带一个已知尺寸的标准球或标准块,放在实际工作距离上,拍20帧点云,看球体拟合的直径偏差和重复性。重复性比绝对精度更重要——拆垛抓取靠的是相对位置,重复性差会导致每次抓取位置都在跳。
第二步:拍实际工件。把最难拍的工件(黑色、反光、有油污的)放到垛上,拍点云看缺失区域。我一般会统计点云完整率:实际点云点数除以理论点数。低于70%就要警惕,低于50%基本不能用。
第三步:拍满垛和空垛。满垛时相机距离工件近,空垛时距离远,要确认在整个工作距离范围内点云质量都稳定。有些相机在近端精度好,远端点云稀疏得没法用。
第四步:开现场光源测。把车间的顶灯、安全光幕、其他设备的指示灯都打开,再拍一遍。环境光对结构光相机影响很大,尤其是工频闪烁的光源,会导致点云出现周期性噪声。
注意:测试时一定要用实际工件,不要用供应商提供的测试块。我见过太多项目用测试块效果完美,换实际工件直接翻车。
2.3 接口与集成:GigE、USB3.0还是GMSL,选错接口耽误三天
相机接口看起来是小事,但现场调试时接口问题能让你多熬两个通宵。目前主流接口有三种:
GigE Vision:最通用,网线传输,距离可以到100米,带宽1Gbps。缺点是延迟比USB3.0略高,而且需要配置网卡巨帧。拆垛场景如果相机到工控机距离超过5米,GigE是首选。我一般会建议用独立网卡,不要和办公网络混用,否则带宽被抢占会导致丢帧。
USB3.0:带宽5Gbps,延迟低,即插即用。缺点是线缆长度一般不超过3米,而且对线材质量敏感。现场如果相机装在机器人手臂上,线缆要跟着动,USB3.0的可靠性是个隐患。我遇到过USB3.0线缆在拖链里弯折几百次后接触不良,点云时不时断流,排查了半天才发现是线的问题。
GMSL:车载级接口,同轴线传输,距离可以到15米,抗干扰能力强,而且线缆细、耐弯折。如果相机要装在运动部件上,GMSL是最优解。缺点是采集卡贵,而且不同品牌的GMSL相机和采集卡兼容性需要确认。
选接口的核心逻辑是:看相机安装位置和运动方式。固定安装、距离远,选GigE;装在机器人末端、线缆要动,选GMSL;短距离、低成本,USB3.0也能用,但线材要选带屏蔽和锁紧的工业级。
3. 手眼标定:拆垛项目里最容易埋雷的环节
3.1 眼在手外还是眼在手上,拆垛场景怎么选
手眼标定是视觉引导拆垛的核心环节,标定不准,后面抓取全偏。拆垛场景一般有两种配置:
Eye-to-Hand(眼在手外):相机固定在支架上,俯视整个垛盘。优点是相机视野固定,标定一次就行,而且相机不随机器人运动,线缆好走。缺点是如果垛盘位置有变动,需要重新标定或者做垛盘定位。拆垛场景大部分用这种配置,因为垛盘位置相对固定,而且相机可以装得比较高,视野覆盖整个垛型。
Eye-in-Hand(眼在手上):相机装在机器人末端,跟着手臂动。优点是灵活,可以从不同角度拍,适合复杂垛型。缺点是标定复杂,每次换工具或者碰撞后都要重新标定,而且线缆要跟着动,可靠性要求高。拆垛场景如果垛型简单、抓取点固定,一般不用这种。
我个人的经验是:拆垛优先选Eye-to-Hand,除非工件有遮挡必须从侧面拍,才考虑Eye-in-Hand。Eye-to-Hand的标定流程相对标准化,而且相机固定后稳定性好,不会因为机器人运动导致标定参数漂移。
3.2 手眼标定的实操步骤与参数计算
手眼标定的本质是求相机坐标系到机器人坐标系的变换矩阵。以Eye-to-Hand为例,标定流程如下:
第一步:制作标定板。用棋盘格或圆点标定板,尺寸根据相机视野选。视野1米左右的话,标定板边长200mm到300mm比较合适。标定板要平整,我一般用铝板贴打印纸,玻璃板虽然更平但反光严重,结构光相机拍玻璃板点云会乱。
第二步:采集标定数据。把标定板固定在机器人末端或者放在垛盘上,机器人带动标定板走10到15个不同位姿,每个位姿记录机器人TCP坐标和相机拍摄的标定板图像。位姿要尽量分散,不要都在一个平面上,否则标定矩阵会病态。
第三步:计算变换矩阵。用OpenCV的calibrateHandEye函数或者Halcon的calibrate_hand_eye算子,输入机器人位姿和相机位姿,输出变换矩阵。这里有个关键点:机器人位姿要用旋转向量或四元数表示,不要用欧拉角,否则会有万向锁问题。
第四步:验证标定精度。标定完后,让机器人走到一个已知点,用相机拍这个点,计算相机坐标系下的坐标,通过变换矩阵转到机器人坐标系,和机器人实际坐标对比。误差一般要求在1mm以内,拆垛抓取才能稳定。
实操心得:标定板不要放在相机视野边缘,边缘畸变大,会影响标定精度。我一般把标定板放在视野中心区域,机器人走位时也尽量让标定板保持在中心。
3.3 标定误差排查:从2mm降到0.5mm的实战记录
有一次项目标定完误差2mm,抓取时经常抓偏。排查过程如下:
先查机器人重复定位精度。让机器人走同一个点20次,用千分表测实际位置,发现重复性0.05mm,机器人没问题。
再查标定板平整度。把标定板放在大理石平台上,用塞尺测间隙,发现中间鼓了0.3mm。换了一块新标定板,误差降到1.2mm。
然后查相机畸变校正。发现标定时用的畸变系数是供应商给的默认值,不是实际标定的。重新做相机内参标定后,误差降到0.8mm。
最后查温度漂移。标定是在早上做的,车间温度20度,中午温度升到28度,相机支架热胀冷缩导致相机位置偏移。换成因瓦合金支架后,误差稳定在0.5mm以内。
这个案例说明,手眼标定误差往往是多个因素叠加的,不要只盯着标定算法,机械结构、温度、标定板质量都要查。
4. 从点云到抓取:拆垛算法链路的工程化落地
4.1 点云预处理:滤波、分割、配准的先后顺序有讲究
相机给出来的原始点云不能直接用,里面有噪声、有背景、有离群点。预处理顺序我一般这样排:
先做直通滤波。根据工作距离,把垛盘以外的点云切掉。比如相机距离垛盘1.5米,垛高0.8米,那就保留Z方向0.7米到1.5米的点云。这一步能去掉大部分背景干扰。
再做体素滤波降采样。原始点云可能几十万个点,直接处理太慢。用体素滤波把点云降采样到原来的十分之一,处理速度能提升5到10倍,而且对精度影响很小。体素大小一般取工件最小特征尺寸的三分之一到五分之一。
然后做离群点去除。用统计滤波或者半径滤波,去掉孤立的噪声点。统计滤波的参数需要根据点云密度调,我一般设K近邻为20,标准差倍数为1.0。
最后做平面分割。用RANSAC把垛盘平面和地面分割出来,剩下的就是工件点云。如果工件是堆叠的,还需要做聚类分割,把每个工件分开。聚类分割用欧式聚类,距离阈值根据工件间隙设,一般取工件最小间隙的一半。
注意:滤波顺序不要颠倒。如果先做离群点去除再做直通滤波,背景点会被当成离群点保留下来,反而增加计算量。
4.2 位姿估计:从点云到抓取位姿的三种方法
拆垛的位姿估计方法主要有三种:
基于模板匹配。提前用CAD模型生成点云模板,在实际点云里做配准,找到最佳匹配位姿。这种方法精度高,但需要工件CAD模型,而且对遮挡敏感。如果工件是标准件,比如固定规格的纸箱,模板匹配效果很好。
基于PCA主成分分析。对分割后的工件点云计算主方向,得到位姿。这种方法不需要CAD模型,计算快,但只适用于形状规则的工件。如果工件是长方体,PCA能给出三个主轴方向,但会有180度歧义,需要额外判断。
基于深度学习。用PointNet或者类似网络直接回归位姿。这种方法适应性强,但需要大量标注数据,而且推理速度可能跟不上节拍。目前拆垛场景用深度学习的还不多,主要是数据标注成本高。
我一般推荐模板匹配为主,PCA为辅。标准工件用模板匹配,非标工件用PCA加规则约束。如果节拍要求高,可以先用PCA快速估计,再用ICP精配准。
4.3 抓取规划:避障、碰撞检测与抓取顺序优化
位姿估计出来后,还要规划抓取路径。拆垛场景的抓取规划有几个特殊点:
避障。机器人抓取时不能碰到垛盘边缘或者其他工件。我一般用MoveIt的碰撞检测功能,把垛盘和已识别的工件都加入碰撞场景,规划时自动避障。
抓取顺序。拆垛要从上往下抓,不能从中间抽,否则上面的工件会塌。所以位姿估计后要按Z轴高度排序,优先抓最高的。如果同一层有多个工件,优先抓边缘的,避免抓中间时碰到旁边的。
抓取姿态。吸盘抓取要保证吸盘面与工件表面平行,夹爪抓取要保证夹爪开口方向与工件长边一致。这些约束要在规划时加进去,否则抓取成功率会很低。
实操心得:抓取顺序不要完全按高度排序,还要考虑机器人运动范围。有时候最高的工件在机器人工作空间边缘,抓它需要机器人伸得很长,反而容易碰到其他东西。我一般会综合高度和距离,选一个最优的抓取顺序。
5. 现场调试与常见问题排查
5.1 点云缺失、噪点、漂移的排查思路
现场调试时,点云问题是最常见的。我整理了一个排查表:
| 现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 点云大面积缺失 | 工件表面反光/吸光 | 换不同材质工件测试 | 调整相机角度或换相机类型 |
| 点云噪点多 | 环境光干扰 | 遮挡环境光再拍 | 加遮光罩或滤光片 |
| 点云周期性波动 | 工频光源闪烁 | 关闭附近灯光测试 | 同步触发或换抗闪烁相机 |
| 点云漂移 | 温度变化 | 记录不同温度下点云 | 预热相机或做温度补偿 |
| 点云边缘模糊 | 相机镜头脏污 | 检查镜头 | 清洁镜头 |
| 点云密度不均 | 相机安装角度倾斜 | 检查相机姿态 | 调整相机角度 |
5.2 节拍优化:从3秒到1.5秒的实操记录
有个项目要求节拍2秒,初始调试时实际节拍3秒,超了50%。优化过程如下:
先测各环节耗时。相机采集0.3秒,点云预处理0.8秒,位姿估计0.5秒,抓取规划0.4秒,机器人运动1.0秒。总计3.0秒。
优化点云预处理。把体素滤波的体素大小从5mm调到8mm,点云点数从30万降到8万,预处理时间从0.8秒降到0.3秒。精度损失0.2mm,可以接受。
优化位姿估计。把模板匹配的搜索范围缩小,只在上一次抓取位置附近搜索,时间从0.5秒降到0.2秒。
优化机器人运动。把抓取路径从直线改成圆弧过渡,减少加减速时间,运动时间从1.0秒降到0.7秒。
最终节拍1.5秒,满足要求。这个案例说明,节拍优化要分环节测,找到瓶颈再针对性优化,不要盲目换硬件。
5.3 与PLC、机器人的通信联调避坑
视觉系统要和PLC、机器人通信,联调时容易出问题。我踩过的坑包括:
通信协议不匹配。视觉系统用TCP/IP,PLC用Profinet,需要加网关。选网关时要注意数据格式,有些网关只支持字节传输,不支持浮点数,需要自己做转换。
触发信号抖动。PLC给视觉系统的触发信号有抖动,导致相机重复触发。解决办法是在PLC侧加滤波,或者视觉侧做去抖。
坐标系不一致。视觉系统给的是相机坐标系下的坐标,机器人要的是基坐标系下的坐标,手眼标定矩阵要正确应用。我一般会在视觉系统里直接输出机器人基坐标系下的坐标,减少机器人侧的转换。
异常处理不完善。视觉系统识别失败时,如果没有给PLC明确的失败信号,PLC会一直等,导致产线停线。我一般会设超时机制,视觉系统超过一定时间没结果就返回失败,PLC收到失败后走异常处理流程。
6. 一些零散但值钱的经验
关于相机选型:不要只看参数,一定要拿实际工件去供应商那里测,或者让供应商带相机到现场测。我见过太多参数漂亮但实际不行的相机。
关于手眼标定:标定板要定期检查,尤其是铝板贴纸的,时间长了会起泡。我一般三个月换一次标定板。
关于点云处理:不要追求完美的点云,够用就行。拆垛抓取对点云精度的要求其实不高,关键是稳定性和重复性。
关于现场调试:调试时一定要记录每次参数变更和对应的效果,否则调着调着就忘了哪个参数是有效的。我一般用Excel记录,包括时间、参数、效果、备注。
关于供应商沟通:问供应商问题时,不要问“你们的相机精度多少”,要问“你们的相机在拍黑色哑光纸箱时,点云完整率多少”。具体的问题才能得到有用的答案。
关于项目验收:验收标准要提前和客户确认,包括节拍、抓取成功率、点云质量指标。不要等到验收时再扯皮,那时候改什么都来不及。
这个领域变化很快,新相机、新算法层出不穷,但底层逻辑是不变的:搞清楚你要拍什么,选对相机,标定准,算法稳,现场调到位。把这几点做好,拆垛项目基本不会翻车。