手眼标定算法---Sai-Lenz(A New Technique for Fully Autonomous and Efficient 3D Robotics Hand/Eye Calibrati)

 本文主要是讲解经典手眼标定问题中的TSAI-LENZ 文献方法,参考文献为“A New Technique for Fully Autonomous and Efficient 3D Robotics Hand/Eye Calibration”  转自:https://blog.csdn.net/YunlinWang/article/details/51622143


手眼标定问题描述

       在机器人校准测量、机器人手眼协调以及机器人辅助测量等领域,都要求知道机器人执行器末端(抓取臂)坐标系和传感器(比如用来测量三维空间中目标位置和方向并固定在机器人手上的摄像机)坐标系之间的相互关系,确定这种转换关系在机器人领域就是通常所说的手眼标定

       将手眼标定系统如下图所示,其中HgijHgij为机器人执行器末端坐标系之间相对位置姿态的齐次变换矩阵;HcijHcij为摄像机坐标系之间相对位置姿态的齐次变换矩阵;HcgHcg为像机与机器人执行器末端之间的相对位置姿态齐次矩阵。

手眼标定系统

       经过坐标系变换,HgijHgij、HcijHcij和HcgHcg满足如下关系: 

               

将上式展开,可以得到手眼标定的基本方程: 

                                                   
       因此,手眼标定问题也就转化为从上述方程组中求解出RcgRcg和TcgTcg,下面就按照TSAI文献所述求解该方程组。


“两步法”手眼标定

       一般用“两步法”求解基本方程,即先从基本方程上式求解出RcgRcg,再代入下式求解出TcgTcg。在TSAI文献中引入旋转轴-旋转角系统来描述旋转运动来进行求解该方程组,具体的公式推导可以查看原始文献,这里只归纳计算步骤,不明白的地方可阅读文献,计算步骤如下:

Step1:利用罗德里格斯变换将旋转矩阵转换为旋转向量

                                            

Step2:向量归一化

                                           

Step3:修正的罗德里格斯参数表示姿态变化

                                            

Step4:计算初始旋转向量P′cg

                                    

       其中,skew为反对称运算,假设一个三维向量V=[vx;vy;vz],其反对称矩阵为: 

                                     

Step5:计算旋转向量Pcg

                                        

Step6:计算旋转矩阵Rcg

                      

Step7:计算平移向量Tcg

                                   

算法源代码

根据上述基本计算步骤,在利用OpenCV 2.0开源库的基础上,编写Tsai手眼标定方法的c++程序,其实现函数代码如下:

