00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef PROPORTIONAL_INTEGRAL_CONTROLLER_H
00032 #define PROPORTIONAL_INTEGRAL_CONTROLLER_H
00033
00034 #include <vector>
00035 #include <ostream>
00036 #include <iofits.h>
00037
00038 namespace Arroyo {
00039
00040 using std::vector;
00041 using std::ostream;
00042
00080
00081
00082 template<class input, class output, class proportional_gain, class integral_gain>
00083 class proportional_integral_controller {
00084
00085 private:
00086
00087 static bool factory_registration;
00088
00089 protected:
00090
00091
00092 proportional_gain propgain;
00093
00094
00095 input last_input;
00096
00097
00098 integral_gain intgain;
00099
00102 proportional_integral_controller(){};
00103
00104 public:
00105
00108 proportional_integral_controller(const proportional_integral_controller & picntrlr);
00109
00112 proportional_integral_controller(const char * filename);
00113
00116 proportional_integral_controller(const iofits & iof);
00117
00120 proportional_integral_controller(const input & init,
00121 const proportional_gain & pgain,
00122 const integral_gain & igain);
00123
00126 ~proportional_integral_controller(){};
00127
00130 proportional_integral_controller & operator=(const proportional_integral_controller & picntrlr);
00131
00134 void update(const input & i, output & o);
00135
00136 };
00137
00138
00139 template<class input, class output, class proportional_gain, class integral_gain>
00140 proportional_integral_controller<input, output, proportional_gain, integral_gain>::
00141 proportional_integral_controller(const proportional_integral_controller<input, output, proportional_gain, integral_gain> & picntrlr){
00142 this->operator=(picntrlr);
00143 }
00144
00145 template<class input, class output, class proportional_gain, class integral_gain>
00146 proportional_integral_controller<input, output, proportional_gain, integral_gain>::
00147 proportional_integral_controller(const char * filename){
00148 this->read(filename);
00149 }
00150
00151 template<class input, class output, class proportional_gain, class integral_gain>
00152 proportional_integral_controller<input, output, proportional_gain, integral_gain>::
00153 proportional_integral_controller(const iofits & iof){
00154 this->read(iof);
00155 }
00156
00157 template<class input, class output, class proportional_gain, class integral_gain>
00158 proportional_integral_controller<input, output, proportional_gain, integral_gain>::
00159 proportional_integral_controller(const input & init,
00160 const proportional_gain & propg,
00161 const integral_gain & intg){
00162 last_input = init;
00163 propgain = propg;
00164 intgain = intg;
00165 }
00166
00167 template<class input, class output, class proportional_gain, class integral_gain>
00168 proportional_integral_controller<input, output, proportional_gain, integral_gain> &
00169 proportional_integral_controller<input, output, proportional_gain, integral_gain>::
00170 operator=(const proportional_integral_controller<input, output, proportional_gain, integral_gain> & picntrlr){
00171 if(this==&picntrlr)
00172 return(*this);
00173
00174 last_input = picntrlr.last_input;
00175 propgain = picntrlr.propgain;
00176 intgain = picntrlr.intgain;
00177
00178 return(*this);
00179 }
00180
00181 template<class input, class output, class proportional_gain, class integral_gain>
00182 void proportional_integral_controller<input, output, proportional_gain, integral_gain>::
00183 update(const input & i, output & o){
00184 o += i*intgain + (i - last_input)*propgain;
00185 last_input = i;
00186 }
00187
00188 }
00189
00190 #endif