相机固定在加工平台上,无机械臂,只有XYZ三轴运动系统 ,这是一个典型的龙门平台视觉定位 场景。与机械手方案的核心区别是:视觉系统直接测量工件相对于平台坐标系的位置,而不是通过手眼标定。
一、系统架构分析
物理布局
-
相机安装:固定于加工平台(龙门架)上,随XY轴移动(或固定在某处)
-
运动系统:X轴、Y轴、Z轴(可能是音圈电机或伺服+滚珠丝杠)
-
任务目标:定位夹具上某个Mark点的初始位置,驱动平台移动到目标加工位置
关键特点
-
无机械臂 → 无需手眼标定中的末端执行器坐标系
-
相机与平台刚性连接 → 相机坐标系与平台坐标系有固定的偏移关系
-
平面运动 → Mark点在同一平面(忽略高度变化)
二、坐标系定义
cpp
坐标系定义:
├── 平台坐标系 (R):以平台原点(如左下限位)为基准,单位 mm
├── 相机坐标系 (C):以相机光心为原点,单位 mm
└── 像素坐标系 (P):图像左上角为原点,单位 pixel
核心关系 :相机固定在平台上,因此相机坐标系与平台坐标系之间的相对位姿是固定的。
设平台当前位置为 (Xr,Yr)(Xr,Yr)(平台坐标系下),则相机光心在平台坐标系中的位置为:
XcameraYcamera\]=\[XrYr\]+\[ΔXoffsetΔYoffset\]\[XcameraYcamera\]=\[XrYr\]+\[ΔXoffsetΔYoffset
其中 (ΔXoffset,ΔYoffset)(ΔXoffset,ΔYoffset) 是相机安装位置相对于平台坐标系的固定偏移。
三、标定流程(核心)
步骤1:相机内参标定(张正友法)
-
目的:获得畸变参数和焦距,将像素坐标转换为归一化坐标
-
方法:棋盘格拍摄15-20张照片,使用OpenCV
calibrateCamera -
输出:内参矩阵 KK,畸变系数 (k1,k2,p1,p2)(k1,k2,p1,p2)
步骤2:像素当量标定(Pixel to mm)
由于相机光轴垂直于工件平面,可以直接建立线性映射。
方法一:两点法
-
平台移动到位置 P1=(X1,Y1)P1=(X1,Y1),拍摄Mark点,记录像素坐标 (u1,v1)(u1,v1)
-
平台移动到位置 P2=(X2,Y2)P2=(X2,Y2),拍摄同一Mark点,记录像素坐标 (u2,v2)(u2,v2)
-
计算像素当量:
Sx=∣X2−X1∣∣u2−u1∣,Sy=∣Y2−Y1∣∣v2−v1∣Sx=∣u2−u1∣∣X2−X1∣,Sy=∣v2−v1∣∣Y2−Y1∣
单位为 mm/pixel
方法二:多点拟合(推荐)
-
移动平台到9个不同位置,记录 (Xi,Yi)(Xi,Yi) 和对应的 (ui,vi)(ui,vi)
-
建立仿射变换模型:
XY\]=\[abcd\]\[uv\]+\[txty\]\[XY\]=\[acbd\]\[uv\]+\[txty
-
使用最小二乘法求解6个参数
-
此方法可补偿相机安装旋转(如果相机有微小偏角)
步骤3:相机安装偏移标定
目的:确定相机光心与平台坐标系原点的固定偏移 (ΔXoffset,ΔYoffset)(ΔXoffset,ΔYoffset)
方法:
-
在平台上固定一个标准Mark点(如玻璃基板上的十字)
-
移动平台,使Mark点正好位于相机视野中心(通过图像处理找到中心并微调)
-
记录此时平台的坐标 (Xcenter,Ycenter)(Xcenter,Ycenter)
-
相机光心在平台坐标系中的位置即为 (Xcenter,Ycenter)(Xcenter,Ycenter)
-
偏移量计算(如果平台原点在左下角):
ΔXoffset=Xcenter,ΔYoffset=YcenterΔXoffset=Xcenter,ΔYoffset=Ycenter
四、在线定位流程
初始化阶段
-
平台移动到拍照位置 (Xphoto,Yphoto)(Xphoto,Yphoto)
-
此时相机视野覆盖夹具上的Mark点
实时定位(每次夹具到位后)
text
1. 触发相机拍照
2. 图像预处理(滤波、二值化)
3. 匹配算法定位Mark点,获得像素坐标 (u, v)
4. 亚像素优化,得到 (u_sub, v_sub)
5. 畸变校正:
└─ 使用张正友标定的畸变系数校正 (u_sub, v_sub) → (u_corrected, v_corrected)
6. 像素坐标 → 相机坐标系(单位mm):
└─ X_cam = (u_corrected - u_center) × S_x
└─ Y_cam = (v_corrected - v_center) × S_y
(其中 (u_center, v_center) 是图像中心像素坐标)
7. 相机坐标 → 平台坐标系:
└─ X_mark = X_photo + X_cam + ΔX_offset
└─ Y_mark = Y_photo + Y_cam + ΔY_offset
8. 计算目标偏移:
└─ ΔX_target = X_target_desired - X_mark
└─ ΔY_target = Y_target_desired - Y_mark
9. 发送给运动控制器:平台移动 (ΔX_target, ΔY_target)
五、关键优化点
1. 相机安装方向标定
如果相机安装有微小旋转(非90°垂直),需要标定旋转角 θθ。
方法:
-
移动平台X轴固定距离 DD,测量Mark点在图像中的像素位移 (Δu,Δv)(Δu,Δv)
-
计算旋转角:
θ=arctan(ΔvΔu)θ=arctan(ΔuΔv)
-
在坐标转换时加入旋转补偿:
XcamYcam\]=\[cosθsinθ−sinθcosθ\]\[Sx⋅(u−ucenter)Sy⋅(v−vcenter)\]\[XcamYcam\]=\[cosθ−sinθsinθcosθ\]\[Sx⋅(u−ucenter)Sy⋅(v−vcenter)
2. Z轴高度变化的影响
如果Z轴有升降(如调焦或加工头升降),且Mark点在不同平面:
解决方案:
-
使用远心镜头(对高度变化不敏感)
-
或建立高度补偿模型:
-
在不同Z高度拍摄标准Mark点,记录像素坐标变化
-
建立 (u,v)=f(Z)(u,v)=f(Z) 查找表
-
在线时根据当前Z高度查表补偿
-
3. 多Mark点定位(提高精度)
对于高精度要求(如±1μm),使用多个Mark点求平均:
-
夹具上设计3-4个Mark点
-
依次定位每个Mark点,得到 (Xi,Yi)(Xi,Yi)
-
计算夹具整体位姿:
Xcenter=1n∑Xi,Ycenter=1n∑YiXcenter=n1∑Xi,Ycenter=n1∑Yiθrotation=arctan(Y2−Y1X2−X1)θrotation=arctan(X2−X1Y2−Y1)
-
同时输出旋转角用于校正(若加工头可旋转)
六、精度分析与误差控制
| 误差源 | 典型值 | 控制方法 |
|---|---|---|
| 相机标定误差 | ±0.5 pixel | 多点拟合 + 亚像素 |
| 像素当量标定 | ±0.1% | 大范围移动(>100mm) |
| 畸变校正残差 | ±0.1 pixel | 高质量镜头 + 高阶畸变模型 |
| 平台重复定位精度 | ±1 μm | 光栅尺闭环 |
| 温度漂移 | ±2 μm/°C | 恒温环境 + 定期标定 |
| 总系统精度 | ±2-5 μm | 上述综合 |
七、工程实现示例(伪代码)
python
import cv2
import numpy as np
class PlatformVisionSystem:
def __init__(self):
# 加载标定参数
self.camera_matrix = np.load('camera_matrix.npy')
self.dist_coeffs = np.load('dist_coeffs.npy')
self.pixel_to_mm = 0.005 # 5 μm/pixel(示例)
self.cam_offset = (150.0, 100.0) # 相机安装偏移(mm)
self.image_center = (640, 512) # 图像中心
def locate_mark(self, image, current_platform_pos):
# 1. 畸变校正
undistorted = cv2.undistort(image, self.camera_matrix, self.dist_coeffs)
# 2. 匹配Mark点(模板匹配或轮廓检测)
u, v = self.find_mark_center(undistorted) # 亚像素精度
# 3. 计算相机坐标系下的偏移
dx_pixel = u - self.image_center[0]
dy_pixel = v - self.image_center[1]
x_cam = dx_pixel * self.pixel_to_mm
y_cam = dy_pixel * self.pixel_to_mm
# 4. 转换到平台坐标系
x_mark = current_platform_pos[0] + x_cam + self.cam_offset[0]
y_mark = current_platform_pos[1] + y_cam + self.cam_offset[1]
return (x_mark, y_mark)
def calculate_move(self, mark_pos, target_pos):
delta_x = target_pos[0] - mark_pos[0]
delta_y = target_pos[1] - mark_pos[1]
return (delta_x, delta_y)
八、与传统机械手方案的区别总结
| 项目 | 机械手方案 | 龙门平台方案(你的场景) |
|---|---|---|
| 坐标系关系 | 手眼标定 AX=XBAX=XB | 固定偏移 + 像素当量 |
| 标定复杂度 | 高(需解旋转矩阵) | 低(线性映射即可) |
| 旋转角输出 | 需要(多自由度) | 通常不需要(若只有XY) |
| Z轴影响 | 可忽略(末端固定) | 需补偿(若升降) |
| 精度 | ±0.02-0.1mm | ±0.002-0.005mm(可达更高) |