Changeset 1226 for applications/pmsm
- Timestamp:
- 10/22/10 21:15:11 (14 years ago)
- Location:
- applications/pmsm/simulator_zdenek
- Files:
-
- 3 modified
Legend:
- Unmodified
- Added
- Removed
-
applications/pmsm/simulator_zdenek/CMakeLists.txt
r1202 r1226 3 3 4 4 EXEC (test_UD pmsmsim ekf_obj) 5 EXEC (test_Ch pmsmsim ekf_obj) -
applications/pmsm/simulator_zdenek/ekf_example/ekf_obj.cpp
r1201 r1226 51 51 52 52 53 //BM::ll = -0.5* ( 4 * 1.83787706640935 +log ( det ( Pfull ) ) +xdif* ( inv(Pfull)*xdif ) );*/53 // BM::ll = -0.5* ( 4 * 1.83787706640935 +log ( det ( Pfull ) ) +xdif* ( inv(Pfull)*xdif ) );*/ 54 54 } 55 55 }; … … 174 174 cG=prevod(Tv*Wref*4/Thetaref,15); 175 175 // cH=prevod(Tv*Wref*Fmag/Iref/Ls*Thetaref,15); 176 cH=prevod(Tv*Wref*Fmag/Iref/Ls,1 5);176 cH=prevod(Tv*Wref*Fmag/Iref/Ls,17); //cB in q 177 177 // cI=prevod(kp*p*p*Tv*Fmag*Iref/J/Wref*Thetaref); 178 178 … … 401 401 // vypocet napeti v systemu (x,y) 402 402 int uf[2]; 403 uf[0]=prevod(ux/Uref, Qm);404 uf[1]=prevod(uy/Uref, Qm);403 uf[0]=prevod(ux/Uref,15); 404 uf[1]=prevod(uy/Uref,15); 405 405 406 406 int Y_mes[2]; 407 407 // zadani mereni 408 Y_mes[0]=prevod(isxd/Iref, Qm);409 Y_mes[1]=prevod(isyd/Iref, Qm);410 408 Y_mes[0]=prevod(isxd/Iref,15); 409 Y_mes[1]=prevod(isyd/Iref,15); 410 411 411 ////// vlastni rutina EKF -- ///////////////////////// 412 412 int t_sin,t_cos, tmp; … … 418 418 t_cos=prevod(cos(Thetaref*x_est[3]/32768.),15); 419 419 420 tmp=((long)cB*x_est[2])>>15; 421 x_est[0]=((long)cA*x_est[0]+(long)tmp*t_sin+(long)cC*(uf[0]<<2))>>15; 422 x_est[1]=((long)cA*x_est[1]-(long)tmp*t_cos+(long)cC*(uf[1]<<2))>>15; 420 tmp=((long)cB*x_est[2])>>15; // q15*q13 -> q13 421 // q15*q13 + q13*q15 + q15*q13?? 422 x_est[0]=((long)cA*x_est[0]+(long)tmp*t_sin+(long)cC*(uf[0]))>>15; // in q13 423 x_est[1]=((long)cA*x_est[1]-(long)tmp*t_cos+(long)cC*(uf[1]))>>15; // q13 423 424 x_est[2]=x_est[2]; 425 // q15 + q15*q13 424 426 x_est[3]=(((long)x_est[3]<<15)+(long)cG*x_est[2])>>15; 425 427 … … 428 430 429 431 //void EKFfixed::update_psi(void) 430 { 432 { 431 433 PSI[2]=((long)cB*t_sin)>>15; 432 tmp=((long)c B*x_est[2])>>15;434 tmp=((long)cH*x_est[2])>>15; // ! cH =cB with different scale!! 433 435 PSI[3]=((long)tmp*t_cos)>>15; 434 436 PSI[6]=-((long)cB*t_cos)>>15; … … 456 458 457 459 int difz[2]; 458 difz[0]=(Y_mes[0] <<2)-x_est[0]; // Y_mes in q13!!459 difz[1]=(Y_mes[1] <<2)-x_est[1];460 difz[0]=(Y_mes[0]-x_est[0]); // shift to q15!! 461 difz[1]=(Y_mes[1]-x_est[1]);//<<2; 460 462 461 463 { 462 vec dd(4);dd(0)=Y_mes[0];dd(1)=Y_mes[1]; dd(2)=difz[0]; dd(3)=difz[1];463 log_level.store(logD, dd);464 ivec dd(Df,4);//;dd(0)=Y_mes[0];dd(1)=Y_mes[1]; dd(2)=difz[0]; dd(3)=difz[1]; 465 log_level.store(logD,get_from_ivec(dd)); 464 466 } 465 467 466 468 //bierman(int *difz, int *xp, int *U, int *D, int *R, unsigned int dimy, unsigned int dimx ); 467 469 int dR[2];dR[0]=R[0];dR[1]=R[3]; 470 //int xb[4]; xb[0]=x_est[0]<<2; xb[1]=x_est[1]<<2; xb[2]=x_est[2]<<2; xb[3]=x_est[3]; 468 471 bierman(difz,x_est,Uf,Df,dR,2,4); 472 //x_est[0] = xb[0]>>2; x_est[1]=xb[1]>>2; x_est[2]=xb[2]>>2; x_est[3]=xb[3]; 469 473 470 474 // navrat estimovanych hodnot regulatoru … … 475 479 (mu)(3)=zprevod(x_est[3],15)*Thetaref; 476 480 481 //x_est[2]=x[2]*32768/Wref; 482 //x_est[3]=x[3]*32768/Thetaref; 477 483 // mat T=diag(concat(vec_2(Iref,Iref), vec_2(Wref,Thetaref))); 478 484 } … … 486 492 Q[15]=prevod(0.0001,15); // 1e-3 487 493 488 Uf[0]=0x7FFF; // 0.05494 Uf[0]=0x7FFF;// ! // 0.05 489 495 Uf[1]=Uf[2]=Uf[3]=Uf[4]=0; 490 Uf[5]=0x7FFF; 496 Uf[5]=0x7FFF;//! 491 497 Uf[6]=Uf[6]=Uf[8]=Uf[9]=0; 492 Uf[10]=0x7FFF; // 1e-3498 Uf[10]=0x7FFF;//! // 1e-3 493 499 Uf[11]=Uf[12]=Uf[13]=Uf[4]=0; 494 500 Uf[15]=0x7FFF; // 1e-3 495 501 496 Df[0]= 0x7FFF;497 Df[1]= 0x7FFF;498 Df[2]= 0x7FFF;499 Df[3]= 0x7FFF;502 Df[0]=1<<14; 503 Df[1]=1<<14; 504 Df[2]=1<<14; 505 Df[3]=1<<14; 500 506 501 507 // Tuning of matrix R … … 510 516 // cE=prevod(kp*p*p*Tv*Fmag*Iref/J/Wref,15); 511 517 // cF=prevod(p*Tv*Mref/J/Wref,15); 512 cG=prevod(Tv*Wref/Thetaref,15); // no *4!!518 cG=prevod(Tv*Wref/Thetaref,15); //in q15! 513 519 //cH=prevod(Tv*Wref*Fmag/Iref/Ls*Thetaref,15); 514 // cH=prevod(Tv*Wref*Fmag/Iref/Ls,15); <<< use cB instead520 cH=prevod(Tv*Wref*Thetaref*Fmag/Iref/Ls,15); // 515 521 // cI=prevod(kp*p*p*Tv*Fmag*Iref/J/Wref*Thetaref); 516 522 … … 522 528 PSI[15]=0x7FFF; 523 529 524 //////////////////////// ================= 525 ///// TEST thorton vs. thorton_fast 526 527 /* int Ut[16]={0x7FFF, 100, 200, 300, 0, 0x7FFF, 500, 600, 0,0,0x7FFF, 800, 0,0,0, 0x7FFF}; 528 int Dt[4]={100,200,300,400}; 529 int PSIu[16] = {100, 200,300, 400 , 500, 600,700,800, 900,1000,1100,1200, 1300,1400,1500,1600}; 530 int Dold[4]; 531 532 thorton(Ut,Dt,PSIu,Q,G,Dold,4); 533 int Ut2[16]={0x7FFF, 100, 200, 300, 0, 0x7FFF, 500, 600, 0,0,0x7FFF, 800, 0,0,0, 0x7FFF}; 534 int Dt2[4]={100,200,300,400}; 535 int PSIu2[16] = {100, 200,300, 400 , 500, 600,700,800, 900,1000,1100,1200, 1300,1400,1500,1600}; 536 thorton_fast(Ut2,Dt2,PSIu2,Q,G,Dold,4); 537 cout<< Q<<endl;*/ 538 } 539 530 } 531 532 void EKFfixedCh::bayes(const itpp::vec& yt, const itpp::vec& ut) 533 { 534 ekf(ut[0],ut[1],yt[0],yt[1]); 535 } 536 537 538 void EKFfixedCh::ekf(double ux, double uy, double isxd, double isyd) 539 { 540 // vypocet napeti v systemu (x,y) 541 int uf[2]; 542 uf[0]=prevod(ux/Uref,15); 543 uf[1]=prevod(uy/Uref,15); 544 545 int Y_mes[2]; 546 // zadani mereni 547 Y_mes[0]=prevod(isxd/Iref,15); 548 Y_mes[1]=prevod(isyd/Iref,15); 549 550 ////// vlastni rutina EKF -- ///////////////////////// 551 int t_sin,t_cos, tmp; 552 553 // implementace v PC 554 /* t_sin=prevod(sin(Thetaref*x_est[3]/32768.),15); 555 * t_cos=prevod(cos(Thetaref*x_est[3]/32768.),15);*/ 556 t_sin=prevod(sin(Thetaref*x_est[3]/32768.),15); 557 t_cos=prevod(cos(Thetaref*x_est[3]/32768.),15); 558 559 tmp=((long)cB*x_est[2])>>15; // q15*q13 -> q13 560 // q15*q13 + q13*q15 + q15*q13?? 561 x_est[0]=((long)cA*x_est[0]+(long)tmp*t_sin+(long)cC*(uf[0]))>>15; // in q13 562 x_est[1]=((long)cA*x_est[1]-(long)tmp*t_cos+(long)cC*(uf[1]))>>15; // q13 563 x_est[2]=x_est[2]; 564 // q15 + q15*q13 565 x_est[3]=(((long)x_est[3]<<15)+(long)cG*x_est[2])>>15; 566 567 if(x_est[3]>(1<<15)) x_est[3]-=2*(1<<15); 568 if(x_est[3]<-(1<<15)) x_est[3]+=2*(1<<15); 569 570 //void EKFfixed::update_psi(void) 571 { 572 PSI[2]=((long)cB*t_sin)>>15; 573 tmp=((long)cH*x_est[2])>>15; // ! cH =cB with different scale!! 574 PSI[3]=((long)tmp*t_cos)>>15; 575 PSI[6]=-((long)cB*t_cos)>>15; 576 PSI[7]=((long)tmp*t_sin)>>15; 577 } 578 { 579 ivec Ad(PSI,16); 580 log_level.store(logA,get_from_ivec(Ad)); 581 } 582 583 ///////// end of copy /////////////// 584 mmultACh(PSI,Chf,PSICh,4,4); 585 //thorton(int *U, int *D, int *PSIU, int *Q, int *G, int *Dold, unsigned int dimx); 586 householder(PSICh,Q,4); 587 588 { 589 ivec Chd(Chf,16); 590 log_level.store(logCh,get_from_ivec(Chd)); 591 } 592 593 594 int difz[2]; 595 difz[0]=(Y_mes[0]-x_est[0]); // shift to q15!! 596 difz[1]=(Y_mes[1]-x_est[1]);//<<2; 597 598 599 // 600 int dR[2];dR[0]=R[0];dR[1]=R[3]; 601 //int xb[4]; xb[0]=x_est[0]<<2; xb[1]=x_est[1]<<2; xb[2]=x_est[2]<<2; xb[3]=x_est[3]; 602 carlson(difz,x_est,Chf,dR,2,4); 603 //x_est[0] = xb[0]>>2; x_est[1]=xb[1]>>2; x_est[2]=xb[2]>>2; x_est[3]=xb[3]; 604 605 // navrat estimovanych hodnot regulatoru 606 vec& mu = E._mu(); 607 (mu)(0)=zprevod(x_est[0],15)*Iref; 608 (mu)(1)=zprevod(x_est[1],15)*Iref; 609 (mu)(2)=zprevod(x_est[2],15)*Wref; 610 (mu)(3)=zprevod(x_est[3],15)*Thetaref; 611 612 //x_est[2]=x[2]*32768/Wref; 613 //x_est[3]=x[3]*32768/Thetaref; 614 // mat T=diag(concat(vec_2(Iref,Iref), vec_2(Wref,Thetaref))); 615 } 616 617 void EKFfixedCh::init_ekf(double Tv) 618 { 619 // Tuning of matrix Q 620 Q[0]=prevod(.01,15); // 0.05 621 Q[5]=Q[0]; 622 Q[10]=prevod(0.0001,15); // 1e-3 623 Q[15]=prevod(0.0001,15); // 1e-3 624 625 Chf[0]=0x7FFF;// ! // 0.05 626 Chf[1]=Chf[2]=Chf[3]=Chf[4]=0; 627 Chf[5]=0x7FFF;//! 628 Chf[6]=Chf[6]=Chf[8]=Chf[9]=0; 629 Chf[10]=0x7FFF;//! // 1e-3 630 Chf[11]=Chf[12]=Chf[13]=Chf[4]=0; 631 Chf[15]=0x7FFF; // 1e-3 632 633 // Tuning of matrix R 634 R[0]=prevod(0.05,15); // 0.05 635 R[3]=R[0]; 636 637 // Motor model parameters 638 cA=prevod(1-Tv*Rs/Ls,15); 639 cB=prevod(Tv*Wref*Fmag/Iref/Ls,15); 640 cC=prevod(Tv/Ls/Iref*Uref,15); 641 // cD=prevod(1-Tv*Bf/J,15); 642 // cE=prevod(kp*p*p*Tv*Fmag*Iref/J/Wref,15); 643 // cF=prevod(p*Tv*Mref/J/Wref,15); 644 cG=prevod(Tv*Wref/Thetaref,15); //in q15! 645 //cH=prevod(Tv*Wref*Fmag/Iref/Ls*Thetaref,15); 646 cH=prevod(Tv*Wref*Thetaref*Fmag/Iref/Ls,15); // 647 // cI=prevod(kp*p*p*Tv*Fmag*Iref/J/Wref*Thetaref); 648 649 /* Init matrix PSI with permanently constant terms */ 650 PSI[0]=cA; 651 PSI[5]=PSI[0]; 652 PSI[10]=0x7FFF; 653 PSI[14]=cG; 654 PSI[15]=0x7FFF; 655 656 } 657 -
applications/pmsm/simulator_zdenek/ekf_example/ekf_obj.h
r1201 r1226 19 19 #include "matrix.h" 20 20 #include "matrix_vs.h" 21 #include "reference .h"21 #include "reference_Q15.h" 22 22 #include "parametry_motoru.h" 23 23 … … 109 109 class EKFfixedUD : public BM { 110 110 public: 111 LOG_LEVEL(EKFfixedUD,logU, logG, logD, logA );111 LOG_LEVEL(EKFfixedUD,logU, logG, logD, logA, logP); 112 112 113 113 void init_ekf(double Tv); … … 164 164 L.add_vector ( log_level, logD, RV ("D", 4 ), prefix ); 165 165 L.add_vector ( log_level, logA, RV ("A", 16 ), prefix ); 166 L.add_vector ( log_level, logP, RV ("P", 16 ), prefix ); 166 167 167 168 }; … … 170 171 171 172 UIREGISTER(EKFfixedUD); 173 174 /*! 175 * \brief Extended Kalman Filter with Chol matrices in fixed point arithmetic 176 * 177 * An approximation of the exact Bayesian filter with Gaussian noices and non-linear evolutions of their mean. 178 */ 179 class EKFfixedCh : public BM { 180 public: 181 LOG_LEVEL(EKFfixedCh,logCh, logA, logP); 182 183 void init_ekf(double Tv); 184 void ekf(double ux, double uy, double isxd, double isyd); 185 186 /* Constants - definovat jako konstanty ?? ?kde je vyhodnejsi aby v pameti byli?*/ 187 int Q[16]; /* matrix [4,4] */ 188 int R[4]; /* matrix [2,2] */ 189 190 int x_est[4]; /* estimate and prediction */ 191 192 int PSI[16]; /* matrix [4,4] */ 193 int PSICh[16]; /* matrix PIS*U, [4,4] */ 194 195 int Chf[16]; // upper triangular of covariance (inplace) 196 197 int cA, cB, cC, cG, cH; // cD, cE, cF, cI ... nepouzivane 198 199 enorm<chmat> E; 200 mat Ry; 201 202 public: 203 //! Default constructor 204 EKFfixedCh ():BM(),E(),Ry(2,2){ 205 int i; 206 for(i=0;i<16;i++){Q[i]=0;} 207 for(i=0;i<4;i++){R[i]=0;} 208 209 for(i=0;i<4;i++){x_est[i]=0;} 210 for(i=0;i<16;i++){Chf[i]=0;} 211 212 for(i=0;i<16;i++){PSI[i]=0;} 213 214 set_dim(4); 215 E._mu()=zeros(4); 216 E._R()=zeros(4,4); 217 init_ekf(0.000125); 218 }; 219 //! Here dt = [yt;ut] of appropriate dimensions 220 void bayes ( const vec &yt, const vec &ut ); 221 //!dummy! 222 const epdf& posterior() const {return E;}; 223 void log_register(logger &L, const string &prefix){ 224 BM::log_register ( L, prefix ); 225 226 L.add_vector ( log_level, logCh, RV ("Ch", 16 ), prefix ); 227 L.add_vector ( log_level, logA, RV ("A", 16 ), prefix ); 228 L.add_vector ( log_level, logP, RV ("P", 16 ), prefix ); 229 230 }; 231 //void from_setting(); 232 }; 233 234 UIREGISTER(EKFfixedCh); 235 172 236 173 237 //! EKF for comparison of EKF_UD with its fixed-point implementation