手眼标定原理
Write By Champrin From 2022-11-03 To 2022-11-04.
GUET Evolution Team Visual Group
参考资料:
外文教程
5.2-手眼标定(外参标定)
要实现由 图像目标点 到 空间实际物体上抓取点 之间的坐标转换,就必须拥有 相机 与 机械臂 之间的位姿转换关系,即手眼关系,因此这种标定就称之为手眼标定。
根据相机固定的地方不同,标定的转换关系也不同,有两种:如果 相机 与 机械臂末端 固定在一起,就称之为“眼在手(eye in hand)”;如果 相机 与 机械臂以外 固定在一起,则称之为“眼在外(eye to hand)”。
总的来说:任意类型的相机标定一定是在标定一个相对不变的量,不会去标定一个变化的量,这会在两种手眼标定所标定的变换矩阵有所体现。
坐标系名称:
base
:机械臂基地坐标系gripper
:机械臂末端坐标系(夹爪坐标系)cam
:相机坐标系target
:标定板坐标系(世界坐标系)
眼在手外(Eye To Hand)及其推导
相机固定在机械臂以外的地方,因此 相机 与 机械臂基底 在整个机械臂抓取过程中的相对位置保持不变,手眼标定求解的量为 相机坐标系 相对于 机械臂基底坐标系 的变换矩阵。
这种关系下,几次运动,标定板 和 机械臂末端 的位姿关系始终不变也就是 标定板坐标系 相对于 机械臂末端坐标系 的变换矩阵不变,可以以此建立方程组求解标定结果。
求解目标:
相机坐标系 相对于 机械臂基底坐标系 的变换矩阵 \({^{base}_{cam}T}\)。
实现方法:
- 把标定板固定在机械臂末端
- 使用相机拍摄不同机械臂姿态下的标定板图片\(n\)张\((n>3)\),建议\(n>10\)
已知对每张图片有:
\[{^{gripper}_{target}T} = {^{gripper}_{base}T}{^{base}_{cam}T}{^{cam}_{target}T} \]- \({^{gripper}_{target}T}\):未知量.由于标定板固定在机械臂末端,所以对每组图片,该变换矩阵都相同
- \({^{gripper}_{base}T}\):可由机械臂末端位姿参数求得
- \({^{cam}_{target}T}\):可由通过拍摄的标定板图片直接求解
设标定图为第 \(1 - n\) 张,那么有:
\[ {^{gripper}_{target}T^{(1)}} = {^{gripper}_{target}T^{(2)}} = \cdots = {^{gripper}_{target}T^{(n)}} \]\[ {^{gripper}_{base}T^{(1)}} \, {^{base}_{cam}T} \, {^{cam}_{target}T^{(1)}} = {^{gripper}_{base}T^{(2)}} \, {^{base}_{cam}T} \, {^{cam}_{target}T^{(2)}} \\ {^{gripper}_{base}T^{(2)}} \, {^{base}_{cam}T} \, {^{cam}_{target}T^{(2)}} = {^{gripper}_{base}T^{(3)}} \, {^{base}_{cam}T} \, {^{cam}_{target}T^{(3)}} \\ \cdots \\ {^{gripper}_{base}T^{(n - 1)}} \, {^{base}_{cam}T} \, {^{cam}_{target}T^{(n - 1)}} = {^{gripper}_{base}T^{(n)}} \, {^{base}_{cam}T} \, {^{cam}_{target}T^{(n)}} \\ \]整理得:
\[ {(^{gripper}_{base}T^{(2)})^{(-1)}} \, {^{gripper}_{base}T^{(1)}} \, {^{base}_{cam}T} = {^{base}_{cam}T} \, {^{cam}_{target}T^{(2)}} \, {(^{cam}_{target}T^{(1)})^{(-1)}} \\ {(^{gripper}_{base}T^{(3)})^{(-1)}} \, {^{gripper}_{base}T^{(2)}} \, {^{base}_{cam}T} = {^{base}_{cam}T} \, {^{cam}_{target}T^{(3)}} \, {(^{cam}_{target}T^{(2)})^{(-1)}} \\ \cdots \\ {(^{gripper}_{base}T^{(n)})^{(-1)}} \, {^{gripper}_{base}T^{(n - 1)}} \, {^{base}_{cam}T} = {^{base}_{cam}T} \, {^{cam}_{target}T^{(n)}} \, {(^{cam}_{target}T^{(n - 1)})^{(-1)}} \\ \]令:
\[\begin{cases} {A_i} = {(^{gripper}_{base}T^{(i + 1)})^{(-1)}} \, {^{gripper}_{base}T^{(i)}} \\ {X} = {^{base}_{cam}T} \\ {B_i} = {^{cam}_{target}T^{(i + 1)}} \, {(^{cam}_{target}T^{(i)})^{(-1)}} \end{cases} \, , \, i \in [1, n - 1] \]得到 \(n\) 个方程组,标定结果转为求解这 \(n\) 个方程组:
\[ {A_i} \, {X} = {X} {B_i} \, , \, i \in [1, n - 1] \]眼在手上(Eye In Hand)及其推导
相机固定在机械臂末端,因此 相机 与 机械臂末端 在整个机械臂抓取过程中的相对位置保持不变,手眼标定求解的量为 相机坐标系 相对于 机械臂末端坐标系 的变换矩阵。
这种关系下,几次运动,标定板 和 机械臂基底 的相对位置始终不变,也就是 标定板坐标系 相对于 机械臂基底坐标系 的变换矩阵不变,可以以此建立方程组求解标定结果。
求解目标:
相机坐标系 相对于 机械臂末端坐标系 的变换矩阵 \({^{gripper}_{cam}T}\)
实现方法:
- 把标定板放到固定位置不动
- 移动机械臂末端,从不同角度拍摄 \(n\) 张标定板图片
已知对每张图片有:
\[ {^{base}_{target}T} = {^{base}_{gripper}T} \, {^{gripper}_{cam}T} \, {^{cam}_{target}T} \]- \({^{base}_{target}T}\):未知量,但是由于标定板全程固定在一个位置不动,所以对每组图片,该变换矩阵都相同,所以以此建立方程
- 因此要保证在标定时,机械臂基底与标定板的相对位置不变
- \({^{base}_{gripper}T}\):可由机械臂末端位姿参数求得
- \({^{cam}_{target}M}\):可由通过拍摄的标定板图片直接求解
设标定图为第 \(1 - n\) 张,那么有:
\[ {^{base}_{target}T^{(1)}} = {^{base}_{target}T^{(2)}} = \cdots = {^{base}_{target}T^{(n)}} \]\[ {^{base}_{gripper}T^{(1)}} \, {^{gripper}_{cam}T} \, {^{cam}_{target}T^{(1)}} = {^{base}_{gripper}T^{(2)}} \, {^{gripper}_{cam}T} \, {^{cam}_{target}T^{(2)}} \\ {^{base}_{gripper}T^{(2)}} \, {^{gripper}_{cam}T} \, {^{cam}_{target}T^{(2)}} = {^{base}_{gripper}T^{(3)}} \, {^{gripper}_{cam}T} \, {^{cam}_{target}T^{(3)}} \\ \cdots \\ {^{base}_{gripper}T^{(n - 1)}} \, {^{gripper}_{cam}T} \, {^{cam}_{target}T^{(n - 1)}} = {^{base}_{gripper}T^{(n)}} \, {^{gripper}_{cam}T} \, {^{cam}_{target}T^{(n)}} \\ \]整理得:
\[ {(^{base}_{gripper}T^{(2)})^{(-1)}} \, {^{base}_{gripper}T^{(1)}} \, {^{gripper}_{cam}T} = {^{gripper}_{cam}T} \, {^{cam}_{target}T^{(2)}} \, {(^{cam}_{target}T^{(1)})^{(-1)}} \\ {(^{base}_{gripper}T^{(3)})^{(-1)}} \, {^{base}_{gripper}T^{(2)}} \, {^{gripper}_{cam}T} = {^{gripper}_{cam}T} \, {^{cam}_{target}T^{(3)}} \, {(^{cam}_{target}T^{(2)})^{(-1)}} \\ \cdots \\ {(^{base}_{gripper}T^{(n)})^{(-1)}} \, {^{base}_{gripper}T^{(n - 1)}} \, {^{gripper}_{cam}T} = {^{gripper}_{cam}T} \, {^{cam}_{target}T^{(n)}} \, {(^{cam}_{target}T^{(n - 1)})^{(-1)}} \\ \]令:
\[\begin{cases} {A_i} = {(^{base}_{gripper}T^{(i + 1)})^{(-1)}} \, {^{base}_{gripper}T^{(i)}} \\ {X} = {^{gripper}_{cam}T} \\ {B_i} = {^{cam}_{target}T^{(i + 1)}} \, {(^{cam}_{target}T^{(i)})^{(-1)}} \\ \end{cases} \, , \, i \in [1, n - 1] \]得到 \(n\) 个方程组,标定结果转为求解这 \(n\) 个方程组:
\[ {A_i} \, {X} = {X} {B_i} \, , \, i \in [1, n - 1] \]也就是说,无论是眼在手外还是手在眼上,最终都是以 \(n - 1\) 个方程组(若标定图有 \(n\) 张),去求解 \(AX=XB\) 中的 \(X\) 即为手眼标定结果。
\(X\) 即为我们要求得的变换矩阵,里面有6个线性无关的变量;其中旋转 3 个自由度,平移 3 个自由度。
求解 \(AX=XB\)
OpenCV 4.1.0 及以上的版本,带有了求解 \(AX=XB\) 的方法——cv::calibrateHandEye()
,调用方法求解即可。