Changeset 1226 for applications/pmsm

Show
Ignore:
Timestamp:
10/22/10 21:15:11 (14 years ago)
Author:
smidl
Message:

kalman in Ch

Location:
applications/pmsm/simulator_zdenek
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • applications/pmsm/simulator_zdenek/CMakeLists.txt

    r1202 r1226  
    33 
    44EXEC (test_UD  pmsmsim ekf_obj) 
     5EXEC (test_Ch  pmsmsim ekf_obj) 
  • applications/pmsm/simulator_zdenek/ekf_example/ekf_obj.cpp

    r1201 r1226  
    5151                 
    5252                 
    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 ) );*/ 
    5454        } 
    5555}; 
     
    174174  cG=prevod(Tv*Wref*4/Thetaref,15); 
    175175//  cH=prevod(Tv*Wref*Fmag/Iref/Ls*Thetaref,15); 
    176   cH=prevod(Tv*Wref*Fmag/Iref/Ls,15); 
     176  cH=prevod(Tv*Wref*Fmag/Iref/Ls,17); //cB in q 
    177177  //  cI=prevod(kp*p*p*Tv*Fmag*Iref/J/Wref*Thetaref); 
    178178 
     
    401401        // vypocet napeti v systemu (x,y) 
    402402        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); 
    405405         
    406406        int Y_mes[2]; 
    407407        // 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                 
    411411        ////// vlastni rutina EKF -- ///////////////////////// 
    412412        int t_sin,t_cos, tmp; 
     
    418418        t_cos=prevod(cos(Thetaref*x_est[3]/32768.),15); 
    419419         
    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 
    423424        x_est[2]=x_est[2]; 
     425        //               q15              + q15*q13 
    424426        x_est[3]=(((long)x_est[3]<<15)+(long)cG*x_est[2])>>15; 
    425427         
     
    428430         
    429431        //void EKFfixed::update_psi(void) 
    430         {                
     432        {        
    431433                PSI[2]=((long)cB*t_sin)>>15; 
    432                 tmp=((long)cB*x_est[2])>>15; 
     434                tmp=((long)cH*x_est[2])>>15; // ! cH =cB with different scale!! 
    433435                PSI[3]=((long)tmp*t_cos)>>15; 
    434436                PSI[6]=-((long)cB*t_cos)>>15; 
     
    456458         
    457459        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; 
    460462 
    461463        { 
    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)); 
    464466        } 
    465467         
    466468        //bierman(int *difz, int *xp, int *U, int *D, int *R, unsigned int dimy, unsigned int dimx ); 
    467469        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];   
    468471        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]; 
    469473         
    470474        // navrat estimovanych hodnot regulatoru 
     
    475479        (mu)(3)=zprevod(x_est[3],15)*Thetaref; 
    476480         
     481        //x_est[2]=x[2]*32768/Wref; 
     482        //x_est[3]=x[3]*32768/Thetaref; 
    477483//      mat T=diag(concat(vec_2(Iref,Iref), vec_2(Wref,Thetaref))); 
    478484} 
     
    486492        Q[15]=prevod(0.0001,15);      // 1e-3 
    487493 
    488         Uf[0]=0x7FFF;       // 0.05 
     494        Uf[0]=0x7FFF;// !       // 0.05 
    489495        Uf[1]=Uf[2]=Uf[3]=Uf[4]=0; 
    490         Uf[5]=0x7FFF; 
     496        Uf[5]=0x7FFF;//! 
    491497        Uf[6]=Uf[6]=Uf[8]=Uf[9]=0; 
    492         Uf[10]=0x7FFF;      // 1e-3 
     498        Uf[10]=0x7FFF;//!      // 1e-3 
    493499        Uf[11]=Uf[12]=Uf[13]=Uf[4]=0; 
    494500        Uf[15]=0x7FFF;      // 1e-3 
    495501         
    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; 
    500506         
    501507        // Tuning of matrix R 
     
    510516        //  cE=prevod(kp*p*p*Tv*Fmag*Iref/J/Wref,15); 
    511517        //  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! 
    513519        //cH=prevod(Tv*Wref*Fmag/Iref/Ls*Thetaref,15); 
    514         // cH=prevod(Tv*Wref*Fmag/Iref/Ls,15); <<< use cB instead 
     520        cH=prevod(Tv*Wref*Thetaref*Fmag/Iref/Ls,15); //  
    515521        //  cI=prevod(kp*p*p*Tv*Fmag*Iref/J/Wref*Thetaref); 
    516522         
     
    522528        PSI[15]=0x7FFF; 
    523529         
    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 
     532void EKFfixedCh::bayes(const itpp::vec& yt, const itpp::vec& ut) 
     533{ 
     534        ekf(ut[0],ut[1],yt[0],yt[1]); 
     535} 
     536 
     537 
     538void 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 
     617void 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  
    1919#include "matrix.h" 
    2020#include "matrix_vs.h" 
    21 #include "reference.h" 
     21#include "reference_Q15.h" 
    2222#include "parametry_motoru.h" 
    2323 
     
    109109class EKFfixedUD : public BM { 
    110110        public: 
    111                 LOG_LEVEL(EKFfixedUD,logU, logG, logD, logA); 
     111                LOG_LEVEL(EKFfixedUD,logU, logG, logD, logA, logP); 
    112112                 
    113113                void init_ekf(double Tv); 
     
    164164                                L.add_vector ( log_level, logD, RV ("D", 4 ), prefix ); 
    165165                                L.add_vector ( log_level, logA, RV ("A", 16 ), prefix ); 
     166                                L.add_vector ( log_level, logP, RV ("P", 16 ), prefix ); 
    166167                                 
    167168                }; 
     
    170171 
    171172UIREGISTER(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 */ 
     179class EKFfixedCh : public BM { 
     180public: 
     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         
     202public: 
     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 
     234UIREGISTER(EKFfixedCh); 
     235 
    172236 
    173237//! EKF for comparison of EKF_UD with its fixed-point implementation