关于手眼标定的误差计算

  之前做的眼在手上的手眼标定,流程结束后,会得到相机坐标系到机械臂末端坐标系的变换关系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));
}

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

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

boss-dog

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

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

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

打赏作者

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

抵扣说明:

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

余额充值