手眼标定

  • 1. 写在前面
  • 2. 手眼标定基本分类
  • 2.1 手眼标定坐标系
  • 2.2 眼在手外(EYE TO HEAD)
  • 2.3 眼在手上(EYE IN HEAD)
  • 3. 九点法(二维)- 算法实现流程
  • 4. AX=XB方法(二维或三维)- 推导 < 什么是AX=XB >
  • 4.1 坐标系转换&运算规则
  • 4.1.1 齐次坐标系
  • 4.2 实际坐标系转换公式推导
  • 4.2.1 眼在手外
  • 4.2.2 眼在手上
  • 4.3 求解
  • 5. AX=XB方法(二维或三维)- 算法实现流程(总结)
  • 源码相关的博文


1. 写在前面

手眼标定实际上就是为了让机械臂知道相机拍出来的物品相对于机械臂在什么位置,所以无论下面的哪一种实际都是建立相机坐标系与机械臂坐标系的映射关系。

  • 另外,相机标定的内容可以参考这里

2. 手眼标定基本分类

2.1 手眼标定坐标系

Base坐标系(基坐标系)

描述机械臂基座的位置

Tool坐标系(工具坐标系)

描述机械爪(机械臂末端)的位置

Cam坐标系(相机坐标系)

描述相机的位置

Cal坐标系(标定板坐标系)

描述标定板的位置

2.2 眼在手外(EYE TO HEAD)

  • 如下图所示,眼在手外是将相机固定在相机平面;标定板固定在机械臂末端,通过移动机械臂来获取标定图像。
  • aruco python 手眼标定 手眼标定方法_机械臂

  • 由于眼在手外标定时,Base坐标系和Cam坐标系的位置是固定的,因此眼在手外主要是求这两个坐标系的关系。

2.3 眼在手上(EYE IN HEAD)

  • 如下图所示,眼在手上是将相机固定在机械臂末端;标定板固定在物品平面,通过移动机械臂来获取标定图像。
  • aruco python 手眼标定 手眼标定方法_机械臂_02

  • 同理,眼在手上时,相机坐标系和工具坐标系的位置是相对不变的。因此,标定的就是相机坐标系和工具坐标系的关系。

3. 九点法(二维)- 算法实现流程

  • 对于二维的手眼标定,广泛采用的方法是九点法:
  1. 在获得相机参数后,指定九个点,先通过相机获得在相机坐标系下这九个点的坐标(2d)。
  2. 再通过示教器将机械臂分别移到九个点的位置,并获取对应在机械臂末端坐标系下的九个点坐标(2d)。
  3. 最后,建立两者的映射关系,即可以表达相机坐标系到机械臂坐标系的关系。

4. AX=XB方法(二维或三维)- 推导 < 什么是AX=XB >

4.1 坐标系转换&运算规则

对于旋转矩阵,坐标系转化(A>>C)表示为:
aruco python 手眼标定 手眼标定方法_学习_03

对于平移阵,坐标系转化(A>>C)表示为:
aruco python 手眼标定 手眼标定方法_aruco python 手眼标定_04

由此,我们可以看到,平移阵的转化关系是比较复杂的,因此,我们引入了齐次坐标系

4.1.1 齐次坐标系

三维坐标系下的点>>齐次坐标

aruco python 手眼标定 手眼标定方法_二维_05

齐次坐标系下的点>>三维坐标

aruco python 手眼标定 手眼标定方法_机械臂_06

4.2 实际坐标系转换公式推导

  • 复习一下各个坐标系的简称:

Base

基坐标系

Tool

工具坐标系(机械臂末端坐标系)

Cam

相机坐标系

Cal

标定板坐标系


(例)基坐标系到工具坐标系的齐次变换阵组成表示为:

旋转阵R

平移阵T

齐次变换阵M

4.2.1 眼在手外

  • 眼在手外的标定,我们希望得到基坐标系到相机坐标系的变换 (对于opencv的handeyecalibrate函数,将其输入的机械臂姿态改为base->tool,则得到的输出是相机到基坐标系,与本文这里的示例相反,需要注意!!!) ,表示为 :
    aruco python 手眼标定 手眼标定方法_学习_10

