9点标定到底怎么工作的?
这个问题困惑了我很久,虽然想海康VisionMaster 和Halcon 这种软件都提供了很好用的工件,但是最好懂原理,这样才不仅能做项目,还能做好项目。
最近好好研究了一下,感觉是搞清楚了,就记录一下。
1. 到底是仿射变换还是投影变换?
HALCON的9点标定实现是用 vector_to_hom_mat2d 求变换矩阵, 然后用 affine_trans_point_2d 反求出物理坐标,从名字猜是用的affine 仿射变换,也就是两个虽然图像会改变形状但是会保持边的平直性。但是想了一下,如果成像平面和工件平面不平行,比如由于安装问题,可以倾斜了15度,这个时候显然就应该用仿射变换来求才合理,也就是求单应性变换。
2. 如果成像平面和工件平面不平行可以吗?
上面已经解释了,是可以的,单应性变换就是投影变换,本来就考虑了倾斜的。
3. 如果工件平面不是水平的还可以吗?
结论:可以的。
假设你的相机拍到一个螺丝在画面中的像素坐标是
(u,v)=(512,360)
而通过 vector_to_hom_mat2d 标定出的矩阵 H,你可以把它映射到机器人坐标系的平面坐标:(这里要特别注意: 一组X,Y 可以对应于多个物理平面,那机械臂到底去那个平面抓取呢,也就是Z是多少?具体看下面Z_plane)
(X,Y)=H(u,v)
这样机械臂就知道:
“我要去这个平面上的 X, Y 点抓取”。
而对于机器人来说,这个平面(哪怕是倾斜的)在标定时已经被定义好了,比如:
Z=Z0
或者
Z=aX+bY+c
但在系统中,它只被看作一个“固定工作平面” Z_plane. 实际抓取时,完全可以通过Z平面公式算出来Z.
Z_plane 是什么时候被“定义”的
它是在 你采集标定点时 定义的。
举个例子:
-
你放置一个平整的标定板或工件;
-
让机械臂在上面不同位置抓 9 个点;
-
对应地记录:
-
每个点的图像坐标
(Row, Col) -
每个点的机械臂末端坐标
(X, Y)(Z固定)
-
那么,这 9 个点实际上都在同一个物理平面上。
HALCON 会自动认为:
这 9 个点所在的平面就是你系统的工作平面(Z_plane)。
所以:
-
你在标定时选的那块平面,
-
你当时采集的那 9 个点,
-
就是 Z_plane 的定义过程。
4. 9点标定有没有前提?
通过上面的分析,9点标定的前提也就清楚了。
1. 工件平面Z_Plane最好是水平的,这样Z=Z0, 在抓取是就不用再继续Z了,直接写死就行了; 而如果斜面的话,每次就要算Z了。
2. 相机平面最好和工件平面平行。
后面再研究一下12点标定。