| | 445 | |
| | 446 | |
| | 447 | void EKFfixedUD::bayes(const itpp::vec& yt, const itpp::vec& ut) |
| | 448 | { |
| | 449 | ekf(ut[0],ut[1],yt[0],yt[1]); |
| | 450 | } |
| | 451 | |
| | 452 | |
| | 453 | void EKFfixedUD::ekf(double ux, double uy, double isxd, double isyd) |
| | 454 | { |
| | 455 | // vypocet napeti v systemu (x,y) |
| | 456 | int uf[2]; |
| | 457 | uf[0]=prevod(ux/Uref,Qm); |
| | 458 | uf[1]=prevod(uy/Uref,Qm); |
| | 459 | |
| | 460 | int Y_mes[2]; |
| | 461 | // zadani mereni |
| | 462 | Y_mes[0]=prevod(isxd/Iref,Qm); |
| | 463 | Y_mes[1]=prevod(isyd/Iref,Qm); |
| | 464 | |
| | 465 | ////// vlastni rutina EKF -- ///////////////////////// |
| | 466 | int t_sin,t_cos, tmp; |
| | 467 | |
| | 468 | // implementace v PC |
| | 469 | t_sin=prevod(sin(Thetaref*x_est[3]/32768.),15); |
| | 470 | t_cos=prevod(cos(Thetaref*x_est[3]/32768.),15); |
| | 471 | |
| | 472 | tmp=((long)cB*x_est[2])>>15; |
| | 473 | x_est[0]=((long)cA*x_est[0]+(long)tmp*t_sin+(long)cC*uf[0])>>15; |
| | 474 | x_est[1]=((long)cA*x_est[1]-(long)tmp*t_cos+(long)cC*uf[1])>>15; |
| | 475 | x_est[2]=x_est[2]; |
| | 476 | x_est[3]=(((long)x_est[3]<<15)+(long)cG*x_est[2])>>15; |
| | 477 | |
| | 478 | //void EKFfixed::update_psi(void) |
| | 479 | { |
| | 480 | PSI[2]=((long)cB*t_sin)>>15; |
| | 481 | tmp=((long)cH*x_est[2])>>15; |
| | 482 | PSI[3]=((long)tmp*t_cos)>>15; |
| | 483 | PSI[6]=-((long)cB*t_cos)>>15; |
| | 484 | PSI[7]=((long)tmp*t_sin)>>15; |
| | 485 | } |
| | 486 | |
| | 487 | ///////// end of copy /////////////// |
| | 488 | mmultAU(PSI,Uf,PSIU,4,4); |
| | 489 | //thorton(int *U, int *D, int *PSIU, int *Q, int *G, int *Dold, unsigned int dimx); |
| | 490 | thorton(Uf,Df,PSIU,Q,G,Dfold,4); |
| | 491 | |
| | 492 | int difz[2]; |
| | 493 | difz[0]=Y_mes[0]-x_est[0]; |
| | 494 | difz[1]=Y_mes[1]-x_est[1]; |
| | 495 | //bierman(int *difz, int *xp, int *U, int *D, int *R, unsigned int dimy, unsigned int dimx ); |
| | 496 | int dR[2];dR[0]=R[0];dR[1]=R[3]; |
| | 497 | bierman_fast(difz,x_est,Uf,Df,dR,2,4); |
| | 498 | |
| | 499 | // navrat estimovanych hodnot regulatoru |
| | 500 | vec& mu = E._mu(); |
| | 501 | (mu)(0)=zprevod(x_est[0],Qm)*Iref; |
| | 502 | (mu)(1)=zprevod(x_est[1],Qm)*Iref; |
| | 503 | (mu)(2)=zprevod(x_est[2],Qm)*Wref; |
| | 504 | (mu)(3)=zprevod(x_est[3],15)*Thetaref; |
| | 505 | |
| | 506 | // mat T=diag(concat(vec_2(Iref,Iref), vec_2(Wref,Thetaref))); |
| | 507 | } |
| | 508 | |
| | 509 | void EKFfixedUD::init_ekf(double Tv) |
| | 510 | { |
| | 511 | // Tuning of matrix Q |
| | 512 | Q[0]=prevod(.01,15); // 0.05 |
| | 513 | Q[5]=Q[0]; |
| | 514 | Q[10]=prevod(0.0001,15); // 1e-3 |
| | 515 | Q[15]=prevod(0.0001,15); // 1e-3 |
| | 516 | |
| | 517 | Uf[0]=0x7FFF; // 0.05 |
| | 518 | Uf[5]=0x7FFF; |
| | 519 | Uf[10]=0x7FFF; // 1e-3 |
| | 520 | Uf[15]=0x7FFF; // 1e-3 |
| | 521 | |
| | 522 | Df[0]=0x7FFF; |
| | 523 | Df[1]=0x7FFF; |
| | 524 | Df[2]=0x7FFF; |
| | 525 | Df[3]=0x7FFF; |
| | 526 | |
| | 527 | // Tuning of matrix R |
| | 528 | R[0]=prevod(0.05,15); // 0.05 |
| | 529 | R[3]=R[0]; |
| | 530 | |
| | 531 | // Motor model parameters |
| | 532 | cA=prevod(1-Tv*Rs/Ls,15); |
| | 533 | cB=prevod(Tv*Wref*Fmag/Iref/Ls,15); |
| | 534 | cC=prevod(Tv/Ls/Iref*Uref,15); |
| | 535 | // cD=prevod(1-Tv*Bf/J,15); |
| | 536 | // cE=prevod(kp*p*p*Tv*Fmag*Iref/J/Wref,15); |
| | 537 | // cF=prevod(p*Tv*Mref/J/Wref,15); |
| | 538 | cG=prevod(Tv*Wref*4/Thetaref,15); |
| | 539 | cH=prevod(Tv*Wref*Fmag/Iref/Ls*Thetaref,15); |
| | 540 | // cI=prevod(kp*p*p*Tv*Fmag*Iref/J/Wref*Thetaref); |
| | 541 | |
| | 542 | /* Init matrix PSI with permanently constant terms */ |
| | 543 | PSI[0]=cA; |
| | 544 | PSI[5]=PSI[0]; |
| | 545 | PSI[10]=0x7FFF; |
| | 546 | PSI[14]=cG; |
| | 547 | PSI[15]=0x7FFF; |
| | 548 | |
| | 549 | //////////////////////// ================= |
| | 550 | ///// TEST thorton vs. thorton_fast |
| | 551 | |
| | 552 | int Ut[16]={0x7FFF, 100, 200, 300, 0, 0x7FFF, 500, 600, 0,0,0x7FFF, 800, 0,0,0, 0x7FFF}; |
| | 553 | int Dt[4]={100,200,300,400}; |
| | 554 | int PSIu[16] = {100, 200,300, 400 , 500, 600,700,800, 900,1000,1100,1200, 1300,1400,1500,1600}; |
| | 555 | int Dold[4]; |
| | 556 | |
| | 557 | thorton(Ut,Dt,PSIu,Q,G,Dold,4); |
| | 558 | int Ut2[16]={0x7FFF, 100, 200, 300, 0, 0x7FFF, 500, 600, 0,0,0x7FFF, 800, 0,0,0, 0x7FFF}; |
| | 559 | int Dt2[4]={100,200,300,400}; |
| | 560 | int PSIu2[16] = {100, 200,300, 400 , 500, 600,700,800, 900,1000,1100,1200, 1300,1400,1500,1600}; |
| | 561 | thorton_fast(Ut2,Dt2,PSIu2,Q,G,Dold,4); |
| | 562 | cout<< Q<<endl; |
| | 563 | } |
| | 564 | |