双目对物体定位

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
// 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值