1 | /*! |
---|
2 | \file |
---|
3 | \brief DataSource for experiments with Aimsun |
---|
4 | \author Jan prikryl. |
---|
5 | |
---|
6 | */ |
---|
7 | |
---|
8 | #include <base/loggers.h> |
---|
9 | |
---|
10 | using namespace bdm; |
---|
11 | |
---|
12 | //! Simulator of traffic - AIMSUN |
---|
13 | class AimsunDS : public DS |
---|
14 | { |
---|
15 | |
---|
16 | protected: |
---|
17 | //! indeces of logged variables |
---|
18 | int L_x, L_ou, L_oy, L_iu, L_optu; |
---|
19 | //! Setpoints of omega in timespans given by dt_prof |
---|
20 | vec profileWw; |
---|
21 | //! Setpoints of Mz in timespans given by dt_prof |
---|
22 | vec profileMz; |
---|
23 | //! time-step for profiles |
---|
24 | double dt_prof; |
---|
25 | //! Number of miliseconds per discrete time step |
---|
26 | int Dt; |
---|
27 | //! options for logging, - log predictions of 'true' voltage |
---|
28 | bool opt_modu; |
---|
29 | //! options for logging, - |
---|
30 | public: |
---|
31 | //! Constructor with fixed sampling period |
---|
32 | AimsunDS () : DS() |
---|
33 | { |
---|
34 | Dt=125; |
---|
35 | Yrv=RV ( "{o_ua o_ub o_ia o_ib t_ua t_ub o_om o_th Mz }" ); |
---|
36 | ytsize = Yrv._dsize(); |
---|
37 | Drv = Yrv; |
---|
38 | } |
---|
39 | void set_parameters ( double Rs0, double Ls0, double Fmag0, double Bf0, double p0, double kp0, double J0, double Uc0, double DT0, double dt0 ) |
---|
40 | { |
---|
41 | pmsmsim_set_parameters ( Rs0, Ls0, Fmag0, Bf0, p0, kp0, J0, Uc0, DT0, dt0 ); |
---|
42 | } |
---|
43 | //! parse options: "modelu" => opt_modu=true; |
---|
44 | void set_options ( string &opt ) |
---|
45 | { |
---|
46 | opt_modu = ( opt.find ( "modelu" ) !=string::npos ); |
---|
47 | } |
---|
48 | void getdata ( vec &dt ) const |
---|
49 | { |
---|
50 | dt.set_subvector(0,vec ( KalmanObs,6 )); |
---|
51 | dt(6)=x[2]; |
---|
52 | dt(7)=x[3]; |
---|
53 | dt(8)=x[8]; |
---|
54 | } |
---|
55 | void write ( vec &ut ) {} |
---|
56 | |
---|
57 | void step() |
---|
58 | { |
---|
59 | static int ind=0; |
---|
60 | static double dW; // increase of W |
---|
61 | static double Ww; // W |
---|
62 | static double Mz; // W |
---|
63 | if ( t>=dt_prof*ind ) |
---|
64 | { |
---|
65 | ind++; |
---|
66 | // check omega profile and set dW |
---|
67 | if ( ind <2 && profileWw.length() ==1 ) |
---|
68 | { |
---|
69 | Ww=profileWw ( 0 ); |
---|
70 | dW=0.0; |
---|
71 | } |
---|
72 | if ( ind<profileWw.length() ) |
---|
73 | { |
---|
74 | dW = profileWw ( ind )-profileWw ( ind-1 ); |
---|
75 | dW *=125e-6/dt_prof; |
---|
76 | } |
---|
77 | else |
---|
78 | { |
---|
79 | dW = 0; |
---|
80 | } |
---|
81 | // Check Mz profile and set Mz |
---|
82 | if ( ind<profileMz.length() ) |
---|
83 | { |
---|
84 | //sudden increase |
---|
85 | Mz = profileMz(ind); |
---|
86 | } |
---|
87 | else |
---|
88 | { |
---|
89 | Mz = 0; |
---|
90 | } |
---|
91 | } |
---|
92 | Ww += dW; |
---|
93 | //Simulate Dt seconds! |
---|
94 | for ( int i=0; i<Dt; i++ ) |
---|
95 | { |
---|
96 | pmsmsim_step ( Ww , Mz); |
---|
97 | } |
---|
98 | // for ( int i=0;i<Dt;i++ ) { pmsmsim_noreg_step ( Ww , Mz);} |
---|
99 | |
---|
100 | //discretization |
---|
101 | double ustep=1.2; |
---|
102 | KalmanObs [ 0 ] = ustep*itpp::round( KalmanObs [ 0 ]/ ustep) ; |
---|
103 | KalmanObs [ 1 ] = ustep*itpp::round(KalmanObs [ 1 ]/ ustep); |
---|
104 | double istep=0.085; |
---|
105 | KalmanObs [ 2 ] = istep*itpp::round( KalmanObs [ 2 ]/ istep) ; |
---|
106 | KalmanObs [ 3 ] = istep*itpp::round(KalmanObs [ 3 ]/ istep); |
---|
107 | |
---|
108 | }; |
---|
109 | |
---|
110 | |
---|
111 | |
---|
112 | // TODO dodelat void to_setting( Setting &root ) const; |
---|
113 | }; |
---|