1. 程式人生 > >工業現場相機座標系和機械手座標系的標定(2)-相機和機械手繫結的情況

工業現場相機座標系和機械手座標系的標定(2)-相機和機械手繫結的情況

        之前,我寫過一篇標定文章,但是隻說明了相機和機械手分離的情況的標定方法,為了提供完整的標定方案,這邊介紹一下怎麼利用我做的標定助手完成相機和機械手繫結的情況的標定方法。

        由文章“工業現場相機座標系和機械手座標系的標定(1)-相機和機械手分離的情況”我們知道只要找到兩組對應點即可完成相機座標系和機械手座標系的關係轉換。那麼,現在相機跟隨著機械手運動(它們繫結在一起了),如果還將標定靶標也固定在機械手上的話,三個物件都相對運動,就無法標定了!那要怎麼利用標定助手完成標定呢?經過思考,我給出了以下標定思路:

整個標定系統的初始狀態

        相機和機械手繫結在一起並且機械手旋轉中心處於機械原點,這時候相機中心和機械手中心有一個相對的偏移並且是固定的(相機中心和機械手旋轉中心的相對距離設為(detX,detY)),將標定靶標放置在工作區域(實際機械手的工作區域)中的合適位置。

第一步:求取第一組影象點座標C1

        移動機械手(相機會跟著移動)到相機能夠清晰拍攝到標定靶標的位置(設該位置的機械座標為(x0,y0))。然後調整標定靶標的識別引數,使得能夠實時的識別標定靶標的中心位置,手動移動靶標最好讓它遠離影象中心,越遠越好(精度越高)但是不能超出相機的視野範圍,我就把靶標放在相機視野的左上角的區域吧,然後我們識別當前靶標的影象位置C1,就是第一組資料的影象點。

第二步:求取第一組機械點座標M1

        進入“標定”選項卡,勾選“顯示十字標”,這時候會在實時影象中間顯示一個藍色的十字游標,然後,慢速移動機械手,直到C1點和十字游標的交點重合(也就是說移動機械手讓實時識別到的靶標中心座標處於影象的中心,比如採集的影象為2048*1536大小的,你需要緩慢移動機械手(靶標保持不動)直到靶標的中心處於(1024,768)的這個位置),然後記下當前的機械手座標也就是第一組資料的機械點M1(注意:此時實際是讓相機中心和靶標中心重合,並非機械手旋轉中心和靶標中心重合,它們之間差了一個detX,detY的距離,具體怎麼換算,等下再說)。

第三步:求取第二組影象點座標C2

        將機械手移動回到初始的工作座標點(x0,y0),將靶標放在相機視野的右下角的區域,識別當前的靶標影象座標C2,就是第二組資料的影象點。

第四步:求取第二組機械點座標M2

        同理,慢速移動機械手,直到C2點和十字游標的交點重合(就是移動機械手讓實時識別到的靶標中心座標處於影象的中心),然後記下當前的機械手座標也就是第二組資料的機械點M2。

第五步:求取整個機械手工作區域座標系和相機座標系的對應關係

        不知道你有沒有發現,上面求得工作區域只對工作區域(x0,y0)開始到相機視野結束的位置有效(比如你在機械手移動到工作區域(x0,y0)為起點的位置識別靶標的影象位置座標為(100,100),但是你將機械手移動到工作區域(x1,y1)為起點的位置識別靶標的影象位置座標也可能為(100,100))。這樣換算過來的機械座標就是錯誤的,其實我們上面求得是小區域的轉換關係,那我們要怎麼擴充套件到整個機械手的工作區域呢?我們只需要這樣做:在機械手工作的時候是可以知道自己在哪裡的,比如:現在機械手移動到工作區域(x1,y1)為起點的位置識別靶標的影象位置座標為(100,100),我們將(100,100)代入轉換關係trans得出來的機械座標是對應(x0,y0)的,要轉換到對應(x1,y1)的只需要將換算處理的座標加上(x1 - x0,y1 - y0)即可!抽象的公式如下:

current_machine.x = trans(current_image.x,current_image.y) + (x1 - x0);
current_machine.y = trans(current_image.x,current_image.y) + (y1 - y0);
其中trans函式就是將影象座標轉換為相對於(x0,y0)工作區域的機械座標,再加上座標(x1 - x0,y1 - y0)就是當前正確的機械座標。到此,我們得到了影象座標和整個機械手工作區域的座標的關係,但是此時的機械座標指的是相機的中心,並不是機械手的旋轉中心。 第六步:將相機中心轉換為機械手的旋轉中心         首先,你可以利用目測法,遊標卡尺法等等粗略的算出detX,detY的值,然後,進行實時識別和移動測試進行細調,因為粗略的估算有誤差,你可以經過多次微調直到精確到機械手的旋轉中心移動到產品的上方就成功了。記下此時的detX,detY,代入以下公式就可以算出了最終的機械手應該去的地方了。最終的換算公式如下:
current_machine.x = trans(current_image.x,current_image.y) + (x1 - x0) + detX;
current_machine.y = trans(current_image.x,current_image.y) + (y1 - y0) + detY;
        整個過程的虛擬碼運算過程如下:
[a,b,c,d] = f([C1,M1],[C2,M2])
trans(double xImage,double yImage){
	double xMachine = xImage * a - yImage * b + c;
	double yMachine = xImage * b + yImage * a + d;
	return xMachine,yMachine;
}
current_machine.x = trans(current_image.x,current_image.y) + (x1 - x0) + detX;
current_machine.y = trans(current_image.x,current_image.y) + (y1 - y0) + detY;
        利用標定助手求取[a,b,c,d]外參矩陣的輸入引數[C1,M1]和[C2,M2]的操作方法如下圖所示:
        可能說的比較抽象,請見諒,後期有時間畫幾張過度圖解釋!