☰
3D视觉引导螺栓抓取:高反光小工件无序上料实战
2026/10/23 9:39:35 网站建设 项目流程

1. 项目缘起:为什么偏偏是螺栓抓取这个环节最让人头疼

在工业自动化圈子里摸爬滚打这些年,我经手过不少上料项目,从冲压件到注塑件,从大尺寸钣金到微型电子元件,但每次有人问我“哪个环节最容易翻车”,我脑子里第一个蹦出来的永远是——高反光小工件的无序抓取。而螺栓,恰恰是这个难题里最典型的代表。

你可能会想,螺栓不就是标准件吗?规规矩矩的,有什么难抓的?说实话,我一开始也这么觉得。直到某次在一个汽车零部件配套厂里,看到一整条产线因为螺栓上料环节卡住,整班停产了四个小时,我才意识到这个问题的严重性。螺栓的问题在于:它小、它反光、它堆在料筐里姿态完全随机。传统的振动盘上料方式,遇到表面镀锌或者发黑的螺栓,要么卡料,要么因为反光导致光电传感器误判,要么因为螺栓互相勾连导致姿态不对。更要命的是,现在工厂对柔性生产的要求越来越高,一条线可能要切换好几种规格的螺栓,振动盘换型的时间成本根本扛不住。

这就是3D视觉引导抓取系统切入的场景。简单来说,这套系统的核心逻辑是:用3D相机对料筐里的螺栓进行扫描,通过点云处理和位姿估计算法,找到每一个螺栓的精确三维位置和姿态,然后引导机械臂去抓取,再放到指定的上料位置。听起来逻辑很清晰,但真正落地的时候,高反光表面的点云质量、小尺寸工件的分割精度、密集堆叠情况下的抓取顺序规划,每一个都是硬骨头。

这套方案适合谁参考?如果你正在做汽车零部件、3C电子、五金加工等领域的自动化上料项目,尤其是遇到多品种、小批量、高反光材质的工件,那这套思路可以直接抄作业。如果你只是做学术研究或者刚入门3D视觉,也可以把它当作一个完整的工程案例来理解从需求到落地的全流程。

2. 整体方案设计:为什么选3D视觉而不是传统上料方式

2.1 传统上料方案的三个死穴

在决定用3D视觉之前,我们其实认真评估过几种传统方案,结论是它们在这个场景下都有绕不过去的坎。

振动盘上料是最常见的方案,成本低、节拍快,但它的问题在于:第一,换型困难,不同规格的螺栓需要更换轨道和定向机构,每次换型至少半小时起步;第二,高反光表面的螺栓在振动盘里互相摩擦,容易造成表面损伤,对于有外观要求的工件来说不可接受;第三,振动盘的定向机构对于长度相近但头部形状不同的螺栓,容易混淆。

料仓+推板式上料适合形状规则的工件,但螺栓的长径比大,推板推过去之后姿态不可控,经常出现竖着、横着、斜着各种情况,后续机构很难统一处理。

人工上料就不说了,成本高、一致性差,而且现在年轻人根本不愿意干这种重复性极强的活。

2.2 3D视觉引导的核心优势

3D视觉引导抓取之所以能解决这些问题,核心在于它把“整理工件姿态”这个动作从机械机构转移到了软件算法上。料筐里的螺栓不需要被整理成统一姿态,相机扫一遍,算法自己去找每个螺栓在哪里、朝哪个方向,然后规划机械臂怎么抓。换型的时候,只需要在软件里切换对应的工件模型和抓取策略,几分钟就能完成,完全不需要动机械结构。

另一个关键优势是对反光表面的适应能力。现在的3D相机,尤其是结构光或者ToF原理的,配合合适的曝光策略和滤波算法,已经能在一定程度上处理镀锌、发黑、甚至轻微油污的金属表面。当然,这里面有很多细节要调,后面我会详细说。

2.3 系统架构的总体思路

整套系统的架构可以分成四层:感知层、决策层、执行层、交互层。

感知层就是3D相机,负责采集料筐内螺栓的点云数据。决策层是工控机上的视觉处理软件,负责点云预处理、分割、位姿估计和抓取规划。执行层是机械臂和夹爪,负责按照规划好的路径去抓取和放置。交互层是人机界面,操作员可以在这里切换工件型号、查看运行状态、处理异常报警。

