关于手眼标定的误差计算

  之前做的眼在手上的手眼标定,流程结束后,会得到相机坐标系到机械臂末端坐标系的变换关系T_cam2end。我一般直接量取机械臂末端到相机的直线距离来校对z轴方向的距离,但只是做个估算,并未进行精确测量。
  我认为手眼标定的误差计算流程:
  以眼在手上为例,标定结束后得到T_cam2end,再根据公式计算得到目标和机械臂基底的位姿关系,让相机识别到某一点,然后在机械臂末端加装一个锥形的尖端,通过计算得到的位姿输入到机械臂中,控制机械臂移动到目标上方,用尖端去戳目标,以此来计算精度。
  但有个疑问?这么做人工去量取的话,是怎么做到很精确如0.0几个毫米的数量级的,而且量取的只是x、y、z方向的误差,那rx、ry、rz该怎么测量呢?
PS:如有大佬知道望告知,非常感谢

思路:

  根据标准差的概念,使用样本标准差进行计算。
在这里插入图片描述
  我的做法:完成手眼标定后,得到T_cam2end,将目标图这里以Aruco码为例固定在一处,控制机械臂在不同的角度对目标图进行拍照,我拍了5张,根据下面的公式得到5组目标和机械臂基底之间的位姿关系,因为目标图固定不动,所以目标和机械臂基底之间的位姿关系为固定值,T_cam2end也是固定值,T_end2base和T_target2cam每次的值都不一样,根据样本标准差,计算位姿(X, Y, Z, RX, RY, RZ)的误差值。
在这里插入图片描述

代码

// 计算手眼标定的样本标准偏差
std::vector<double> stdev_err_res;
int num = stdev_err[0].size();
int len = stdev_err.size();
for (int i = 0; i < num; i++) {
    double mean = 0.0, sum = 0.0;
    for (int j = 0; j < len; j++) {
        sum += stdev_err[j][i];
    }
    mean = sum / len;

    double square_diff_sum = 0.0;
    for (int k = 0; k < len; k++) {
        square_diff_sum += std::pow(stdev_err[k][i] - mean, 2);
    }
    double variance;
    variance = (square_diff_sum / (len - 1));

    stdev_err_res.push_back(std::sqrt(variance));
}

总觉得这么计算的话,万一样本中有一个值偏差很大或者是错误的,不就增加了整体的误差,暂时还没想到好的方法。。。

### 手眼标定误差修正模型 #### 原理 手眼标定中的误差修正旨在解决由机械结构、传感器测量以及算法本身带来的各种不确定性。这些不确定因素可能导致机器人末端执行器的实际位置与期望位置之间存在差异。为此,在实际应用中,通常采用非线性方式描述这种位姿误差模型,但由于计算复杂度的原因,往往简化为线性形式处理,这不可避免地引入了一定量的近似误差[^1]。 对于视觉引导的手眼系统而言,考虑到镜头畸变等因素的影响,可以通过构建优化问题框架——即让基于初始猜测值并通过成像几何关系预测出来的图像坐标尽可能贴近真实观测数据点;进而借助最小二乘法完成参数估计任务,从而达到校正目的[^2]。 另一种有效途径是运用机器学习技术特别是人工神经网络来进行误差补偿。具体来说,可以将关节角度变化量映射至相应的空间位移向量作为监督信号训练多层感知机或其他类型的前馈网路架构;经过充分的学习之后,该网络便能够在给定任意一组关节配置条件下准确预报出预期产生的定位偏差,并据此调整控制命令以提升整体作业精度[^3]。 #### 实现方法 针对上述提到的不同策略,以下是几种具体的实现方案: - **传统解析法**:建立精确的动力学方程组并求解最优解的过程较为繁琐耗时,而且当面对高度冗余自由度或多连杆机构时可能难以收敛于全局极小值附近。 - **数值逼近法**:通过泰勒级数展开或者其他渐进展开手段忽略掉高次幂项影响后进行迭代更新直至满足预设阈值条件为止。这种方法虽然简单易行但在某些情况下可能会牺牲部分准确性。 - **基于学习的方法**:利用大量样本数据驱动的方式自动提取特征模式而无需依赖先验知识假设前提下快速适应环境变化趋势。例如,可设计一种两阶段流程:前期离线采集足够数量的标准姿态样本集用于初步拟合权重系数矩阵;后期在线微调过程中实时反馈调节使得整个闭环控制系统更加鲁棒稳定可靠。 ```python import numpy as np from sklearn.neural_network import MLPRegressor # 构造模拟数据集 (X: 关节角度, y: 对应的空间位移) np.random.seed(0) X_train = np.linspace(-np.pi, np.pi, 100).reshape(-1, 1) y_train = np.sin(X_train) # 创建一个多层感知机回归器实例 mlp = MLPRegressor(hidden_layer_sizes=(5,), max_iter=10000, tol=1e-8) # 训练模型 mlp.fit(X_train, y_train) def predict_error(joint_angle): """根据输入的关节角度预测对应的位移误差""" return mlp.predict([[joint_angle]])[0] print(predict_error(np.pi / 4)) ``` #### 应用案例 这类技术广泛应用于工业自动化领域内的精密装配操作当中,比如电子元件贴片焊接工序里就需要确保每一个零件都能被精准放置到位而不发生偏移现象;另外还有医疗手术辅助设备的研发制造环节同样离不开此类先进技术的支持保障患者安全健康权益不受损害风险威胁。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

boss-dog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值