手眼标定实际上就是为了让机械臂知道相机拍出来的物品相对于机械臂在什么位置,所以无论下面的哪一种实际都是建立相机坐标系与机械臂坐标系的映射关系。
Base坐标系(基坐标系) | 描述机械臂基座的位置 |
---|---|
Tool坐标系(工具坐标系) | 描述机械爪(机械臂末端)的位置 |
Cam坐标系(相机坐标系) | 描述相机的位置 |
Cal坐标系(标定板坐标系) | 描述标定板的位置 |
由于眼在手外标定时,Base坐标系和Cam坐标系
的位置是固定的,因此眼在手外主要是求这两个坐标系的关系。
同理,眼在手上时,相机坐标系和工具坐标系的位置是相对不变的。因此,标定的就是相机坐标系和工具坐标系的关系。
对于旋转矩阵
,坐标系转化(A>>C)
表示为:
C A R = B A R ∗ C B R ^{A}_{C}R^{} = ^{A}_{B}R^{} * ^{B}_{C}R^{} CAR=BAR∗CBR
对于平移阵
,坐标系转化(A>>C)
表示为:
C A T = B A T + B A R C B T ^{A}_{C}T^{} = ^{A}_{B}T^{} + ^{A}_{B}R^{} {}^{B}_{C}T^{} CAT=BAT+BARCBT
由此,我们可以看到,平移阵的转化关系是比较复杂的,因此,我们引入了齐次坐标系
。
三维坐标系下的点>>齐次坐标 | a = ( x , y , z ) T > > a ′ = ( x , y , z , 1 ) T a = (x,y,z)^T >> a^{'}=(x,y,z,1)^T a=(x,y,z)T>>a′=(x,y,z,1)T |
---|---|
齐次坐标系下的点>>三维坐标 | p = ( a , b , c , d ) T > > p ′ = ( a d , b d , c d ) T p = (a,b,c,d)^T >> p^{'} = (\frac{a}{d},\frac{b}{d},\frac{c}{d})^T p=(a,b,c,d)T>>p′=(da,db,dc)T |
Base | 基坐标系 |
---|---|
Tool | 工具坐标系(机械臂末端坐标系) |
Cam | 相机坐标系 |
Cal | 标定板坐标系 |
(例)基坐标系到工具坐标系的齐次变换阵组成表示为:
B a s e T o o l R ^{Tool}_{Base}R^{} BaseToolR | 旋转阵R |
---|---|
B a s e T o o l T ^{Tool}_{Base}T^{} BaseToolT | 平移阵T |
B a s e T o o l M = [ B a s e T o o l R B a s e T o o l T 0 1 ] ^{Tool}_{Base}M^{} = \begin{bmatrix}^{Tool}_{Base}R^{}&^{Tool}_{Base}T^{}\\0&1\end{bmatrix} BaseToolM=[BaseToolR0BaseToolT1] | 齐次变换阵M |
其中:
C a l C a m M ^{Cam}_{Cal}M^{} CalCamM | 可以通过拍摄标定板图片直接获得(基于相机标定获得的内参和畸变系数) |
---|---|
B a s e T o o l M ^{Tool}_{Base}M^{} BaseToolM | 可以通过机械臂末端位姿参数获得(通过示教器可直接获得机械臂位姿来表示机械臂的坐标系) |
T o o l C a l M ^{Cal}_{Tool}M^{} ToolCalM | 由于标定板固定在机械臂末端,所以对每组图片,该变换阵都一样(可以在联立方程组时直接消掉) |
我们先将Tool>>Cal的变换阵
写成:
T o o l C a l M = C a l C a m M − 1 ∗ B a s e C a m M ∗ B a s e T o o l M − 1 ^{Cal}_{Tool}M^{} = ^{Cam}_{Cal}M^{-1} * ^{Cam}_{Base}M^{} * ^{Tool}_{Base}M^{-1} ToolCalM=CalCamM−1∗BaseCamM∗BaseToolM−1
对于拍摄的多张图像,我们用M1、M2…Mn来表示不同图像的变换阵,联立两次变换方程,(消掉Tool>>Cal的变换阵
)得到下式:
C a l C a m M 1 − 1 ∗ B a s e C a m M ∗ B a s e T o o l M 1 − 1 = C a l C a m M 2 − 1 ∗ B a s e C a m M ∗ B a s e T o o l M 2 − 1 ^{Cam}_{Cal}M^{-1}_1 * ^{Cam}_{Base}M^{} * ^{Tool}_{Base}M^{-1}_1= ^{Cam}_{Cal}M^{-1}_2 * ^{Cam}_{Base}M^{} * ^{Tool}_{Base}M^{-1}_2 CalCamM1−1∗BaseCamM∗BaseToolM1−1=CalCamM2−1∗BaseCamM∗BaseToolM2−1
我们通过下表将整个变换总结为AX=XB的形式:
C a l C a m M 2 ∗ C a l C a m M 1 − 1 ∗ B a s e C a m M = B a s e C a m M ∗ B a s e T o o l M 2 − 1 ∗ B a s e T o o l M 1 ^{Cam}_{Cal}M^{}_2 * ^{Cam}_{Cal}M^{-1} _1* ^{Cam}_{Base}M^{}= ^{Cam}_{Base}M^{} * ^{Tool}_{Base}M^{-1}_2 * ^{Tool}_{Base}M^{}_1 CalCamM2∗CalCamM1−1∗BaseCamM=BaseCamM∗BaseToolM2−1∗BaseToolM1 …
C a l C a m M n ∗ C a l C a m M n − 1 − 1 ∗ B a s e C a m M = B a s e C a m M ∗ B a s e T o o l M n − 1 ∗ B a s e T o o l M n − 1 ^{Cam}_{Cal}M^{}_n * ^{Cam}_{Cal}M^{-1} _{n-1}* ^{Cam}_{Base}M^{}= ^{Cam}_{Base}M^{} * ^{Tool}_{Base}M^{-1}_n * ^{Tool}_{Base}M^{}_{n-1} CalCamMn∗CalCamMn−1−1∗BaseCamM=BaseCamM∗BaseToolMn−1∗BaseToolMn−1
即:
B a s e C a m M ^{Cam}_{Base}M^{} BaseCamM | X |
---|---|
C a l C a m M 2 ∗ C a l C a m M 1 − 1 ^{Cam}_{Cal}M^{}_2 * ^{Cam}_{Cal}M^{-1} _1 CalCamM2∗CalCamM1−1… C a l C a m M n ∗ C a l C a m M n − 1 − 1 ^{Cam}_{Cal}M^{}_n * ^{Cam}_{Cal}M^{-1} _{n-1} CalCamMn∗CalCamMn−1−1 | A |
B a s e T o o l M 2 − 1 ∗ B a s e T o o l M 1 ^{Tool}_{Base}M^{-1}_2 * ^{Tool}_{Base}M^{}_1 BaseToolM2−1∗BaseToolM1 … B a s e T o o l M n − 1 ∗ B a s e T o o l M n − 1 ^{Tool}_{Base}M^{-1}_n * ^{Tool}_{Base}M^{}_{n-1} BaseToolMn−1∗BaseToolMn−1 | B |
其中:
C a l C a m M ^{Cam}_{Cal}M^{} CalCamM | 可以通过拍摄标定板图片直接获得(基于相机标定获得的内参和畸变系数) |
---|---|
T o o l B a s e M ^{Base}_{Tool}M^{} ToolBaseM | 可以通过机械臂末端位姿参数获得(通过示教器可直接获得机械臂位姿来表示机械臂的坐标系) |
B a s e C a l M ^{Cal}_{Base}M^{} BaseCalM | 由于标定板固定在一个位置不动,所以对每组图片,该变换阵都一样(可以在联立方程组时直接消掉) |
我们先将Cal>>Base的变换阵
写成:
B a s e C a l M = C a l C a m M − 1 ∗ T o o l C a m M ∗ T o o l B a s e M − 1 ^{Cal}_{Base}M^{} = ^{Cam}_{Cal}M^{-1} * ^{Cam}_{Tool}M^{} * ^{Base}_{Tool}M^{-1} BaseCalM=CalCamM−1∗ToolCamM∗ToolBaseM−1
基于眼在手外的原理,将眼在手上的变换阵求解表示为:
T o o l C a m M ^{Cam}_{Tool}M^{} ToolCamM | X |
---|---|
C a l C a m M 2 ∗ C a l C a m M 1 − 1 ^{Cam}_{Cal}M^{}_2 * ^{Cam}_{Cal}M^{-1} _1 CalCamM2∗CalCamM1−1… C a l C a m M n ∗ C a l C a m M n − 1 − 1 ^{Cam}_{Cal}M^{}_n * ^{Cam}_{Cal}M^{-1} _{n-1} CalCamMn∗CalCamMn−1−1 | A |
T o o l B a s e M 2 − 1 ∗ T o o l B a s e M 1 ^{Base}_{Tool}M^{-1}_2 * ^{Base}_{Tool}M^{}_1 ToolBaseM2−1∗ToolBaseM1 … T o o l B a s e M n − 1 ∗ T o o l B a s e M n − 1 ^{Base}_{Tool}M^{-1}_n * ^{Base}_{Tool}M^{}_{n-1} ToolBaseMn−1∗ToolBaseMn−1 | B |
首先将A,B,X表示为齐次阵的形式:
[ R X T X 0 1 ] \begin{bmatrix}R_X^{}&T_X^{}\\0&1\end{bmatrix} [RX0TX1] | X |
---|---|
[ R A T A 0 1 ] \begin{bmatrix}R_A^{}&T_A^{}\\0&1\end{bmatrix} [RA0TA1] | A |
[ R B T B 0 1 ] \begin{bmatrix}R_B^{}&T_B^{}\\0&1\end{bmatrix} [RB0TB1] | B |
即可将 AX=XB 拆解为:
R A R X = R X R B R_AR_X = R_XR_B RARX=RXRB
( R A − I ) T X = R X T B − T A (R_A-I)T_X = R_XT_B - T_A (RA−I)TX=RXTB−TA
关于上式具体的求解:
优化方法的思想
(高斯牛顿的方法),移到一边后求取误差项,然后通过非线性最优化的方法,将误差最小化,直接拟合出 R 和 T
。两步法的思想
,先求R再求T
,具体可以参考Navy_HandEye或Tsai_HandEye等方法。下面以EYE IN HAND为例,描述实际的算法实现流程: