第三章:坐标系与标定技术

各位同学,今天我们来聊聊Delta机器人视觉引导里最绕不开的一个话题——坐标系与标定。说实话,我见过太多项目在调试阶段卡在这里,明明视觉检测没问题,机器人也能动,但就是抓不准。说白了,就是坐标系没对齐。

3.1 机器人坐标系:三个“世界”的对话

机器人身上有三个核心坐标系,我习惯把它们理解成三个不同的“语言系统”。

3.1.1 基座标系(Base Coordinate)

这是机器人的“根”。它固定在机器人底座上,所有运动都从这里算起。Delta机器人的基座标系原点通常在底座中心,Z轴垂直向上。嗯,这里要注意:不同品牌的机器人,基座标系定义可能不一样,换机器人时一定要先确认。

3.1.2 工具坐标系(Tool Coordinate)

工具坐标系定义的是机器人末端执行器的位置和姿态。比如你装了一个吸嘴,那工具坐标系的原点就在吸嘴末端。我在项目中遇到过一个问题:换了吸嘴后忘了更新工具坐标系,结果抓取点偏了2毫米。后来我养成了一个习惯——每次换工具,第一件事就是重新标定工具坐标系。

3.1.3 用户坐标系(User Coordinate)

用户坐标系是给操作者用的。你可以把它理解成“工作台坐标系”。比如你的传送带是斜着放的,那定义一个用户坐标系,让机器人沿着传送带方向运动,编程会方便很多。

核心要点:视觉系统检测到的坐标,最终都要转换到机器人基座标系下,机器人才能执行。这个转换过程,就是标定要解决的问题。

3.2 手眼标定:Eye-to-Hand vs Eye-in-Hand

手眼标定,说白了就是让机器人知道“眼睛看到的”和“手摸到的”是什么关系。根据相机安装位置不同,分两种方式。

3.2.1 Eye-to-Hand(眼在手外)

相机固定安装在机器人外部,比如架在传送带上方。这种方式下,相机能看到机器人和工件。标定时,我们需要求出相机坐标系到机器人基座标系的转换关系。

优点:相机视野固定,不会随机器人运动而晃动。
缺点:机器人可能会遮挡视野,需要规划好安装位置。

3.2.2 Eye-in-Hand(眼在手上)

相机安装在机器人末端,跟着机器人一起动。这种方式下,相机只能看到工件,看不到机器人自己。标定时,我们需要求出相机坐标系到工具坐标系的转换关系。

优点:灵活,可以从不同角度观察工件。
缺点:标定过程稍微复杂一些,而且相机跟着动,对运动控制精度要求高。

我的建议:Delta机器人抓取场景,我一般推荐Eye-to-Hand。因为Delta机器人运动速度快,Eye-in-Hand容易产生运动模糊。当然,如果工件位置变化大,需要动态调整视角,那还是得用Eye-in-Hand。

3.3 九点标定法原理

九点标定法,是视觉引导抓取中最常用的方法。为什么是九点?因为二维平面上的仿射变换需要6个参数,但为了精度和鲁棒性,我们通常用9个点做最小二乘拟合。

3.3.1 标定流程

  1. 制作标定板:一个带有9个圆点(或十字)的平板,点间距已知。
  2. 放置标定板:放在机器人工作范围内,确保相机能清晰看到。
  3. 记录机器人坐标:用机器人末端(或吸嘴)依次对准9个点,记录每个点的机器人坐标。
  4. 记录视觉坐标:用相机拍摄标定板,识别出9个点的像素坐标。
  5. 计算转换矩阵:通过两组坐标,解算出仿射变换矩阵。

3.3.2 数学原理

说白了,就是解一个线性方程组:

X_robot = a * X_pixel + b * Y_pixel + c
Y_robot = d * X_pixel + e * Y_pixel + f

其中a、b、c、d、e、f就是我们要找的6个参数。用9个点做最小二乘,能有效减小单个点的测量误差。

3.3.3 代码示例(Python)

import numpy as np

# 假设我们有9个点的机器人坐标和像素坐标
robot_pts = np.array([[x1,y1], [x2,y2], ..., [x9,y9]])
pixel_pts = np.array([[u1,v1], [u2,v2], ..., [u9,v9]])

# 构建矩阵
A = []
B = []
for i in range(9):
    u, v = pixel_pts[i]
    x, y = robot_pts[i]
    A.append([u, v, 1, 0, 0, 0])
    A.append([0, 0, 0, u, v, 1])
    B.append(x)
    B.append(y)

A = np.array(A)
B = np.array(B)

# 最小二乘求解
params, _, _, _ = np.linalg.lstsq(A, B, rcond=None)
a, b, c, d, e, f = params

print(f"转换矩阵参数: a={a:.4f}, b={b:.4f}, c={c:.4f}")
print(f"                d={d:.4f}, e={e:.4f}, f={f:.4f}")

避坑指南:我曾经在项目里犯过一个低级错误——标定板放歪了。结果标定出来的矩阵误差很大,抓取总是偏。后来我学乖了:标定前先用水平仪检查标定板是否水平,同时确保标定板在相机视野中央,不要有畸变严重的区域。

3.4 知识体系总览

下面这张图,是我自己整理的坐标系与标定知识结构,希望能帮你理清思路。

坐标系与标定技术知识体系 机器人坐标系 基座标系 工具坐标系 用户坐标系 手眼标定 Eye-to-Hand Eye-in-Hand 相机-机器人关系 九点标定法 标定板制作 坐标采集 仿射变换求解 核心流程:视觉坐标 → 九点标定 → 机器人坐标 → 抓取执行 常见问题与注意事项 • 标定板必须水平放置,避免倾斜误差 • 采集点时,机器人末端要精确对准标定点 • 相机镜头畸变会影响标定精度,建议先做畸变校正 • 标定完成后,用验证点检查精度,误差应在0.5mm以内

3.5 标定精度验证

标定做完,怎么知道准不准?我的做法是:选一个不在标定点上的位置,用视觉检测出坐标,然后让机器人去抓。如果偏差在0.5mm以内,就算合格。如果偏差大,别急着调参数,先检查标定板有没有动过,或者相机有没有松动。

验证点 视觉坐标 (mm) 机器人坐标 (mm) 偏差 (mm)
点A (100.5, 200.3) (100.8, 200.1) 0.36
点B (150.2, 180.7) (150.5, 180.4) 0.42
点C (120.1, 220.6) (120.3, 220.8) 0.28

你看,这三个验证点的偏差都在0.5mm以内,说明标定结果是可用的。如果偏差超过1mm,我建议重新标定一次,别偷懒。

小技巧:标定完成后,把转换矩阵保存到配置文件里。下次换相机或调整安装位置时,只需要重新标定一次,不用改程序。我习惯用JSON格式保存,方便调试时查看。

好了,坐标系与标定技术就讲到这里。记住一句话:标定是视觉引导的基石,基础打牢了,后面的抓取逻辑才能跑得顺。下一章我们聊聊视觉检测算法,到时候见。


公众号:蓝海资料掘金营,微信deep3321