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
b1201f6f
Commit
b1201f6f
authored
May 03, 2018
by
DonLakeFlyer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refly and camera shot count support
parent
1d10b2ad
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
54 additions
and
173 deletions
+54
-173
CorridorScanComplexItem.cc
src/MissionManager/CorridorScanComplexItem.cc
+1
-1
SurveyComplexItem.cc
src/MissionManager/SurveyComplexItem.cc
+52
-172
SurveyComplexItem.h
src/MissionManager/SurveyComplexItem.h
+1
-0
No files found.
src/MissionManager/CorridorScanComplexItem.cc
View file @
b1201f6f
...
...
@@ -456,7 +456,7 @@ void CorridorScanComplexItem::_rebuildTransectsPhase2(void)
{
// Calculate distance flown for complex item
_complexDistance
=
0
;
for
(
int
i
=
0
;
i
<
_visualTransectPoints
.
count
()
-
2
;
i
++
)
{
for
(
int
i
=
0
;
i
<
_visualTransectPoints
.
count
()
-
1
;
i
++
)
{
_complexDistance
+=
_visualTransectPoints
[
i
].
value
<
QGeoCoordinate
>
().
distanceTo
(
_visualTransectPoints
[
i
+
1
].
value
<
QGeoCoordinate
>
());
}
...
...
src/MissionManager/SurveyComplexItem.cc
View file @
b1201f6f
...
...
@@ -1136,6 +1136,14 @@ bool SurveyComplexItem::_hoverAndCaptureEnabled(void) const
#endif
void
SurveyComplexItem
::
_rebuildTransectsPhase1
(
void
)
{
_rebuildTransectsPhase1Worker
(
false
/* refly */
);
if
(
_refly90DegreesFact
.
rawValue
().
toBool
())
{
_rebuildTransectsPhase1Worker
(
true
/* refly */
);
}
}
void
SurveyComplexItem
::
_rebuildTransectsPhase1Worker
(
bool
refly
)
{
if
(
_ignoreRecalc
)
{
return
;
...
...
@@ -1148,15 +1156,16 @@ void SurveyComplexItem::_rebuildTransectsPhase1(void)
_loadedMissionItemsParent
=
NULL
;
}
_transects
.
clear
();
_transectsPathHeightInfo
.
clear
();
// First pass will clear old transect data, refly will append to existing data
if
(
!
refly
)
{
_transects
.
clear
();
_transectsPathHeightInfo
.
clear
();
}
if
(
_surveyAreaPolygon
.
count
()
<
3
)
{
return
;
}
QList
<
QList
<
QPointF
>>
transectSegments
;
// Convert polygon to NED
QList
<
QPointF
>
polygonPoints
;
...
...
@@ -1177,12 +1186,11 @@ void SurveyComplexItem::_rebuildTransectsPhase1(void)
// Generate transects
bool
refly
=
_refly90DegreesFact
.
rawValue
().
toBool
();
double
gridAngle
=
_gridAngleFact
.
rawValue
().
toDouble
();
double
gridSpacing
=
_cameraCalc
.
adjustedFootprintSide
()
->
rawValue
().
toDouble
();
gridAngle
=
_clampGridAngle90
(
gridAngle
);
//
gridAngle += refly ? 90 : 0;
gridAngle
+=
refly
?
90
:
0
;
qCDebug
(
SurveyComplexItemLog
)
<<
"_rebuildTransectsPhase1 Clamped grid angle"
<<
gridAngle
;
qCDebug
(
SurveyComplexItemLog
)
<<
"_rebuildTransectsPhase1 gridSpacing:gridAngle:refly"
<<
gridSpacing
<<
gridAngle
<<
refly
;
...
...
@@ -1265,7 +1273,29 @@ void SurveyComplexItem::_rebuildTransectsPhase1(void)
_adjustTransectsToEntryPointLocation
(
transects
);
// Convert to CoordInfo transects
if
(
refly
)
{
_optimizeTransectsForShortestDistance
(
_transects
.
last
().
last
().
coord
,
transects
);
}
// Adjust to lawnmower pattern
bool
reverseVertices
=
false
;
for
(
int
i
=
0
;
i
<
transects
.
count
();
i
++
)
{
// We must reverse the vertices for every other transect in order to make a lawnmower pattern
QList
<
QGeoCoordinate
>
transectVertices
=
transects
[
i
];
if
(
reverseVertices
)
{
reverseVertices
=
false
;
QList
<
QGeoCoordinate
>
reversedVertices
;
for
(
int
j
=
transectVertices
.
count
()
-
1
;
j
>=
0
;
j
--
)
{
reversedVertices
.
append
(
transectVertices
[
j
]);
}
transectVertices
=
reversedVertices
;
}
else
{
reverseVertices
=
true
;
}
transects
[
i
]
=
transectVertices
;
}
// Convert to CoordInfo transects and append to _transects
foreach
(
const
QList
<
QGeoCoordinate
>&
transect
,
transects
)
{
QGeoCoordinate
coord
;
QList
<
TransectStyleComplexItem
::
CoordInfo_t
>
coordInfoTransect
;
...
...
@@ -1297,183 +1327,33 @@ void SurveyComplexItem::_rebuildTransectsPhase1(void)
_transects
.
append
(
coordInfoTransect
);
}
// Adjust to lawnmower pattern
bool
reverseVertices
=
false
;
for
(
int
i
=
0
;
i
<
_transects
.
count
();
i
++
)
{
// We must reverse the vertices for every other transect in order to make a lawnmower pattern
QList
<
TransectStyleComplexItem
::
CoordInfo_t
>
transectVertices
=
_transects
[
i
];
if
(
reverseVertices
)
{
reverseVertices
=
false
;
QList
<
TransectStyleComplexItem
::
CoordInfo_t
>
reversedVertices
;
for
(
int
j
=
transectVertices
.
count
()
-
1
;
j
>=
0
;
j
--
)
{
reversedVertices
.
append
(
transectVertices
[
j
]);
}
transectVertices
=
reversedVertices
;
}
else
{
reverseVertices
=
true
;
}
_transects
[
i
]
=
transectVertices
;
}
#if 0
CorridorScan code
if (_ignoreRecalc) {
return;
}
// If the transects are getting rebuilt then any previsouly loaded mission items are now invalid
if (_loadedMissionItemsParent) {
_loadedMissionItems.clear();
_loadedMissionItemsParent->deleteLater();
_loadedMissionItemsParent = NULL;
}
_transects.clear();
_transectsPathHeightInfo.clear();
double transectSpacing = _cameraCalc.adjustedFootprintSide()->rawValue().toDouble();
double fullWidth = _corridorWidthFact.rawValue().toDouble();
double halfWidth = fullWidth / 2.0;
int transectCount = _transectCount();
double normalizedTransectPosition = transectSpacing / 2.0;
if (_corridorPolyline.count() >= 2) {
// First build up the transects all going the same direction
//qDebug() << "_rebuildTransectsPhase1";
for (int i=0; i<transectCount; i++) {
//qDebug() << "start transect";
double offsetDistance;
if (transectCount == 1) {
// Single transect is flown over scan line
offsetDistance = 0;
} else {
// Convert from normalized to absolute transect offset distance
offsetDistance = halfWidth - normalizedTransectPosition;
}
// Turn transect into CoordInfo transect
QList<TransectStyleComplexItem::CoordInfo_t> transect;
QList<QGeoCoordinate> transectCoords = _corridorPolyline.offsetPolyline(offsetDistance);
for (int j=1; j<transectCoords.count() - 1; j++) {
TransectStyleComplexItem::CoordInfo_t coordInfo = { transectCoords[j], CoordTypeInterior };
transect.append(coordInfo);
}
TransectStyleComplexItem::CoordInfo_t coordInfo = { transectCoords.first(), CoordTypeSurveyEdge };
transect.prepend(coordInfo);
coordInfo = { transectCoords.last(), CoordTypeSurveyEdge };
transect.append(coordInfo);
// Extend the transect ends for turnaround
if (_hasTurnaround()) {
QGeoCoordinate turnaroundCoord;
double turnAroundDistance = _turnAroundDistanceFact.rawValue().toDouble();
double azimuth = transectCoords[0].azimuthTo(transectCoords[1]);
turnaroundCoord = transectCoords[0].atDistanceAndAzimuth(-turnAroundDistance, azimuth);
turnaroundCoord.setAltitude(qQNaN());
TransectStyleComplexItem::CoordInfo_t coordInfo = { turnaroundCoord, CoordTypeTurnaround };
transect.prepend(coordInfo);
azimuth = transectCoords.last().azimuthTo(transectCoords[transectCoords.count() - 2]);
turnaroundCoord = transectCoords.last().atDistanceAndAzimuth(-turnAroundDistance, azimuth);
turnaroundCoord.setAltitude(qQNaN());
coordInfo = { turnaroundCoord, CoordTypeTurnaround };
transect.append(coordInfo);
}
#if 0
qDebug() << "transect debug";
foreach (const TransectStyleComplexItem::CoordInfo_t& coordInfo, transect) {
qDebug() << coordInfo.coordType;
}
#endif
_transects.append(transect);
normalizedTransectPosition += transectSpacing;
}
// Now deal with fixing up the entry point:
// 0: Leave alone
// 1: Start at same end, opposite side of center
// 2: Start at opposite end, same side
// 3: Start at opposite end, opposite side
bool reverseTransects = false;
bool reverseVertices = false;
switch (_entryPoint) {
case 0:
reverseTransects = false;
reverseVertices = false;
break;
case 1:
reverseTransects = true;
reverseVertices = false;
break;
case 2:
reverseTransects = false;
reverseVertices = true;
break;
case 3:
reverseTransects = true;
reverseVertices = true;
break;
}
if (reverseTransects) {
QList<QList<TransectStyleComplexItem::CoordInfo_t>> reversedTransects;
foreach (const QList<TransectStyleComplexItem::CoordInfo_t>& transect, _transects) {
reversedTransects.prepend(transect);
}
_transects = reversedTransects;
}
if (reverseVertices) {
for (int i=0; i<_transects.count(); i++) {
QList<TransectStyleComplexItem::CoordInfo_t> reversedVertices;
foreach (const TransectStyleComplexItem::CoordInfo_t& vertex, _transects[i]) {
reversedVertices.prepend(vertex);
}
_transects[i] = reversedVertices;
}
}
// Adjust to lawnmower pattern
reverseVertices = false;
for (int i=0; i<_transects.count(); i++) {
// We must reverse the vertices for every other transect in order to make a lawnmower pattern
QList<TransectStyleComplexItem::CoordInfo_t> transectVertices = _transects[i];
if (reverseVertices) {
reverseVertices = false;
QList<TransectStyleComplexItem::CoordInfo_t> reversedVertices;
for (int j=transectVertices.count()-1; j>=0; j--) {
reversedVertices.append(transectVertices[j]);
}
transectVertices = reversedVertices;
} else {
reverseVertices = true;
}
_transects[i] = transectVertices;
}
}
#endif
}
void
SurveyComplexItem
::
_rebuildTransectsPhase2
(
void
)
{
// Calculate distance flown for complex item
_complexDistance
=
0
;
for
(
int
i
=
0
;
i
<
_visualTransectPoints
.
count
()
-
2
;
i
++
)
{
for
(
int
i
=
0
;
i
<
_visualTransectPoints
.
count
()
-
1
;
i
++
)
{
_complexDistance
+=
_visualTransectPoints
[
i
].
value
<
QGeoCoordinate
>
().
distanceTo
(
_visualTransectPoints
[
i
+
1
].
value
<
QGeoCoordinate
>
());
}
#if 0
double
triggerDistance
=
_cameraCalc
.
adjustedFootprintFrontal
()
->
rawValue
().
toDouble
();
if
(
_cameraTriggerInTurnAroundFact
.
rawValue
().
toBool
())
{
_cameraShots = qCeil(_complexDistance /
_cameraCalc.adjustedFootprintFrontal()->rawValue().toDouble()
);
_cameraShots
=
qCeil
(
_complexDistance
/
triggerDistance
);
}
else
{
int singleTransectImageCount = qCeil(_corridorPolyline.length() / _cameraCalc.adjustedFootprintFrontal()->rawValue().toDouble());
_cameraShots = singleTransectImageCount * _transectCount();
_cameraShots
=
0
;
foreach
(
const
QList
<
TransectStyleComplexItem
::
CoordInfo_t
>&
transect
,
_transects
)
{
QGeoCoordinate
firstCameraCoord
,
lastCameraCoord
;
if
(
_hasTurnaround
())
{
firstCameraCoord
=
transect
[
1
].
coord
;
lastCameraCoord
=
transect
[
transect
.
count
()
-
2
].
coord
;
}
else
{
firstCameraCoord
=
transect
.
first
().
coord
;
lastCameraCoord
=
transect
.
last
().
coord
;
}
_cameraShots
+=
qCeil
(
firstCameraCoord
.
distanceTo
(
lastCameraCoord
)
/
triggerDistance
);
}
}
#endif
_coordinate
=
_visualTransectPoints
.
count
()
?
_visualTransectPoints
.
first
().
value
<
QGeoCoordinate
>
()
:
QGeoCoordinate
();
_exitCoordinate
=
_visualTransectPoints
.
count
()
?
_visualTransectPoints
.
last
().
value
<
QGeoCoordinate
>
()
:
QGeoCoordinate
();
...
...
src/MissionManager/SurveyComplexItem.h
View file @
b1201f6f
...
...
@@ -101,6 +101,7 @@ private:
bool
_hoverAndCaptureEnabled
(
void
)
const
;
bool
_loadV3
(
const
QJsonObject
&
complexObject
,
int
sequenceNumber
,
QString
&
errorString
);
bool
_loadV4
(
const
QJsonObject
&
complexObject
,
int
sequenceNumber
,
QString
&
errorString
);
void
_rebuildTransectsPhase1Worker
(
bool
refly
);
QMap
<
QString
,
FactMetaData
*>
_metaDataMap
;
...
...
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