- 什么是標定?
工業應用中相機拍到一個mark點的坐標為C1(Cx,Cy),C1點對應的龍門架/機械手等執行端對應的坐標是多少?
標定就是解決這個問題,如相機拍到一個點坐標C1(Cx,Cy),通過標定公式的計算得到點R1(Rx,Ry),R1就是龍門架/機械手坐標系的真實點位
C1與R1之間存在一種固定的關系,求解這個關系的過程叫做標定 - 為什么是9點標定?
C1與R1之間的關系只有四種平移、縮放、旋轉、錯切
矩陣中有對四種關系的公式如下:
平移矩陣公式 image.png
縮放矩陣公式 image.png
旋轉矩陣公式 image.png
錯切矩陣公式image.png
上面四種矩陣相乘合成一個矩陣就是仿射變換矩陣 image.png
最后一個矩陣是根據前4個矩陣相乘得到,故為得到最終的放射變換矩陣,需要知道 Tx,Ty,Sx,Sy,θ,Theta這6個參數。為得到6個參數至少需要6個不同等式,而每個點位包涵(x,y)坐標,所以每個點位可以產生2個不同等式。
故此我們得出結論最少3個點我們就可以推到出最終的放射變換矩陣。
那為什么是9點標定呢?答案是為了提高精度,通過9個點我們可以有N種組合算出結果,基于這些結果我們求類似于平均值的東西提高精度
那為什么不是10個,11個或更多點呢?答案是9個點的計算已經基本滿足大家對精度的要求了,如π=3.1415926已經滿足計算精度了,就沒必要再把π計算到小數點后100位了 - 怎么實現9點標定呢?
拿到9個相機點位[C1,C2…C9],同時拿到這9個點對應的機械手或龍門架真實坐標[R1,R2…R9]
把上面數據套入halcon的vector_to_hom_mat2d算子,就可以得到放射變換矩陣了
*像素坐標
Row1:=[1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6]
Column1:=[1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3]*機械坐標
Row2:=[50,51.999,54.999,56.999,59.999,62.996,-4.999,-3,0,1.999,4.999,7.995,-59.998,-57.001,-55.001,-52.001,-49.003,-45.005]
Column2:=[-93.3,-47.299,0.002,45.499,91.498,135.493,-92.301,-44.3,0,46.999,91.497,135.494,-90.297,-44.297,1.003,46.999,91.497,134.494]*求解放射變換矩陣
vector_to_hom_mat2d (Row1, Column1, Row2, Column2, HomMat2D)*保存變換矩陣到HomMat2D.mat中
serialize_hom_mat2d (HomMat2D, SerializedItemHandle)
open_file ('HomMat2D.mat', 'output_binary', FileHandle)
fwrite_serialized_item (FileHandle, SerializedItemHandle)
close_file (FileHandle)
- 傳統的9點標定工具怎么做?
求解9點工具的難點在于怎么得到相機拍照點C1對應的真實坐標R1?
傳統的作法是在機械手或龍門架的執行端下掛一個針尖。讓龍門架/機械手到達標定板的點位1使針尖與點位1中心重合,記錄真實位置,同時通過拍照得出點位1的相機坐標 - 還有沒有更方便的9點標定工具?其原理是什么?
有,其核心原理是取消針尖,通過旋轉180度方式求解出相機坐標點C1
精度更高的方式:可以旋轉任意角度得到5個點,擬合橢圓,然后根據橢圓的圓度判斷這個點是否ok
如機械手在物理點位R1(Rx,Ry)拍照的到此mark點對應的相機坐標C1(Cx1,Cy1),然后讓機械手旋轉180度再次拍照的到mark點對應相機坐標C2(Cx2,Cy2)。那么物理點R1(Rx,Ry)對應的相機的點位未C1,C2的中心點。 因為物料點圍繞自己旋轉真實點位并未發生變化。
通過這種方法就可以實現自動化的9點標定工具
另外評估一個標定結果的精度,可以通過放一塊標定板,用不同的位置來拍照定位他;理論上理論上標定板沒有動,得到的位置點的誤差只有標定誤差