最近因为工作原因需要用到手眼标定相关知识,在网上查了一番大部分文章都写得似懂非懂,感觉都是从别处copy过来,很少有人能清晰的描述整个完整流程,因此在这里对手眼标定的原理进行自己的推理,代码也在后面附上。
1. 问题建模(AX=XB)
假设 k \boldsymbol k k时刻,机械臂相对于世界坐标系的位姿为 A k \boldsymbol {A_k} Ak (末端到世界),相机相对于世界坐标系的位姿为 B k \boldsymbol {B_k} Bk (相机到世界),相机相对于机械臂的位姿 X \boldsymbol X X(相机到末端),那么有
A k X = B k \boldsymbol {A_k} \boldsymbol X = \boldsymbol {B_k} AkX=Bk
同样 k + 1 \boldsymbol {k+1} k+1时刻有
A k + 1 X = B k + 1 \boldsymbol {A_{k+1}} \boldsymbol X = \boldsymbol {B_{k+1}} Ak+1X=Bk+1
所有矩阵均属于SE3,两式联立,则有
( A k + 1 X ) − 1 A k X = B k + 1 − 1 B k + 1 A k + 1 − 1 A k X = X B k + 1 − 1 B k + 1 \begin{aligned} \boldsymbol {(A_{k+1} X)^{-1}} \boldsymbol {A_{k} X} &= \boldsymbol {B_{k+1}^{-1}}\boldsymbol B_{k+1}\\ \boldsymbol {A_{k+1}^{-1}} \boldsymbol {A_{k}} \boldsymbol X &= \boldsymbol X \boldsymbol {B_{k+1}^{-1}} \boldsymbol B_{k+1} \end{aligned} (Ak+1X)−1AkXAk+1−1AkX=Bk+1−1Bk+1=XBk+1−1Bk+1
令 A = A k + 1 − 1 A k \boldsymbol A = \boldsymbol {A_{k+1}^{-1} A_{k}} A=Ak+1−1Ak, B = B k + 1 − 1 B k \boldsymbol B = \boldsymbol {B_{k+1}^{-1} B_{k}} B=Bk+1−1Bk,则有
A X = X B \begin{equation} \boldsymbol {AX} = \boldsymbol {XB} \end{equation} AX=XB
其中 A \boldsymbol A A表示末端两个时刻之间的相对位姿态关系,可以由棋盘格或Tag码获取。 B \boldsymbol B B表示相机两个时刻之间的相对位姿态关系,可由机械臂读数获取。手眼标定即为利用不同时刻得到的末端和相机位姿来求解 X \boldsymbol X X。
A = [ R A t A 0 1 ] , B = [ R B t B 0 1 ] , X = [ R X t X 0 1 ] \boldsymbol{A} = \begin{bmatrix} \boldsymbol{R_A} & \boldsymbol{t_A} \\ \boldsymbol{0} & 1 \end{bmatrix},\boldsymbol{B} = \begin{bmatrix} \boldsymbol{R_B} & \boldsymbol{t_B} \\ \boldsymbol{0} & 1 \end{bmatrix},\boldsymbol{X} = \begin{bmatrix} \boldsymbol{R_X} & \boldsymbol{t_X} \\ \boldsymbol{0} & 1 \end{bmatrix} A=[RA0tA1],B=[R