天天看點

工業現場相機坐标系和機械手坐标系的标定

      工業現場使用視覺時一般需要相機坐标系和機械手臂坐标系的轉化,這裡介紹一種比較簡單的标定方案。沒有使用到标定闆。經過幾個項目的測試,精度還算可以,如果要求高精度的場合,就用标定闆标定吧!【可以購買專用的标定闆,或者自己制作(像我這種窮逼),哈哈】

工業現場相機坐标系和機械手坐标系的标定

        如上圖所示:OXY為機械手坐标系,O'X'Y'為相機坐标系。theta為兩個坐标系之間的夾角。假設P點在圖像上的位置如圖,則P在機械手坐标系有一個坐标,在圖像坐标系也有一個坐标。我們要做的工作就是圖像上的任意一點都可以轉化為機械手坐标系上的坐标點:P(Machine) = f(P(Image))。接下來介紹如何找到這個關系。

OXY為機械手坐标系 O'X'Y'為相機坐标系從上圖可以看出坐标轉化關系:

x

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
y = x' * b + y' * a + d;      

很顯然,要解出這個方程,需要兩組對應關系,就是兩組對應的坐标點。設兩組坐标點,如下:

第一組:圖像坐标點:(xImage1,yImage1) 對應的機械坐标點:(xMachine1,yMachine1)

第二組:圖像坐标點:(xImage2,yImage2) 對應的機械坐标點:(xMachine2,yMachine2)

則可以解出a ,b, c, d。如下:

工業現場相機坐标系和機械手坐标系的标定

是以,就得出了圖像上任意一點的像素坐标轉成機械手坐标的關系。

以下是我寫的一個求解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,然後就可以結合真正的機械坐标系建立工件坐标系,要對機械手有些了解才比較好了解這些拗口的話!然後對于每一個新的産品都可以建立合适的工件坐标系,然後進行補正和一些操作!

相機跟随着機械手運動(它們綁定在一起了),如果還将标定靶标也固定在機械手上的話,三個對象都相對運動,就無法标定了!那要怎麼利用标定助手完成标定呢?經過思考,我給出了以下标定思路:

整個标定系統的初始狀态

相機和機械手綁定在一起并且機械手旋轉中心處于機械原點,這時候相機中心和機械手中心有一個相對的偏移并且是固定的(相機中心和機械手旋轉中心的相對距離設為(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)即可!抽象的公式如下:

工業現場相機坐标系和機械手坐标系的标定

其中trans函數就是将圖像坐标轉換為相對于(x0,y0)工作區域的機械坐标,再加上坐标(x1 - x0,y1 - y0)就是目前正确的機械坐标。到此,我們得到了圖像坐标和整個機械手工作區域的坐标的關系,但是此時的機械坐标指的是相機的中心,并不是機械手的旋轉中心。

第六步:将相機中心轉換為機械手的旋轉中心

        首先,你可以利用目測法,遊标卡尺法等等粗略的算出detX,detY的值,然後,進行實時識别和移動測試進行細調,因為粗略的估算有誤差,你可以經過多次微調直到精确到機械手的旋轉中心移動到産品的上方就成功了。記下此時的detX,detY,代入以下公式就可以算出了最終的機械手應該去的地方了。最終的換算公式如下:

工業現場相機坐标系和機械手坐标系的标定

整個過程的僞代碼運算過程如下:

工業現場相機坐标系和機械手坐标系的标定

利用标定助手求取[a,b,c,d]外參矩陣的輸入參數[C1,M1]和[C2,M2]的操作方法如下圖所示:

工業現場相機坐标系和機械手坐标系的标定