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位姿,才能转换到机械手坐标系中进行抓取。
那么如何在单目相机中拿到物体的3D位姿呢?
在halcon中,提供了两种办法通过单目相机拿到物体的3D位姿。当然正常使用中用的最多的还是上面的九点标定来进行2D引导。
2.2.1 变形匹配
halcon的find_planar_calib_deformable_model
平面形变匹配算子,可以计算出平面物体在透视情况下的空间位姿。首先将标定板放到物体旁边,用CAD模型注册的边缘模板进行匹配,计算当前物体相对于相机的位姿。后续就可以进行匹配了。
匹配到的工件:
基本原理:
2.2.2 基于形状的三维匹配
基于形状匹配是指在二维图像中搜索三维CAD模型实例,而不是三维点云。通过操作符find_shape_model_3d
计算并返回物体姿态。
它是通过一种基于视图的方法来计算的。通过虚拟球面视图的方式,降低算法复杂度:
假设物体置于球心,并对球心进行观测,创建多个位置的虚拟相机,我们可以通过将物体投影到每一个虚拟相机的像平面上获取相机的拍到的视图,注册为模板,在实际匹配时,会在每个虚拟相机的位置进行匹配计算,找到最佳位姿。注意还需计算不同半径下的虚拟相机。
创建模板的时候,利用CAD三维信息,进行多虚拟相机投影的计算,计算量很大。在后面使用时,需要对数以千计的视图进行匹配计算,很难满足实际的应用需求,还是推荐直接上3D相机获取到点云信息后进行匹配。
3.3D相机手眼标定
将下图中的标定板换成其他标定物,就可以进行3D手眼标定了。
2.2.2 基于形状的三维匹配
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视觉定位系统设计 ——周泽西》。