fixup! Add velocity extrapolator

This commit is contained in:
Lars Toenning
2022-12-22 17:56:34 +01:00
parent 4c07beb2bf
commit 11c897e04f
2 changed files with 43 additions and 46 deletions

View File

@@ -1272,27 +1272,15 @@ namespace BlackCore
// update client info
this->autoAdjustCientGndCapability(situation);
// store situation history
Q_ASSERT_X(m_fsdClient, Q_FUNC_INFO, "Empty fsd client");
const bool isVatsim = m_fsdClient->getServer().getEcosystem().isSystem(CEcosystem::VATSIM);
Q_ASSERT_X(!situation.hasVelocity(), Q_FUNC_INFO, "Velocity of aircraft updates must be invalid");
if (isVatsim)
{
// We are not using PilotDataUpdate (@) for VATSIM with velocity to update position
// but store this situation to use some data of it with visual pilot updates
m_fullSituations[callsign] = situation;
if (!existsInRange && validMaxRange)
{
// On first recv packet, add position with 0 velocity
CAircraftSituation sit(situation);
sit.setVelocity(CAircraftVelocity());
this->storeAircraftSituation(sit);
}
}
else
{
this->storeAircraftSituation(situation); // updates situation
}
// store situation history
this->storeAircraftSituation(situation); // updates situation
// The packet is only stored above, if previously no velocity packet was added.
// To transfer data from the @ update to velocity updates, store this situation separatly
// TODO: Not needed anymore if all packets would be added to the history
m_fullSituations[callsign] = situation;
// in case we only have
if (!existsInRange && validMaxRange)
@@ -1389,28 +1377,23 @@ namespace BlackCore
Q_ASSERT_X(situation.isValidVectorRange(), Q_FUNC_INFO, "out of range [-1,1]");
}
// Visual packets do not have groundspeed, hence set the last known value.
// If there is no full position available yet, throw this interim position away.
// Visual packets do not have groundspeed, pressure altitude and onGround flag,
// hence set the last known value from last full update or last visual update.
// If there is no full position available yet, throw this visual position away.
CAircraftSituation visualSituation(situation);
// changed position, continue and copy values
visualSituation.setCurrentUtcTime();
// Use data from last full position update (@) if newer or from last stored situation if nothing changed
// If non of the following cases catches (no full update received in the past), use default initialized values
CAircraftSituation lastFullUpdate{};
auto lastData = m_fullSituations.find(callsign);
CAircraftSituation lastSituation{};
auto lastDataIt = m_fullSituations.find(callsign);
CAircraftSituationList history = this->remoteAircraftSituations(callsign);
if (lastData != m_fullSituations.end())
if (lastDataIt != m_fullSituations.end())
{
// New full update in last data.
lastFullUpdate = *lastData;
m_fullSituations.erase(lastData);
lastSituation = *lastDataIt;
m_fullSituations.erase(lastDataIt);
}
else if (!history.empty())
{
// Use full update info from last position/visual update
lastFullUpdate = history.latestObject();
lastSituation = history.latestObject();
}
else
{
@@ -1420,21 +1403,20 @@ namespace BlackCore
// Throw away visual update
return;
}
visualSituation.setPressureAltitude(lastFullUpdate.getPressureAltitude());
visualSituation.setOnGround(lastFullUpdate.isOnGround());
visualSituation.setGroundSpeed(lastFullUpdate.getGroundSpeed());
// changed position, continue and copy values
visualSituation.setCurrentUtcTime();
visualSituation.setPressureAltitude(lastSituation.getPressureAltitude());
visualSituation.setOnGround(lastSituation.isOnGround());
visualSituation.setGroundSpeed(lastSituation.getGroundSpeed());
Q_ASSERT_X(visualSituation.hasVelocity(), Q_FUNC_INFO, "Velocity of visual updates must be valid");
// store situation history
this->storeAircraftSituation(visualSituation);
history = this->remoteAircraftSituations(callsign);
if (!history.empty())
{
const CAircraftSituation lastSituation = history.latestObject();
const bool samePosition = lastSituation.equalNormalVectorDouble(visualSituation);
if (samePosition) { return; } // nothing to update
}
const bool samePosition = lastSituation.equalNormalVectorDouble(visualSituation);
if (samePosition) { return; } // nothing to update
// update aircraft
this->updateAircraftInRangeDistanceBearing(

View File

@@ -186,7 +186,22 @@ namespace BlackMisc::Simulation
CInterpolatorVelocity::CInterpolant CInterpolatorVelocity::getInterpolant(SituationLog &log)
{
CAircraftSituation current = *m_currentSituations.begin();
Q_ASSERT_X(m_currentSituations.size() >= 1, Q_FUNC_INFO, "Velocity interpolator needs at least one situation");
CAircraftSituation current{};
// Find first (latest) situation with velocity data
auto it = std::find_if(m_currentSituations.begin(), m_currentSituations.end(), [](const CAircraftSituation &sit){ return sit.hasVelocity(); });
if (it != m_currentSituations.end())
{
current = *it;
}
else
{
// No situation with velocity data available. Take the latest full update with velocities set to 0
current = *m_currentSituations.begin();
current.setVelocity(CAircraftVelocity(0, 0, 0, CSpeedUnit::m_s(), 0, 0, 0, CAngleUnit::rad(), CTimeUnit::s()));
}
Q_ASSERT_X(current.hasVelocity(), Q_FUNC_INFO, "Velocity interpolator needs situation with valid velocities");
// adjust ground if required
if (!current.canLikelySkipNearGroundInterpolation() && !current.hasGroundElevation())
@@ -194,7 +209,7 @@ namespace BlackMisc::Simulation
// The elevation needs to be requested again when we do not receive any velocity updates of an aircraft
// for some time and the elevation is therefore discarded from the cache.
// This happens when the aircraft is not moving and we only receive a #ST packet once.
const CElevationPlane planeOld = this->findClosestElevationWithinRangeOrRequest(current, CElevationPlane::singlePointRadius(), current.getCallsign());
const CElevationPlane planeOld = this->findClosestElevationWithinRange(current, CElevationPlane::singlePointRadius());
current.setGroundElevationChecked(planeOld, CAircraftSituation::FromCache);
}