眼在手外(eye to hand):
相机固定在机械臂以外的地方,主要标定相机和基底坐标系的转换矩阵。
眼在手上(eye in hand):
相机固定在机械臂末端,主要标定相机和机械臂末端的转换矩阵。
e n d b a s e R _{end}^{base}R endbaseR:机械臂末端坐标系到机械臂基底坐标系的旋转矩阵
e n d b a s e T _{end}^{base}T endbaseT:机械臂末端坐标系到机械臂基底坐标系的平移矩阵
e n d b a s e M = [ e n d b a s e R e n d b a s e T 0 1 ] _{end}^{base}M = \begin{bmatrix} _{end}^{base}R & _{end}^{base}T \\ 0 & 1 \end{bmatrix} endbaseM=[endbaseR0endbaseT1]:机械臂末端坐标系到机械臂基底坐标系变换矩阵
以上等价于:机械臂末端坐标系在基底坐标系下的描述
e n d b a s e R = b a s e e n d R − 1 e n d b a s e M = b a s e e n d M − 1 e n d b a s e T = { = − b a s e e n d T i f e n d b a s e R = b a s e e n d R = I ≠ − b a s e e n d T i f e n d b a s e R ≠ b a s e e n d R ≠ I _{end}^{base}R = ^{end}_{base}R^{-1} \\ _{end}^{base}M = ^{end}_{base}M^{-1} \\ _{end}^{base}T=\left\{ \begin{aligned} = & -^{end}_{base}T\quad if \quad_{end}^{base}R = ^{end}_{base}R = I \\ \neq & -^{end}_{base}T\quad if \quad _{end}^{base}R \neq ^{end}_{base}R \neq I \end{aligned} \right. endbaseR=baseendR−1endbaseM=baseendM−1endbaseT={==−baseendTifendbaseR=baseendR=I−baseendTifendbaseR=baseendR=I
由于R是正交矩阵,正交矩阵的逆=正交矩阵的转置,所以有时候也会写为 e n d b a s e R = b a s e e n d R T ^{base}_{end}R = ^{end}_{base}R^T endbaseR=baseendRT
假设有两个坐标系A,B,其中坐标系B中的点b是由坐标系A中的点a转换来的,则点a和点b之间有如下等式
a = B A R ∗ b + B A T b = A B R ∗ a + A B T a = {^A_B}R * b + {^A_B}T \\ b = {^B_A}R * a + {^B_A}T a=BAR∗b+BATb=ABR∗a+ABT
由以上等式可以看出:
a = A B R − 1 ( b − A B T ) = A B R − 1 b − A B R − 1 A B T = A B R − 1 b + B A T B A T = − A B R − 1 A B T a = {^B_A}R^{-1}(b-{^B_A}T) \\ \quad\quad\;\,= {^B_A}R^{-1}b-{^B_A}R^{-1}{^B_A}T\\ \,= {^B_A}R^{-1}b+{^A_B}T \\ {^A_B}T = -{^B_A}R^{-1}{^B_A}T a=ABR−1(b−ABT)=ABR−1b−ABR−1ABT=ABR−1b+BATBAT=−ABR−1ABT
假设由三个坐标系A,B,C,已知如下关系: B A R , B A T , C B R , C B T {^A_B}R,{^A_B}T,{^B_C}R,{^B_C}T BAR,BAT,CBR,CBT,求 C A R , C A T {^A_C}R,{^A_C}T CAR,CAT
对于旋转矩阵 R R R: C A R = B A R ∗ C B R {^A_C}R = {^A_B}R*{^B_C}R CAR=BAR∗CBR
对于平移矩阵 T T T: 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 形式麻烦!
求解目标:机械臂基底坐标系到相机坐标系的变换矩阵 b a s e c a m e r a M ^{camera}_{base}M basecameraM
手眼标定坐标系表示:
实现方法:
则对每张图片可知: b a s e c a m e r a M = b o a r d c a m e r a M ∗ e n d b o a r d M ∗ b a s e e n d M ^{camera}_{base}M = \;^{camera}_{board}M * \; ^{board}_{end}M * \;^{end}_{base}M basecameraM=boardcameraM∗endboardM∗baseendM
变形得:
e n d b o a r d M = b o a r d c a m e r a M − 1 ∗ b a s e c a m e r a M ∗ b a s e e n d M − 1 ^{board}_{end}M = \;^{camera}_{board}M^{-1} * \;^{camera}_{base}M * \;^{end}_{base}M^{-1} endboardM=boardcameraM−1∗basecameraM∗baseendM−1
其中:
b o a r d c a m e r a M : ^{camera}_{board}M: boardcameraM: 可由通过拍摄的标定板图片直接求解
b a s e e n d M : ^{end}_{base}M: baseendM: 可由机械臂末端位姿参数求得
e n d b o a r d M : ^{board}_{end}M: endboardM: 未知量,由于标定板固定在机械臂末端,所以对每组图片,该转换矩阵都相同
已知对每张图片:
e n d b o a r d M = b o a r d c a m e r a M − 1 ∗ b a s e c a m e r a M ∗ b a s e e n d M − 1 ^{board}_{end}M = \;^{camera}_{board}M^{-1} * \;^{camera}_{base}M * \;^{end}_{base}M^{-1} endboardM=boardcameraM−1∗basecameraM∗baseendM−1
**则可以得到如下等式:**左乘 b o a r d c a m e r a M 2 ^{camera}_{board}M_2 boardcameraM2 右乘 b a s e e n d M 1 ^{end}_{base}M_1 baseendM1
求解目标:机械臂末端坐标系到相机坐标系的变换矩阵 e n d c a m e r a M ^{camera}_{end}M endcameraM
手眼标定坐标系表示:
实现方法:
则对每张图片可知: e n d c a m e r a M = b o a r d c a m e r a M ∗ b a s e b o a r d M ∗ e n d b a s e M ^{camera}_{end}M = \;^{camera}_{board}M * \; ^{board}_{base}M * \;^{base}_{end}M endcameraM=boardcameraM∗baseboardM∗endbaseM
变形得:
b a s e b o a r d M = b o a r d c a m e r a M − 1 ∗ e n d c a m e r a M ∗ e n d b a s e M − 1 ^{board}_{base}M = \;^{camera}_{board}M^{-1} * \;^{camera}_{end}M * \;^{base}_{end}M^{-1} baseboardM=boardcameraM−1∗endcameraM∗endbaseM−1
其中:
b o a r d c a m e r a M : ^{camera}_{board}M: boardcameraM: 可由通过拍摄的标定板图片直接求解
b a s e e n d M : ^{end}_{base}M: baseendM: 可由机械臂末端位姿参数求得
b a s e b o a r d M : ^{board}_{base}M: baseboardM: 未知量,由于标定板全程固定在一个位置不动,所以对每组图片,该转换矩阵都相同
已知对每张图片:
b a s e b o a r d M = b o a r d c a m e r a M − 1 ∗ e n d c a m e r a M ∗ e n d b a s e M − 1 ^{board}_{base}M = \;^{camera}_{board}M^{-1} * \;^{camera}_{end}M * \;^{base}_{end}M^{-1} baseboardM=boardcameraM−1∗endcameraM∗endbaseM−1
**则可以得到如下等式:**左乘 b o a r d c a m e r a M 2 ^{camera}_{board}M_2 boardcameraM2 右乘 e n d b a s e M 1 ^{base}_{end}M_1 endbaseM1
无论是眼在手外还是眼在手内,都可以得到一个经典的方程组 A X = X B AX=XB AX=XB,这个方程组有n-1个方程 (n是拍摄的图片数量)
其中X是我们要求得的手眼矩阵,里面有6个线性无关的变量,其中旋转3个自由度,平移3个自由度。
**形式变换:**由于A,B,X均为变换矩阵
A = [ R A T A 0 1 ] B = [ R B T B 0 1 ] X = [ R X T X 0 1 ] A = \begin{bmatrix} R_A & T_A \\ 0 & 1 \end{bmatrix} \qquad B = \begin{bmatrix} R_B & T_B \\ 0 & 1 \end{bmatrix} \qquad X = \begin{bmatrix} R_X & T_X \\ 0 & 1 \end{bmatrix} A=[RA0TA1]B=[RB0TB1]X=[RX0TX1]
则 A X = X B AX=XB AX=XB可以拆解成如下两个等式
{ R A R X = R X R B ( R A − 1 ) T X = R X T B − T A \left\{ \begin{aligned} R_AR_X & =R_XR_B \\ (R_A-1)T_X & =R_XT_B-T_A \\ \end{aligned} \right. {RARX(RA−1)TX=RXRB=RXTB−TA
Tais方法:先求解Rx,再求解Tx
旋转的表示:
**旋转矩阵:**3*3矩阵 R = R z R y R x R = R_zR_yR_x R=RzRyRx
旋转向量: r = ( x y z ) θ = n o r m ( r ) r = (x\;y\;z) \quad \theta = norm(r) r=(xyz)θ=norm(r)
刚体绕旋转轴旋转, r r r表示的是旋转轴的方向, r r r的长度表示刚体绕旋转轴的角度
旋转角: θ = ( θ x θ y θ z ) \theta = (\theta_x \; \theta_y \; \theta_z) θ=(θxθyθz)
旋转角又称欧拉角,一般情况下旋转角指的是坐标系绕x轴旋转后,再绕y轴旋转后,再绕z轴旋转分别的角度
R x ( θ x ) = [ 1 0 0 0 c o s θ x − s i n θ x 0 s i n θ x c o s θ x ] R y ( θ y ) = [ c o s θ y 0 s i n θ y 0 1 0 − s i n θ y 0 c o s θ y ] R z ( θ z ) = [ c o s θ z − s i n θ z 0 s i n θ z c o s θ z 0 0 0 1 ] R = R z R y R x R_x(\theta_x) = \begin{bmatrix} 1 & 0 & 0 \\ 0 & cos\theta_x & -sin\theta_x \\ 0 & sin\theta_x & cos\theta_x\end{bmatrix} \\R_y(\theta_y) = \begin{bmatrix} cos\theta_y & 0 & sin\theta_y \\ 0 & 1 & 0 \\ -sin\theta_y & 0 & cos\theta_y\end{bmatrix} \\ R_z(\theta_z) = \begin{bmatrix} cos\theta_z & -sin\theta_z & 0 \\ sin\theta_z & cos\theta_z & 0 \\ 0 & 0 & 1\end{bmatrix}\\R = R_zR_yR_x Rx(θx)=⎣⎡1000cosθxsinθx0−sinθxcosθx⎦⎤Ry(θy)=⎣⎡cosθy0−sinθy010sinθy0cosθy⎦⎤Rz(θz)=⎣⎡cosθzsinθz0−sinθzcosθz0001⎦⎤R=RzRyRx
R = [ r 11 r 12 r 13 r 21 r 22 r 23 r 31 r 32 r 33 ] R = \begin{bmatrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33}\end{bmatrix} R=⎣⎡r11r21r31r12r22r32r13r23r33⎦⎤
θ Z = a t a n 2 ( r 21 , r 11 ) θ Y = a t a n 2 ( − r 31 , r 31 2 + r 33 2 ) θ X = a t a n 2 ( r 32 , r 33 ) \theta_Z = atan2(r_{21},r_{11}) \\ \theta_Y = atan2(-r_{31},\sqrt{r^2_{31}+r^2_{33}}) \\ \theta_X = atan2(r_{32},r_{33}) θZ=atan2(r21,r11)θY=atan2(−r31,r312+r332)θX=atan2(r32,r33)
solvePnP()
bool cv::solvePnP(InputArray objectPoints,
InputArray imagePoints,
InputArray cameraMatrix, // 相机内参
InputArray distCoeffs, // 相机畸变系数
OutputArray rvec, // R
OutputArray objectPoints, // T
bool useExtrinsicGuess = false,
int flags = SOLVEPNP_ITERATIVE)
1. 利用calibrateCamera函数中计算的R、T,来作为标定板坐标系到相机坐标系的输入
问题分析:对手眼标定来说,这个R、T没有问题。但是由于后续的抓取来说,使用的物体三维坐标是相机重建的点云,即相机之前标定的内参下的点云。此时手眼标定的相机坐标系和实际抓取使用的相机坐标系轻微的不一致,导致抓取总是有轻微误差。
2. 识别标定板角点方向反了!
由于在建立棋盘格上的三维坐标系的时候,我们默认是从棋盘格左上角到右下角建立的,如果识别反了,则会有个别图片棋盘格识别的角点和输入的棋盘格三维坐标对应不上!
本篇为观看b站视频的笔记
在此附上原视频地址:
手眼标定–原理与实战