| ²é¿´: 3428 | »Ø¸´: 13 | ||||||
| µ±Ç°Ö»ÏÔʾÂú×ãÖ¸¶¨Ìõ¼þµÄ»ØÌû£¬µã»÷ÕâÀï²é¿´±¾»°ÌâµÄËùÓлØÌû | ||||||
Ïë·ÉµÄÖíľ³æ (ÕýʽдÊÖ)
|
[½»Á÷]
¡¾Ô´´¡¿Áù×ÔÓɶȻúÆ÷ÈËJacobian(Ñſ˱È)¾ØÕó¼ÆËãÀà ÒÑÓÐ1È˲ÎÓë
|
|||||
|
×÷ÕߣºÏë·ÉµÄÖí ˵Ã÷£ºMLGetIdentityMatΪ»ñµÃµ¥Î»¾ØÕóº¯Êý MLMatMultiΪ¾ØÕóÏà³Ëº¯Êý ºÍOpenCVÇóÄæ¾ØÕóº¯ÊýcvInvertûÓиø³öÇë´ó¼Ò×Ô¼ºÐ´Ò»Ï£¡ºÜ¼òµ¥µÄ£¡ typedef struct RobotJacobian6 { //±äÁ¿! //¸÷¹Ø½Ú´«µÝ¾ØÕó! union { struct { double AMat[6][4][4]; }; double A0to1[4][4]; double A1to2[4][4]; double A2to3[4][4]; double A3to4[4][4]; double A4to5[4][4]; double A5to6[4][4]; }; union { struct { double TMat[6][4][4]; }; struct { double T0to6[4][4]; double T1to6[4][4]; double T2to6[4][4]; double T3to6[4][4]; double T4to6[4][4]; double T5to6[4][4]; }; }; //Ä©¶Ëλ×Ë! double EndPose[4][4]; //D-H²ÎÊý±í! double DHParam[6][4];//˳ÐòΪ£ºAngle d_L a_L a_A! //Ñſ˱ȾØÕó! double EndJacobian[6][6]; //ÄæÑſ˱ȾØÕó! double EndInvJacobian[6][6]; //»ù×ø±êµÄµÑ¿¨¶û΢·ÖÔ˶¯µ½Ä©¶Ë×ø±êµÄ´«µÝ¾ØÕó! double JBasetoEnd[6][6]; double T_1to6[4][4];//¸Ã¾ØÕóµÄ×Ë̬Óë»ù×ø±êÒ»Ö£¬Î»ÖÃÓëÄ©¶Ë×ø±êÒ»ÖÂ! //ÒÔ±ã¿ÉÒÔ°´ÕÕ»ù×ø±ê½øÐÐÆ½¶¯ºÍÈÆ»ù×ø±êÖá·½Ïòת¶¯! double mInput[6]; //ÊäÈë! double mOutput[6];//Êä³ö! int mMode; void GetAMat() { for (int i=0;i<6;i++) { MLGetDHTransMat(AMat,DHParam[0],DHParam[1],DHParam[2],DHParam[3]); } } void GetTMat() { MLGetIdentityMat(T5to6); MLMatMulti(AMat[5],T5to6); MLMatMulti(AMat[4],T5to6,T4to6); MLMatMulti(AMat[3],T4to6,T3to6); MLMatMulti(AMat[2],T3to6,T2to6); MLMatMulti(AMat[1],T2to6,T1to6); MLMatMulti(AMat[0],T1to6,T0to6); } void UpdateAngle(double Angles[6])//AnglesΪ»¡¶È! { for (int i=0;i<6;i++) { DHParam[0]=Angles; } GetAMat(); GetEndPose(); GetTMat(); GetEndJacobian(); GetEndInvJacobian(); GetJBasetoEnd(); } void Inti(double DHparameter[6][4]) { for (int i=0;i<6;i++) { for (int j=0;j<4;j++) { DHParam[j]=DHparameter[j]; } } GetAMat(); GetEndPose(); GetTMat(); GetEndJacobian(); GetEndInvJacobian(); GetJBasetoEnd(); for (i=0;i<6;i++) { mInput=0; mOutput=0; } mMode=BASE; } void GetEndPose() { MLGetIdentityMat(EndPose); for (int i=0;i<6;i++) { MLMatMulti(AMat[5-i],EndPose); } } void GetEndJacobian() { for (int i=0;i<6;i++) { EndJacobian[0]=-1*TMat[Xx][Nn]*TMat[Yy][Pp]+TMat[Yy][Nn]*TMat[Xx][Pp]; EndJacobian[1]=-1*TMat[Xx][Oo]*TMat[Yy][Pp]+TMat[Yy][Oo]*TMat[Xx][Pp]; EndJacobian[2]=-1*TMat[Xx][Aa]*TMat[Yy][Pp]+TMat[Yy][Aa]*TMat[Xx][Pp]; EndJacobian[3]=TMat[Zz][Nn]; EndJacobian[4]=TMat[Zz][Oo]; EndJacobian[5]=TMat[Zz][Aa]; } } void GetEndInvJacobian() { double Data1[36]; CvMat Mat1 = cvMat( 6,6,CV_64FC1,Data1); double Data2[36]; CvMat Mat2 = cvMat( 6,6,CV_64FC1,Data2); for (int i=0;i<6;i++) { for (int j=0;j<6;j++) { cvmSet(&Mat1,i,j,EndJacobian[j]); } } cvInvert(&Mat1,&Mat2,CV_SVD); for (i=0;i<6;i++) { for (int j=0;j<6;j++) { EndInvJacobian[j]=cvmGet(&Mat2,i,j); } } } void EndOutput(double Input[6], double Output[6])//OutputΪ½ÇËÙ¶È! { MLMatMulti_3(EndInvJacobian,Input,Output); } void GetJBasetoEnd() { double TransMat[4][4]; MLGetIdentityMat(TransMat); TransMat[0][3]=-1*EndPose[0][3]; TransMat[1][3]=-1*EndPose[1][3]; TransMat[2][3]=-1*EndPose[2][3]; MLMatMulti(TransMat,EndPose,T_1to6); JBasetoEnd[0][0]=T_1to6[Xx][Nn]; JBasetoEnd[0][1]=T_1to6[Yy][Nn]; JBasetoEnd[0][2]=T_1to6[Zz][Nn]; JBasetoEnd[1][0]=T_1to6[Xx][Oo]; JBasetoEnd[1][1]=T_1to6[Yy][Oo]; JBasetoEnd[1][2]=T_1to6[Zz][Oo]; JBasetoEnd[2][0]=T_1to6[Xx][Aa]; JBasetoEnd[2][1]=T_1to6[Yy][Aa]; JBasetoEnd[2][2]=T_1to6[Zz][Aa]; for (int i=3;i<6;i++) { for (int j=0;j<3;j++) { JBasetoEnd[j]=0; } } JBasetoEnd[3][3]=T_1to6[Xx][Nn]; JBasetoEnd[3][4]=T_1to6[Yy][Nn]; JBasetoEnd[3][5]=T_1to6[Zz][Nn]; JBasetoEnd[4][3]=T_1to6[Xx][Oo]; JBasetoEnd[4][4]=T_1to6[Yy][Oo]; JBasetoEnd[4][5]=T_1to6[Zz][Oo]; JBasetoEnd[5][3]=T_1to6[Xx][Aa]; JBasetoEnd[5][4]=T_1to6[Yy][Aa]; JBasetoEnd[5][5]=T_1to6[Zz][Aa]; JBasetoEnd[0][3]=T_1to6[Yy][Pp]*T_1to6[Zz][Nn]-T_1to6[Zz][Pp]*T_1to6[Yy][Nn];//(P¡ÁN)x JBasetoEnd[0][4]=T_1to6[Zz][Pp]*T_1to6[Xx][Nn]-T_1to6[Xx][Pp]*T_1to6[Zz][Nn];//(P¡ÁN)y JBasetoEnd[0][5]=T_1to6[Xx][Pp]*T_1to6[Yy][Nn]-T_1to6[Yy][Pp]*T_1to6[Xx][Nn];//(P¡ÁN)z JBasetoEnd[1][3]=T_1to6[Yy][Pp]*T_1to6[Zz][Oo]-T_1to6[Zz][Pp]*T_1to6[Yy][Oo];//(P¡ÁO)x JBasetoEnd[1][4]=T_1to6[Zz][Pp]*T_1to6[Xx][Oo]-T_1to6[Xx][Pp]*T_1to6[Zz][Oo];//(P¡ÁO)y JBasetoEnd[1][5]=T_1to6[Xx][Pp]*T_1to6[Yy][Oo]-T_1to6[Yy][Pp]*T_1to6[Xx][Oo];//(P¡ÁO)z JBasetoEnd[2][3]=T_1to6[Yy][Pp]*T_1to6[Zz][Aa]-T_1to6[Zz][Pp]*T_1to6[Yy][Aa];//(P¡ÁA)x JBasetoEnd[2][4]=T_1to6[Zz][Pp]*T_1to6[Xx][Aa]-T_1to6[Xx][Pp]*T_1to6[Zz][Aa];//(P¡ÁA)y JBasetoEnd[2][5]=T_1to6[Xx][Pp]*T_1to6[Yy][Aa]-T_1to6[Yy][Pp]*T_1to6[Xx][Aa];//(P¡ÁA)z } void BaseOutput(double BaseInput[6], double Output[6])//OutputΪ½ÇËÙ¶È! { double EndInput[6]; MLMatMulti_3(JBasetoEnd,BaseInput,EndInput); EndOutput(EndInput,Output); } void SetInput(double Input[6]) { for (int i=0;i<6;i++) { mInput=Input; } } void SetMode(int mode) { mMode=mode; } void GetOutput(int mode=BASE) { int i=0; int j=0; switch(mode) { case eND: EndOutput(mInput,mOutput); break; case BASE: BaseOutput(mInput,mOutput); break; } } RobotJacobian6() { } RobotJacobian6(double DHparameter[6][4]) { Inti(DHparameter); } }MLJacobian; |
» ÊÕ¼±¾ÌûµÄÌÔÌûר¼ÍƼö
»úÆ÷È˼¼Êõר¼ | À¶´ü | »úÆ÷ÈËѧ |
» ²ÂÄãϲ»¶
272·Ö²ÄÁÏ×ÓÇóµ÷¼Á
ÒѾÓÐ36È˻ظ´
275Çóµ÷¼Á
ÒѾÓÐ8È˻ظ´
µ÷¼ÁÇóÊÕÁô
ÒѾÓÐ5È˻ظ´
Ò»Ö¾Ô¸211£¬»¯Ñ§Ñ§Ë¶£¬310·Ö£¬±¾¿ÆÖصãË«·Ç£¬Çóµ÷¼Á
ÒѾÓÐ20È˻ظ´
070300»¯Ñ§Ñ§Ë¶311·ÖÇóµ÷¼Á
ÒѾÓÐ19È˻ظ´
²ÄÁÏÓ뻯¹¤µ÷¼Á
ÒѾÓÐ13È˻ظ´
²ÄÁÏÓ뻯¹¤µ÷¼Á
ÒѾÓÐ33È˻ظ´
¸´ÊÔµ÷¼Á
ÒѾÓÐ7È˻ظ´
Ò»Ö¾Ô¸¹þ¹¤´ó 085600 277 12²Ä¿Æ»ùÇóµ÷¼Á
ÒѾÓÐ17È˻ظ´
»¹Óл¯¹¤¶þÂÖµ÷¼ÁµÄѧУÂð
ÒѾÓÐ47È˻ظ´
» ±¾Ö÷ÌâÏà¹Ø¼ÛÖµÌùÍÆ¼ö£¬¶ÔÄúͬÑùÓаïÖú:
Äæ¾ØÕóÖеÄijһÁеĺÍÓëÔ¾ØÕóÊÇʲô¹ØÏµ£¿ÈçºÎ¼ÆË㣿
ÒѾÓÐ4È˻ظ´
¹ØÓÚ»ùÓÚVCµÄ¾ØÕóÀà
ÒѾÓÐ3È˻ظ´
×ÔÓɶȵ½µ×ÊÇÔõôËãµÄ°¡£¡
ÒѾÓÐ3È˻ظ´
ËÄ×ÔÓɶȲ½ÐлúÆ÷È˽ṹÉè¼Æ
ÒѾÓÐ5È˻ظ´
ÔÚ×ø±êת»»ÀJacobian¾ØÕóµ½µ×ÔõôÓõÄ
ÒѾÓÐ5È˻ظ´
ÇóC++ MFC¾ØÕóÏà³Ë´úÂ룡£¡£¡
ÒѾÓÐ5È˻ظ´
ÈçºÎÐÞ¸ÄÑſ˱ȾØÕó
ÒѾÓÐ4È˻ظ´
×ÔÓɶȵļÆË㣬Çó½â
ÒѾÓÐ7È˻ظ´
´ÓÐÄÀíѧ½Ç¶È¿´»úÆ÷ÈËÒª¾ß±¸Öǻ۵Ĺؼü¼¸²½
ÒѾÓÐ3È˻ظ´
¡¾ÇóÖú¡¿¾ØÕóÏà³Ë
ÒѾÓÐ8È˻ظ´
ytinghost3
Ìú¸Ëľ³æ (ÖøÃûдÊÖ)
- Ó¦Öú: 113 (¸ßÖÐÉú)
- ½ð±Ò: 7263.5
- É¢½ð: 611
- ºì»¨: 31
- Ìû×Ó: 2940
- ÔÚÏß: 339.7Сʱ
- ³æºÅ: 931663
- ×¢²á: 2009-12-21
- רҵ: »ú¹¹Ñ§Óë»úÆ÷ÈË

10Â¥2011-09-01 22:14:38













»Ø¸´´ËÂ¥