對於初學者而言,對相機的標定經常模糊不清。不知道機器坐標與相機坐標如何轉換,兩個坐標系又是如何建立?
我們通常是利用張氏標定法,針對於相機的畸變進行標定,利用校正得到的參數對圖形進行處理后再呈現出來。這個方法網上用的人很多,資料也較為全面。這里就不做說明了。本文主要是針對機械手的手眼標定,一般而言目前相機的畸變較小,精度也較為准確,使用該方法進行標定也能得到較好的效果。
首先,對於九點標定而言。我們使用到的是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);
至此標定結束,我們可以控制相機拍照進行定位,然后轉換成機械手坐標,指哪打哪了。