这个架构的关键在于决策层的算法鲁棒性。因为感知层采集到的原始点云质量,受反光、遮挡、环境光的影响很大,如果决策层的算法不够健壮,整个系统就会频繁报错停机。所以我们在设计之初就把大量精力放在了点云预处理和位姿估计的容错机制上。

3. 核心细节解析:从点云到抓取位姿的完整链路

3.1 3D相机的选型与参数配置

选相机这件事,我的经验是不要只看参数表上的精度指标,要看实际工况下的点云质量。我们对比过好几款不同原理的3D相机,最终选定的是一款基于结构光原理的工业级3D相机,工作距离在600mm左右,视野范围覆盖整个料筐。

这里有一个关键参数需要计算:相机的分辨率与最小可识别特征的匹配。螺栓的杆径一般在6mm到12mm之间,螺纹的牙距更小。如果相机的点云分辨率不够,螺纹部分就会糊成一团,影响位姿估计的精度。我们根据视野范围和分辨率算了一下,在600mm工作距离下,相机的点间距大约在0.3mm左右,对于识别螺栓的头部和杆部轮廓来说是足够的。

曝光策略也很重要。高反光表面在过曝的时候会丢失细节,欠曝的时候信噪比又不够。我们的做法是采用多曝光融合,相机在一次扫描中采集多张不同曝光时间的图像,然后融合成一张高动态范围的点云。这样既能保留反光区域的细节,又能保证暗部区域的信噪比。

注意:多曝光融合会增加单次扫描的时间,如果产线节拍要求很高,需要权衡扫描时间和点云质量。我们的经验是,对于螺栓这种小工件,3到5次曝光融合基本够用,单次扫描时间控制在0.8秒以内。

3.2 点云预处理:把“脏数据”变成“干净数据”

原始点云里有很多噪声,比如料筐底部的平面、螺栓之间的遮挡区域、反光造成的飞点等等。预处理的目标就是把这些无关信息去掉,只保留螺栓的点云。

第一步是直通滤波,根据料筐的高度范围,把料筐底部和上方的背景点云裁掉。这一步比较简单,但参数设置要合理,裁多了会丢失螺栓的顶部,裁少了会保留太多噪声。

第二步是统计滤波,去除那些离群点。反光造成的飞点通常表现为孤立的、远离主体的点,统计滤波可以有效地把它们滤掉。这里的关键参数是邻域点数和标准差倍数,我们一般设置邻域点数为50,标准差倍数为1.0,实测下来对螺栓点云的效果比较好。

第三步是平面分割,把料筐底部的平面去掉。这一步用RANSAC算法就能搞定,但要注意料筐底部可能有螺栓的阴影或者反光,导致平面拟合不准确。我们的做法是先做一次粗分割,然后用剩余点云的高度分布来验证平面是否合理。

3.3 点云分割:把一堆螺栓分开

点云预处理完之后,料筐里所有螺栓的点云是混在一起的,需要把它们分割成一个个独立的实例。这一步是整个链路里最考验算法功底的环节。

对于稀疏堆叠的情况,欧式聚类就能搞定。根据点之间的欧式距离,把距离小于阈值的点聚成一类。阈值的选择很关键,太小了同一个螺栓会被分成多类,太大了相邻的螺栓会被合并。我们一般设置阈值为螺栓杆径的1.5倍左右,实测下来比较稳。

但对于密集堆叠的情况,欧式聚类就不够用了,因为相邻螺栓的点云在空间上是连在一起的。这时候就需要引入基于法向量的分割或者基于深度信息的分割。我们的做法是结合两种信息:先根据法向量的一致性做初步分割,然后根据深度图的连通性做修正。这样即使两个螺栓紧挨着,只要它们的表面法向量有差异,就能被分开。

还有一种更棘手的情况是螺栓互相勾连,比如一个螺栓的头部卡在另一个螺栓的杆部下面。这种情况下,点云分割算法很难把它们完全分开,因为从相机的视角看,它们就是连在一起的一团。我们的处理策略是先抓取上层容易抓的螺栓,逐步暴露下层的螺栓。这需要在抓取规划阶段就考虑到抓取顺序的问题。

