Browse Source

Fix Takeoff item flight profile segment generation (#9268)

QGC4.4
Don Gagne 4 years ago committed by GitHub
parent
commit
a43ccc344a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 25
      src/MissionManager/FixedWingLandingComplexItem.cc
  2. 3
      src/MissionManager/FixedWingLandingComplexItem.h
  3. 24
      src/MissionManager/LandingComplexItem.cc
  4. 3
      src/MissionManager/LandingComplexItem.h
  5. 25
      src/MissionManager/LandingComplexItemTest.cc
  6. 5
      src/MissionManager/LandingComplexItemTest.h
  7. 33
      src/MissionManager/MissionController.cc
  8. 3
      src/MissionManager/SimpleMissionItem.cc
  9. 26
      src/MissionManager/VTOLLandingComplexItem.cc
  10. 3
      src/MissionManager/VTOLLandingComplexItem.h
  11. 1
      src/MissionManager/VisualMissionItem.h

25
src/MissionManager/FixedWingLandingComplexItem.cc

@ -158,3 +158,28 @@ bool FixedWingLandingComplexItem::scanForItem(QmlObjectListModel* visualItems, b @@ -158,3 +158,28 @@ bool FixedWingLandingComplexItem::scanForItem(QmlObjectListModel* visualItems, b
{
return _scanForItem(visualItems, flyView, masterController, _isValidLandItem, _createItem);
}
// Never call this method directly. If you want to update the flight segments you emit _updateFlightPathSegmentsSignal()
void FixedWingLandingComplexItem::_updateFlightPathSegmentsDontCallDirectly(void)
{
if (_cTerrainCollisionSegments != 0) {
_cTerrainCollisionSegments = 0;
emit terrainCollisionChanged(false);
}
_flightPathSegments.beginReset();
_flightPathSegments.clearAndDeleteContents();
if (useLoiterToAlt()->rawValue().toBool()) {
_appendFlightPathSegment(finalApproachCoordinate(), amslEntryAlt(), loiterTangentCoordinate(), amslEntryAlt()); // Best we can do to simulate loiter circle terrain profile
_appendFlightPathSegment(loiterTangentCoordinate(), amslEntryAlt(), landingCoordinate(), amslExitAlt());
} else {
_appendFlightPathSegment(finalApproachCoordinate(), amslEntryAlt(), landingCoordinate(), amslExitAlt());
}
_flightPathSegments.endReset();
if (_cTerrainCollisionSegments != 0) {
emit terrainCollisionChanged(true);
}
_masterController->missionController()->recalcTerrainProfile();
}

3
src/MissionManager/FixedWingLandingComplexItem.h

@ -55,7 +55,8 @@ public: @@ -55,7 +55,8 @@ public:
static const char* valueSetIsDistanceName;
private slots:
void _glideSlopeChanged(void);
void _updateFlightPathSegmentsDontCallDirectly (void) override;
void _glideSlopeChanged (void);
private:
static LandingComplexItem* _createItem (PlanMasterController* masterController, bool flyView, QObject* parent) { return new FixedWingLandingComplexItem(masterController, flyView, parent); }

24
src/MissionManager/LandingComplexItem.cc

@ -138,28 +138,6 @@ double LandingComplexItem::complexDistance(void) const @@ -138,28 +138,6 @@ double LandingComplexItem::complexDistance(void) const
return finalApproachCoordinate().distanceTo(loiterTangentCoordinate()) + loiterTangentCoordinate().distanceTo(landingCoordinate());
}
// Never call this method directly. If you want to update the flight segments you emit _updateFlightPathSegmentsSignal()
void LandingComplexItem::_updateFlightPathSegmentsDontCallDirectly(void)
{
if (_cTerrainCollisionSegments != 0) {
_cTerrainCollisionSegments = 0;
emit terrainCollisionChanged(false);
}
_flightPathSegments.beginReset();
_flightPathSegments.clearAndDeleteContents();
_appendFlightPathSegment(finalApproachCoordinate(), amslEntryAlt(), loiterTangentCoordinate(), amslEntryAlt());
_appendFlightPathSegment(loiterTangentCoordinate(), amslEntryAlt(), landingCoordinate(), amslEntryAlt());
_appendFlightPathSegment(landingCoordinate(), amslEntryAlt(), landingCoordinate(), amslExitAlt());
_flightPathSegments.endReset();
if (_cTerrainCollisionSegments != 0) {
emit terrainCollisionChanged(true);
}
_masterController->missionController()->recalcTerrainProfile();
}
void LandingComplexItem::setLandingCoordinate(const QGeoCoordinate& coordinate)
{
if (coordinate != _landingCoordinate) {
@ -412,7 +390,7 @@ bool LandingComplexItem::_scanForItem(QmlObjectListModel* visualItems, bool flyV @@ -412,7 +390,7 @@ bool LandingComplexItem::_scanForItem(QmlObjectListModel* visualItems, bool flyV
// Stop taking photos sequence - optional
// Stop taking video sequence - optional
// MAV_CMD_NAV_LOITER_TO_ALT or MAV_CMD_NAV_WAYPOINT
// MAV_CMD_NAV_LAND or MAV_CMS_NAV_VTOL_LAND
// MAV_CMD_NAV_LAND or MAV_CMD_NAV_VTOL_LAND
// Start looking for the commands in reverse order from the end of the list

3
src/MissionManager/LandingComplexItem.h

@ -128,7 +128,8 @@ signals: @@ -128,7 +128,8 @@ signals:
void _updateFlightPathSegmentsSignal(void);
protected slots:
void _updateFlightPathSegmentsDontCallDirectly (void);
virtual void _updateFlightPathSegmentsDontCallDirectly(void) = 0;
void _recalcFromHeadingAndDistanceChange (void);
void _recalcFromCoordinateChange (void);
void _setDirty (void);

25
src/MissionManager/LandingComplexItemTest.cc

@ -376,3 +376,28 @@ bool SimpleLandingComplexItem::_isValidLandItem(const MissionItem& missionItem) @@ -376,3 +376,28 @@ bool SimpleLandingComplexItem::_isValidLandItem(const MissionItem& missionItem)
return true;
}
}
// Never call this method directly. If you want to update the flight segments you emit _updateFlightPathSegmentsSignal()
void SimpleLandingComplexItem::_updateFlightPathSegmentsDontCallDirectly(void)
{
if (_cTerrainCollisionSegments != 0) {
_cTerrainCollisionSegments = 0;
emit terrainCollisionChanged(false);
}
_flightPathSegments.beginReset();
_flightPathSegments.clearAndDeleteContents();
if (useLoiterToAlt()->rawValue().toBool()) {
_appendFlightPathSegment(finalApproachCoordinate(), amslEntryAlt(), loiterTangentCoordinate(), amslEntryAlt()); // Best we can do to simulate loiter circle terrain profile
_appendFlightPathSegment(loiterTangentCoordinate(), amslEntryAlt(), landingCoordinate(), amslExitAlt());
} else {
_appendFlightPathSegment(finalApproachCoordinate(), amslEntryAlt(), landingCoordinate(), amslExitAlt());
}
_flightPathSegments.endReset();
if (_cTerrainCollisionSegments != 0) {
emit terrainCollisionChanged(true);
}
_masterController->missionController()->recalcTerrainProfile();
}

5
src/MissionManager/LandingComplexItemTest.h

@ -82,7 +82,7 @@ public: @@ -82,7 +82,7 @@ public:
QString mapVisualQML(void) const final { return QStringLiteral("FWLandingPatternMapVisual.qml"); }
// Overrides from VisualMissionItem
void save (QJsonArray& /*missionItems*/) { };
void save (QJsonArray& /*missionItems*/) override { };
static const QString name;
@ -90,6 +90,9 @@ public: @@ -90,6 +90,9 @@ public:
static const char* settingsGroup;
private slots:
void _updateFlightPathSegmentsDontCallDirectly(void) override;
private:
static LandingComplexItem* _createItem (PlanMasterController* masterController, bool flyView, QObject* parent) { return new SimpleLandingComplexItem(masterController, flyView, parent); }
static bool _isValidLandItem(const MissionItem& missionItem);

33
src/MissionManager/MissionController.cc

@ -1154,22 +1154,25 @@ double MissionController::_calcDistanceToHome(VisualMissionItem* currentItem, Vi @@ -1154,22 +1154,25 @@ double MissionController::_calcDistanceToHome(VisualMissionItem* currentItem, Vi
FlightPathSegment* MissionController::_createFlightPathSegmentWorker(VisualItemPair& pair)
{
QGeoCoordinate coord1 = pair.first->isSimpleItem() ? pair.first->coordinate() : pair.first->exitCoordinate();
QGeoCoordinate coord2 = pair.second->coordinate();
double coord1AMSLAlt = pair.first->isSimpleItem() ? pair.first->amslEntryAlt() : pair.first->amslExitAlt();
double coord2AMSLAlt = pair.second->amslEntryAlt();
// The takeoff goes straight up from ground to alt and then over to specified position at same alt. Which means
// that coord 1 altitude is the same as coord altitude.
bool takeoffStraightUp = pair.second->isTakeoffItem() && !_controllerVehicle->fixedWing();
FlightPathSegment* segment = new FlightPathSegment(coord1, coord1AMSLAlt, coord2, coord2AMSLAlt, !_flyView /* queryTerrainData */, this);
QGeoCoordinate coord1 = pair.first->exitCoordinate();
QGeoCoordinate coord2 = pair.second->coordinate();
double coord2AMSLAlt = pair.second->amslEntryAlt();
double coord1AMSLAlt = takeoffStraightUp ? coord2AMSLAlt : pair.first->amslExitAlt();
auto coord1Notifier = pair.first->isSimpleItem() ? &VisualMissionItem::coordinateChanged : &VisualMissionItem::exitCoordinateChanged;
auto coord2Notifier = &VisualMissionItem::coordinateChanged;
auto coord1AltNotifier = pair.first->isSimpleItem() ? &VisualMissionItem::amslEntryAltChanged : &VisualMissionItem::amslExitAltChanged;
auto coord2AltNotifier = &VisualMissionItem::amslEntryAltChanged;
FlightPathSegment* segment = new FlightPathSegment(coord1, coord1AMSLAlt, coord2, coord2AMSLAlt, !_flyView /* queryTerrainData */, this);
connect(pair.first, coord1Notifier, segment, &FlightPathSegment::setCoordinate1);
connect(pair.second, coord2Notifier, segment, &FlightPathSegment::setCoordinate2);
connect(pair.first, coord1AltNotifier, segment, &FlightPathSegment::setCoord1AMSLAlt);
connect(pair.second, coord2AltNotifier, segment, &FlightPathSegment::setCoord2AMSLAlt);
if (takeoffStraightUp) {
connect(pair.second, &VisualMissionItem::amslEntryAltChanged, segment, &FlightPathSegment::setCoord1AMSLAlt);
} else {
connect(pair.first, &VisualMissionItem::amslExitAltChanged, segment, &FlightPathSegment::setCoord1AMSLAlt);
}
connect(pair.first, &VisualMissionItem::exitCoordinateChanged, segment, &FlightPathSegment::setCoordinate1);
connect(pair.second, &VisualMissionItem::coordinateChanged, segment, &FlightPathSegment::setCoordinate2);
connect(pair.second, &VisualMissionItem::amslEntryAltChanged, segment, &FlightPathSegment::setCoord2AMSLAlt);
connect(pair.second, &VisualMissionItem::coordinateChanged, this, &MissionController::_recalcMissionFlightStatusSignal, Qt::QueuedConnection);
@ -1266,7 +1269,7 @@ void MissionController::_recalcFlightPathSegments(void) @@ -1266,7 +1269,7 @@ void MissionController::_recalcFlightPathSegments(void)
_incompleteComplexItemLines.clearAndDeleteContents();
// Mission Settings item needs to start with no segment
lastFlyThroughVI->setSimpleFlighPathSegment(nullptr);
lastFlyThroughVI->clearSimpleFlighPathSegment();
// Grovel through the list of items keeping track of things needed to correctly draw waypoints lines
@ -1275,7 +1278,7 @@ void MissionController::_recalcFlightPathSegments(void) @@ -1275,7 +1278,7 @@ void MissionController::_recalcFlightPathSegments(void)
SimpleMissionItem* simpleItem = qobject_cast<SimpleMissionItem*>(visualItem);
ComplexMissionItem* complexItem = qobject_cast<ComplexMissionItem*>(visualItem);
visualItem->setSimpleFlighPathSegment(nullptr);
visualItem->clearSimpleFlighPathSegment();
if (simpleItem) {
if (roiActive) {

3
src/MissionManager/SimpleMissionItem.cc

@ -173,6 +173,9 @@ void SimpleMissionItem::_connectSignals(void) @@ -173,6 +173,9 @@ void SimpleMissionItem::_connectSignals(void)
connect(&_missionItem._param1Fact, &Fact::valueChanged, this, &SimpleMissionItem::_possibleAdditionalTimeDelayChanged);
connect(&_missionItem._param4Fact, &Fact::valueChanged, this, &SimpleMissionItem::_possibleVehicleYawChanged);
// Exit coordinate is the same as entrance coordinate
connect(this, &SimpleMissionItem::coordinateChanged, this, &SimpleMissionItem::exitCoordinate);
// The following changes may also change friendlyEditAllowed
connect(&_missionItem._autoContinueFact, &Fact::valueChanged, this, &SimpleMissionItem::_sendFriendlyEditAllowedChanged);
connect(&_missionItem._commandFact, &Fact::valueChanged, this, &SimpleMissionItem::_sendFriendlyEditAllowedChanged);

26
src/MissionManager/VTOLLandingComplexItem.cc

@ -120,3 +120,29 @@ bool VTOLLandingComplexItem::scanForItem(QmlObjectListModel* visualItems, bool f @@ -120,3 +120,29 @@ bool VTOLLandingComplexItem::scanForItem(QmlObjectListModel* visualItems, bool f
{
return _scanForItem(visualItems, flyView, masterController, _isValidLandItem, _createItem);
}
// Never call this method directly. If you want to update the flight segments you emit _updateFlightPathSegmentsSignal()
void VTOLLandingComplexItem::_updateFlightPathSegmentsDontCallDirectly(void)
{
if (_cTerrainCollisionSegments != 0) {
_cTerrainCollisionSegments = 0;
emit terrainCollisionChanged(false);
}
_flightPathSegments.beginReset();
_flightPathSegments.clearAndDeleteContents();
if (useLoiterToAlt()->rawValue().toBool()) {
_appendFlightPathSegment(finalApproachCoordinate(), amslEntryAlt(), loiterTangentCoordinate(), amslEntryAlt()); // Best we can do to simulate loiter circle terrain profile
_appendFlightPathSegment(loiterTangentCoordinate(), amslEntryAlt(), landingCoordinate(), amslEntryAlt());
} else {
_appendFlightPathSegment(finalApproachCoordinate(), amslEntryAlt(), landingCoordinate(), amslEntryAlt());
}
_appendFlightPathSegment(landingCoordinate(), amslEntryAlt(), landingCoordinate(), amslExitAlt());
_flightPathSegments.endReset();
if (_cTerrainCollisionSegments != 0) {
emit terrainCollisionChanged(true);
}
_masterController->missionController()->recalcTerrainProfile();
}

3
src/MissionManager/VTOLLandingComplexItem.h

@ -43,6 +43,9 @@ public: @@ -43,6 +43,9 @@ public:
static const char* settingsGroup;
private slots:
void _updateFlightPathSegmentsDontCallDirectly(void) override;
private:
static LandingComplexItem* _createItem (PlanMasterController* masterController, bool flyView, QObject* parent) { return new VTOLLandingComplexItem(masterController, flyView, parent); }
static bool _isValidLandItem(const MissionItem& missionItem);

1
src/MissionManager/VisualMissionItem.h

@ -133,6 +133,7 @@ public: @@ -133,6 +133,7 @@ public:
FlightPathSegment* simpleFlightPathSegment(void) { return _simpleFlightPathSegment; }
void setSimpleFlighPathSegment (FlightPathSegment* segment) { _simpleFlightPathSegment = segment; }
void clearSimpleFlighPathSegment(void) { _simpleFlightPathSegment = nullptr; }
PlanMasterController* masterController(void) { return _masterController; }

Loading…
Cancel
Save