Browse Source

Merge pull request #1203 from PX4/initderivativeblock

BlockDerivative: initialize in first run
sbg
Lorenz Meier 11 years ago
parent
commit
4b6192f0bc
  1. 13
      src/modules/controllib/blocks.cpp
  2. 17
      src/modules/controllib/blocks.hpp

13
src/modules/controllib/blocks.cpp

@ -293,7 +293,18 @@ int blockIntegralTrapTest()
float BlockDerivative::update(float input) float BlockDerivative::update(float input)
{ {
float output = _lowPass.update((input - getU()) / getDt()); float output;
if (_initialized) {
output = _lowPass.update((input - getU()) / getDt());
} else {
// if this is the first call to update
// we have no valid derivative
// and so we use the assumption the
// input value is not changing much,
// which is the best we can do here.
output = 0.0f;
_initialized = true;
}
setU(input); setU(input);
return output; return output;
} }

17
src/modules/controllib/blocks.hpp

@ -238,9 +238,25 @@ public:
BlockDerivative(SuperBlock *parent, const char *name) : BlockDerivative(SuperBlock *parent, const char *name) :
SuperBlock(parent, name), SuperBlock(parent, name),
_u(0), _u(0),
_initialized(false),
_lowPass(this, "LP") _lowPass(this, "LP")
{}; {};
virtual ~BlockDerivative() {}; virtual ~BlockDerivative() {};
/**
* Update the state and get current derivative
*
* This call updates the state and gets the current
* derivative. As the derivative is only valid
* on the second call to update, it will return
* no change (0) on the first. To get a closer
* estimate of the derivative on the first call,
* call setU() one time step before using the
* return value of update().
*
* @param input the variable to calculate the derivative of
* @return the current derivative
*/
float update(float input); float update(float input);
// accessors // accessors
void setU(float u) {_u = u;} void setU(float u) {_u = u;}
@ -249,6 +265,7 @@ public:
protected: protected:
// attributes // attributes
float _u; /**< previous input */ float _u; /**< previous input */
bool _initialized;
BlockLowPass _lowPass; /**< low pass filter */ BlockLowPass _lowPass; /**< low pass filter */
}; };

Loading…
Cancel
Save