OpenCV 機器人手眼標定(九點標定法)


  對於初學者而言,對相機的標定經常模糊不清。不知道機器坐標與相機坐標如何轉換,兩個坐標系又是如何建立?
  我們通常是利用張氏標定法,針對於相機的畸變進行標定,利用校正得到的參數對圖形進行處理后再呈現出來。這個方法網上用的人很多,資料也較為全面。這里就不做說明了。本文主要是針對機械手的手眼標定,一般而言目前相機的畸變較小,精度也較為准確,使用該方法進行標定也能得到較好的效果。
  首先,對於九點標定而言。我們使用到的是OpenCv中的estimateRigidTransform 函數。
函數定義如下:

Mat estimateRigidTransform(InputArraysrc,InputArraydst,boolfullAffine)

前兩個參數,可以是 :src=srcImage (變換之前的圖片Mat) dst=transImage(變換之后的圖片Mat)
也可以: src=array(變換之前的關鍵點Array) dst=array(變換之后的關鍵點Array)
第三個參數: 1(全仿射變換,包括:rotation, translation, scaling,shearing,reflection)

其主要原理為:如果我們有一個點變換之前是[x,y,1],變換后是[x’,y’,1] 則fullAffine表示如下:

 TX=Y

展開后表示

 如果我們想求這【a-f】 6個變量需要有6個方程,也就是3組點。但是比三個點多呢?
比如:20個點。那就是用最小方差。

 標定步驟
1、首先我們需要准備一塊,標定板。如果條件不足,可以使用白紙畫上九個圓進行代替。

2、相機位置,機械手位置全部固定好,標定針固定在機械手上,固定好后不能夠再移動。標定針的位置一定要與夾手或吸盤之內的工具同一位置高度。
3、將標定板放到相機下方,位置區域要與機械手工作的區域一樣,包括高度必須盡量一致,這是標定准確度的關鍵。
4、調整好相機焦距,拍照,然后識別9個圓圓心的坐標並進行記錄。關於如何找圓,可以參考我的上一篇博文,對於圓形的查找十分精准。
5、將機械手依次移動到9個圓的圓心位置,記下機械手坐標

做完以上五步,我們會得到兩個點集。一個為9個圓圓心坐標(points_camera),一個為9個圓心對應的機械手坐標(points_robot)。

 1  Mat warpMat;  2     vector<Point2f>points_camera;  3     vector<Point2f>points_robot;`  4     vector<Point2f>points_camera;  5     vector<Point2f>points_robot;  6     warpMat =estimateRigidTransform(points_camera, points_robot, true);  7      A = warpMat.ptr<double>(0)[0];  8      B = warpMat.ptr<double>(0)[1];  9      C = warpMat.ptr<double>(0)[2]; 10      D = warpMat.ptr<double>(1)[0]; 11      E = warpMat.ptr<double>(1)[1]; 12      F = warpMat.ptr<double>(1)[2];

得出來的6個double類型的參數,就是我們此次標定最終得到的標定參數了。
之后我們把檢測得到的圖像坐標(t_px,t_py)代入,就可以得到與之相對應的機械手坐標(t_rx,t_ry)
t_rx= (A * t_px) + B * t_py + C);
t_ry= (D * t_px) + E * t_py+ F);
至此標定結束,我們可以控制相機拍照進行定位,然后轉換成機械手坐標,指哪打哪了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM