描述

常见的机械臂手眼标定,都是通过相机检测棋盘格的方式来完成的。那么针对点云相机来说,在没有rgb图像的情况下, 该如何完成手眼标定呢

我的方法是
利用ICP算法,完成3D点云相机的手眼标定

点云相机手眼标定原理

2D相机的手眼标定过程,看起来是需要机械臂位姿和相机检测结果,事实上,它利用的也是公式 AX = XB

我们先来推一下公式,很简单

手眼标定公式

  • 核心公式
    T o b j e c t − i n − b a s e    = T h a n d − i n − b a a s e ⋅ T c a m e r a − i n − h a n d ⋅ T o b j e c t − i n − c a m e r a T_{object-in-base\; }=T_{hand-in-baase}\cdot T_{camera-in-hand}\cdot T_{object-in-camera} Tobjectinbase=ThandinbaaseTcamerainhandTobjectincamera

  • 假设我有两组数据的话
    T p o s e 1 ⋅ T h a n d ⋅ T o b j e c t 1    =    T p o s e 2 ⋅ T h a n d ⋅ T o b j e c t 2 T_{pose1}\cdot T_{hand}\cdot T_{object1}\; =\; T_{pose2}\cdot T_{hand}\cdot T_{object2} Tpose1ThandTobject1=Tpose2ThandTobject2
    进行一下变换
    T p o s e 1 − 1 ⋅ T p o s e 2 ⋅ T h a n d    =    T h a n d ⋅ T o b j e c t 1 ⋅ T o b j e c t 2 − 1 T_{pose1}^{-1}\cdot T_{pose2}\cdot T_{hand}\; =\; T_{hand}\cdot T_{object1}\cdot T_{object2}^{-1} Tpose11Tpose2Thand=ThandTobject1Tobject21

  • 则公式变为
    A X = X B AX=XB AX=XB
    其中
    A    =    T p o s e 1 − 1 ⋅ T p o s e 2 A\; = \; T_{pose1}^{-1}\cdot T_{pose2} A=Tpose11Tpose2
    B    =    T o b j e c t 1 ⋅ T o b j e c t 2 − 1 B\; =\; T_{object1}\cdot T_{object2}^{-1} B=Tobject1Tobject21

AX = XB是西尔维斯特方程的一种特殊形式
西尔维斯特方程(Sylvester equation)是控制理论中的矩阵方程,形式如下:
A X + X B = C {AX+XB=C} AX+XB=C
其中A、B及C是已知的矩阵,问题是要找出符合条件的X。其中所有矩阵的系数都是复数。为了要使方程成立,矩阵的行和列需要满足一定条件,A和B都要是方阵,大小分别是n和m,而X和C要是n行m列的矩阵,n和m也可以相等,四个矩阵都是大小相同的方阵。有兴趣可以自行去研究,我没深究。

AX = XB

由于变换了公式,所以在完成手眼标定过程中,我们将不再需要物体在相机中的位姿了。因此,3D点云相机的手眼标定,可以使用两片点云的相对位姿

这个步骤跳跃的非常优雅。原因在于:使用点云相机在估计物体的位姿,实际上是一个高精度的算法工作,而进行手眼标定过程往往是机械臂项目的开始。我们不希望,连手眼标定矩阵都没搞好,就去准确的估计物体位姿了。

我们可以说,使用AX = XB的方法,能在手眼标定过程中,暂时不去优化待检测物体的位姿估计,能够快速的完成机械臂的环境搭建工作

代码

想要用代码完成手眼标定,请看我的这篇文章
点云相机手眼标定代码——利用PCL库的ICP算法完成手眼标定

想要学习求解AX = XB的两种经典算法,可以看这篇
C++求解AX = XB

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