diff --git a/src/PositionManager/PositionManager.cpp b/src/PositionManager/PositionManager.cpp index 17ee71614375..596f00a43ea5 100644 --- a/src/PositionManager/PositionManager.cpp +++ b/src/PositionManager/PositionManager.cpp @@ -119,11 +119,18 @@ void QGCPositionManager::_positionUpdated(const QGeoPositionInfo &update) } } + // Accept the altitude when the fix carries one and the vertical accuracy is either + // acceptable or not reported at all. The Android position source typically reports a + // vertical accuracy well above the old 10m gate (or none), which used to drop the + // altitude entirely and leave consumers such as Remote ID (which mandates an operator + // altitude in FAA regions) with a NaN. + bool verticalAccuracyOk = true; if (update.hasAttribute(QGeoPositionInfo::VerticalAccuracy)) { _gcsPositionVerticalAccuracy = update.attribute(QGeoPositionInfo::VerticalAccuracy); - if (_gcsPositionVerticalAccuracy <= kMinVerticalAccuracyMeters) { - newGCSPosition.setAltitude(update.coordinate().altitude()); - } + verticalAccuracyOk = (_gcsPositionVerticalAccuracy <= kMinVerticalAccuracyMeters); + } + if ((update.coordinate().type() == QGeoCoordinate::Coordinate3D) && verticalAccuracyOk) { + newGCSPosition.setAltitude(update.coordinate().altitude()); } _gcsPositionAccuracy = sqrt(pow(_gcsPositionHorizontalAccuracy, 2) + pow(_gcsPositionVerticalAccuracy, 2)); diff --git a/src/PositionManager/PositionManager.h b/src/PositionManager/PositionManager.h index 13c75b90c62d..53a92ce161d8 100644 --- a/src/PositionManager/PositionManager.h +++ b/src/PositionManager/PositionManager.h @@ -85,6 +85,6 @@ private slots: QGCCompass *_compass = nullptr; static constexpr qreal kMinHorizonalAccuracyMeters = 100.; - static constexpr qreal kMinVerticalAccuracyMeters = 10.; + static constexpr qreal kMinVerticalAccuracyMeters = 100.; static constexpr qreal kMinDirectionAccuracyDegrees = 30.; }; diff --git a/src/Vehicle/RemoteIDManager.cc b/src/Vehicle/RemoteIDManager.cc index 54a4086ee5bc..7fce98135bc3 100644 --- a/src/Vehicle/RemoteIDManager.cc +++ b/src/Vehicle/RemoteIDManager.cc @@ -488,6 +488,10 @@ void RemoteIDManager::setEmergency(bool declare) void RemoteIDManager::_updateLastGCSPositionInfo(QGeoPositionInfo update) { if (update.isValid()) { - _lastGeoPositionTimeStamp = update.timestamp().toUTC(); + // Stamp the local arrival time rather than update.timestamp(). The freshness + // check in _sendSystem() compares this against the local wall clock, and on some + // platforms (e.g. Android) the position source's own timestamp is offset from the + // system clock, which made gcsGPSGood flap green/red even with a healthy fix. + _lastGeoPositionTimeStamp = QDateTime::currentDateTimeUtc(); } }