QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
TransectStyleComplexItem.h
Go to the documentation of this file.
1#pragma once
2
4#include "MissionItem.h"
5#include "SettingsFact.h"
6#include "QGCMapPolygon.h"
7#include "CameraCalc.h"
8#include "TerrainQuery.h"
9
10#include <QtCore/QLoggingCategory>
11
12Q_DECLARE_LOGGING_CATEGORY(TransectStyleComplexItemLog)
13
15
17{
18 Q_OBJECT
19
20public:
22
23 Q_PROPERTY(QGCMapPolygon* surveyAreaPolygon READ surveyAreaPolygon CONSTANT)
29
30 Q_PROPERTY(int cameraShots READ cameraShots NOTIFY cameraShotsChanged)
31 Q_PROPERTY(double timeBetweenShots READ timeBetweenShots NOTIFY timeBetweenShotsChanged)
32 Q_PROPERTY(double coveredArea READ coveredArea NOTIFY coveredAreaChanged)
35
39
40 QGCMapPolygon* surveyAreaPolygon (void) { return &_surveyAreaPolygon; }
41 CameraCalc* cameraCalc (void) { return &_cameraCalc; }
42 QVariantList visualTransectPoints(void) { return _visualTransectPoints; }
43
51
52 const Fact* hoverAndCapture (void) const { return &_hoverAndCaptureFact; }
53
54 int cameraShots (void) const { return _cameraShots; }
55 double coveredArea (void) const;
56 bool hoverAndCaptureAllowed (void) const;
57
58 virtual double timeBetweenShots (void) { return 0; } // Most be overridden. Implementation here is needed for unit testing.
59
60 double triggerDistance (void) const { return _cameraCalc.adjustedFootprintFrontal()->rawValue().toDouble(); }
61 bool hoverAndCaptureEnabled (void) const { return hoverAndCapture()->rawValue().toBool(); }
62 bool triggerCamera (void) const { return triggerDistance() != 0; }
63
64 // Used internally only by unit tests
65 int _transectCount(void) const { return _transects.count(); }
66
67 // Overrides from ComplexMissionItem
68 int lastSequenceNumber (void) const final;
69 QString mapVisualQML (void) const override = 0;
70 bool load (const QJsonObject& complexObject, int sequenceNumber, QString& errorString) override = 0;
71 void addKMLVisuals (KMLPlanDomDocument& domDocument) final;
72 double complexDistance (void) const final { return _complexDistance; }
73 double greatestDistanceTo (const QGeoCoordinate &other) const final;
74
75 // Overrides from VisualMissionItem
76 void save (QJsonArray& planItems) override = 0;
77 bool specifiesCoordinate (void) const override = 0;
78 void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final;
79 void applyNewAltitude (double newAltitude) final;
80 bool dirty (void) const final { return _dirty; }
81 bool isSimpleItem (void) const final { return false; }
82 bool isStandaloneCoordinate (void) const final { return false; }
83 bool specifiesAltitudeOnly (void) const final { return false; }
84 QGeoCoordinate coordinate (void) const final { return entryCoordinate(); }
85 QGeoCoordinate entryCoordinate (void) const final { return _entryCoordinate; }
86 QGeoCoordinate exitCoordinate (void) const final { return _exitCoordinate; }
87 int sequenceNumber (void) const final { return _sequenceNumber; }
88 double specifiedFlightSpeed (void) final { return std::numeric_limits<double>::quiet_NaN(); }
89 double specifiedGimbalYaw (void) final { return std::numeric_limits<double>::quiet_NaN(); }
90 double specifiedGimbalPitch (void) final { return std::numeric_limits<double>::quiet_NaN(); }
92 ReadyForSaveState readyForSaveState (void) const override;
93 QString commandDescription (void) const override { return tr("Transect"); }
94 QString commandName (void) const override { return tr("Transect"); }
95 QString abbreviation (void) const override { return tr("T"); }
96 bool exitCoordinateSameAsEntry (void) const final { return false; }
97 void setDirty (bool dirty) final;
98 void setCoordinate (const QGeoCoordinate& coordinate) override;
99 void setSequenceNumber (int sequenceNumber) final;
100 double editableAlt (void) const final;
101 double amslEntryAlt (void) const final;
102 double amslExitAlt (void) const final;
103 double minAMSLAltitude (void) const final;
104 double maxAMSLAltitude (void) const final;
105
106 static constexpr const char* turnAroundDistanceName = "TurnAroundDistance";
107 static constexpr const char* turnAroundDistanceMultiRotorName = "TurnAroundDistanceMultiRotor";
108 static constexpr const char* cameraTriggerInTurnAroundName = "CameraTriggerInTurnAround";
109 static constexpr const char* hoverAndCaptureName = "HoverAndCapture";
110 static constexpr const char* refly90DegreesName = "Refly90Degrees";
111 static constexpr const char* terrainAdjustToleranceName = "TerrainAdjustTolerance";
112 static constexpr const char* terrainAdjustMaxClimbRateName = "TerrainAdjustMaxClimbRate";
113 static constexpr const char* terrainAdjustMaxDescentRateName = "TerrainAdjustMaxDescentRate";
114
115signals:
121
122protected slots:
123 void _setDirty (void);
124 void _setIfDirty (bool dirty);
125 void _updateCoordinateAltitudes (void);
126 void _polyPathTerrainData (bool success, const QList<TerrainPathQuery::PathHeightInfo_t>& rgPathHeightInfo);
127 void _missionItemCoordTerrainData (bool success, QList<double> heights);
128 void _rebuildTransects (void);
129
130protected:
131 virtual void _rebuildTransectsPhase1 (void) = 0;
132 virtual void _recalcCameraShots (void) = 0;
133
134 void _save (QJsonObject& saveObject);
135 bool _load (const QJsonObject& complexObject, bool forPresets, QString& errorString);
136 void _setExitCoordinate (const QGeoCoordinate& coordinate);
137 void _setCameraShots (int cameraShots);
138 double _triggerDistance (void) const;
139 bool _hasTurnaround (void) const;
140 double _turnAroundDistance (void) const;
141 void _appendWaypoint (QList<MissionItem*>& items, QObject* missionItemParent, int& seqNum, MAV_FRAME mavFrame, float holdTime, const QGeoCoordinate& coordinate);
142 void _appendSinglePhotoCapture (QList<MissionItem*>& items, QObject* missionItemParent, int& seqNum);
143 void _appendConditionGate (QList<MissionItem*>& items, QObject* missionItemParent, int& seqNum, MAV_FRAME mavFrame, const QGeoCoordinate& coordinate);
144 void _appendCameraTriggerDistance (QList<MissionItem*>& items, QObject* missionItemParent, int& seqNum, float triggerDistance);
145 void _appendCameraTriggerDistanceUpdatePoint(QList<MissionItem*>& items, QObject* missionItemParent, int& seqNum, MAV_FRAME mavFrame, const QGeoCoordinate& coordinate, bool useConditionGate, float triggerDistance);
146 void _buildAndAppendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent);
147 void _appendLoadedMissionItems (QList<MissionItem*>& items, QObject* missionItemParent);
148 void _recalcComplexDistance (void);
149
151 QGeoCoordinate _entryCoordinate;
152 QGeoCoordinate _exitCoordinate;
154
163
164 typedef struct {
165 QGeoCoordinate coord;
167 } CoordInfo_t;
168
170 QList<QList<CoordInfo_t>> _transects;
171 QList<TerrainPathQuery::PathHeightInfo_t> _rgPathHeightInfo;
172 QList<QGeoCoordinate> _rgFlyThroughMissionItemCoords;
174 QList<CoordInfo_t> _rgFlightPathCoordInfo;
175
176 bool _ignoreRecalc = false;
177 double _complexDistance = qQNaN();
180 double _vehicleSpeed = 5;
182 double _minAMSLAltitude = qQNaN();
183 double _maxAMSLAltitude = qQNaN();
184
185 QObject* _loadedMissionItemsParent = nullptr;
186 QList<MissionItem*> _loadedMissionItems;
187
188 QMap<QString, FactMetaData*> _metaDataMap;
189
197
198 static constexpr const char* _jsonTransectStyleComplexItemKey = "TransectStyleComplexItem";
199 static constexpr const char* _jsonCameraCalcKey = "CameraCalc";
200 static constexpr const char* _jsonVisualTransectPointsKey = "VisualTransectPoints";
201 static constexpr const char* _jsonItemsKey = "Items";
202 static constexpr const char* _jsonTerrainFlightSpeed = "TerrainFlightSpeed";
203 static constexpr const char* _jsonCameraShotsKey = "CameraShots";
204
205 static constexpr int _terrainQueryTimeoutMsecs= 1000;
206 static constexpr int _hoverAndCaptureDelaySeconds = 4;
207 static constexpr double _minimumTransectSpacingMeters = 0.3;
208 static constexpr double _forceLargeTransectSpacingMeters = 100000;
209
210private slots:
211 void _reallyQueryTransectsPathHeightInfo (void);
212 void _handleHoverAndCaptureEnabled (QVariant enabled);
213 void _updateFlightPathSegmentsDontCallDirectly (void);
214 void _segmentTerrainCollisionChanged (bool terrainCollision) final;
215 void _distanceModeChanged (int distanceMode);
216
217private:
218 typedef struct {
219 bool imagesInTurnaround;
220 bool hasTurnarounds;
221 bool addTriggerAtFirstAndLastPoint;
222 bool useConditionGate;
223 } BuildMissionItemsState_t;
224
225 void _queryTransectsPathHeightInfo (void);
226 void _queryMissionItemCoordHeights (void);
227 void _adjustForAvailableTerrainData (void);
228 void _buildFlightPathCoordInfoFromTransects (void);
229 void _buildFlightPathCoordInfoFromPathHeightInfoForCalcAboveTerrain (void);
230 void _buildFlightPathCoordInfoFromPathHeightInfoForTerrainFrame (void);
231 void _buildFlightPathCoordInfoFromMissionItems (void);
232 void _adjustForMaxRates (void);
233 void _adjustForTolerance (void);
234 double _altitudeBetweenCoords (const QGeoCoordinate& fromCoord, const QGeoCoordinate& toCoord, double percentTowardsTo);
235 int _maxPathHeight (const TerrainPathQuery::PathHeightInfo_t& pathHeightInfo, int fromIndex, int toIndex, double& maxHeight);
236 BuildMissionItemsState_t _buildMissionItemsState (void) const;
237
238 TerrainPolyPathQuery* _currentTerrainPolyPathQuery = nullptr;
239 TerrainAtCoordinateQuery* _currentTerrainAtCoordinateQuery = nullptr;
240 QTimer _terrainPolyPathQueryTimer;
241
242 // Deprecated json keys
243 static constexpr const char* _jsonTerrainFollowKeyDeprecated = "FollowTerrain";
244};
Q_DECLARE_LOGGING_CATEGORY(AndroidSerialLog)
QString errorString
Fact * adjustedFootprintFrontal(void)
Definition CameraCalc.h:58
virtual bool terrainCollision(void) const
A Fact is used to hold a single value within the system.
Definition Fact.h:19
Used to convert a Plan to a KML document.
Master controller for mission, fence, rally.
A SettingsFact is Fact which holds a QSettings value.
NOTE: TerrainAtCoordinateQuery is not thread safe. All instances/calls to ElevationProvider must be o...
static constexpr double _minimumTransectSpacingMeters
virtual void _rebuildTransectsPhase1(void)=0
Rebuilds the _transects array.
QObject * _loadedMissionItemsParent
Parent for all items in _loadedMissionItems for simpler delete.
static constexpr const char * _jsonTransectStyleComplexItemKey
QList< QList< CoordInfo_t > > _transects
QList< QGeoCoordinate > _rgFlyThroughMissionItemCoords
double minAMSLAltitude(void) const final
double editableAlt(void) const final
double specifiedGimbalPitch(void) final
void _appendLoadedMissionItems(QList< MissionItem * > &items, QObject *missionItemParent)
static constexpr const char * cameraTriggerInTurnAroundName
QString commandName(void) const override
void save(QJsonArray &planItems) override=0
static constexpr const char * terrainAdjustMaxDescentRateName
double amslExitAlt(void) const final
int lastSequenceNumber(void) const final
double maxAMSLAltitude(void) const final
void _appendSinglePhotoCapture(QList< MissionItem * > &items, QObject *missionItemParent, int &seqNum)
QList< MissionItem * > _loadedMissionItems
Mission items loaded from plan file.
void setMissionFlightStatus(MissionController::MissionFlightStatus_t &missionFlightStatus) final
bool isSimpleItem(void) const final
static constexpr const char * _jsonVisualTransectPointsKey
void _setExitCoordinate(const QGeoCoordinate &coordinate)
virtual double timeBetweenShots(void)
void _buildAndAppendMissionItems(QList< MissionItem * > &items, QObject *missionItemParent)
static constexpr const char * _jsonItemsKey
static constexpr const char * _jsonTerrainFlightSpeed
double _triggerDistance(void) const
void _updateFlightPathSegmentsSignal(void)
void setSequenceNumber(int sequenceNumber) final
static constexpr const char * terrainAdjustMaxClimbRateName
static constexpr const char * terrainAdjustToleranceName
void _setCameraShots(int cameraShots)
void _appendConditionGate(QList< MissionItem * > &items, QObject *missionItemParent, int &seqNum, MAV_FRAME mavFrame, const QGeoCoordinate &coordinate)
QGeoCoordinate coordinate(void) const final
double complexDistance(void) const final
double greatestDistanceTo(const QGeoCoordinate &other) const final
void applyNewAltitude(double newAltitude) final
Adjust the altitude of the item if appropriate to the new altitude.
void setCoordinate(const QGeoCoordinate &coordinate) override
int sequenceNumber(void) const final
bool specifiesCoordinate(void) const override=0
static constexpr int _terrainQueryTimeoutMsecs
void addKMLVisuals(KMLPlanDomDocument &domDocument) final
double specifiedFlightSpeed(void) final
void _missionItemCoordTerrainData(bool success, QList< double > heights)
void _polyPathTerrainData(bool success, const QList< TerrainPathQuery::PathHeightInfo_t > &rgPathHeightInfo)
ReadyForSaveState readyForSaveState(void) const override
void _appendCameraTriggerDistanceUpdatePoint(QList< MissionItem * > &items, QObject *missionItemParent, int &seqNum, MAV_FRAME mavFrame, const QGeoCoordinate &coordinate, bool useConditionGate, float triggerDistance)
QString abbreviation(void) const override
static constexpr const char * hoverAndCaptureName
static constexpr const char * refly90DegreesName
QGCMapPolygon *surveyAreaPolygon READ surveyAreaPolygon CONSTANT(CameraCalc *cameraCalc READ cameraCalc CONSTANT) 1(Fact *turnAroundDistance READ turnAroundDistance CONSTANT) 1(Fact *cameraTriggerInTurnAround READ cameraTriggerInTurnAround CONSTANT) 1(Fact *hoverAndCapture READ hoverAndCapture CONSTANT) 1(Fact *refly90Degrees READ refly90Degrees CONSTANT) 1(int cameraShots READ cameraShots NOTIFY cameraShotsChanged) 1(double timeBetweenShots READ timeBetweenShots NOTIFY timeBetweenShotsChanged) 1(double coveredArea READ coveredArea NOTIFY coveredAreaChanged) 1(bool hoverAndCaptureAllowed READ hoverAndCaptureAllowed CONSTANT) 1(QVariantList visualTransectPoints READ visualTransectPoints NOTIFY visualTransectPointsChanged) 1(Fact *terrainAdjustTolerance READ terrainAdjustTolerance CONSTANT) 1(Fact *terrainAdjustMaxDescentRate READ terrainAdjustMaxDescentRate CONSTANT) 1(Fact *terrainAdjustMaxClimbRate READ terrainAdjustMaxClimbRate CONSTANT) QGCMapPolygon *surveyAreaPolygon(void)
QMap< QString, FactMetaData * > _metaDataMap
QString commandDescription(void) const override
const Fact * hoverAndCapture(void) const
bool _load(const QJsonObject &complexObject, bool forPresets, QString &errorString)
void _appendCameraTriggerDistance(QList< MissionItem * > &items, QObject *missionItemParent, int &seqNum, float triggerDistance)
void _appendWaypoint(QList< MissionItem * > &items, QObject *missionItemParent, int &seqNum, MAV_FRAME mavFrame, float holdTime, const QGeoCoordinate &coordinate)
static constexpr const char * _jsonCameraCalcKey
static constexpr const char * _jsonCameraShotsKey
QList< TerrainPathQuery::PathHeightInfo_t > _rgPathHeightInfo
Path height for each segment includes turn segments.
bool exitCoordinateSameAsEntry(void) const final
static constexpr double _forceLargeTransectSpacingMeters
static constexpr int _hoverAndCaptureDelaySeconds
QVariantList _visualTransectPoints
Used to draw the flight path visuals on the screen.
QVariantList visualTransectPoints(void)
QList< double > _rgFlyThroughMissionItemCoordsTerrainHeights
QGeoCoordinate entryCoordinate(void) const final
static constexpr const char * turnAroundDistanceMultiRotorName
bool isStandaloneCoordinate(void) const final
void _save(QJsonObject &saveObject)
QString mapVisualQML(void) const override=0
bool specifiesAltitudeOnly(void) const final
double amslEntryAlt(void) const final
void visualTransectPointsChanged(void)
QList< CoordInfo_t > _rgFlightPathCoordInfo
Fully calculated flight path (including terrain if needed)
virtual void _recalcCameraShots(void)=0
bool load(const QJsonObject &complexObject, int sequenceNumber, QString &errorString) override=0
void timeBetweenShotsChanged(void)
QGeoCoordinate exitCoordinate(void) const final
static constexpr const char * turnAroundDistanceName
@ CoordTypeTurnaround
Turnaround extension waypoint.
@ CoordTypeSurveyExit
Waypoint at exit edge of survey polygon.
@ CoordTypeInterior
Interior waypoint for flight path only (example: interior corridor point)
@ CoordTypeInteriorTerrainAdded
Interior waypoint added for terrain.
@ CoordTypeInteriorHoverTrigger
Interior waypoint for hover and capture trigger.
@ CoordTypeSurveyEntry
Waypoint at entry edge of survey polygon.
void appendMissionItems(QList< MissionItem * > &items, QObject *missionItemParent) final
bool flyView(void) const
PlanMasterController * masterController(void)