From 055a51a4bf709fd07512c4493fb7e3005512cd8f Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Sat, 20 Aug 2016 12:40:32 -0700 Subject: [PATCH] Add camera info calculator --- src/MissionEditor/SurveyItemEditor.qml | 110 ++++++++++++++++++++++++ src/MissionManager/SurveyMissionItem.cc | 10 +-- 2 files changed, 115 insertions(+), 5 deletions(-) diff --git a/src/MissionEditor/SurveyItemEditor.qml b/src/MissionEditor/SurveyItemEditor.qml index 8a9e1088e..ca6e369af 100644 --- a/src/MissionEditor/SurveyItemEditor.qml +++ b/src/MissionEditor/SurveyItemEditor.qml @@ -22,8 +22,45 @@ Rectangle { property real _margin: ScreenTools.defaultFontPixelWidth / 2 + property var _cameraInfoCanonSX260: { "focalLength": 4.5, "sensorHeight": 4.55, "sensorWidth": 6.17 } + + function recalcFromCameraValues() { + var focalLength = Number(focalLengthField.text) + var sensorWidth = Number(sensorWidthField.text) + var sensorHeight = Number(sensorHeightField.text) + var overlap = Number(imageOverlapField.text) + + if (focalLength <= 0.0 || sensorWidth <= 0.0 || sensorHeight <= 0.0) { + return + } + + var scaledFocalLengthMM = (1000.0 * missionItem.gridAltitude.rawValue) / focalLength + var imageWidthM = (sensorWidth * scaledFocalLengthMM) / 1000.0; + var imageHeightM = (sensorHeight * scaledFocalLengthMM) / 1000.0; + + var gridSpacing + var cameraTriggerDistance + if (cameraOrientationLandscape.checked) { + gridSpacing = imageWidthM + cameraTriggerDistance = imageHeightM + } else { + gridSpacing = imageHeightM + cameraTriggerDistance = imageWidthM + } + gridSpacing = (1.0 - (overlap / 100.0)) * gridSpacing + cameraTriggerDistance = (1.0 - (overlap / 100.0)) * cameraTriggerDistance + + missionItem.gridSpacing.rawValue = gridSpacing + missionItem.cameraTriggerDistance.rawValue = cameraTriggerDistance + } + QGCPalette { id: qgcPal; colorGroupEnabled: true } + ExclusiveGroup { + id: cameraOrientationGroup + onCurrentChanged: recalcFromCameraValues() + } + Column { id: editorColumn anchors.margins: _margin @@ -115,6 +152,79 @@ Rectangle { onPolygonAdjustVertex: missionItem.adjustPolygonCoordinate(vertexIndex, vertexCoordinate) } + QGCLabel { text: qsTr("Camera:") } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + height: 1 + color: qgcPal.text + } + + Row { + spacing: ScreenTools.defaultFontPixelWidth + + + QGCRadioButton { + id: cameraOrientationLandscape + text: "Landscape" + checked: true + exclusiveGroup: cameraOrientationGroup + } + + QGCRadioButton { + id: cameraOrientationPortrait + text: "Portrait" + exclusiveGroup: cameraOrientationGroup + } + } + + Grid { + columns: 2 + spacing: ScreenTools.defaultFontPixelWidth + verticalItemAlignment: Grid.AlignVCenter + + QGCLabel { text: qsTr("Focal length:") } + QGCTextField { + id: focalLengthField + unitsLabel: "mm" + showUnits: true + text: _cameraInfoCanonSX260.focalLength.toString() + + onEditingFinished: recalcFromCameraValues() + } + + QGCLabel { text: qsTr("Sensor Width:") } + QGCTextField { + id: sensorWidthField + unitsLabel: "mm" + showUnits: true + text: _cameraInfoCanonSX260.sensorWidth.toString() + + onEditingFinished: recalcFromCameraValues() + } + + QGCLabel { text: qsTr("Sensor height:") } + QGCTextField { + id: sensorHeightField + unitsLabel: "mm" + showUnits: true + text: _cameraInfoCanonSX260.sensorHeight.toString() + + onEditingFinished: recalcFromCameraValues() + } + + QGCLabel { text: qsTr("Image overlap:") } + QGCTextField { + id: imageOverlapField + unitsLabel: "%" + showUnits: true + text: "0" + + onEditingFinished: recalcFromCameraValues() + } + } + QGCLabel { text: qsTr("Polygon:") } Rectangle { diff --git a/src/MissionManager/SurveyMissionItem.cc b/src/MissionManager/SurveyMissionItem.cc index e1d6ccc0d..f9406e625 100644 --- a/src/MissionManager/SurveyMissionItem.cc +++ b/src/MissionManager/SurveyMissionItem.cc @@ -34,16 +34,16 @@ SurveyMissionItem::SurveyMissionItem(Vehicle* vehicle, QObject* parent) : ComplexMissionItem(vehicle, parent) , _sequenceNumber(0) , _dirty(false) - , _cameraTrigger(false) + , _cameraTrigger(true) , _gridAltitudeRelative(true) , _surveyDistance(0.0) , _cameraShots(0) , _coveredArea(0.0) - , _gridAltitudeFact (0, "Altitude:", FactMetaData::valueTypeDouble) - , _gridAngleFact (0, "Grid angle:", FactMetaData::valueTypeDouble) - , _gridSpacingFact (0, "Grid spacing:", FactMetaData::valueTypeDouble) - , _cameraTriggerDistanceFact(0, "Camera trigger distance", FactMetaData::valueTypeDouble) + , _gridAltitudeFact (0, "Altitude:", FactMetaData::valueTypeDouble) + , _gridAngleFact (0, "Grid angle:", FactMetaData::valueTypeDouble) + , _gridSpacingFact (0, "Grid spacing:", FactMetaData::valueTypeDouble) + , _cameraTriggerDistanceFact(0, "Camera trigger distance", FactMetaData::valueTypeDouble) , _gridAltitudeMetaData (FactMetaData::valueTypeDouble) , _gridAngleMetaData (FactMetaData::valueTypeDouble) -- 2.22.0