14constexpr double kSetHomeTerrainAltMax = 10000.0;
15constexpr double kSetHomeTerrainAltMin = -500.0;
18constexpr int kAltQueryMinIntervalMs = 500;
19constexpr qreal kAltMinDistanceTraveled = 2.0;
20constexpr float kAltMinAltitudeChanged = 0.5f;
27 _altQueryTimer.restart();
32 if (!coord.isValid()) {
39 if (_doSetHomeQuery) {
41 this, &TerrainQueryCoordinator::_doSetHomeTerrainReceived);
42 _doSetHomeQuery =
nullptr;
45 _doSetHomeCoordinate = coord;
49 this, &TerrainQueryCoordinator::_doSetHomeTerrainReceived);
51 QList<QGeoCoordinate> rgCoord;
52 rgCoord.append(coord);
53 _doSetHomeQuery->requestData(rgCoord);
56void TerrainQueryCoordinator::_doSetHomeTerrainReceived(
bool success, QList<double> heights)
59 const double terrainAltitude = heights[0];
60 if (_doSetHomeCoordinate.isValid()
61 && terrainAltitude <= kSetHomeTerrainAltMax
62 && terrainAltitude >= kSetHomeTerrainAltMin) {
70 static_cast<float>(qQNaN()),
71 _doSetHomeCoordinate.latitude(),
72 _doSetHomeCoordinate.longitude(),
74 }
else if (_doSetHomeCoordinate.isValid()) {
75 qCDebug(TerrainQueryCoordinatorLog) <<
"_doSetHomeTerrainReceived: elevation data out of limits";
77 qCDebug(TerrainQueryCoordinatorLog) <<
"_doSetHomeTerrainReceived: cached home coordinate not valid";
80 QGC::showAppMessage(tr(
"Set Home failed, terrain data not available for selected coordinate"));
83 _doSetHomeQuery =
nullptr;
84 _doSetHomeCoordinate = QGeoCoordinate();
89 if (!coord.isValid()) {
95 this, &TerrainQueryCoordinator::_roiTerrainReceived);
99 _roiCoordinate = coord;
103 this, &TerrainQueryCoordinator::_roiTerrainReceived);
105 QList<QGeoCoordinate> rgCoord;
106 rgCoord.append(coord);
107 _roiQuery->requestData(rgCoord);
110void TerrainQueryCoordinator::_roiTerrainReceived(
bool success, QList<double> heights)
114 if (!_roiCoordinate.isValid()) {
120 roiAltitude =
static_cast<float>(heights[0]);
122 qCDebug(TerrainQueryCoordinatorLog) <<
"_roiTerrainReceived: terrain query failed, falling back to home altitude";
123 roiAltitude =
static_cast<float>(_vehicle->
homePosition().altitude());
126 qCDebug(TerrainQueryCoordinatorLog) <<
"roiWithTerrain: lat" << _roiCoordinate.latitude()
127 <<
"lon" << _roiCoordinate.longitude()
128 <<
"terrainAltAMSL" << roiAltitude <<
"success" << success;
132 _roiCoordinate = QGeoCoordinate();
137 if (_vehicle->
capabilityBits() & MAV_PROTOCOL_CAPABILITY_COMMAND_INT) {
140 MAV_CMD_DO_SET_ROI_LOCATION,
143 static_cast<float>(qQNaN()),
144 static_cast<float>(qQNaN()),
145 static_cast<float>(qQNaN()),
146 static_cast<float>(qQNaN()),
153 MAV_CMD_DO_SET_ROI_LOCATION,
155 static_cast<float>(qQNaN()),
156 static_cast<float>(qQNaN()),
157 static_cast<float>(qQNaN()),
158 static_cast<float>(qQNaN()),
159 static_cast<float>(coord.latitude()),
160 static_cast<float>(coord.longitude()),
169 if (_altQueryTimer.elapsed() < kAltQueryMinIntervalMs) {
173 const QGeoCoordinate currentCoord = _vehicle->
coordinate();
174 if (!currentCoord.isValid()) {
181 if (_altLastCoord.isValid() && !qIsNaN(_altLastRelAlt)) {
182 if (_altLastCoord.distanceTo(currentCoord) < kAltMinDistanceTraveled
183 && std::fabs(currentRelAlt - _altLastRelAlt) < kAltMinAltitudeChanged) {
188 _altLastCoord = currentCoord;
189 _altLastRelAlt = currentRelAlt;
193 this, &TerrainQueryCoordinator::_altitudeAboveTerrainReceived);
199 this, &TerrainQueryCoordinator::_altitudeAboveTerrainReceived);
201 QList<QGeoCoordinate> rgCoord;
202 rgCoord.append(currentCoord);
203 _altQuery->requestData(rgCoord);
204 _altQueryTimer.restart();
207void TerrainQueryCoordinator::_altitudeAboveTerrainReceived(
bool success, QList<double> heights)
210 qCDebug(TerrainQueryCoordinatorLog) <<
"_altitudeAboveTerrainReceived: terrain data not available";
212 const double terrainAltitude = heights[0];
213 const double altitudeAboveTerrain = _vehicle->
altitudeAMSL()->
rawValue().toDouble() - terrainAltitude;
#define QGC_LOGGING_CATEGORY(name, categoryStr)
void setRawValue(const QVariant &value)
QVariant rawValue() const
Value after translation.
NOTE: TerrainAtCoordinateQuery is not thread safe. All instances/calls to ElevationProvider must be o...
void terrainDataReceived(bool success, const QList< double > &heights)
void updateAltAboveTerrain()
void roiWithTerrain(const QGeoCoordinate &coord)
void sendROICommand(const QGeoCoordinate &coord, MAV_FRAME frame, float altitude)
void doSetHomeWithTerrain(const QGeoCoordinate &coord)
TerrainQueryCoordinator(Vehicle *vehicle)
Fact * altitudeRelative()
Fact * altitudeAboveTerr()
void sendMavCommand(int compId, MAV_CMD command, bool showError, float param1=0.0f, float param2=0.0f, float param3=0.0f, float param4=0.0f, float param5=0.0f, float param6=0.0f, float param7=0.0f)
QGeoCoordinate homePosition()
uint64_t capabilityBits() const
void sendMavCommandInt(int compId, MAV_CMD command, MAV_FRAME frame, bool showError, float param1, float param2, float param3, float param4, double param5, double param6, float param7)
int defaultComponentId() const
QGeoCoordinate coordinate()
void showAppMessage(const QString &message, const QString &title)
Modal application message. Queued if the UI isn't ready yet.