refs #865, use CG for on ground estimation

This commit is contained in:
Klaus Basan
2017-01-26 21:54:08 +01:00
committed by Mathew Sutcliffe
parent 818cdfba59
commit 8fb79f613c
3 changed files with 22 additions and 15 deletions

View File

@@ -241,17 +241,15 @@ namespace BlackMisc
CLength CAircraftSituation::getHeightAboveGround() const
{
if (this->getAltitude().isNull()) { return { 0, nullptr }; }
if (this->getAltitude().getReferenceDatum() == CAltitude::AboveGround)
{
// we have a sure value explicitly set
return this->getAltitude();
}
const CLength gh(this->getGroundElevation());
if (!gh.isNull() && !getAltitude().isNull())
{
return this->getAltitude() - gh;
}
return { 0, nullptr };
if (gh.isNull()) { return { 0, nullptr }; }
return this->getAltitude() - gh;
}
CAltitude CAircraftSituation::getCorrectedAltitude() const

View File

@@ -73,9 +73,10 @@ namespace BlackMisc
//! Reliability of on ground information
enum OnGroundReliability
{
OnGroundByGuessing,
OnGroundByInterpolation, //!< strongest
OnGroundByElevationAndCG,
OnGroundByElevation,
OnGroundByInterpolation,
OnGroundByGuessing, //!< weakest
OnGroundReliabilityNoSet
};

View File

@@ -303,15 +303,23 @@ namespace BlackMisc
return;
}
// no value by factor, guess on elevation
const CLength heightAboveGround(situation.getHeightAboveGround());
const CLength cgAboveGround(hints.getCGAboveGround());
if (!heightAboveGround.isNull())
// on elevation and CG
if (!situation.getGroundElevation().isNull())
{
const bool og = cgAboveGround.isNull() ?
heightAboveGround.value(CLengthUnit::m()) < 1.0 :
heightAboveGround <= cgAboveGround;
situation.setOnGround(og ? CAircraftSituation::OnGround : CAircraftSituation::NotOnGround, CAircraftSituation::OnGroundByElevation);
CLength offset(hints.isVtolAircraft() ? 0.0 : 1.0, CLengthUnit::m()); // offset from ground
CAircraftSituation::OnGroundReliability reliability = CAircraftSituation::OnGroundByElevation;
if (!hints.isVtolAircraft() && !hints.getCGAboveGround().isNull())
{
offset = hints.getCGAboveGround();
reliability = CAircraftSituation::OnGroundByElevationAndCG;
}
Q_ASSERT_X(situation.getGroundElevation().getReferenceDatum() == CAltitude::MeanSeaLevel, Q_FUNC_INFO, "Need MSL elevation");
const CAircraftSituation::IsOnGround og =
situation.getHeightAboveGround() <= offset ?
CAircraftSituation::OnGround : CAircraftSituation::NotOnGround;
situation.setOnGround(og, reliability);
return;
}
// for VTOL aircraft we give up