3.4 位姿估计:找到螺栓的精确位置和方向

分割出单个螺栓的点云之后,下一步是估计它的三维位姿,也就是它在空间中的位置和朝向。这一步的精度直接决定了抓取的成功率。

我们的做法是基于CAD模型的配准。提前用螺栓的三维CAD模型生成一个模板点云,然后在实际点云上做配准,找到最佳的旋转和平移矩阵。配准算法用的是ICP的变种,加入了法向量约束和距离约束,收敛速度更快,精度也更高。

这里有一个细节:螺栓的螺纹部分在点云上是不完整的,因为螺纹的凹槽部分相机拍不到。所以配准的时候不能依赖螺纹特征,主要依赖螺栓的头部和杆部的圆柱面。我们在模板点云里把螺纹部分弱化,增加头部和杆部的权重,这样配准的鲁棒性更好。

位姿估计的输出是一个6自由度的位姿,包括3个位置和3个姿态角。对于螺栓抓取来说,最关键的是轴向的姿态,因为夹爪需要沿着螺栓的轴向去抓。如果轴向估计偏差超过5度,夹爪就可能抓空或者抓偏。

4. 实操过程:从零搭建一套可复现的抓取系统

4.1 硬件搭建与标定

硬件部分包括3D相机、机械臂、夹爪、工控机和料筐。相机的安装位置很讲究,最好安装在机械臂的基座附近,斜向下对着料筐,这样视野可以覆盖整个料筐,而且不会和机械臂的运动产生干涉。

手眼标定是这一步的核心。我们用的是眼在手外的标定方式,也就是相机固定在支架上,不随机械臂运动。标定的过程是:在机械臂末端安装一个标定板,让机械臂带着标定板在相机视野内走若干个不同的位姿,然后通过优化算法求解相机坐标系和机械臂基坐标系之间的变换矩阵。

标定的精度直接影响抓取的绝对精度。我们的经验是,标定完成后一定要做验证:让机械臂走到几个已知位置,看相机识别出来的位置和实际位置的偏差。如果偏差超过1mm,就需要重新标定或者检查标定板的安装是否牢固。

4.2 视觉处理流程的代码实现

视觉处理流程用Python实现,核心依赖OpenCV和PCL库。下面是一个简化的处理流程示例:

import open3d as o3d import numpy as np # 1. 读取点云 pcd = o3d.io.read_point_cloud("bolt_scene.pcd") # 2. 直通滤波,保留料筐范围内的点云 points = np.asarray(pcd.points) mask = (points[:, 2] > z_min) & (points[:, 2] < z_max) pcd = pcd.select_by_index(np.where(mask)[0]) # 3. 统计滤波,去除离群点 pcd, _ = pcd.remove_statistical_outlier(nb_neighbors=50, std_ratio=1.0) # 4. 平面分割,去除料筐底部 plane_model, inliers = pcd.segment_plane( distance_threshold=2.0, ransac_n=3, num_iterations=1000 ) pcd = pcd.select_by_index(inliers, invert=True) # 5. 欧式聚类,分割出单个螺栓 labels = np.array(pcd.cluster_dbscan(eps=8.0, min_points=30)) max_label = labels.max() # 6. 对每个聚类做位姿估计 for i in range(max_label + 1): cluster = pcd.select_by_index(np.where(labels == i)[0]) # ICP配准,估计位姿 result = o3d.pipelines.registration.registration_icp( cluster, template, max_correspondence_distance=2.0, init=np.identity(4), estimation_method=o3d.pipelines.registration.TransformationEstimationPointToPlane() ) pose = result.transformation # 输出位姿给机械臂 print(f"Bolt {i} pose:\n{pose}")

这段代码是简化版,实际项目中还需要加入更多的异常处理和参数调优。比如DBSCAN的eps参数,需要根据螺栓的尺寸和点云密度来调整。我们一般会先用几组不同堆叠状态的样本做测试,找到一组在大多数情况下都能工作的参数。

4.3 抓取规划与路径优化

