工業現場相機座標系和機械手座標系的標定
原文:https://blog.csdn.net/kaychangeek/article/details/73878994
參考:https://blog.csdn.net/qq_16481211/article/details/79764730
工業現場使用視覺時一般需要相機座標系和機械手臂座標系的轉化,這裡介紹一種比較簡單的標定方案。沒有使用到標定板。經過幾個專案的測試,精度還算可以,如果要求高精度的場合,就用標定板標定吧!【可以購買專用的標定板,或者自己製作(像我這種窮逼),哈哈,可以閱讀這個文章下這個軟體自己做一個標定板嘿!】
如上圖所示:OXY為機械手座標系,O'X'Y'為相機座標系。theta為兩個座標系之間的夾角。假設P點在影象上的位置如圖,則P在機械手座標系有一個座標,在影象座標系也有一個座標。我們要做的工作就是影象上的任意一點都可以轉化為機械手座標系上的座標點:P(Machine) = f(P(Image))。接下來介紹如何找到這個關係。
OXY為機械手座標系 O'X'Y'為相機座標系從上圖可以看出座標轉化關係:
x = x' * r * cos(theta) - y' * r * sin(theta) + x0;
y = x' * r * sin(theta) + y' * r * cos(theta) + y0;
其中r是毫米畫素比、(mm/pixel)就是一個毫米有幾個畫素,theta為兩個座標系之間的夾角,(x0,y0)為影象座標原點到機械座標原點的距離。
簡化抽象公式,假設:
a = r * cos(theta);
b = r * sin(theta);
c = x0;
d = y0;
得到:
x = x' * a - y' * b + c;
y = x' * b + y' * a + d;
很顯然,要解出這個方程,需要兩組對應關係,就是兩組對應的座標點。設兩組座標點,如下:
第一組:影象座標點:(xImage1,yImage1) 對應的機械座標點:(xMachine1,yMachine1)
第二組:影象座標點:(xImage2,yImage2) 對應的機械座標點:(xMachine2,yMachine2)
則可以解出a ,b, c, d。如下:
-
a = ((xMachine1 - xMachine2)*(xImage1- xImage2) + (yMachine1 - yMachine2)*(yImage1 - yImage2))
-
/ ((xImage1 - xImage2)*(xImage1 - xImage2) + (yImage1 - yImage2)*(yImage1 - yImage2));
-
b = ((yMachine1 - yMachine2)*(xImage1 - xImage2) - (xMachine1 - xMachine2)*(yImage1 - yImage2))
-
/ ((xImage1 - xImage2)*(xImage1 - xImage2) + (yImage1 - yImage2)*(yImage1 - yImage2));
-
c = xMachine1 - a*xImage1 + b*yImage1;
-
d = yMachine1 - b*xImage1 - a*yImage1;
所以,就得出了影象上任意一點的畫素座標轉成機械手座標的關係。
以下是我寫的一個求解a ,b, c, d軟體:需要的點這裡下載。下面是軟體截圖:
下面舉個栗子說明一下操作吧!這是我實際專案中的機械手和相機佈局情況,畫圖真T``M`累!,如下圖:
首先將產品上的目標點搞到機械手的Z軸的中心,然後移動到相機事業範圍內,讓識別產品上的目標點,這時,你會讀到一組機械手座標(也就是上面所說的(xMachine1,yMachine1)),和一組相機座標(也就是上面所說的(xImage1,yImage1)),再在相機視野範圍內移動機械手,就可以得到第二組資料(xMachine2,yMachine2)和(xImage2,yImage2),寫入標定軟體就可以求出a, b, c, d。就求出了影象上任意一點對應的機械座標,然後你下次移動第二個產品到相機視野時,首先識別目標點的畫素座標,經過對應的轉換就可以得出機械座標,然後進行相應的偏移即可實現你想要的操作!
當然,有些時候,實際現場並沒有如你所願,現在出現一種情況就是以機械手自帶的Z軸無法移動到視野中去,這樣就無法進行上面的操作了,系不繫!這也是我遇到的情況,SO,我的解決方案如下:先上示意圖:
如圖,就是在機械手Z軸的橫杆上加上一個橫條,使得產品可以移動到視野範圍內。然後進行上面的操作,雖然現在可以將產品移動到視野範圍內了,但是你會發現此時機械手的座標並不是產品的座標,因為他們之間隔著一個橫條,那我們要怎麼換算過來呢!
首先,我們可以這麼假定的認為,他們是機械手的座標就是產品的座標,然後就可以用上面取兩組對應點的方法求出影象上每個點的機械座標了,但是,此時的機械座標並不是真正的機械座標,但是,我們可以利用這些座標找出機械手U軸的旋轉中心就是Z軸(就是實際機械座標所在的位置)在我們所建立的不是真正的機械座標系中的座標。是不是有點不好理解,我也不大清楚怎麼描述!求U軸的旋轉中心的過程如下:上圖:
如圖:將產品的目標點繞機械手的U軸的旋轉中心旋轉得到3的目標點的不是真正的機械座標系的座標P1,P2,P3,必須讓每次旋轉的目標點在視野範圍內,然後通過圓弧上的3點就可以求得圓心。此時的圓心座標為不是真正的機械座標系的座標。然後我們就可以求出產品中心和機械手U軸旋轉中心的deltaX,deltaY,然後就可以結合真正的機械座標系建立工件座標系,要對機械手有些瞭解才比較好理解這些拗口的話!然後對於每一個新的產品都可以建立合適的工件座標系,然後進行補正和一些操作!(上面那個軟體也有三點求圓心的工具)
或者,最近我製作了一個更加強大一點的軟體(並且修復上面的哪個軟體不能輸入負數的缺陷),也可以直接算出這邊第二種情況的對應關係(詳細細節見該軟體的幫助資訊),看下這篇文章的介紹,裡面有提供下載地址。略貴!哈哈,不過畢竟是辛辛苦苦做出來噠!
相機繫結在機械手上的標定方法參考這裡工業現場相機座標系和機械手座標系的標定(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]的操作方法如下圖所示:
可能說的比較抽象,請見諒,後期有時間畫幾張過度圖解釋!
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
六軸機器人的標定
所謂手眼系統,就是人眼鏡看到一個東西的時候要讓手去抓取,就需要大腦知道眼鏡和手的座標關係。如果把大腦比作B,把眼睛比作A,把手比作C,如果A和B的關係知道,B和C的關係知道,那麼C和A的關係就知道了,也就是手和眼的座標關係也就知道了。
相機知道的是畫素座標,機械手是空間座標系,所以手眼標定就是得到畫素座標系和空間機械手座標系的座標轉化關係。
在實際控制中,相機檢測到目標在影象中的畫素位置後,通過標定好的座標轉換矩陣將相機的畫素座標變換到機械手的空間座標系中,然後根據機械手座標系計算出各個電機該如何運動,從而控制機械手到達指定位置。這個過程中涉及到了影象標定,影象處理,運動學正逆解,手眼標定等。
常用的標定方法有:九點標定
九點標定:
九點標定直接建立相機和機械手之間的座標變換關係。
讓機械手的末端去走這就9個點得到在機器人座標系中的座標,同時還要用相機識別9個點得到畫素座標。這樣就得到了9組對應的座標。
由下面的式子可知至少需要3個點才能求出標定的矩陣。
(1)、標定,Halcon中進行9點標定的運算元
(2)、求解
affine_trans_point_2d(HomMat2D,Row2,Column2,Qx,Qy)
%由畫素座標和標定矩陣求出機器人基礎座標系中的座標
一些特殊情況的解釋:
有些情況中我們看到相機固定在一個地方,然後拍照找到目標,控制機械手去抓取,這種就很好理解。我們也叫做eye-to-hand
還有一種情況是相機固定在機械手上面,這種情況的標定過程實際上和相機和機械手分離的標定方法是一樣的,因為相機拍照時,機械手會運動到相機標定的時候的位置,然後相機拍照,得到目標的座標,再控制機械手,所以簡單的相機固定在末端的手眼系統很多都是採用這種方法,標定的過程和手眼分離系統的標定是可以相同對待的。我們也叫做eye-in-hand