An state-observer that deals with delay in measurements, also compatible with the standard state-observer
STATES_OBSERVER_DELAY.h
- Committer:
- benson516
- Date:
- 2017-02-10
- Revision:
- 1:085d41355949
- Parent:
- 0:0699f8e638ca
File content as of revision 1:085d41355949:
#ifndef STATES_OBSERVER_DELAY_H #define STATES_OBSERVER_DELAY_H // #include <vector> #include "CIRCULAR_BUFFER_VECTOR.h" using std::vector; /* // For debugging #include <iostream> using std::cout; // */ //-----------------------------------------------------------------------// // Note: if the "delay_sample" was set to "0", the observer will be the regular observer //-----------------------------------------------------------------------// class STATES_OBSERVER_DELAY{ public: // Dimensions size_t n; // Number of states size_t p; // Number of inputs of the plant size_t q; // Number of outputs of the plant, no use in full-state-measureable case // size_t d; // Delay-sample in the measurements y float Ts; // Sampling time // bool enable; bool flag_reset; // Parameters for observer vector<vector<float> > Ad; // (Discrete) state-transition matrix of the plant vector<vector<float> > Bd; // (Discrete) Input matrix for u (the input matrix of the plant) // Cd: Output matric for the system, if necessary (the definition of the simulated states are different with the measurements) bool enable_Cd; // Decide if Cd is going to be used vector<vector<float> > Cd; // Gain matrix vector<vector<float> > Ld; // Gain matrix for the observer with measurement-delay, Ld is an n(d+1) by q matrix (or n(d+1) by n if Cd is not used) // Input-signals of the observer vector<float> sys_inputs; // Input of the real system vector<float> sys_outputs; // Output of the real system (measurement, with d-sample delay) vector<float> sys_extraDisturbance; // "sys_extraDisturbance" is an n dimensional vector that interprets the summation of the extra inputs // Variables of the observer CIRCULAR_BUFFER_VECTOR states_est_buffer; // Estimated states from time k to time (k-d) vector<float> state_est; // Estimated states at time k (current) // vector<float> states_est_delay_d; // Estimated states at time k-d (delay d samples) vector<float> y_est; // Estimated output, Cd*states_est_delay_d (if necessary) vector<float> est_error; // Estimation error, est_error = y_est - sys_outputs STATES_OBSERVER_DELAY(size_t num_state, size_t num_in, size_t num_out, size_t delay_sample, float samplingTime); // void start(); void stop(); void reset(); // Assignments for observer //--------------------------------------------// // Assign continuous-time version of system matrices void assign_At(float* At_in, size_t n_in); // Continuous-time version void assign_Bt(float* Bt_in, size_t n_in, size_t p_in); // Continuous-time version void assign_Lt(float* Lt_in, size_t n_in, size_t d_in, size_t q_in); // Continuous-time version // ** Assign the continuous-time version of system matrices by matrices void assign_At(const vector<vector<float> > &At_in); void assign_Bt(const vector<vector<float> > &Bt_in); void assign_Lt(const vector<vector<float> > &Lt_in); // Assign discrete-time version of system matrices directly void assign_Ad(float* Ad_in, size_t n_in); // Discrete-time version void assign_Bd(float* Bd_in, size_t n_in, size_t p_in); // Discrete-time version //--------------------------------------------// void assign_Cd(float* Cd_in, size_t q_in, size_t n_in); // Assignment for observer Gain void assign_Ld(float* Ld_in, size_t n_in, size_t d_in, size_t q_in); // Process of observer void iterateOnce(void); // Execute the simulator once private: vector<float> zeros_n; vector<float> zeros_p; vector<float> zeros_q; // Utilities void Mat_multiply_Vec(vector<float> &v_out, const vector<vector<float> > &m_left, const vector<float> &v_right); // v_out = m_left*v_right vector<float> Mat_multiply_Vec(const vector<vector<float> > &m_left, const vector<float> &v_right); // v_out = m_left*v_right vector<float> Get_VectorPlus(const vector<float> &v_a, const vector<float> &v_b, bool is_minus); // v_a + (or -) v_b vector<float> Get_VectorScalarMultiply(const vector<float> &v_a, float scale); // scale*v_a // Increment void Get_VectorIncrement(vector<float> &v_a, const vector<float> &v_b, bool is_minus); // v_a += (or -=) v_b // Partial matrix multiplication vector<float> Partial_Mat_multiply_Vec(vector<vector<float> >::iterator &it_m_left, size_t numRow_m_left, const vector<float> &v_right); // v_out = m_left*v_right }; #endif