关于手眼标定的误差计算
??之前做的眼在手上的手眼標定,流程結束后,會得到相機坐標系到機械臂末端坐標系的變換關系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)); }總覺得這么計算的話,萬一樣本中有一個值偏差很大或者是錯誤的,不就增加了整體的誤差,暫時還沒想到好的方法。。。
總結
以上是生活随笔為你收集整理的关于手眼标定的误差计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matpower学习笔记
- 下一篇: Scala下载,安装及配置