Unverified Commit bbffece3 authored by Don Gagne's avatar Don Gagne Committed by GitHub

Merge pull request #7230 from DonLakeFlyer/StructureScan

Structure Scan: Add support for Start From Top/Bottom, plus more helpful stats
parents 867ea2df 2aa727a1
...@@ -32,5 +32,11 @@ ...@@ -32,5 +32,11 @@
"units": "m", "units": "m",
"min": 1, "min": 1,
"defaultValue": 100 "defaultValue": 100
},
{
"name": "StartFromTop",
"shortDescription": "Start scan from top of structure.",
"type": "bool",
"defaultValue": true
} }
] ]
...@@ -26,6 +26,7 @@ const char* StructureScanComplexItem::altitudeName = "Altitude"; ...@@ -26,6 +26,7 @@ const char* StructureScanComplexItem::altitudeName = "Altitude";
const char* StructureScanComplexItem::structureHeightName = "StructureHeight"; const char* StructureScanComplexItem::structureHeightName = "StructureHeight";
const char* StructureScanComplexItem::layersName = "Layers"; const char* StructureScanComplexItem::layersName = "Layers";
const char* StructureScanComplexItem::gimbalPitchName = "GimbalPitch"; const char* StructureScanComplexItem::gimbalPitchName = "GimbalPitch";
const char* StructureScanComplexItem::startFromTopName = "StartFromTop";
const char* StructureScanComplexItem::jsonComplexItemTypeValue = "StructureScan"; const char* StructureScanComplexItem::jsonComplexItemTypeValue = "StructureScan";
const char* StructureScanComplexItem::_jsonCameraCalcKey = "CameraCalc"; const char* StructureScanComplexItem::_jsonCameraCalcKey = "CameraCalc";
...@@ -46,6 +47,7 @@ StructureScanComplexItem::StructureScanComplexItem(Vehicle* vehicle, bool flyVie ...@@ -46,6 +47,7 @@ StructureScanComplexItem::StructureScanComplexItem(Vehicle* vehicle, bool flyVie
, _structureHeightFact (settingsGroup, _metaDataMap[structureHeightName]) , _structureHeightFact (settingsGroup, _metaDataMap[structureHeightName])
, _layersFact (settingsGroup, _metaDataMap[layersName]) , _layersFact (settingsGroup, _metaDataMap[layersName])
, _gimbalPitchFact (settingsGroup, _metaDataMap[gimbalPitchName]) , _gimbalPitchFact (settingsGroup, _metaDataMap[gimbalPitchName])
, _startFromTopFact (settingsGroup, _metaDataMap[startFromTopName])
{ {
_editorQml = "qrc:/qml/StructureScanEditor.qml"; _editorQml = "qrc:/qml/StructureScanEditor.qml";
...@@ -54,6 +56,7 @@ StructureScanComplexItem::StructureScanComplexItem(Vehicle* vehicle, bool flyVie ...@@ -54,6 +56,7 @@ StructureScanComplexItem::StructureScanComplexItem(Vehicle* vehicle, bool flyVie
connect(&_altitudeFact, &Fact::valueChanged, this, &StructureScanComplexItem::_setDirty); connect(&_altitudeFact, &Fact::valueChanged, this, &StructureScanComplexItem::_setDirty);
connect(&_layersFact, &Fact::valueChanged, this, &StructureScanComplexItem::_setDirty); connect(&_layersFact, &Fact::valueChanged, this, &StructureScanComplexItem::_setDirty);
connect(&_gimbalPitchFact, &Fact::valueChanged, this, &StructureScanComplexItem::_setDirty); connect(&_gimbalPitchFact, &Fact::valueChanged, this, &StructureScanComplexItem::_setDirty);
connect(&_startFromTopFact, &Fact::valueChanged, this, &StructureScanComplexItem::_setDirty);
connect(&_layersFact, &Fact::valueChanged, this, &StructureScanComplexItem::_recalcLayerInfo); connect(&_layersFact, &Fact::valueChanged, this, &StructureScanComplexItem::_recalcLayerInfo);
connect(&_structureHeightFact, &Fact::valueChanged, this, &StructureScanComplexItem::_recalcLayerInfo); connect(&_structureHeightFact, &Fact::valueChanged, this, &StructureScanComplexItem::_recalcLayerInfo);
...@@ -156,6 +159,7 @@ void StructureScanComplexItem::save(QJsonArray& missionItems) ...@@ -156,6 +159,7 @@ void StructureScanComplexItem::save(QJsonArray& missionItems)
saveObject[_jsonAltitudeRelativeKey] = _altitudeRelative; saveObject[_jsonAltitudeRelativeKey] = _altitudeRelative;
saveObject[layersName] = _layersFact.rawValue().toDouble(); saveObject[layersName] = _layersFact.rawValue().toDouble();
saveObject[gimbalPitchName] = _gimbalPitchFact.rawValue().toDouble(); saveObject[gimbalPitchName] = _gimbalPitchFact.rawValue().toDouble();
saveObject[startFromTopName] = _startFromTopFact.rawValue().toBool();
QJsonObject cameraCalcObject; QJsonObject cameraCalcObject;
_cameraCalc.save(cameraCalcObject); _cameraCalc.save(cameraCalcObject);
...@@ -187,6 +191,7 @@ bool StructureScanComplexItem::load(const QJsonObject& complexObject, int sequen ...@@ -187,6 +191,7 @@ bool StructureScanComplexItem::load(const QJsonObject& complexObject, int sequen
{ _jsonAltitudeRelativeKey, QJsonValue::Bool, true }, { _jsonAltitudeRelativeKey, QJsonValue::Bool, true },
{ layersName, QJsonValue::Double, true }, { layersName, QJsonValue::Double, true },
{ gimbalPitchName, QJsonValue::Double, false }, // This value was added after initial implementation so may be missing from older files { gimbalPitchName, QJsonValue::Double, false }, // This value was added after initial implementation so may be missing from older files
{ startFromTopName, QJsonValue::Bool, false }, // This value was added after initial implementation so may be missing from older files
{ _jsonCameraCalcKey, QJsonValue::Object, true }, { _jsonCameraCalcKey, QJsonValue::Object, true },
}; };
if (!JsonHelper::validateKeys(complexObject, keyInfoList, errorString)) { if (!JsonHelper::validateKeys(complexObject, keyInfoList, errorString)) {
...@@ -218,6 +223,7 @@ bool StructureScanComplexItem::load(const QJsonObject& complexObject, int sequen ...@@ -218,6 +223,7 @@ bool StructureScanComplexItem::load(const QJsonObject& complexObject, int sequen
_altitudeFact.setRawValue (complexObject[altitudeName].toDouble()); _altitudeFact.setRawValue (complexObject[altitudeName].toDouble());
_layersFact.setRawValue (complexObject[layersName].toDouble()); _layersFact.setRawValue (complexObject[layersName].toDouble());
_structureHeightFact.setRawValue(complexObject[structureHeightName].toDouble()); _structureHeightFact.setRawValue(complexObject[structureHeightName].toDouble());
_startFromTopFact.setRawValue (complexObject[startFromTopName].toBool(false)); // Set the false if doesn't exist, which matches previous functionality prior to setting
_altitudeRelative = complexObject[_jsonAltitudeRelativeKey].toBool(true); _altitudeRelative = complexObject[_jsonAltitudeRelativeKey].toBool(true);
...@@ -289,8 +295,9 @@ bool StructureScanComplexItem::specifiesCoordinate(void) const ...@@ -289,8 +295,9 @@ bool StructureScanComplexItem::specifiesCoordinate(void) const
void StructureScanComplexItem::appendMissionItems(QList<MissionItem*>& items, QObject* missionItemParent) void StructureScanComplexItem::appendMissionItems(QList<MissionItem*>& items, QObject* missionItemParent)
{ {
int seqNum = _sequenceNumber; int seqNum = _sequenceNumber;
double baseAltitude = _altitudeFact.rawValue().toDouble(); bool startFromTop = _startFromTopFact.rawValue().toBool();
double startAltitude = _altitudeFact.rawValue().toDouble() + (startFromTop ? _structureHeightFact.rawValue().toDouble() : 0);
MissionItem* item = new MissionItem(seqNum++, MissionItem* item = new MissionItem(seqNum++,
MAV_CMD_DO_SET_ROI_WPNEXT_OFFSET, MAV_CMD_DO_SET_ROI_WPNEXT_OFFSET,
...@@ -305,10 +312,15 @@ void StructureScanComplexItem::appendMissionItems(QList<MissionItem*>& items, QO ...@@ -305,10 +312,15 @@ void StructureScanComplexItem::appendMissionItems(QList<MissionItem*>& items, QO
items.append(item); items.append(item);
for (int layer=0; layer<_layersFact.rawValue().toInt(); layer++) { for (int layer=0; layer<_layersFact.rawValue().toInt(); layer++) {
bool addTriggerStart = true; bool addTriggerStart = true;
// baseAltitude is the bottom of the first layer. Hence we need to move up half the distance of the camera footprint to center the camera double layerIncrement = (_cameraCalc.adjustedFootprintFrontal()->rawValue().toDouble() / 2.0) + (layer * _cameraCalc.adjustedFootprintFrontal()->rawValue().toDouble());
// within the layer. double layerAltitude;
double layerAltitude = baseAltitude + (_cameraCalc.adjustedFootprintFrontal()->rawValue().toDouble() / 2.0) + (layer * _cameraCalc.adjustedFootprintFrontal()->rawValue().toDouble());
if (startFromTop) {
layerAltitude = startAltitude - layerIncrement;
} else {
layerAltitude = startAltitude + layerIncrement;
}
for (int i=0; i<_flightPolygon.count(); i++) { for (int i=0; i<_flightPolygon.count(); i++) {
QGeoCoordinate vertexCoord = _flightPolygon.vertexCoordinate(i); QGeoCoordinate vertexCoord = _flightPolygon.vertexCoordinate(i);
......
...@@ -35,6 +35,7 @@ public: ...@@ -35,6 +35,7 @@ public:
Q_PROPERTY(Fact* structureHeight READ structureHeight CONSTANT) Q_PROPERTY(Fact* structureHeight READ structureHeight CONSTANT)
Q_PROPERTY(Fact* layers READ layers CONSTANT) Q_PROPERTY(Fact* layers READ layers CONSTANT)
Q_PROPERTY(Fact* gimbalPitch READ gimbalPitch CONSTANT) Q_PROPERTY(Fact* gimbalPitch READ gimbalPitch CONSTANT)
Q_PROPERTY(Fact* startFromTop READ startFromTop CONSTANT)
Q_PROPERTY(bool altitudeRelative READ altitudeRelative WRITE setAltitudeRelative NOTIFY altitudeRelativeChanged) Q_PROPERTY(bool altitudeRelative READ altitudeRelative WRITE setAltitudeRelative NOTIFY altitudeRelativeChanged)
Q_PROPERTY(int cameraShots READ cameraShots NOTIFY cameraShotsChanged) Q_PROPERTY(int cameraShots READ cameraShots NOTIFY cameraShotsChanged)
Q_PROPERTY(double timeBetweenShots READ timeBetweenShots NOTIFY timeBetweenShotsChanged) Q_PROPERTY(double timeBetweenShots READ timeBetweenShots NOTIFY timeBetweenShotsChanged)
...@@ -46,6 +47,7 @@ public: ...@@ -46,6 +47,7 @@ public:
Fact* structureHeight (void) { return &_structureHeightFact; } Fact* structureHeight (void) { return &_structureHeightFact; }
Fact* layers (void) { return &_layersFact; } Fact* layers (void) { return &_layersFact; }
Fact* gimbalPitch (void) { return &_gimbalPitchFact; } Fact* gimbalPitch (void) { return &_gimbalPitchFact; }
Fact* startFromTop (void) { return &_startFromTopFact; }
bool altitudeRelative (void) const { return _altitudeRelative; } bool altitudeRelative (void) const { return _altitudeRelative; }
int cameraShots (void) const; int cameraShots (void) const;
...@@ -102,6 +104,7 @@ public: ...@@ -102,6 +104,7 @@ public:
static const char* structureHeightName; static const char* structureHeightName;
static const char* layersName; static const char* layersName;
static const char* gimbalPitchName; static const char* gimbalPitchName;
static const char* startFromTopName;
signals: signals:
void cameraShotsChanged (int cameraShots); void cameraShotsChanged (int cameraShots);
...@@ -147,6 +150,7 @@ private: ...@@ -147,6 +150,7 @@ private:
SettingsFact _structureHeightFact; SettingsFact _structureHeightFact;
SettingsFact _layersFact; SettingsFact _layersFact;
SettingsFact _gimbalPitchFact; SettingsFact _gimbalPitchFact;
SettingsFact _startFromTopFact;
static const char* _jsonCameraCalcKey; static const char* _jsonCameraCalcKey;
static const char* _jsonAltitudeRelativeKey; static const char* _jsonAltitudeRelativeKey;
......
...@@ -100,6 +100,14 @@ Rectangle { ...@@ -100,6 +100,14 @@ Rectangle {
rowSpacing: _margin rowSpacing: _margin
columns: 2 columns: 2
FactComboBox {
fact: missionItem.startFromTop
indexModel: true
model: [ qsTr("Start Scan From Bottom"), qsTr("Start Scan From Top") ]
Layout.columnSpan: 2
Layout.fillWidth: true
}
QGCLabel { QGCLabel {
text: qsTr("Structure height") text: qsTr("Structure height")
visible: !missionItem.cameraCalc.isManualCamera visible: !missionItem.cameraCalc.isManualCamera
...@@ -165,13 +173,19 @@ Rectangle { ...@@ -165,13 +173,19 @@ Rectangle {
columnSpacing: ScreenTools.defaultFontPixelWidth columnSpacing: ScreenTools.defaultFontPixelWidth
visible: statsHeader.checked visible: statsHeader.checked
QGCLabel { text: qsTr("Layers") }
QGCLabel { text: missionItem.layers.valueString }
QGCLabel { text: qsTr("Layer height") }
QGCLabel { text: missionItem.cameraCalc.adjustedFootprintFrontal.valueString + " " + QGroundControl.appSettingsDistanceUnitsString }
QGCLabel { text: qsTr("Photo count") } QGCLabel { text: qsTr("Photo count") }
QGCLabel { text: missionItem.cameraShots } QGCLabel { text: missionItem.cameraShots }
QGCLabel { text: qsTr("Photo interval") } QGCLabel { text: qsTr("Photo interval") }
QGCLabel { text: missionItem.timeBetweenShots.toFixed(1) + " " + qsTr("secs") } QGCLabel { text: missionItem.timeBetweenShots.toFixed(1) + " " + qsTr("secs") }
QGCLabel { text: qsTr("Trigger Distance") } QGCLabel { text: qsTr("Trigger distance") }
QGCLabel { text: missionItem.cameraCalc.adjustedFootprintSide.valueString + " " + QGroundControl.appSettingsDistanceUnitsString } QGCLabel { text: missionItem.cameraCalc.adjustedFootprintSide.valueString + " " + QGroundControl.appSettingsDistanceUnitsString }
} }
} // Column } // Column
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment