Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Q
qgroundcontrol
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Valentin Platzgummer
qgroundcontrol
Commits
313a7b90
Commit
313a7b90
authored
Sep 06, 2019
by
Valentin Platzgummer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
12312
parent
4666c881
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
282 additions
and
9 deletions
+282
-9
MissionController.cc
src/MissionManager/MissionController.cc
+9
-0
CircularSurveyItemEditor.qml
src/PlanView/CircularSurveyItemEditor.qml
+7
-0
CircularSurveyComplexItem.cc
src/Wima/CircularSurveyComplexItem.cc
+240
-6
CircularSurveyComplexItem.h
src/Wima/CircularSurveyComplexItem.h
+12
-0
WimaPlaner.cc
src/Wima/WimaPlaner.cc
+14
-3
No files found.
src/MissionManager/MissionController.cc
View file @
313a7b90
...
...
@@ -781,6 +781,15 @@ bool MissionController::_loadJsonMissionFileV2(const QJsonObject& json, QmlObjec
nextSequenceNumber
=
corridorItem
->
lastSequenceNumber
()
+
1
;
qCDebug
(
MissionControllerLog
)
<<
"Corridor Scan load complete: nextSequenceNumber"
<<
nextSequenceNumber
;
visualItems
->
append
(
corridorItem
);
}
else
if
(
complexItemType
==
CircularSurveyComplexItem
::
jsonComplexItemTypeValue
)
{
qCDebug
(
MissionControllerLog
)
<<
"Loading Circular Survey: nextSequenceNumber"
<<
nextSequenceNumber
;
CircularSurveyComplexItem
*
circularSurvey
=
new
CircularSurveyComplexItem
(
_controllerVehicle
,
_flyView
,
QString
()
/* kmlFile */
,
visualItems
);
if
(
!
circularSurvey
->
load
(
itemObject
,
nextSequenceNumber
++
,
errorString
))
{
return
false
;
}
nextSequenceNumber
=
circularSurvey
->
lastSequenceNumber
()
+
1
;
qCDebug
(
MissionControllerLog
)
<<
"Circular Survey load complete: nextSequenceNumber"
<<
nextSequenceNumber
;
visualItems
->
append
(
circularSurvey
);
}
else
if
(
complexItemType
==
MissionSettingsItem
::
jsonComplexItemTypeValue
)
{
qCDebug
(
MissionControllerLog
)
<<
"Loading Mission Settings: nextSequenceNumber"
<<
nextSequenceNumber
;
MissionSettingsItem
*
settingsItem
=
new
MissionSettingsItem
(
_controllerVehicle
,
_flyView
,
visualItems
);
...
...
src/PlanView/CircularSurveyItemEditor.qml
View file @
313a7b90
...
...
@@ -72,6 +72,13 @@ Rectangle {
visible
:
transectsHeader
.
checked
QGCLabel
{
text
:
qsTr
(
"
Altitude
"
)
}
FactTextField
{
fact
:
missionItem
.
cameraCalc
.
distanceToSurface
Layout.fillWidth
:
true
//onUpdated: rSlider.value = missionItem.deltaR.value
}
QGCLabel
{
text
:
qsTr
(
"
Delta R
"
)
}
FactTextField
{
fact
:
missionItem
.
deltaR
...
...
src/Wima/CircularSurveyComplexItem.cc
View file @
313a7b90
#include "CircularSurveyComplexItem.h"
#include "JsonHelper.h"
#include "QGCApplication.h"
const
char
*
CircularSurveyComplexItem
::
settingsGroup
=
"CircularSurvey"
;
const
char
*
CircularSurveyComplexItem
::
deltaRName
=
"DeltaR"
;
const
char
*
CircularSurveyComplexItem
::
deltaAlphaName
=
"DeltaAlpha"
;
const
char
*
CircularSurveyComplexItem
::
jsonComplexItemTypeValue
=
"circularSurvey"
;
const
char
*
CircularSurveyComplexItem
::
jsonDeltaRKey
=
"deltaR"
;
const
char
*
CircularSurveyComplexItem
::
jsonDeltaAlphaKey
=
"deltaAlpha"
;
const
char
*
CircularSurveyComplexItem
::
jsonReferencePointLatKey
=
"referencePointLat"
;
const
char
*
CircularSurveyComplexItem
::
jsonReferencePointLongKey
=
"referencePointLong"
;
const
char
*
CircularSurveyComplexItem
::
jsonReferencePointAltKey
=
"referencePointAlt"
;
CircularSurveyComplexItem
::
CircularSurveyComplexItem
(
Vehicle
*
vehicle
,
bool
flyView
,
const
QString
&
kmlOrShpFile
,
QObject
*
parent
)
:
TransectStyleComplexItem
(
vehicle
,
flyView
,
settingsGroup
,
parent
)
,
_referencePoint
(
QGeoCoordinate
(
0
,
0
,
0
))
...
...
@@ -69,22 +77,243 @@ bool CircularSurveyComplexItem::autoGenerated()
bool
CircularSurveyComplexItem
::
load
(
const
QJsonObject
&
complexObject
,
int
sequenceNumber
,
QString
&
errorString
)
{
return
false
;
// We need to pull version first to determine what validation/conversion needs to be performed
QList
<
JsonHelper
::
KeyValidateInfo
>
versionKeyInfoList
=
{
{
JsonHelper
::
jsonVersionKey
,
QJsonValue
::
Double
,
true
},
};
if
(
!
JsonHelper
::
validateKeys
(
complexObject
,
versionKeyInfoList
,
errorString
))
{
return
false
;
}
int
version
=
complexObject
[
JsonHelper
::
jsonVersionKey
].
toInt
();
if
(
version
!=
1
)
{
errorString
=
tr
(
"Survey items do not support version %1"
).
arg
(
version
);
return
false
;
}
QList
<
JsonHelper
::
KeyValidateInfo
>
keyInfoList
=
{
{
VisualMissionItem
::
jsonTypeKey
,
QJsonValue
::
String
,
true
},
{
ComplexMissionItem
::
jsonComplexItemTypeKey
,
QJsonValue
::
String
,
true
},
{
jsonDeltaRKey
,
QJsonValue
::
Double
,
true
},
{
jsonDeltaAlphaKey
,
QJsonValue
::
Double
,
true
},
{
jsonReferencePointLatKey
,
QJsonValue
::
Double
,
true
},
{
jsonReferencePointLongKey
,
QJsonValue
::
Double
,
true
},
{
jsonReferencePointAltKey
,
QJsonValue
::
Double
,
true
},
};
if
(
!
JsonHelper
::
validateKeys
(
complexObject
,
keyInfoList
,
errorString
))
{
return
false
;
}
QString
itemType
=
complexObject
[
VisualMissionItem
::
jsonTypeKey
].
toString
();
QString
complexType
=
complexObject
[
ComplexMissionItem
::
jsonComplexItemTypeKey
].
toString
();
if
(
itemType
!=
VisualMissionItem
::
jsonTypeComplexItemValue
||
complexType
!=
jsonComplexItemTypeValue
)
{
errorString
=
tr
(
"%1 does not support loading this complex mission item type: %2:%3"
).
arg
(
qgcApp
()
->
applicationName
()).
arg
(
itemType
).
arg
(
complexType
);
return
false
;
}
_ignoreRecalc
=
true
;
setSequenceNumber
(
sequenceNumber
);
if
(
!
_surveyAreaPolygon
.
loadFromJson
(
complexObject
,
true
/* required */
,
errorString
))
{
_surveyAreaPolygon
.
clear
();
return
false
;
}
if
(
!
_load
(
complexObject
,
errorString
))
{
_ignoreRecalc
=
false
;
return
false
;
}
_deltaR
.
setRawValue
(
complexObject
[
jsonDeltaRKey
].
toDouble
());
_deltaAlpha
.
setRawValue
(
complexObject
[
jsonDeltaAlphaKey
].
toDouble
());
_referencePoint
.
setLongitude
(
complexObject
[
jsonReferencePointLongKey
].
toDouble
());
_referencePoint
.
setLatitude
(
complexObject
[
jsonReferencePointLatKey
].
toDouble
());
_referencePoint
.
setAltitude
(
complexObject
[
jsonReferencePointAltKey
].
toDouble
());
_autoGenerated
=
true
;
_ignoreRecalc
=
false
;
_recalcComplexDistance
();
if
(
_cameraShots
==
0
)
{
// Shot count was possibly not available from plan file
_recalcCameraShots
();
}
return
true
;
}
void
CircularSurveyComplexItem
::
save
(
QJsonArray
&
planItems
)
{
QJsonObject
saveObject
;
_save
(
saveObject
);
saveObject
[
JsonHelper
::
jsonVersionKey
]
=
1
;
saveObject
[
VisualMissionItem
::
jsonTypeKey
]
=
VisualMissionItem
::
jsonTypeComplexItemValue
;
saveObject
[
ComplexMissionItem
::
jsonComplexItemTypeKey
]
=
jsonComplexItemTypeValue
;
saveObject
[
jsonDeltaRKey
]
=
_deltaR
.
rawValue
().
toDouble
();
saveObject
[
jsonDeltaAlphaKey
]
=
_deltaAlpha
.
rawValue
().
toDouble
();
saveObject
[
jsonReferencePointLongKey
]
=
_referencePoint
.
longitude
();
saveObject
[
jsonReferencePointLatKey
]
=
_referencePoint
.
latitude
();
saveObject
[
jsonReferencePointAltKey
]
=
_referencePoint
.
altitude
();
// Polygon shape
_surveyAreaPolygon
.
saveToJson
(
saveObject
);
planItems
.
append
(
saveObject
);
}
void
CircularSurveyComplexItem
::
appendMissionItems
(
QList
<
MissionItem
*>
&
items
,
QObject
*
missionItemParent
)
{
if
(
_loadedMissionItems
.
count
())
{
// We have mission items from the loaded plan, use those
_appendLoadedMissionItems
(
items
,
missionItemParent
);
}
else
{
// Build the mission items on the fly
_buildAndAppendMissionItems
(
items
,
missionItemParent
);
}
}
void
CircularSurveyComplexItem
::
_appendLoadedMissionItems
(
QList
<
MissionItem
*>&
items
,
QObject
*
missionItemParent
)
{
//qCDebug(SurveyComplexItemLog) << "_appendLoadedMissionItems";
int
seqNum
=
_sequenceNumber
;
for
(
const
MissionItem
*
loadedMissionItem
:
_loadedMissionItems
)
{
MissionItem
*
item
=
new
MissionItem
(
*
loadedMissionItem
,
missionItemParent
);
item
->
setSequenceNumber
(
seqNum
++
);
items
.
append
(
item
);
}
}
void
CircularSurveyComplexItem
::
applyNewAltitude
(
double
newAltitude
)
void
CircularSurveyComplexItem
::
_buildAndAppendMissionItems
(
QList
<
MissionItem
*>&
items
,
QObject
*
missionItemParent
)
{
// original code: SurveyComplexItem::_buildAndAppendMissionItems()
//qCDebug(SurveyComplexItemLog) << "_buildAndAppendMissionItems";
// Now build the mission items from the transect points
MissionItem
*
item
;
int
seqNum
=
_sequenceNumber
;
// bool imagesEverywhere = _cameraTriggerInTurnAroundFact.rawValue().toBool();
// bool addTriggerAtBeginning = !hoverAndCaptureEnabled() && imagesEverywhere;
bool
firstOverallPoint
=
true
;
MAV_FRAME
mavFrame
=
followTerrain
()
||
!
_cameraCalc
.
distanceToSurfaceRelative
()
?
MAV_FRAME_GLOBAL
:
MAV_FRAME_GLOBAL_RELATIVE_ALT
;
for
(
const
QList
<
TransectStyleComplexItem
::
CoordInfo_t
>&
transect
:
_transects
)
{
//bool transectEntry = true;
for
(
const
CoordInfo_t
&
transectCoordInfo
:
transect
)
{
item
=
new
MissionItem
(
seqNum
++
,
MAV_CMD_NAV_WAYPOINT
,
mavFrame
,
0
,
// Hold time (delay for hover and capture to settle vehicle before image is taken)
0.0
,
// No acceptance radius specified
0.0
,
// Pass through waypoint
std
::
numeric_limits
<
double
>::
quiet_NaN
(),
// Yaw unchanged
transectCoordInfo
.
coord
.
latitude
(),
transectCoordInfo
.
coord
.
longitude
(),
transectCoordInfo
.
coord
.
altitude
(),
true
,
// autoContinue
false
,
// isCurrentItem
missionItemParent
);
items
.
append
(
item
);
// implement capture if desired
// if (hoverAndCaptureEnabled()) {
// item = new MissionItem(seqNum++,
// MAV_CMD_IMAGE_START_CAPTURE,
// MAV_FRAME_MISSION,
// 0, // Reserved (Set to 0)
// 0, // Interval (none)
// 1, // Take 1 photo
// qQNaN(), qQNaN(), qQNaN(), qQNaN(), // param 4-7 reserved
// true, // autoContinue
// false, // isCurrentItem
// missionItemParent);
// items.append(item);
// }
// if (firstOverallPoint && addTriggerAtBeginning) {
// // Start triggering
// addTriggerAtBeginning = false;
// item = new MissionItem(seqNum++,
// MAV_CMD_DO_SET_CAM_TRIGG_DIST,
// MAV_FRAME_MISSION,
// triggerDistance(), // trigger distance
// 0, // shutter integration (ignore)
// 1, // trigger immediately when starting
// 0, 0, 0, 0, // param 4-7 unused
// true, // autoContinue
// false, // isCurrentItem
// missionItemParent);
// items.append(item);
// }
firstOverallPoint
=
false
;
// // Possibly add trigger start/stop to survey area entrance/exit
// if (triggerCamera() && !hoverAndCaptureEnabled() && transectCoordInfo.coordType == TransectStyleComplexItem::CoordTypeSurveyEdge) {
// if (transectEntry) {
// // Start of transect, always start triggering. We do this even if we are taking images everywhere.
// // This allows a restart of the mission in mid-air without losing images from the entire mission.
// // At most you may lose part of a transect.
// item = new MissionItem(seqNum++,
// MAV_CMD_DO_SET_CAM_TRIGG_DIST,
// MAV_FRAME_MISSION,
// triggerDistance(), // trigger distance
// 0, // shutter integration (ignore)
// 1, // trigger immediately when starting
// 0, 0, 0, 0, // param 4-7 unused
// true, // autoContinue
// false, // isCurrentItem
// missionItemParent);
// items.append(item);
// transectEntry = false;
// } else if (!imagesEverywhere && !transectEntry){
// // End of transect, stop triggering
// item = new MissionItem(seqNum++,
// MAV_CMD_DO_SET_CAM_TRIGG_DIST,
// MAV_FRAME_MISSION,
// 0, // stop triggering
// 0, // shutter integration (ignore)
// 0, // trigger immediately when starting
// 0, 0, 0, 0, // param 4-7 unused
// true, // autoContinue
// false, // isCurrentItem
// missionItemParent);
// items.append(item);
// }
// }
}
}
// implemetn photo capture if desired
// if (triggerCamera() && !hoverAndCaptureEnabled() && imagesEverywhere) {
// // Stop triggering
// MissionItem* item = new MissionItem(seqNum++,
// MAV_CMD_DO_SET_CAM_TRIGG_DIST,
// MAV_FRAME_MISSION,
// 0, // stop triggering
// 0, // shutter integration (ignore)
// 0, // trigger immediately when starting
// 0, 0, 0, 0, // param 4-7 unused
// true, // autoContinue
// false, // isCurrentItem
// missionItemParent);
// items.append(item);
// }
}
void
CircularSurveyComplexItem
::
applyNewAltitude
(
double
newAltitude
)
{
_cameraCalc
.
valueSetIsDistance
()
->
setRawValue
(
true
);
_cameraCalc
.
distanceToSurface
()
->
setRawValue
(
newAltitude
);
_cameraCalc
.
setDistanceToSurfaceRelative
(
true
);
}
double
CircularSurveyComplexItem
::
timeBetweenShots
()
...
...
@@ -94,7 +323,7 @@ double CircularSurveyComplexItem::timeBetweenShots()
bool
CircularSurveyComplexItem
::
readyForSave
()
const
{
return
false
;
return
TransectStyleComplexItem
::
readyForSave
()
;
}
double
CircularSurveyComplexItem
::
additionalTimeDelay
()
const
...
...
@@ -301,12 +530,17 @@ void CircularSurveyComplexItem::_rebuildTransectsPhase1()
void
CircularSurveyComplexItem
::
_recalcComplexDistance
()
{
_complexDistance
=
0
;
for
(
int
i
=
0
;
i
<
_visualTransectPoints
.
count
()
-
1
;
i
++
)
{
_complexDistance
+=
_visualTransectPoints
[
i
].
value
<
QGeoCoordinate
>
().
distanceTo
(
_visualTransectPoints
[
i
+
1
].
value
<
QGeoCoordinate
>
());
}
emit
complexDistanceChanged
();
}
// no cameraShots in Circular Survey, add if desired
void
CircularSurveyComplexItem
::
_recalcCameraShots
()
{
_cameraShots
=
0
;
}
void
CircularSurveyComplexItem
::
_updateItem
()
...
...
src/Wima/CircularSurveyComplexItem.h
View file @
313a7b90
...
...
@@ -56,6 +56,13 @@ public:
static
const
char
*
deltaRName
;
static
const
char
*
deltaAlphaName
;
static
const
char
*
jsonComplexItemTypeValue
;
static
const
char
*
jsonDeltaRKey
;
static
const
char
*
jsonDeltaAlphaKey
;
static
const
char
*
jsonReferencePointLongKey
;
static
const
char
*
jsonReferencePointLatKey
;
static
const
char
*
jsonReferencePointAltKey
;
signals:
void
refPointChanged
();
void
autoGeneratedChanged
();
...
...
@@ -70,6 +77,11 @@ private slots:
signals:
private:
void
_appendLoadedMissionItems
(
QList
<
MissionItem
*>&
items
,
QObject
*
missionItemParent
);
void
_buildAndAppendMissionItems
(
QList
<
MissionItem
*>&
items
,
QObject
*
missionItemParent
);
QGeoCoordinate
_referencePoint
;
// center of the circular lanes, e.g. base station
QMap
<
QString
,
FactMetaData
*>
_metaDataMap
;
...
...
src/Wima/WimaPlaner.cc
View file @
313a7b90
...
...
@@ -497,9 +497,17 @@ bool WimaPlaner::loadFromFile(const QString &filename)
emit
currentFileChanged
();
//recalcJoinedArea();
// MissionItems
4
// MissionItems
// extrac MissionItems part
QJsonDocument
missionJsonDoc
=
QJsonDocument
(
json
[
missionItemsName
].
toObject
());
// bool ret = json.contains(missionItemsName);
// qWarning() << ret;
QJsonObject
missionObject
=
json
[
missionItemsName
].
toObject
();
//qWarning() << json[missionItemsName].type();
QJsonDocument
missionJsonDoc
=
QJsonDocument
(
missionObject
);
// create temporary file with missionItems
QFile
temporaryFile
;
QString
cropedFileName
=
filename
.
section
(
"/"
,
0
,
-
2
);
...
...
@@ -508,7 +516,8 @@ bool WimaPlaner::loadFromFile(const QString &filename)
#endif
QString
temporaryFileName
;
for
(
int
i
=
0
;
;
i
++
)
{
temporaryFileName
=
cropedFileName
.
append
(
"/temp%1.%2"
).
arg
(
i
).
arg
(
AppSettings
::
planFileExtension
);
temporaryFileName
=
cropedFileName
+
QString
(
"/temp%1.%2"
).
arg
(
i
).
arg
(
AppSettings
::
planFileExtension
);
// qWarning() << temporaryFileName;
if
(
!
QFile
::
exists
(
temporaryFileName
)
)
{
temporaryFile
.
setFileName
(
temporaryFileName
);
...
...
@@ -523,7 +532,9 @@ bool WimaPlaner::loadFromFile(const QString &filename)
}
}
// qWarning() << missionJsonDoc.toVariant().toString();
temporaryFile
.
write
(
missionJsonDoc
.
toJson
());
temporaryFile
.
close
();
// load from temporary file
_masterController
->
loadFromFile
(
temporaryFileName
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment