完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include "arhs_ekf.h" #include "stdlib.h" #include float Pitch,Roll,Yaw; float Ak[16]={0};//Ô¤²â¾ØÕó float q[4]={1,0,0,0};//³õʼ»¯ËÄÔªÊý float Pk1[16]= {0.0001 ,0.00001 ,0.00001 ,0.00001, 0.00001,0.0001 ,0.00001 ,0.00001, 0.00001,0.00001 ,0.0001 ,0.00001, 0.00001,0.00001 ,0.00001 ,0.0001 };//*0.001з½²î¾ØÕó³õʼֵ float Qk[16] ={0.000001 , 0 , 0 , 0 , 0 , 0.000001 , 0 , 0 , 0 , 0 , 0.000001 , 0 , 0 , 0 , 0 , 0.000001 };//Ô¤²â¸ß˹ÔëÉù float Rk1[9]= {300,0,0, 0,300,0, 0,0,300};//²âÁ¿¸ß˹ÔëÉù float Eye[16]={1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1};//4άµ¥Î»¾ØÕó float Pk[16]={0};//Ô¤²âз½²î¾ØÕó float R2[3]={0};//×ø±êת»»¾ØÕóµÚ¶þÁÐ float R3[3]={0};//×ø±êת»»¾ØÕóµÚÈýÁÐ float J3[12]={0};//R3µÄÑſɱȾØÕó float Kk1[12]={0};//¿¨¶ûÂüÔöÒæKk1 float Pk_1[16]={0};//¼ÓËÙ¶ÈÔ¤²âз½²î void MatrixAdd(float *a, float *b, float *c, unsigned char m, unsigned char n); void MatrixMinus(float *a, float *b, float *c, unsigned char m, unsigned char n); void MatrixTrans(float *a, float *c, unsigned char m, unsigned char n); void MatrixMul(float *a, float *b, float *c, unsigned char m, unsigned char p, unsigned char n); void MatrixCal(float *a, float *b, float *c, unsigned char n); unsigned char Gauss_Jordan(float *a, unsigned char n); float invs_qrt(float x); //¾ØÕóÔËË㺯Êý³õʼ»¯ float g=9.79973; float TEMP3[12]={0};//Öмä±äÁ¿TEMP3 Hk1תÖà float TEMP4[12]={0};//Öмä±äÁ¿TEMP4 float TEMP5[9]={0};//Öмä±äÁ¿TEMP5 float TEMP6[12]={0};//Öмä±äÁ¿TEMP6 float TEMP7[9]={0};//Öмä±äÁ¿TEMP7 float TEMP10[16]={0}; float norm_a=0;//·ÀÖ¹Êý¾Ý·¢É¢ float norm_q=0; float norm_qt=0; float norm_g=0; float TEMP8[16]={0};//Öмä±äÁ¿ float TEMP9[16]={0}; float Hk1[12]={0};//AccÑſɱȸ³Öµ float qe1[4]={0};//¼ÓËٶȼÆËã³öµÄËÄÔªÊýÎó²î float ae1[3]={0};//Öмä±äÁ¿ void ARHS_EkfFilter(float ax,float ay,float az,float mx,float my,float mz, float dT) { float gx=Gyro_Filter_Data.X*Gyro_Rates;//½ÇËٶȻ¡¶È»¯ float gy=Gyro_Filter_Data.Y*Gyro_Rates; float gz=Gyro_Filter_Data.Z*Gyro_Rates; q[0]+= (-gx*q[1]-gy*q[2]-gz*q[3])*dT*0.5;//halfTΪÖÜÆÚ q[1]+= ( gx*q[0]+gz*q[2]-gy*q[3])*dT*0.5; q[2]+= ( gy*q[0]-gz*q[1]+gx*q[3])*dT*0.5; q[3]+= ( gz*q[0]+gy*q[1]-gx*q[2])*dT*0.5; norm_q=invs_qrt(q[0]*q[0]+q[1]*q[1]+q[2]*q[2]+q[3]*q[3]); //Ô¤²âËÄÔªÊý¹éÒ»»¯ q[0]=q[0]*norm_q; q[1]=q[1]*norm_q; q[2]=q[2]*norm_q; q[3]=q[3]*norm_q;//X=A*Xk-1 Ak[0]= 1.0; Ak[1]= -0.5*gx*dT; Ak[2]= -0.5*gy*dT; Ak[3]= -0.5*gy*dT; Ak[4]= 0.5*gx*dT; Ak[5]= 1.0; Ak[6]= 0.5*gz*dT; Ak[7]= -0.5*gy*dT; Ak[8]= 0.5*gy*dT; Ak[9]= -0.5*gz*dT; Ak[10]= 1.0; Ak[11]= 0.5*gx*dT; Ak[12]= 0.5*gz*dT; Ak[13]= 0.5*gy*dT; Ak[14]= -0.5*gx*dT; Ak[15]= 1.0;//Ô¤²â¾ØÕó MatrixCal(Ak,Pk1,TEMP10,4); MatrixAdd(TEMP10,Qk,Pk,4,4);//Pk=Ak*Pk_1*Ak'+Qk ¹«Ê½2 if((ax*ay*az)==0) return;//Èç¹ûÊý¾Ý²»¶Ô¾Í·µ»Ø norm_a=invs_qrt(ax*ax+ay*ay+az*az); ax=ax*norm_a*g; ay=ay*norm_a*g; az=az*norm_a*g;//¼ÓËٶȼÆÊý¾Ý¹éÒ»»¯ R3[0]=(2.0*q[1]*q[3]-2.0*q[0]*q[2])*g; R3[1]=(2.0*q[2]*q[3]+2.0*q[0]*q[1])*g; R3[2]=(2.0*q[0]*q[0]+2.0*q[3]*q[3]-1)*g; //////////////////////////////// J3[0]= -2.0*q[2]*g; J3[1]= 2.0*q[3]*g; J3[2]= -2.0*q[0]*g; J3[3]= 2.0*q[1]*g; J3[4]= 2.0*q[1]*g; J3[5]= 2.0*q[0]*g; J3[6]= 2.0*q[3]*g; J3[7]= 2.0*q[2]*g; J3[8]= 2.0*q[0]*g; J3[9]= -2.0*q[1]*g; J3[10]= -2.0*q[2]*g; J3[11]= 2.0*q[3]*g; ///////////////////// for(uint8_t i=0;i<12;i++ ) { Hk1=J3; } //////////// MatrixTrans(Hk1,TEMP3,3,4);//TEMP3ΪתÖà MatrixMul(Hk1,Pk,TEMP6,3,4,4);//3*4 MatrixMul(TEMP6,TEMP3,TEMP5,3,4,3);//3*3 tEMP5 MatrixAdd(TEMP5,Rk1,TEMP7,3,3);//TEMP7 3*3 Gauss_Jordan(TEMP7,3);//¾ØÕóÇóÄæ TEMP7 MatrixMul(Pk,TEMP3,TEMP4,4,4,3);//Pk*Hk1' TEMP4 4*3 MatrixMul(TEMP4,TEMP7,Kk1,4,3,3);//4*3 Kk1=P_k*Hk1'*inv(Hk1*P_k*Hk1'+Rk1);¹«Ê½3 // ae1[0]=ax-R3[0]; ae1[1]=ay-R3[1]; ae1[2]=az-R3[2]; //ae1[0]=ay*R3[2]-az*R3[1]; //ae1[1]=az*R3[0]-ax*R3[2]; //ae1[2]=ax*R3[1]-ay*R3[0]; qe1[0]=Kk1[0]*ae1[0]+Kk1[1]*ae1[1]+Kk1[2]*ae1[2]; qe1[1]=Kk1[3]*ae1[0]+Kk1[4]*ae1[1]+Kk1[5]*ae1[2]; qe1[2]=Kk1[6]*ae1[0]+Kk1[7]*ae1[1]+Kk1[8]*ae1[2]; qe1[3]=Kk1[9]*ae1[0]+Kk1[10]*ae1[1]+Kk1[11]*ae1[2];//¼ÓËٶȹÀ¼ÆµÄÎó²îqe1 q[0]=q[0]+qe1[0]; q[1]=q[1]+qe1[1]; q[2]=q[2]+qe1[2]; q[3]=q[3]+qe1[3];//¹À¼Æ×îÓÅËÄÔªÊý&&µ¥Î»»¯ /////////////////////////////// MatrixMul(Kk1,Hk1,TEMP8,4,3,4);//4*4 MatrixMinus(Eye,TEMP8,TEMP9,4,4); MatrixMul(TEMP9,Pk,Pk_1,4,4,4); //Pk_1=(eye(4)-Kk1*Hk1)*P_k; for(uint8_t i=0;i<16;i++) { Pk1 = Pk_1; }//¸³Ö norm_qt=invs_qrt(q[0]*q[0]+q[1]*q[1]+q[2]*q[2]+q[3]*q[3]); q[0]=q[0]*norm_qt; q[1]=q[1]*norm_qt; q[2]=q[2]*norm_qt; q[3]=q[3]*norm_qt; Roll = atan2(2 *q[2]*q[3] + 2 *q[0]*q[1], -2 *q[1]*q[1]- 2 *q[2]*q[2] + 1)*57.3; // roll Pitch = asin(-2 *q[1]*q[3] + 2 *q[0]*q[2])*57.3; // pitch Yaw = atan2(2 *q[1]*q[2] + 2 *q[0]*q[3], -2 *q[2]*q[2] - 2 *q[3]*q[3] + 1)* 57.3; // yaw } //¾ØÕóÇóÄæ unsigned char Gauss_Jordan(float *a, unsigned char n) { signed char i,j,k,l,u,v; signed char is[3]; signed char js[3]; float d,p; for (k=0; k<=n-1; k++) { d=0.0; for (i=k; i<=n-1; i++) for (j=k; j<=n-1; j++) { l=i*n+j; p=fabs(a[l]); if (p>d) { d=p; is[k]=i; js[k]=j;} } if (d+1.0==1.0) { return(0); } if (is[k]!=k) for (j=0; j<=n-1; j++) { u=k*n+j; v=is[k]*n+j; p=a; a=a[v]; a[v]=p; } if (js[k]!=k) for (i=0; i<=n-1; i++) { u=i*n+k; v=i*n+js[k]; p=a; a=a[v]; a[v]=p; } l=k*n+k; a[l]=1.0/a[l]; for (j=0; j<=n-1; j++) if (j!=k) { u=k*n+j; a=a*a[l];} for (i=0; i<=n-1; i++) if (i!=k) for (j=0; j<=n-1; j++) if (j!=k) { u=i*n+j; a=a-a[i*n+k]*a[k*n+j]; } for (i=0; i<=n-1; i++) if (i!=k) { u=i*n+k; a=-a*a[l];} } for (k=n-1; k>=0; k--) { if (js[k]!=k) for (j=0; j<=n-1; j++) { u=k*n+j; v=js[k]*n+j; p=a; a=a[v]; a[v]=p; } if (is[k]!=k) for (i=0; i<=n-1; i++) { u=i*n+k; v=i*n+is[k]; p=a; a=a[v]; a[v]=p; } } return(1); } //¾ØÕóÏà¼Ó void MatrixAdd(float *a, float *b, float *c, unsigned char m, unsigned char n) { unsigned char i; for (i=0; i { c = a + b; } } //¾ØÕóÏà¼õ void MatrixMinus(float *a, float *b, float *c, unsigned char m, unsigned char n) { unsigned char i; for (i=0; i { c = a - b; } } //ÇóתÖà void MatrixTrans(float *a, float *c, unsigned char m, unsigned char n) { unsigned char i,j; for (i=0; i { for (j=0; j { c[i*m+j] = a[j*n+i]; //??m*n???,i*m+j??i?j????; ??n*m???,i*n+j??i?j???? } } } //¾ØÕóÏà³Ë void MatrixMul(float *a, float *b, float *c, unsigned char m, unsigned char p, unsigned char n) { unsigned char i,j,k; //???? for (i=0; i { for (j=0; j { c[i*n+j] = 0.0; for (k=0; k { //??????????? c[i*n+j] += a[i*p+k] * b[k*n+j]; //a[i*p+k]: ??k???,???a[]????i? //b[k*n+j]: ??k???,???a[]????j? } } } } //¼ÆËãA*B*A' void MatrixCal(float *a, float *b, float *c, unsigned char n) { float Temp1[16] = {0}; float Temp2[16] = {0}; MatrixMul(a, b, Temp1, n, n, n); MatrixTrans(a, Temp2, n, n); MatrixMul(Temp1, Temp2, c, n, n, n); } //¿ìËÙƽ·½¸ùËã·¨ float invs_qrt(float x) { float halfx = 0.5f * x; float y = x; long i = *(long*)&y; i = 0x5f3759df - (i>>1); y = *(float*)&i; y = y * (1.5f - (halfx * y * y)); return y; } |
|
相关推荐
|
|
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-移植前准备之git管理内核源码
1905 浏览 0 评论
【瑞萨RA2L1入门学习】+ MacOS安装e2studio
750 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-本地仓库管理之分支间的操作
791 浏览 0 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】3D 图形显示
665 浏览 0 评论
756 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12251 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-3 03:10 , Processed in 0.752018 second(s), Total 31, Slave 25 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号