位姿估计出来之后,并不是所有螺栓都能直接抓。有些螺栓被其他螺栓压住了,有些螺栓的姿态导致夹爪无法伸入,有些螺栓虽然能抓但抓取后可能会带倒旁边的螺栓。所以需要一个抓取规划环节,从所有可抓取的螺栓中选出一个最优的。

我们的评分函数考虑几个因素:抓取可行性(夹爪是否能无碰撞地到达)、抓取稳定性(夹爪和螺栓的接触面积是否足够)、对周围工件的影响(抓取后是否会导致其他螺栓移位)。每个因素给一个权重,综合评分最高的螺栓优先抓取。

路径规划用的是RRT算法,在机械臂的关节空间里搜索一条从当前位置到抓取位置的无碰撞路径。这里要注意的是,料筐的壁和机械臂本身都可能成为障碍物,需要在规划时考虑进去。

4.4 夹爪的选择与参数设置

夹爪的选择也很关键。对于螺栓这种小尺寸、高反光的工件,我们用的是气动平行夹爪,夹爪指上贴了聚氨酯垫片,既能增加摩擦力,又能避免划伤螺栓表面。

夹爪的开口宽度需要根据螺栓的头部尺寸来设置。太大了夹不住,太小了放不进去。我们的做法是设置一个略大于螺栓头部宽度的开口,然后在夹取的时候用力控模式,检测到接触力达到阈值就停止闭合,这样既能保证夹紧,又不会把螺栓夹变形。

提示:气动夹爪的响应速度受气压影响很大,如果产线气压不稳定,夹爪的闭合速度会波动,影响抓取成功率。建议在气路里加一个稳压阀,把气压稳定在0.5MPa左右。

5. 常见问题与排查技巧实录

5.1 点云质量差导致识别失败

这是最常见的问题,表现为相机扫出来的点云要么缺了一块,要么全是噪声。排查思路是从光源、曝光、工件表面状态三个方向入手。

先看环境光。如果料筐附近有强光直射,或者有窗户透进来的自然光变化,都会影响点云质量。我们的做法是在料筐上方加一个遮光罩,把环境光的影响降到最低。

再看曝光参数。高反光表面需要更短的曝光时间,但太短了暗部又拍不到。多曝光融合是解决方案,但曝光时间的组合需要根据实际工件来调。我们一般会先用自动曝光模式扫一遍,看看相机推荐的曝光时间范围,然后在这个范围内取3到5个值做融合。

最后看工件表面状态。如果螺栓表面有油污或者水渍,点云质量会明显下降。这种情况下,要么在来料环节增加清洗工序,要么在算法里加入针对油污表面的滤波策略。

5.2 位姿估计偏差大导致抓空

位姿估计偏差超过阈值,夹爪就会抓空或者抓偏。排查的时候,先看模板点云和实际点云的匹配程度。如果匹配度很低,说明模板和实际工件差异太大,可能是工件型号换了但模板没更新,或者工件表面磨损严重导致点云特征变化。

如果匹配度还行但位姿还是有偏差,那可能是标定参数漂移了。手眼标定的参数会随着温度变化、机械臂关节磨损等因素慢慢漂移,建议每隔一段时间重新标定一次。我们的做法是每周做一次快速验证,每月做一次完整标定。

还有一个容易被忽略的原因是点云分割不完整。如果螺栓的一部分点云被错误地分到了相邻的聚类里,位姿估计就会偏。这种情况下需要调整分割参数,或者加入基于法向量的二次分割。

5.3 抓取顺序不合理导致碰撞

密集堆叠的情况下,如果抓取顺序不对,机械臂或者夹爪可能会碰到其他螺栓,导致工件移位甚至损坏。我们的解决思路是在抓取规划阶段就做碰撞检测,模拟夹爪从上方接近螺栓的路径,如果路径上有其他点云,就判定为不可抓。

但有时候所有螺栓的抓取路径都有干涉,这时候就需要先抓一个“牺牲品”,也就是选一个虽然会碰到旁边螺栓但影响最小的,先把它抓走,暴露下面的螺栓。这个策略需要在实际调试中根据料筐的堆叠情况来调整。

5.4 节拍不达标