其中:

aruco python 手眼标定 手眼标定方法_学习_10

可以通过拍摄标定板图片直接获得(基于相机标定获得的内参和畸变系数)

aruco python 手眼标定 手眼标定方法_学习_10

可以通过机械臂末端位姿参数获得(通过示教器可直接获得机械臂位姿来表示机械臂的坐标系)

aruco python 手眼标定 手眼标定方法_学习_10

由于标定板固定在机械臂末端,所以对每组图片,该变换阵都一样(可以在联立方程组时直接消掉)

我们先将Tool>>Cal的变换阵写成:
aruco python 手眼标定 手眼标定方法_二维_14

对于拍摄的多张图像,我们用M1、M2…Mn来表示不同图像的变换阵,联立两次变换方程,(消掉Tool>>Cal的变换阵)得到下式:
aruco python 手眼标定 手眼标定方法_机械臂_15


我们通过下表将整个变换总结为AX=XB的形式:

aruco python 手眼标定 手眼标定方法_二维_16
aruco python 手眼标定 手眼标定方法_经验分享_17
即:

aruco python 手眼标定 手眼标定方法_二维_14

X

aruco python 手眼标定 手眼标定方法_二维_19aruco python 手眼标定 手眼标定方法_二维_19

A

aruco python 手眼标定 手眼标定方法_二维_19aruco python 手眼标定 手眼标定方法_二维_19

B

4.2.2 眼在手上

  • 眼在手上,期望的转化阵为工具坐标系(机械臂末端坐标系)到相机坐标系,表示为:
    aruco python 手眼标定 手眼标定方法_二维_19

其中:

aruco python 手眼标定 手眼标定方法_二维_19

可以通过拍摄标定板图片直接获得(基于相机标定获得的内参和畸变系数)

aruco python 手眼标定 手眼标定方法_二维_25

可以通过机械臂末端位姿参数获得(通过示教器可直接获得机械臂位姿来表示机械臂的坐标系)

aruco python 手眼标定 手眼标定方法_二维_25

由于标定板固定在一个位置不动,所以对每组图片,该变换阵都一样(可以在联立方程组时直接消掉)

我们先将Cal>>Base的变换阵写成:
aruco python 手眼标定 手眼标定方法_二维_25
基于眼在手外的原理,将眼在手上的变换阵求解表示为:

aruco python 手眼标定 手眼标定方法_二维_25

X

aruco python 手眼标定 手眼标定方法_二维_25aruco python 手眼标定 手眼标定方法_二维_25

A

aruco python 手眼标定 手眼标定方法_学习_31aruco python 手眼标定 手眼标定方法_学习_31

B

4.3 求解

首先将A,B,X表示为齐次阵的形式:

aruco python 手眼标定 手眼标定方法_学习_31

X

aruco python 手眼标定 手眼标定方法_经验分享_34

A

aruco python 手眼标定 手眼标定方法_机械臂_35

B


即可将 AX=XB 拆解为:
aruco python 手眼标定 手眼标定方法_经验分享_36
aruco python 手眼标定 手眼标定方法_经验分享_37


关于上式具体的求解:

  • 可以基于优化方法的思想(高斯牛顿的方法),移到一边后求取误差项,然后通过非线性最优化的方法,将误差最小化,直接拟合出 R 和 T
  • (常用) 也可以基于两步法的思想先求R再求T,具体可以参考Navy_HandEye或Tsai_HandEye等方法。

5. AX=XB方法(二维或三维)- 算法实现流程(总结)

下面以EYE IN HAND为例,描述实际的算法实现流程:

  1. 相机标定获得像素坐标系到世界坐标系(标定板坐标系)的变换关系。
  • 由于该相机标定结果会用于手眼标定,因此相机标定时,标定板固定位置不动,手眼组合体变换姿态拍摄图片。
  1. A 通过在不同姿态下读取相机外参(相机相对于世界坐标系,即标定板坐标系的位姿)获得的位姿矩阵求得。
  2. B 通过示教器读取不同位姿下的机械臂末端相对于基座的坐标求得。
  3. 求解变换阵 X
    这里可以参考: