zoukankan      html  css  js  c++  java
  • 双目对物体定位

    writen by wqj1212@yahoo.com.cn
    function y=DingWei(ul,vl,ur,vr,Gtb)
    Kl
    =[2237.01/3.368 0 310.29/3.368 0;0 2237.54/3.38 242.11/3.38 0;0 0 1 0];
    Kr
    =[2180.22/3.368 0  326.79/3.368 0;0 2180.43/3.38 247.89/3.38 0;0 0 1 0];
    Gctl
    = [-0.0057    0.9916    0.0122    9.3578;
       
    -1.0052   -0.0109   -0.0179      78.9181;
       
    -0.0224   -0.0267    1.0121       303.7695;
         
    0        0            0           1     ];
    Gctr
    = [-0.0105    0.9728    0.0239  33.9378;
         
    -0.9868   -0.0103   -0.0184   89.4880;
         
    -0.0296   -0.0199    1.0114   305.9265;
           
    0        0            0         1   ];

    %摄像机相对于base的坐标变换 
       G
    =inv(Gtb);

    Ml
    =Kl*Gctl*G;
    Mr
    =Kr*Gctr*G;

    %物体相对于机器人base的坐标
    Mll
    =[ul*Ml(3,1)-Ml(1,1)  ul*Ml(3,2)-Ml(1,2)   ul*Ml(3,3)-Ml(1,3);
         vl
    *Ml(3,1)-Ml(2,1)  vl*Ml(3,2)-Ml(2,2)   vl*Ml(3,3)-Ml(2,3);
         ur
    *Mr(3,1)-Mr(1,1)  ur*Mr(3,2)-Mr(1,2)   ur*Mr(3,3)-Mr(1,3);
         vr
    *Mr(3,1)-Mr(2,1)  vr*Mr(3,2)-Mr(2,2)   vr*Mr(3,3)-Mr(2,3)];
    Mlr
    =[Ml(1,4)-ul*Ml(3,4);Ml(2,4)-vl*Ml(3,4);Mr(1,4)-ur*Mr(3,4);Mr(2,4)-vr*Mr(3,4)];
    y
    =inv(Mll'*Mll)*Mll'*Mlr

    void CMObjRecDlg::OnButtonGrab() 
    {
        
    // TODO: Add your control notification handler code here
    #if 0
    double ul=0.0,vl=0.0,ur=0.0,vr=0.0;   double rl,rr=0.0;

            
    double a=0.0,b=0.0,r=0.0;
        
    double spd=2.0;
        
    short toolno=0;
       
    double p[12]={0,0,0,0,0,0,0,0,0,0,0,0};
          
    double q[12]={0,0,0,0,0,0,0,0,0,0,0,0};
        WORD rconf;
        mxArray 
    *Gtb=mxCreateDoubleMatrix(4,4,mxREAL);
            mxArray 
    *Result=mxCreateDoubleMatrix(1,1,mxREAL);
    mxArray 
    * prhs[5];

    CvPoint pointleft
    =CGrabProcess::ImageCenter(leftErzhi);
    CvPoint pointright
    =CGrabProcess::ImageCenter(rightErzhi);
    ul
    =8*pointleft.x;vl=8*pointleft.y;
    ur
    =8*pointright.x;vr=8*pointright.y;
    mxArray 
    *ull = mxCreateDoubleMatrix(1,1, mxREAL); 
    mxArray 
    *vll = mxCreateDoubleMatrix(1,1, mxREAL); 
    mxArray 
    *urr = mxCreateDoubleMatrix(1,1, mxREAL); 
    mxArray 
    *vrr = mxCreateDoubleMatrix(1,1, mxREAL); 
    memcpy(mxGetPr(ull),
    &ul,sizeof(double));
    memcpy(mxGetPr(vll),
    &vl,sizeof(double));
    memcpy(mxGetPr(urr),
    &ur,sizeof(double));
    memcpy(mxGetPr(vrr),
    &vr,sizeof(double));

        
    short g_nCid = TestOpenComm ( TEST_TRANS_MODE );    // mode = 0:RS-232C or 1:Etherne
        if( g_nCid < 0 )
        
    {
            AfxMessageBox(
    "open error");return;
        }

            
    //libDingWeiInitialize();
    /*        double spd=2.0;
        short toolno=0;
       double p[12]={0,0,0,0,0,0,0,0,0,0,0,0};
          double q[12]={0,0,0,0,0,0,0,0,0,0,0,0};
        WORD rconf;
    */


        CHECK_VOID(BscIsLoc(g_nCid,
    0,&rconf,p)==0);
        q[
    0]=p[0];q[1]=p[1];q[2]=p[2];q[3]=p[3];q[4]=p[4];q[5]=p[5];
        
    a
    =p[3]/180 *CV_PI;
    b
    =p[4]/180 *CV_PI;
    r
    =p[5]/180*CV_PI;
    /*    mxArray *Gtb=mxCreateDoubleMatrix(4,4,mxREAL);
            mxArray *Result=mxCreateDoubleMatrix(1,1,mxREAL);
    mxArray * prhs[5];
    */

    double C[16]={cos(r)*cos(b),sin(r)*cos(b),-sin(b),0,
    -sin(r)*cos(a)+cos(r)*sin(b)*sin(a),cos(r)*cos(a)+sin(r)*sin(b)*sin(a),cos(b)*sin(a),0,
    sin(r)
    *sin(a)+cos(r)*sin(b)*cos(a), -cos(r)*sin(a)+sin(r)*sin(b)*cos(a), cos(b)*cos(a),0,
    p[
    0],p[1],p[2],1}
    ;

    memcpy(mxGetPr(Gtb),C,
    16*sizeof(double));

    prhs[
    0]=ull;
    prhs[
    1]=vll;
    prhs[
    2]=urr;
    prhs[
    3]=vrr;
    prhs[
    4]=Gtb;

    libDingWeiInitialize();
    mlxDingwei(
    1&Result, 5, prhs);
     libDingWeiTerminate();
    /*for(int i=0;i<mxGetNumberOfElements(Result);i++)

        cout<<*(mxGetPr(Result)+i)<<endl;
    }
    */

    p[
    0]=*mxGetPr(Result)+18;
    p[
    1]=*(mxGetPr(Result)+1)+2;
    p[
    2]=-270;
    DWORD T1
    =GetTickCount();
    CHECK_VOID(BscMovj(g_nCid,
    20,"BASE",rconf,toolno, p)==0);
    DWORD T2
    =GetTickCount();
    DWORD T
    =T2-T1;
     
    /*p[0]=296.288;
     p[1]=483.657;
     p[2]=-219.261;
     p[3]=180;
     p[4]=19.52;
     p[5]=58.51;
    CHECK_VOID(BscMovj(g_nCid,20,"BASE",rconf,toolno, p)==0);
    p[0]=q[0];
     p[1]=q[1];
     p[2]=q[2];
     p[3]=q[3];
     p[4]=q[4];
     p[5]=q[5];
     CHECK_VOID(BscMovj(g_nCid,20,"BASE",rconf,toolno, p)==0);
    */



    #endif
    // 
    }

  • 相关阅读:
    什么是 Linux
    Java常用几种加密算法
    Java多线程
    SpringSecurity相关配置【SpringSecurityConfig】
    应用上下文配置【AppConfig】
    web.xml
    Web上下文配置【MvcConfig】
    SpringMVC4零配置--Web上下文配置【MvcConfig】
    HTML <meta> 标签 遇到<meta http-equiv="refresh" content="0; url=">详解
    java如何获取当前机器ip和容器port
  • 原文地址:https://www.cnblogs.com/wqj1212/p/1006414.html
Copyright © 2011-2022 走看看