1
0
Fork 0
flightgear/src/Systems/static.cxx
Torsten Dreyer 48180eb9ab Optionally disable the lowpass for the static system
the static system has an optional "tau" parameter to
define the rate at which the output value changes.

Setting this value to zero now disables the filter.

This prevents wrong airspeed indications on rapid
altitude changes. No functional changes if tau has
other-than-zero values (e.g. the default systems).
2014-09-10 21:07:57 +02:00

113 lines
3.5 KiB
C++

// static.cxx - the static air system.
// Written by David Megginson, started 2002.
//
// Last modified by Eric van den Berg, 09 Nov 2013
// This file is in the Public Domain and comes with no warranty.
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "static.hxx"
#include <string>
#include <Main/fg_props.hxx>
#include <Main/util.hxx>
#include <simgear/constants.h>
#include <simgear/math/SGMisc.hxx>
#include <simgear/math/SGLimits.hxx>
#include <simgear/math/SGMathFwd.hxx>
#include <simgear/sg_inlines.h>
StaticSystem::StaticSystem ( SGPropertyNode *node )
:
_name(node->getStringValue("name", "static")),
_num(node->getIntValue("number", 0)),
_tau(SGMiscd::max(.0,node->getDoubleValue("tau", 1))),
_error_factor(node->getDoubleValue("error-factor", 0)),
_type(node->getIntValue("type", 0))
{
}
StaticSystem::~StaticSystem ()
{
}
void
StaticSystem::init ()
{
std::string branch = "/systems/" + _name;
SGPropertyNode *node = fgGetNode(branch.c_str(), _num, true );
_serviceable_node = node->getChild("serviceable", 0, true);
_pressure_in_node = fgGetNode("/environment/pressure-inhg", true);
_pressure_out_node = node->getChild("pressure-inhg", 0, true);
_beta_node = fgGetNode("/orientation/side-slip-deg", true);
_alpha_node = fgGetNode("/orientation/alpha-deg", true);
_mach_node = fgGetNode("/velocities/mach", true);
SG_CLAMP_RANGE(_error_factor,0.0,1.0); // making sure the error_factor is between 0 and 1
reinit();
}
void
StaticSystem::reinit ()
{
// start with settled static pressure
_pressure_out_node->setDoubleValue(_pressure_in_node->getDoubleValue());
}
void
StaticSystem::bind ()
{
}
void
StaticSystem::unbind ()
{
}
void
StaticSystem::update (double dt)
{
if (_serviceable_node->getBoolValue()) {
double p_new = _pressure_in_node->getDoubleValue(); //current static pressure around aircraft
double p = _pressure_out_node->getDoubleValue(); //last pressure in aircraft static system
double beta;
double alpha;
double mach;
double trat = _tau ? dt/_tau : SGLimitsd::max();
double proj_factor = 0;
double pt;
double qc_part;
if (_type == 1) { // type 1 = static pressure dependent on side-slip only: static port on the fuselage
beta = _beta_node->getDoubleValue() * SGD_DEGREES_TO_RADIANS;
proj_factor = sin(beta);
}
if (_type == 2) { // type 2 = static pressure dependent on aoa and side-slip: static port on the pitot tube
alpha = _alpha_node->getDoubleValue() * SGD_DEGREES_TO_RADIANS;
beta = _beta_node->getDoubleValue() * SGD_DEGREES_TO_RADIANS;
proj_factor = sqrt( 1.0 - cos(beta)*cos(beta) * cos(alpha)*cos(alpha) );
}
if ( (_type ==1) || (_type == 2) ) {
mach = _mach_node->getDoubleValue();
pt = p_new * pow(1 + 0.2 * mach*mach*proj_factor*proj_factor, 3.5 ); //total pressure perpendicular to static port (=perpendicular to body x-axis)
qc_part = (pt - p_new) * _error_factor ; //part of impact pressure to be added to static pressure (due to sideslip)
p_new = p_new + qc_part;
}
_pressure_out_node->setDoubleValue(
_tau > .0 ? fgGetLowPass(p, p_new, trat) : p_new
); //setting new pressure in static system
}
}
// end of static.cxx