FlightGear next
pidcontroller.hxx
Go to the documentation of this file.
1// pidcontroller.hxx - implementation of PID controller
2//
3// Written by Torsten Dreyer
4// Based heavily on work created by Curtis Olson, started January 2004.
5//
6// Copyright (C) 2004 Curtis L. Olson - http://www.flightgear.org/~curt
7// Copyright (C) 2010 Torsten Dreyer - Torsten (at) t3r (dot) de
8//
9// This program is free software; you can redistribute it and/or
10// modify it under the terms of the GNU General Public License as
11// published by the Free Software Foundation; either version 2 of the
12// License, or (at your option) any later version.
13//
14// This program is distributed in the hope that it will be useful, but
15// WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17// General Public License for more details.
18//
19// You should have received a copy of the GNU General Public License
20// along with this program; if not, write to the Free Software
21// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22//
23#ifndef __PIDCONTROLLER_HXX
24#define __PIDCONTROLLER_HXX 1
25
26#ifdef HAVE_CONFIG_H
27# include <config.h>
28#endif
29
30#include "analogcomponent.hxx"
31
32#include <simgear/props/props.hxx>
33#include <simgear/structure/subsystem_mgr.hxx>
34
35namespace FGXMLAutopilot {
36
41{
42private:
43 // Configuration values
44 simgear::ValueList Kp; // proportional gain
45 simgear::ValueList Ti; // Integrator time (sec)
46 simgear::ValueList Td; // Derivator time (sec)
47
48 double alpha; // low pass filter weighing factor (usually 0.1)
49 double beta; // process value weighing factor for
50 // calculating proportional error
51 // (usually 1.0)
52 double gamma; // process value weighing factor for
53 // calculating derivative error
54 // (usually 0.0)
55
56 // Previous state tracking values
57 double ep_n_1; // ep[n-1] (prop error)
58 double edf_n_1; // edf[n-1] (derivative error)
59 double edf_n_2; // edf[n-2] (derivative error)
60 double u_n_1; // u[n-1] (output)
61 double desiredTs; // desired sampling interval (sec)
62 double elapsedTime; // elapsed time (sec)
63
64 /* If startup_current is false (the default), we initialise internal state
65 variables to zero.
66
67 Otherwise we initialise internal variables to the current values, which can
68 reduce initial transient behaviour. */
69 bool startup_current;
70
71 /* For the first startup_its iterations we don't modify our output. Default
72 is zero. */
73 unsigned startup_its;
74
75 unsigned iteration;
76
77protected:
78 virtual bool configure( SGPropertyNode& cfg_node,
79 const std::string& cfg_name,
80 SGPropertyNode& prop_root );
81
82public:
85
86 // Subsystem identification.
87 static const char* staticSubsystemClassId() { return "pid-controller"; }
88
89 void update( bool firstTime, double dt ) override;
90};
91
92}
93#endif // __PIDCONTROLLER_HXX
AnalogComponent()
A constructor for an analog component.
static const char * staticSubsystemClassId()
void update(bool firstTime, double dt) override
pure virtual function to be implemented by the derived classes.
virtual bool configure(SGPropertyNode &cfg_node, const std::string &cfg_name, SGPropertyNode &prop_root)
This method configures this analog component from a property node.