void Tsai_HandEye(Mat Hcg, vector<Mat> Hgij, vector<Mat> Hcij)
{
    CV_Assert(Hgij.size() == Hcij.size());
    int nStatus = Hgij.size();

    Mat Rgij(3, 3, CV_64FC1);
    Mat Rcij(3, 3, CV_64FC1);

    Mat rgij(3, 1, CV_64FC1);
    Mat rcij(3, 1, CV_64FC1);

    double theta_gij;
    double theta_cij;

    Mat rngij(3, 1, CV_64FC1);
    Mat rncij(3, 1, CV_64FC1);

    Mat Pgij(3, 1, CV_64FC1);
    Mat Pcij(3, 1, CV_64FC1);

    Mat tempA(3, 3, CV_64FC1);
    Mat tempb(3, 1, CV_64FC1);

    Mat A;
    Mat b;
    Mat pinA;

    Mat Pcg_prime(3, 1, CV_64FC1);
    Mat Pcg(3, 1, CV_64FC1);
    Mat PcgTrs(1, 3, CV_64FC1);

    Mat Rcg(3, 3, CV_64FC1);
    Mat eyeM = Mat::eye(3, 3, CV_64FC1);

    Mat Tgij(3, 1, CV_64FC1);
    Mat Tcij(3, 1, CV_64FC1);

    Mat tempAA(3, 3, CV_64FC1);
    Mat tempbb(3, 1, CV_64FC1);

    Mat AA;
    Mat bb;
    Mat pinAA;

    Mat Tcg(3, 1, CV_64FC1);

    for (int i = 0; i < nStatus; i++)
    {
        Hgij[i](Rect(0, 0, 3, 3)).copyTo(Rgij);
        Hcij[i](Rect(0, 0, 3, 3)).copyTo(Rcij);

        Rodrigues(Rgij, rgij);
        Rodrigues(Rcij, rcij);

        theta_gij = norm(rgij);
        theta_cij = norm(rcij);

        rngij = rgij / theta_gij;
        rncij = rcij / theta_cij;

        Pgij = 2 * sin(theta_gij / 2)*rngij;
        Pcij = 2 * sin(theta_cij / 2)*rncij;

        tempA = skew(Pgij + Pcij);
        tempb = Pcij - Pgij;

        A.push_back(tempA);
        b.push_back(tempb);
    }

    //Compute rotation
    invert(A, pinA, DECOMP_SVD);

    Pcg_prime = pinA * b;
    Pcg = 2 * Pcg_prime / sqrt(1 + norm(Pcg_prime) * norm(Pcg_prime));
    PcgTrs = Pcg.t();   
    Rcg = (1 - norm(Pcg) * norm(Pcg) / 2) * eyeM + 0.5 * (Pcg * PcgTrs + sqrt(4 - norm(Pcg)*norm(Pcg))*skew(Pcg));

    //Computer Translation 
    for (int i = 0; i < nStatus; i++)
    {
        Hgij[i](Rect(0, 0, 3, 3)).copyTo(Rgij);
        Hcij[i](Rect(0, 0, 3, 3)).copyTo(Rcij);
        Hgij[i](Rect(3, 0, 1, 3)).copyTo(Tgij);
        Hcij[i](Rect(3, 0, 1, 3)).copyTo(Tcij);


        tempAA = Rgij - eyeM;
        tempbb = Rcg * Tcij - Tgij;

        AA.push_back(tempAA);
        bb.push_back(tempbb);
    }

    invert(AA, pinAA, DECOMP_SVD);
    Tcg = pinAA * bb;

    Rcg.copyTo(Hcg(Rect(0, 0, 3, 3)));
    Tcg.copyTo(Hcg(Rect(3, 0, 1, 3)));
    Hcg.at<double>(3, 0) = 0.0;
    Hcg.at<double>(3, 1) = 0.0;
    Hcg.at<double>(3, 2) = 0.0;
    Hcg.at<double>(3, 3) = 1.0;

}

 

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 手眼标定算法是一种重要的基于机器视觉的算法,用于计算机器人机构的姿态信息。其核心是将机械臂(s)的末端效应器(e)和机器人手眼系(c)之间的关系建立起来。这种算法基于一组机器人手眼系统的标定点,通过计算机算法得出机器人起始手臂底座坐标系(b)与相机坐标系(p)之间的相对关系。形象地说,目标就是计算出机器人的位置和方向,使得机器人运动过程中的末端执行器能够精确地执行预定的任务。这种算法有利于提高机器人的操作精度和运动速度,使得机器人在工业和服务行业中得到更广泛的应用。 手眼标定算法包括两个主要步骤: 1.手眼标定数据采集。该步骤旨在获取一组机器人手臂和相机位置的数据,以计算机编程方式将其转换成数字信号,用于后续的计算和分析。数据采集的主要任务是确定物体在相机空间中的位置和方向,这样机器人就可以准确地处理该物体。 2.手眼标定计算。该步骤将先前采集的数据输入到计算机程序中,并计算机器人起始手臂底座坐标系和相机坐标系之间的变换矩阵。这个变换矩阵是一组用于计算机器人位置和方向的数学变换公式。 总之,手眼标定算法在控制机器人的运动过程中发挥重要作用,提高了机器人的精度和速度,为机器人在工业和服务行业中的应用提供了有力支持。 ### 回答2: 手眼标定算法,也称为eye-to-hand calibration,是指在机器人控制中,将机器人末端执行器的坐标系与机器人基座坐标系进行校准的过程。目的是为了达到控制机器人末端执行器的位置和姿态时,能与机器人基座坐标系之间建立良好的关系,使机器人能够准确地执行任务。手眼标定算法在机器人应用中非常重要,因为它保证了机器人的准确性和稳定性。 手眼标定算法的过程分为两个部分:手眼标定和坐标变换。在手眼标定过程中,需要对机器人末端执行器和摄像头进行标定,确定它们各自的坐标系。在坐标变换中,将机器人末端执行器和摄像头的坐标系进行转换,以使它们两个坐标系相互关联。这个过程的关键是找到一组准确的变换矩阵,将机器人的坐标系与摄像头的坐标系之间的关系确定下来。 手眼标定算法有许多方法和技术可供选择,包括基于线性代数的方法、角度差法、四元数法等。在实际应用中,用户需要依据具体的场景,选择合适的方法和算法。总的来说,手眼标定算法是机器人控制和应用中不可或缺的一部分,它对机器人的精度、稳定性和效率都有着至关重要的影响。 ### 回答3: 手眼标定指的是利用机器人控制器控制机械臂末端执行器的运动来确定相机与机器人的运动之间的关系。手眼标定算法可以用于改善机器人视觉导航的精度和准确性,使机器人可以在运动中对环境进行快速和精确的感知。 手眼标定算法包括两种方法:手眼标定与眼手标定。在手眼标定中,机器人的手部和相机的位置和姿态都是已知的,通过对它们的运动进行测量,并分析它们的关系来估计它们之间的变换矩阵。而在眼手标定中,相机被移动到多个位置来捕捉机器人手部的不同位置,通过计算相机和机器人手部之间的运动变换矩阵,来进行标定手眼标定算法不仅可以用于机器人视觉导航,还可以用于了解机器人在空间中的绝对位置和姿态,以及机器人的关节抖动等问题。此外,手眼标定算法还可以用于机器人在协作操作中的运动控制,通过将相机和机器人手部相对位置的变化进行跟踪,可以快速和准确地匹配两者的运动。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值