1. 项目背景与核心挑战
PCB板检测产线对精度和效率的要求堪称苛刻。以华为5G基站PCB板为例,最小线宽仅50μm,检测精度要求±0.05mm,节拍必须控制在12秒/板以内。传统单相机+单机器人的方案在简单场景下尚可应付,但面对12台工业相机(8台用于外观检测,4台用于尺寸测量)与8台协作机器人(6台负责分拣,2台负责返修)的复杂系统时,就会暴露出致命问题:
- 时钟同步误差:各相机独立触发时,微秒级的时间差会导致PCB板位移造成的图像错位。实测数据显示,传送带速度1m/s时,100μs的同步误差就会产生0.1mm的图像偏移。
- 坐标系混乱:每台设备使用本地坐标系,经过8次坐标转换后,累积误差可达±0.2mm。这直接导致机器人抓取位置偏差,出现"看得见抓不着"的尴尬局面。
- 任务冲突:当多台机器人同时申请同一工位时,若无中央调度系统,轻则节拍下降,重则发生物理碰撞。我们曾因这个问题导致两台ABB IRB 6700机械臂末端执行器损毁,单次维修成本超5万元。
关键教训:多机系统不是单机方案的简单堆叠,必须建立全局时钟、统一坐标系和中央决策机制。
2. 系统架构设计解析
2.1 硬件拓扑设计
采用"星型+总线"混合架构,既保证实时性又兼顾扩展性:
code复制[主控服务器]
├── [PTP主时钟] via 10G光纤
│ ├── [相机1]
│ ├── ...
│ └── [相机12]
└── [EtherCAT主站]
├── [机器人控制器1]
├── ...
└── [机器人控制器8]
- 时钟同步:通过IEEE 1588(PTP)协议实现纳秒级同步,选用Meinberg M1000时钟服务器作为主时钟,实测各相机触发时间偏差<50ns。
- 通信网络:
- 视觉数据:10G光纤网络传输2000万像素图像,单帧压缩耗时控制在80ms内
- 控制指令:EtherCAT总线确保机器人指令延迟<1ms
2.2 软件架构设计
采用分层解耦设计,各模块通过ROS2中间件通信:
python复制class VisionSystem:
def __init__(self):
self.image_processor = YOLOv5s(weights='pcb_defect_v3.pt') # 定制化训练的模型
self.coord_transformer = CoordTransformer(master_frame='world')
class RobotScheduler:
def __init__(self):
self.task_queue = PriorityQueue()
self.collision_map = OccupancyGrid(resolution=1mm)
class CentralController:
def __init__(self):
self.vision = VisionSystem()
self.scheduler = RobotScheduler()
self.state_monitor = StateMonitor()
3. 核心实现细节
3.1 多相机同步采集方案
硬件触发电路设计:
- 使用NI PCIe-6323数字IO卡产生触发脉冲
- 采用光耦隔离防止地环路干扰
- 信号线阻抗匹配50Ω,防止反射造成边沿畸变
软件配置要点:
csharp复制// Halcon采集配置示例
HTuple hAcqHandle;
HOperatorSet.OpenFramegrabber("GigEVision", 0, 0, 0, 0, 0, 0, "default", -1,
"default", -1, "false", "default", "cam1", 0, -1, out hAcqHandle);
HOperatorSet.SetFramegrabberParam(hAcqHandle, "TriggerMode", "On");
HOperatorSet.SetFramegrabberParam(hAcqHandle, "TriggerSource", "Line1");
避坑指南:Basler相机需额外设置TriggerDelay=50μs,避免首帧丢失问题。
3.2 统一坐标系建立
采用"九点标定法"建立世界坐标系:
- 使用标定板在传送带不同位置拍摄9组图像
- 通过最小二乘法拟合平面方程:z = 0.0032x + 0.0015y + 12.345
- 各设备坐标系转换矩阵存储为JSON配置文件:
json复制{
"cam1": {
"rotation": [0.9992, -0.0123, 0.0384, 0.0118, 0.9996, 0.0257, -0.0387, -0.0252, 0.9989],
"translation": [1250.34, -345.67, 856.12]
}
}
实测表明,该方法可将坐标转换误差控制在±0.03mm内。
4. 任务调度算法
4.1 动态优先级分配
采用改进的EDF(Earliest Deadline First)算法:
code复制机器人任务优先级 =
基础权重(返修任务:10, 分拣任务:5)
+ 紧急系数(1/剩余时间)
- 路径惩罚(与当前任务路径重叠度)
4.2 防碰撞策略
建立三维时空占用网格:
- 空间分辨率:1mm
- 时间分辨率:10ms
- 冲突检测代码片段:
python复制def check_collision(robot1_path, robot2_path):
for t in range(max_steps):
pos1 = robot1_path[t]
pos2 = robot2_path[t]
if euclidean_distance(pos1, pos2) < safety_margin:
return True
return False
5. 实测性能数据
在华为产线连续7天压力测试结果:
| 指标 | 要求值 | 实测值 |
|---|---|---|
| 节拍 | ≤12s | 11.3s |
| 定位精度 | ±0.05mm | ±0.03mm |
| 误检率 | ≤0.1% | 0.07% |
| 系统可用率 | ≥99.5% | 99.8% |
6. 关键问题排查手册
6.1 图像错位问题
现象:检测框与实物位置偏移0.1-0.3mm
排查步骤:
- 检查PTP同步状态:
ptp4l -m -q查看offset值应<100ns - 验证触发信号:用示波器测量各相机Trigger信号上升沿
- 检查传送带编码器信号:脉冲间隔波动应<1%
6.2 机器人路径冲突
现象:机器人突然停止并报错"Collision Avoidance"
解决方案:
- 更新OccupancyGrid地图分辨率到0.5mm
- 在路径规划中增加10ms缓冲时间
- 优化任务分配算法权重系数
7. 工程实施要点
-
线缆管理:
- 电源线与信号线分层走线,间距>10cm
- 千兆网线长度不超过75米
- 光纤弯曲半径>5cm
-
接地规范:
- 所有设备共地,接地电阻<4Ω
- 模拟地与数字地单点连接
-
抗干扰措施:
- 变频器输出端加装磁环
- 伺服电机电源线使用屏蔽线
这套方案在比亚迪线束检测产线实施时,通过增加视觉伺服补偿模块,进一步将动态抓取精度提升到±0.02mm。现在回头看那些踩过的坑,最大的体会是:复杂系统必须建立严格的数学模型,每个参数都要有物理意义,不能靠试错法调试。下次再遇到20相机+15机器人的项目,我准备尝试基于强化学习的分布式调度算法,到时候再和大家分享实战效果。