节拍是产线的硬指标,如果视觉处理时间太长,整个系统的节拍就上不去。我们的优化经验是:把耗时的操作放到GPU上做,比如点云滤波和ICP配准,用CUDA加速之后速度能提升5到10倍。另外,不是每次抓取都需要完整扫描,可以在第一次扫描之后,根据已抓取的位置预测剩余螺栓的大致区域,只对这个区域做局部扫描,减少数据处理量。

下面是一个常见问题的速查表,方便你在调试的时候快速定位:

问题现象可能原因排查方法解决措施
点云缺失严重曝光不足或反光过强检查相机曝光参数和环境光调整多曝光融合参数,加遮光罩
点云噪声多环境光干扰或工件表面油污观察噪声分布,检查工件表面加遮光罩,增加清洗工序
分割不完整聚类参数不合适可视化分割结果调整DBSCAN的eps和min_points
位姿偏差大标定漂移或模板不匹配验证标定精度,检查模板重新标定,更新模板点云
抓取碰撞抓取顺序不合理模拟抓取路径调整评分函数权重,加入碰撞检测
节拍超标数据处理太慢分析各环节耗时GPU加速,局部扫描

5.5 独家避坑技巧

说几个文档里不会写但实际调试中特别有用的技巧。

第一,料筐的内壁最好做哑光处理。我们一开始用的料筐是亮面不锈钢的,结果相机扫出来的点云里料筐内壁的反光比螺栓还亮,严重干扰分割。后来换成喷砂处理的哑光料筐,问题就解决了。

第二,螺栓的来料状态要控制。如果来料时螺栓是散乱倒进去的,堆叠状态会非常复杂。我们的做法是在料筐上方加一个简单的布料机构,让螺栓相对均匀地铺在料筐里,这样堆叠层数少,抓取成功率高。

第三,定期清理相机镜头。车间环境里粉尘多,镜头上一旦积灰,点云质量就会下降。我们规定每班次开机前用气吹清理一次镜头,这个习惯坚持下来之后,因为点云质量问题导致的停机减少了至少一半。

第四,保留人工干预的接口。再好的系统也有搞不定的情况,比如螺栓卡死了或者料筐快空了。我们在HMI上做了一个“手动模式”,操作员可以用摇杆控制机械臂去处理异常情况,处理完了再切回自动模式。这个功能在实际使用中非常受欢迎。

6. 影响范围与扩展思考

这套3D视觉引导螺栓抓取系统的价值,不仅仅在于解决了螺栓上料这一个问题。它的核心思路——用3D视觉替代传统的机械整理机构,用软件算法替代硬件的柔性——可以扩展到很多类似的场景。

比如螺母、垫片、销钉等标准件的上料,逻辑是完全一样的,只需要更换模板点云和调整抓取参数。再比如小型冲压件、注塑件的无序抓取,虽然工件形状不同,但点云处理、分割、位姿估计的流程是通用的。

甚至在一些装配环节,这套系统也能派上用场。比如需要把螺栓插入孔位的时候,3D视觉可以同时识别螺栓和孔位的位置,引导机械臂完成对准和插入。这就把上料和装配两个环节打通了,减少了中间的转运和定位工序。

从行业趋势来看,柔性制造的需求越来越强烈,一条产线要能快速切换不同型号的产品。传统的专用上料机构在这种趋势下会越来越吃力,而3D视觉引导抓取系统的柔性优势会越来越明显。当然,这套系统的技术门槛也不低,点云处理、位姿估计、抓取规划,每一个环节都需要扎实的工程经验。但一旦跑通,它的复用价值是非常高的。

我个人在实际操作中的体会是,这套系统最难的其实不是算法本身,而是对实际工况的理解和适配。实验室里跑得通的算法,到了车间里可能因为光线变化、粉尘、振动等各种因素就失效了。所以做这类项目,一定要多下现场,多观察,多和产线操作员聊天,他们往往能告诉你很多文档里看不到的细节。最后再分享一个小技巧:在调试初期,可以在料筐里放几个不同姿态的螺栓作为“标准样本”,每次调试前先扫一遍这些样本,验证系统的识别和抓取是否正常,这样能快速判断问题是出在系统本身还是来料状态上。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询