00001
00013 #include <stat/loggers.h>
00014 #include <estim/libKF.h>
00015 #include "simulator_zdenek/simulator.h"
00016 #include "pmsm.h"
00017
00019 class pmsmDS : public DS {
00020
00021 protected:
00023 int L_x, L_ou, L_oy, L_iu, L_optu;
00025 vec profileWw;
00027 vec profileMz;
00029 double dt_prof;
00031 int Dt;
00033 bool opt_modu;
00035 public:
00037 pmsmDS () {Dt=125; Drv=RV ( "{o_ua o_ub o_ia o_ib t_ua t_ub o_om o_th Mz }" );}
00038 void set_parameters ( double Rs0, double Ls0, double Fmag0, double Bf0, double p0, double kp0, double J0, double Uc0, double DT0, double dt0 ) {
00039 pmsmsim_set_parameters ( Rs0, Ls0, Fmag0, Bf0, p0, kp0, J0, Uc0, DT0, dt0 );
00040 }
00042 void set_options ( string &opt ) {
00043 opt_modu = ( opt.find ( "modelu" ) !=string::npos );
00044 }
00045 void getdata ( vec &dt ) {dt.set_subvector(0,vec ( KalmanObs,6 ));dt(6)=x[2];dt(7)=x[3];dt(8)=x[8];}
00046 void write ( vec &ut ) {}
00047
00048 void step() {
00049 static int ind=0;
00050 static double dW;
00051 static double Ww;
00052 static double Mz;
00053 if ( t>=dt_prof*ind ) {
00054 ind++;
00055
00056 if ( ind<profileWw.length() ) {
00057
00058 if ( profileWw.length() ==1 ) {
00059 Ww=profileWw ( 0 ); dW=0.0;
00060 }
00061 else {
00062 dW = profileWw ( ind )-profileWw ( ind-1 );
00063 dW *=125e-6/dt_prof;
00064 }
00065 }
00066 else {
00067 dW = 0;
00068 }
00069
00070 if ( ind<profileMz.length() ) {
00071
00072 Mz = profileMz(ind);
00073 }
00074 else {
00075 Mz = 0;
00076 }
00077 }
00078 Ww += dW;
00079
00080 for ( int i=0;i<Dt;i++ ) { pmsmsim_step ( Ww , Mz);}
00081
00082
00083
00084 double ustep=1.2;
00085 KalmanObs [ 0 ] = ustep*itpp::round( KalmanObs [ 0 ]/ ustep) ;
00086 KalmanObs [ 1 ] = ustep*itpp::round(KalmanObs [ 1 ]/ ustep);
00087 double istep=0.085;
00088 KalmanObs [ 2 ] = istep*itpp::round( KalmanObs [ 2 ]/ istep) ;
00089 KalmanObs [ 3 ] = istep*itpp::round(KalmanObs [ 3 ]/ istep);
00090
00091 };
00092
00093 void log_add ( logger &L ) {
00094 L_x = L.add ( rx, "x" );
00095 L_oy = L.add ( ry, "o" );
00096 L_ou = L.add ( ru, "o" );
00097 L_iu = L.add ( ru, "t" );
00098
00099 if ( opt_modu ) {
00100 L_optu = L.add ( ru, "model" );
00101 }
00102 }
00103
00104 void logit ( logger &L ) {
00105 L.logit ( L_x, vec ( x,4 ) );
00106 L.logit ( L_oy, vec_2 ( KalmanObs[2],KalmanObs[3] ) );
00107 L.logit ( L_ou, vec_2 ( KalmanObs[0],KalmanObs[1] ) );
00108 L.logit ( L_iu, vec_2 ( KalmanObs[4],KalmanObs[5] ) );
00109 if ( opt_modu ) {
00110 double sq3=sqrt ( 3.0 );
00111 double ua,ub;
00112 double i1=x[0];
00113 double i2=0.5* ( -i1+sq3*x[1] );
00114 double i3=0.5* ( -i1-sq3*x[1] );
00115 double u1=KalmanObs[0];
00116 double u2=0.5* ( -u1+sq3*KalmanObs[1] );
00117 double u3=0.5* ( -u1-sq3*KalmanObs[1] );
00118
00119 double du1=1.4* ( double ( i1>0.3 ) - double ( i1<-0.3 ) ) +0.2*i1;
00120 double du2=1.4* ( double ( i2>0.3 ) - double ( i2<-0.3 ) ) +0.2*i2;
00121 double du3=1.4* ( double ( i3>0.3 ) - double ( i3<-0.3 ) ) +0.2*i3;
00122 ua = ( 2.0* ( u1-du1 )- ( u2-du2 )- ( u3-du3 ) ) /3.0;
00123 ub = ( ( u2-du2 )- ( u3-du3 ) ) /sq3;
00124 L.logit ( L_optu , vec_2 ( ua,ub ) );
00125 }
00126
00127 }
00128
00129 void set_profile ( double dt, const vec &Ww, const vec &Mz ) {dt_prof=dt; profileWw=Ww; profileMz=Mz;}
00130 };
00131
00133 class pmsmCRB : public EKFfull{
00134 protected:
00135 vec interr;
00136 vec old_true;
00137 vec secder;
00138 int L_CRB;
00139 int L_err;
00140 int L_sec;
00141 public:
00143 pmsmCRB():EKFfull(){old_true=zeros(6);}
00144
00145 void bayes(const vec &dt){
00146 static vec umin(2);
00147 vec u(2);
00148
00149 vec true_state=vec(x,4);
00150 E.set_mu(true_state);
00151 mu=true_state;
00152
00153
00154 old_true(4)=KalmanObs[4];
00155 old_true(5)=KalmanObs[5];
00156 u(0) = KalmanObs[0];
00157 u(1) = KalmanObs[1];
00158 interr = (true_state - pfxu->eval(old_true));
00159
00160
00161 IMpmsm2o* pf = dynamic_cast<IMpmsm2o*>(pfxu);
00162 if (pf) {secder=pf->eval2o(u-umin);}
00163
00164 umin =u;
00165 EKFfull::bayes(dt);
00166 old_true.set_subvector(0,true_state);
00167 }
00168
00169 void log_add(logger &L, const string &name="" ){
00170 L_CRB=L.add(rx,"crb");
00171 L_err=L.add(rx,"err");
00172 L_sec=L.add(rx,"d2");
00173 }
00174 void logit(logger &L){
00175 L.logit(L_err, interr);
00176 L.logit(L_CRB,diag(_R()));
00177 L.logit(L_sec,secder);
00178 }
00179 };
00180
00182 class pmsmCRBMz : public EKFfull{
00183 protected:
00184 int L_CRB;
00185 public:
00187 pmsmCRBMz():EKFfull(){}
00188
00189 void bayes(const vec &dt){
00190
00191 vec true_state(5);
00192 true_state.set_subvector(0,vec(x,4));
00193 true_state(4)=x[8];
00194
00195 E.set_mu(true_state);
00196 mu = true_state;
00197
00198 EKFfull::bayes(dt);
00199 }
00200
00201 void log_add(logger &L, const string &name="" ){
00202 L_CRB=L.add(concat(rx,RV("Mz",1,0)),"crbz");
00203 }
00204 void logit(logger &L){
00205 L.logit(L_CRB,diag(_R()));
00206 }
00207 };