2D/3D相机手眼标定总结

1. N点标定

1.1 九点标定

在这里插入图片描述

九点标定法的本质: 无需进行相机内参标定,只能识别x,y坐标,属于2D平面标定,在标定过程中z是未知的
该算法的核心是仿射变换,即图像坐标系机器人坐标系2D仿射变换(注意这里并不是RT的刚体变换)。

由上篇文章射影变换的一种解法,可知仿射变换的基本公式:
在这里插入图片描述
有6个自由度,至少需要3组点才能解决,超过3组点,可以用非线性最小二乘优化。

9点标定分类:

  • 眼在手上,分为静态标定和动态标定,静态标定拍一次,动态标定拍多次。
  • 眼在手外,也分为静态标定和动态标定,不过对应了相机从上往下拍和相机从下往上拍。

1.1.1 眼在手上

  • 静态标定
    此种情况相机会固定在一个位置拍照,只拍摄一次,一次拍全9个标定点,在引导和抓取时,还会移动到该位置给出工件的位置。

1.求出9个点在图像坐标系的坐标 ( u , v ) (u,v) (u,v)
2. 控制机械手,让工具末端分别移动到9个点上,记录9个点的机械手坐标 ( x , y ) (x,y) (x,y)这里工具末端如何跟9个点对准是个问题
3. 进行求解,halcon中使用vector_to_hom_mat2d算子,opencv可使用estimateRigidTransform接口。
4. 使用时,先控制相机拍摄一幅图片,然后根据模板匹配得到的工件中心点,进而得到机械手的点坐标,最终就可以控制机械手去相应的位置了。

  • 动态标定
    动态标定不再使用9点标定板了,使用的是一个固定位置的标定物,要进行多次拍照,每次拍摄完之后要移动到新的位置,此时相机位置是变了的【原理待整理】

1.1.2 眼在手外

眼在手外就是相机固定在外面,分为从上往下拍和从下往上拍:
在这里插入图片描述

  • 从上往下拍可以使用9点标定板进行九点标定,和上面的静态标定是一样的。
  • 从下往上拍工具末端可以夹持一个标定物来移动,实际也是需要移动多次的,但相机位置不会变动,所以原理也和静态标定是一样的。

1.2 12点标定

12点标定就是9点标定和3点旋转标定的组合。它解决的是**“不共轴”**的问题,那么什么是不共轴呢?

不共轴是说夹爪的中心,和机器人末端旋转中心不同,如下图所示,9点标定的时候,用的是夹爪中心进行对准取的机械手坐标,但实际使用时,工件位姿千变万化,夹爪需要旋转到一定角度后才能抓取该工件。
在这里插入图片描述

【3点旋转标定原理待补充】
参考链接 https://zhuanlan.zhihu.com/p/367922840

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 Aj1AiX= X B j B i − 1 XB_{j}B_{i}^{-1} XBjBi1,即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引导。3D引导还是推荐使用3D相机,除非对成本特别敏感。

2.2.1 变形匹配

halcon的find_planar_calib_deformable_model平面形变匹配算子,可以计算出平面物体在透视情况下的空间位姿。首先将标定板放到物体旁边,用CAD模型注册的边缘模板进行匹配,计算当前物体相对于相机的位姿。后续就可以进行匹配了。【注意】这种方法只针对一个平面做的透视矫正,没法得到整个物体的3D信息的
在这里插入图片描述
匹配到的工件:
在这里插入图片描述

基本原理:
在这里插入图片描述

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 线激光轮廓相机

线激光轮廓相机和上面的结构光等相机获取点云的原理是不一样的,需要进行多次扫描才能拿到物体的点云信息。
进行手眼标定时,具目前的资料,有三种方法进行手眼标定:

  1. 和结构光一样,扫描模板标定物进行点云匹配,求 o c T _{o}^{c}\textrm{T} ocT,注意需要用不同的位姿拍摄扫描多组;
  2. 本思路未验证)类似上面的9点标定,可以扫描一个9点(或多点)的标定物获得点在相机坐标系中的坐标,然后用机械手的工具针碰触9个点,拿到机械手空间坐标,最后解3D空间的仿射变换。
  3. 拍摄标准球,使用两步法计算,精度应该是比较差的(未验证)。参考论文《基于线激光轮廓仪的机器人3D视觉定位系统设计 ——周泽西》。

猜你喜欢

转载自blog.csdn.net/hao1183716597/article/details/136401554
今日推荐