1. 九点标定
九点标定法的本质: 无需进行相机内参标定,只能识别x,y坐标,属于2D平面标定,在标定过程中z是未知的。
该算法的核心是仿射变换,即图像坐标系到机器人坐标系的2D仿射变换(注意这里并不是RT的刚体变换)。
由上篇文章射影变换的一种解法,可知仿射变换的基本公式:
有6个自由度,至少需要3组点才能解决,超过3组点,可以用非线性最小二乘优化。
无论是眼在手上,还是眼在手外,标定的步骤都是一样的:
- 相机拍摄一幅9点的图片,眼在手外时相机固定好直接拍摄,眼在手上时,控制机械手移动的固定位置(9点标定板正上方)进行拍摄;
- 求出标定点在图像坐标系的坐标 ( u , v ) (u,v) (u,v);
- 控制机械手,分别移动到9个点上,记录9个点的坐标 ( x , y ) (x,y) (x,y)
- 进行求解,halcon中使用
vector_to_hom_mat2d
算子,opencv可使用estimateRigidTransform
接口。
求解后,就可以根据给出的像素点,得到机械手的点坐标,进而可以控制机械手去相应的位置了。
2. 2D传统手眼标定
2.1 原理
如下图所示,图(a)是眼在手上,图(b)是眼在手外。(图片来自《机器视觉算法及应用》)
- 眼在手上,标定板放置在自由位置;
- 眼在手外,标定板放置在机器人末端,和机器人绑定在一起。
上面的俩个图中,实线是已知的变换关系,虚线是未知的变换关系。
要求解的关键:
- 眼在手上,求解的是相机和末端工具(注意不是末端)的位姿变换关系,即 c t T _{c}^{t}\textrm{T} ctT,整体位姿关系为:
o b T _{o}^{b}\textrm{T} obT = t b T _{t}^{b}\textrm{T} tbT c t T _{c}^{t}\textrm{T} ctT o c T _{o}^{c}\textrm{T} ocT - 眼在手外,求解的是相机和基座的位姿变换关系,即 c b T _{c}^{b}\textrm{T} cbT,整体位姿关系为:
o t T _{o}^{t}\textrm{T} otT = b t T _{b}^{t}\textrm{T} btT c b T _{c}^{b}\textrm{T} cbT o c T _{o}^{c}\textrm{T} ocT
注意,上面两个变换关系的公式有共同形式:
Y Y Y = A X B AXB AXB,这里A为工具和底座的变换关系,B为相机和标定板的关系,未知为X,即眼在手上的 c t T _{c}^{t}\textrm{T} ctT和眼在手外的 c b T _{c}^{b}\textrm{T} cbT,而Y在两种情况中是不变的。
取两组不同的位姿,可以得到两个等式 Y Y Y = A i X B i A_{i}XB_{i} AiXBi和 Y Y Y = A j X B j A_{j}XB_{j} AjXBj,消除Y后,可得
A i X B i A_{i}XB_{i} AiXBi= A j X B j A_{j}XB_{j} AjXBj
变换位置:
A j − 1 A i X A_{j}^{-1}A_{i}X Aj−1AiX= X B j B i − 1 XB_{j}B_{i}^{-1} XBjBi−1,即AX = XB。
如何解?
opencv:
void cv::calibrateHandEye (InputArrayOfArrays R_gripper2base, InputArrayOfArrays t_gripper2base, InputArrayOfArrays R_target2cam, InputArrayOfArrays t_target2cam, OutputArray R_cam2gripper, OutputArray t_cam2gripper, HandEyeCalibrationMethod method = CALIB_HAND_EYE_TSAI )
halcon:
calibrate_hand_eye()
2.2 用途
有人说,通过手眼标定拿到了相机和机械手的相对位姿变换关系,最后用来做什么呢?这是个很好的问题。
下面是我的理解(如有不对请指正):
通过单目相机,我们是无法拿到物体的3D空间位姿的,也就不能做3D引导,所以要引导还得靠上面的九点标定,,进行2D引导。如果需要进行3D引导,需要使用3D相机
我想到可用的一个场景是这样的:AGV上装一个相机,到了一个工位停下来后,可以拍摄一个标定板(或可以做PNP的标定物),来计算标定物和相机的位姿变换关系,然后结合手眼标定的结果,可以计算出AGV相对于标定物的位姿偏移,最终来矫正AGV的空间位姿。
3.3D相机手眼标定
将下图中的标定板换成其他标定物,就可以进行3D手眼标定了。
3.1 结构光/双目/RGBD等相机
参考《机器视觉算法及应用》最后一章。
这种类型的相机进行手眼标定时,一次拍照就可以拿到物体的3D点云信息,可以通过点云匹配来获取物体相对于相机的位姿,也就是 o c T _{o}^{c}\textrm{T} ocT是可以通过点云匹配拿到的。
标定物的选取:
- 已知实际尺寸的CAD标准标定物,通过拍摄得到的点云,和标准点云匹配;
- 抓取场景可以用实际要抓取的物体去制定模型模板,然后进行匹配。
比如halcon中的find_surface_model
就可以进行点云匹配。
之后的过程和上面的传统相机手眼标定是一样的,需要进行多个位姿的拍照来进行计算。
3.2 线激光轮廓相机
线激光轮廓相机和上面的结构光等相机获取点云的原理是不一样的,需要进行多次扫描才能拿到物体的点云信息。
进行手眼标定时,具目前的资料,有三种方法进行手眼标定:
- 和结构光一样,扫描模板标定物进行点云匹配,求 o c T _{o}^{c}\textrm{T} ocT,注意需要用不同的位姿拍摄扫描多组;
- (本思路未验证)类似上面的9点标定,可以扫描一个9点(或多点)的标定物获得点在相机坐标系中的坐标(注意上面是像素坐标系),然后用机械手的工具针碰触9个点,拿到空间坐标,最后解3D空间的仿射变换。
- 拍摄标准球,使用两步法计算,精度应该是比较差的(未验证)。参考论文《基于线激光轮廓仪的机器人3D视觉定位系统设计 ——周泽西》。