//
// Written by Curtis Olson, started January 2004.
//
-// Copyright (C) 2004 Curtis L. Olson - curt@flightgear.org
+// Copyright (C) 2004 Curtis L. Olson - http://www.flightgear.org/~curt
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
#include STL_STRING
#include <vector>
+#include <deque>
SG_USING_STD(string);
SG_USING_STD(vector);
+SG_USING_STD(deque);
#include <simgear/props/props.hxx>
#include <simgear/structure/subsystem_mgr.hxx>
// Input values
double y_n; // measured process value
double r_n; // reference (set point) value
+ double y_scale; // scale process input from property system
+ double r_scale; // scale reference input from property system
// Configuration values
double Kp; // proportional gain
* A simplistic P [ + I ] PID controller
*/
-class FGSimplePIController : public FGXMLAutoComponent {
+class FGPISimpleController : public FGXMLAutoComponent {
private:
// proportional component data
bool proportional;
- double factor;
+ double Kp;
SGPropertyNode *offset_prop;
double offset_value;
// integral component data
bool integral;
- double gain;
+ double Ki;
double int_sum;
// post functions for output
// Input values
double y_n; // measured process value
double r_n; // reference (set point) value
+ double y_scale; // scale process input from property system
+ double r_scale; // scale reference input from property system
double u_min; // Minimum output clamp
double u_max; // Maximum output clamp
public:
- FGSimplePIController( SGPropertyNode *node );
- ~FGSimplePIController() {}
+ FGPISimpleController( SGPropertyNode *node );
+ ~FGPISimpleController() {}
void update( double dt );
};
+/**
+ * Predictor - calculates value in x seconds future.
+ */
+
+class FGPredictor : public FGXMLAutoComponent {
+
+private:
+
+ // proportional component data
+ double last_value;
+ double average;
+ double seconds;
+ double filter_gain;
+
+ // debug flag
+ bool debug;
+
+ // Input values
+ double ivalue; // input value
+
+public:
+
+ FGPredictor( SGPropertyNode *node );
+ ~FGPredictor() {}
+
+ void update( double dt );
+};
+
+
+/**
+ * FGDigitalFilter - a selection of digital filters
+ *
+ * Exponential filter
+ * Double exponential filter
+ * Moving average filter
+ * Noise spike filter
+ *
+ * All these filters are low-pass filters.
+ *
+ */
+
+class FGDigitalFilter : public FGXMLAutoComponent
+{
+private:
+ double Tf; // Filter time [s]
+ unsigned int samples; // Number of input samples to average
+ double rateOfChange; // The maximum allowable rate of change [1/s]
+ deque <double> output;
+ deque <double> input;
+ string filterType;
+
+ bool debug;
+
+public:
+ FGDigitalFilter(SGPropertyNode *node);
+ ~FGDigitalFilter() {}
+
+ void update(double dt);
+};
+
/**
* Model an autopilot system.
*