Skip to content

Commit

Permalink
Merge pull request #9071 from DonLakeFlyer/LandingPattern
Browse files Browse the repository at this point in the history
Landing Pattern: Loiter to alt optional support
  • Loading branch information
DonLakeFlyer committed Sep 15, 2020
2 parents a671b14 + 138bdfa commit 48ffa39
Show file tree
Hide file tree
Showing 27 changed files with 1,549 additions and 1,357 deletions.
2 changes: 2 additions & 0 deletions qgroundcontrol.pro
Original file line number Diff line number Diff line change
Expand Up @@ -472,6 +472,7 @@ DebugBuild { PX4FirmwarePlugin { PX4FirmwarePluginFactory { APMFirmwarePlugin {
src/MissionManager/CameraSectionTest.h \
src/MissionManager/CorridorScanComplexItemTest.h \
src/MissionManager/FWLandingPatternTest.h \
src/MissionManager/LandingComplexItemTest.h \
src/MissionManager/MissionCommandTreeEditorTest.h \
src/MissionManager/MissionCommandTreeTest.h \
src/MissionManager/MissionControllerManagerTest.h \
Expand Down Expand Up @@ -519,6 +520,7 @@ DebugBuild { PX4FirmwarePlugin { PX4FirmwarePluginFactory { APMFirmwarePlugin {
src/MissionManager/CameraSectionTest.cc \
src/MissionManager/CorridorScanComplexItemTest.cc \
src/MissionManager/FWLandingPatternTest.cc \
src/MissionManager/LandingComplexItemTest.cc \
src/MissionManager/MissionCommandTreeEditorTest.cc \
src/MissionManager/MissionCommandTreeTest.cc \
src/MissionManager/MissionControllerManagerTest.cc \
Expand Down
4 changes: 4 additions & 0 deletions src/MissionManager/CameraSection.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
#define VIDEO_CAPTURE_STATUS_INTERVAL 0.2 //-- Send capture status every 5 seconds

class PlanMasterController;
class CameraSectionTest;


class CameraSection : public Section
{
Expand Down Expand Up @@ -131,4 +133,6 @@ private slots:
static const char* _cameraPhotoIntervalDistanceName;
static const char* _cameraPhotoIntervalTimeName;
static const char* _cameraModeName;

friend CameraSectionTest;
};
78 changes: 64 additions & 14 deletions src/MissionManager/CameraSectionTest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
#include "MissionCommandTree.h"
#include "MissionCommandUIInfo.h"

#include <functional>

CameraSectionTest::CameraSectionTest(void)
: _spyCamera (nullptr)
, _spySection (nullptr)
Expand Down Expand Up @@ -44,11 +46,24 @@ void CameraSectionTest::init(void)

_validGimbalItem = new SimpleMissionItem(_masterController,
false, // flyView
MissionItem(0, MAV_CMD_DO_MOUNT_CONTROL, MAV_FRAME_MISSION, 10.1234, 0, 20.1234, 0, 0, 0, MAV_MOUNT_MODE_MAVLINK_TARGETING, true, false),
MissionItem(0,
MAV_CMD_DO_MOUNT_CONTROL,
MAV_FRAME_MISSION,
10.1234, 0, 20.1234, // pitch, roll, yaw
0, 0, 0, // alt, lat, lon (all 0 since unused)
MAV_MOUNT_MODE_MAVLINK_TARGETING, // control gimbal with pitch, roll, yaw settings
true, false),
this);
_validTimeItem = new SimpleMissionItem(_masterController,
false, // flyView
MissionItem(0, MAV_CMD_IMAGE_START_CAPTURE, MAV_FRAME_MISSION, 0, 48, 0, NAN, NAN, NAN, NAN, true, false),
MissionItem(0,
MAV_CMD_IMAGE_START_CAPTURE,
MAV_FRAME_MISSION,
0, // Reserved, must be 0
48, // time interval
0, // 0 = capture forever
NAN, NAN, NAN, NAN, // Reserved
true, false),
this);
_validDistanceItem = new SimpleMissionItem(_masterController,
false, // flyView
Expand Down Expand Up @@ -615,12 +630,12 @@ void CameraSectionTest::_testScanForGimbalSection(void)
Mission Param #5 WIP: latitude in degrees * 1E7, set if appropriate mount mode.
Mission Param #6 WIP: longitude in degrees * 1E7, set if appropriate mount mode.
Mission Param #7 MAV_MOUNT_MODE enum value
*/
*/

// Gimbal command but incorrect settings

SimpleMissionItem invalidSimpleItem(_masterController, false /* flyView */, _validGimbalItem->missionItem(), nullptr);
invalidSimpleItem.missionItem().setParam2(10); // roll is not supported
invalidSimpleItem.missionItem().setParam2(10); // roll is not supported, should be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
Expand All @@ -629,7 +644,7 @@ void CameraSectionTest::_testScanForGimbalSection(void)
visualItems.clear();

invalidSimpleItem.missionItem() = _validGimbalItem->missionItem();
invalidSimpleItem.missionItem().setParam4(10); // alt is not supported
invalidSimpleItem.missionItem().setParam4(10); // alt is not supported, should be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
Expand All @@ -638,7 +653,7 @@ void CameraSectionTest::_testScanForGimbalSection(void)
visualItems.clear();

invalidSimpleItem.missionItem() = _validGimbalItem->missionItem();
invalidSimpleItem.missionItem().setParam5(10); // lat is not supported
invalidSimpleItem.missionItem().setParam5(10); // lat is not supported, should be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
Expand All @@ -647,7 +662,7 @@ void CameraSectionTest::_testScanForGimbalSection(void)
visualItems.clear();

invalidSimpleItem.missionItem() = _validGimbalItem->missionItem();
invalidSimpleItem.missionItem().setParam6(10); // lon is not supported
invalidSimpleItem.missionItem().setParam6(10); // lon is not supported, should be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
Expand Down Expand Up @@ -709,14 +724,27 @@ void CameraSectionTest::_testScanForCameraModeSection(void)
*/

// Mode command but incorrect settings

SimpleMissionItem invalidSimpleItem(_masterController, false /* flyView */, _validCameraPhotoModeItem->missionItem(), nullptr);
invalidSimpleItem.missionItem().setParam3(1); // Param3 should be NaN
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->specifyCameraMode(), false);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
std::function<void(MissionItem&, double)> rgSetParamFns[] = {
&MissionItem::setParam1,
&MissionItem::setParam2,
&MissionItem::setParam3,
&MissionItem::setParam4,
&MissionItem::setParam5,
&MissionItem::setParam6,
&MissionItem::setParam7
};

for (int fnIndex=2; fnIndex<7; fnIndex++) {
rgSetParamFns[fnIndex](invalidSimpleItem.missionItem(), 0); // should be NaN
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->specifyCameraMode(), false);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
}
}

void CameraSectionTest::_testScanForPhotoIntervalTimeSection(void)
Expand Down Expand Up @@ -1135,3 +1163,25 @@ SimpleMissionItem* CameraSectionTest::createValidStopTimeItem(PlanMasterControll
MissionItem(1, MAV_CMD_IMAGE_STOP_CAPTURE, MAV_FRAME_MISSION, 0, qQNaN(), qQNaN(), qQNaN(), qQNaN(), qQNaN(), qQNaN(), true, false),
parent);
}

SimpleMissionItem* CameraSectionTest::createInvalidStopVideoItem(PlanMasterController* masterController, QObject* parent)
{
SimpleMissionItem* invalidSimpleItem = createValidStopVideoItem(masterController, parent);
invalidSimpleItem->missionItem().setParam1(10); // must be 0 to be valid for scan
return invalidSimpleItem;
}


SimpleMissionItem* CameraSectionTest::createInvalidStopDistanceItem(PlanMasterController* masterController, QObject* parent)
{
SimpleMissionItem* invalidSimpleItem = createValidStopDistanceItem(masterController, parent);
invalidSimpleItem->missionItem().setParam2(-1); // Should be 0
return invalidSimpleItem;
}

SimpleMissionItem* CameraSectionTest::createInvalidStopTimeItem(PlanMasterController* masterController, QObject* parent)
{
SimpleMissionItem* invalidSimpleItem = createValidStopTimeItem(masterController, parent);
invalidSimpleItem->missionItem().setParam1(1); // Should be 0
return invalidSimpleItem;
}
9 changes: 6 additions & 3 deletions src/MissionManager/CameraSectionTest.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,12 @@ class CameraSectionTest : public SectionTest
void init(void) override;
void cleanup(void) override;

static SimpleMissionItem* createValidStopVideoItem (PlanMasterController* masterController, QObject* parent);
static SimpleMissionItem* createValidStopDistanceItem(PlanMasterController* masterController, QObject* parent);
static SimpleMissionItem* createValidStopTimeItem (PlanMasterController* masterController, QObject* parent);
static SimpleMissionItem* createValidStopVideoItem (PlanMasterController* masterController, QObject* parent);
static SimpleMissionItem* createValidStopDistanceItem (PlanMasterController* masterController, QObject* parent);
static SimpleMissionItem* createValidStopTimeItem (PlanMasterController* masterController, QObject* parent);
static SimpleMissionItem* createInvalidStopVideoItem (PlanMasterController* masterController, QObject* parent);
static SimpleMissionItem* createInvalidStopDistanceItem (PlanMasterController* masterController, QObject* parent);
static SimpleMissionItem* createInvalidStopTimeItem (PlanMasterController* masterController, QObject* parent);

private slots:
void _testDirty (void);
Expand Down
62 changes: 37 additions & 25 deletions src/MissionManager/FWLandingPattern.FactMetaData.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,75 +5,87 @@
[
{
"name": "LandingDistance",
"shortDesc": "Distance between landing and loiter points.",
"shortDesc": "Distance between approach and land points.",
"type": "double",
"units": "m",
"min": 10,
"decimalPlaces": 1,
"default": 300.0
"default": 300.0
},
{
"name": "LandingHeading",
"shortDesc": "Heading from loiter point to land point.",
"shortDesc": "Heading from approach to land point.",
"type": "double",
"units": "deg",
"min": 0.0,
"max": 360.0,
"decimalPlaces": 0,
"default": 270.0
"default": 270.0
},
{
"name": "LoiterAltitude",
"shortDesc": "Aircraft will proceed to the loiter point and loiter downwards until it reaches this approach altitude. Once altitude is reached the aircraft will proceed to land.",
"name": "FinalApproachAltitude",
"shortDesc": "Altitude to begin landing approach from.",
"type": "double",
"units": "m",
"decimalPlaces": 1,
"default": 40.0
"default": 40.0
},
{
"name": "LoiterRadius",
"shortDesc": "Loiter radius.",
"shortDesc": "Loiter radius.",
"type": "double",
"decimalPlaces": 1,
"min": 1,
"units": "m",
"default": 75.0
"default": 75.0
},
{
"name": "LoiterClockwise",
"shortDesc": "Loiter clockwise around the final approach point.",
"type": "bool",
"default": true
},
{
"name": "LandingAltitude",
"shortDesc": "Altitude for landing point.",
"shortDesc": "Altitude for landing point.",
"type": "double",
"units": "m",
"decimalPlaces": 1,
"default": 0.0
"default": 0.0
},
{
"name": "GlideSlope",
"shortDesc": "The glide slope between the loiter and landing point.",
"shortDesc": "The glide slope between the loiter and landing point.",
"type": "double",
"units": "deg",
"min": 0.1,
"max": 90,
"decimalPlaces": 1,
"default": 6.0
"default": 6.0
},
{
"name": "ValueSetIsDistance",
"shortDesc": "Value controller approach point is distance",
"type": "bool",
"default": false
},
{
"name": "ValueSetIsDistance",
"shortDesc": "Value controller loiter point is distance",
"type": "bool",
"default": false
"name": "UseLoiterToAlt",
"shortDesc": "Use a loiter to altitude item for final appoach. Otherwise use a regular waypoint.",
"type": "bool",
"default": true
},
{
"name": "StopTakingPhotos",
"shortDesc": "Stop taking photos",
"type": "bool",
"default": true
"name": "StopTakingPhotos",
"shortDesc": "Stop taking photos",
"type": "bool",
"default": true
},
{
"name": "StopTakingVideo",
"shortDesc": "Stop taking video",
"type": "bool",
"default": true
"name": "StopTakingVideo",
"shortDesc": "Stop taking video",
"type": "bool",
"default": true
}
]
}

0 comments on commit 48ffa39

Please sign in to comment.