关键词: 手眼标定、 机器视觉、标定、最小二乘法、标定误差
前言
机器人视觉系统,简而言之,即利用计算机技术模拟人类的视觉功能,实现对周遭三维环境的有效识别与理解。在这里给大家分享下最近项目中的一个机器人视觉的标定讲解。
手眼标定
手眼标定是指统一视觉系统和机器人的坐标系,使得视觉系统所确定的物体位姿可以转换到机器人坐标系下,从而指导机器人进行精确作业。其本质是计算图像坐标与机械坐标之间的转换矩阵。 根据相机与机器人相对位置的不同,手眼标定可分为两种类型:
- Eye-in-Hand(眼在手上) :相机固定在机械臂末端,随着机械臂的移动而移动。这种情况下,标定的是相机坐标系与机械臂末端坐标系之间的转换关系。
- Eye-to-Hand(眼在手外) :相机固定在机器人基座或其他固定位置,不随机械臂移动。这种情况下,标定的是相机坐标系与机器人基座坐标系之间的转换关系。
在这篇文章中我将为大家介绍第二种方式:眼在手外
标定方法
这里我们设定摄像机(眼)是垂直于目标物进行拍摄得到俯视图,机械臂的标定过程中需要注意机械臂的极限坐标,避免机械臂无法达到图像中的像素坐标对应的世界坐标值。具体的流程可以参考如下所示:
graph TD
开始 --> 确定像素坐标xy和世界坐标xy方向
确定像素坐标xy和世界坐标xy方向 --> 固定相机和机械臂位置
固定相机和机械臂位置 --> 获取视觉图像并进行9等份
获取视觉图像并进行9等份 --> 确定9等份像素采集点
确定9等份像素采集点 --> 获取采集点的像素点值xy
获取采集点的像素点值xy --> 移动机械臂世界坐标采集点至像素采集点的xy
移动机械臂世界坐标采集点至像素采集点的xy --> 记录各像素xy采集点的世界坐标xy
记录各像素xy采集点的世界坐标xy --> 汇总像素坐标xy和世界坐标xy并整理
汇总像素坐标xy和世界坐标xy并整理 --> 结束
最小二乘法拟合
最小二乘法是一种数学统计方法,它通过最小化误差的平方和来寻找数据的最佳函数匹配。在拟合给定数据时,最小二乘法常用于线性回归模型,但也可以应用于更复杂的非线性模型。这里我们是明确像素坐标和世界坐标关系为一元一次函数关系,所以可以很好定义系数常量,另外我们在进行最小二乘法迭代的时候不妨把迭代次数值增加,这样可以更好的进行拟合数据得到常量。
参考代码
import numpy as np
from scipy.optimize import curve_fit
# 定义函数模型
def f(x, a, b):
try:
return a * x + b
except OverflowError:
return np.inf # 如果发生溢出,返回无穷大,这样curve_fit会跳过这个点
# 给定的数据
x_data = np.array(
[1284, 984, 678, 396, 1288, 993, 680, 399.5, 1275, 984.5, 687, 402, 552, 845, 1108, 1136, 548]) # 你的x数据
fx_data = np.array(
[419.605, 638.652, 853.049, 1063.931, 415.336, 629.775, 850.564, 1064.63, 416.204, 633.153, 847.061, 1062.584,
944.063, 732.246, 546.704, 531.685, 946.564]) # 你的fx数据
# 使用curve_fit拟合数据,增加最大迭代次数和调整初始参数
params, params_covariance = curve_fit(f, x_data, fx_data, p0=[-1, 1], maxfev=20000)
# 输出拟合参数
print("拟合参数:", params)
# 使用拟合参数计算新的f(x)值
fitted_fx = f(x_data, *params)