@ -26,6 +26,7 @@ const char* StructureScanComplexItem::_altitudeFactName = "Altitude";
@@ -26,6 +26,7 @@ const char* StructureScanComplexItem::_altitudeFactName = "Altitude";
const char * StructureScanComplexItem : : _layersFactName = " Layers " ;
const char * StructureScanComplexItem : : _jsonCameraCalcKey = " CameraCalc " ;
const char * StructureScanComplexItem : : _jsonAltitudeRelativeKey = " altitudeRelative " ;
const char * StructureScanComplexItem : : _jsonYawVehicleToStructureKey = " yawVehicleToStructure " ;
QMap < QString , FactMetaData * > StructureScanComplexItem : : _metaDataMap ;
@ -40,6 +41,7 @@ StructureScanComplexItem::StructureScanComplexItem(Vehicle* vehicle, QObject* pa
@@ -40,6 +41,7 @@ StructureScanComplexItem::StructureScanComplexItem(Vehicle* vehicle, QObject* pa
, _cameraShots ( 0 )
, _cameraMinTriggerInterval ( 0 )
, _cameraCalc ( vehicle )
, _yawVehicleToStructure ( true )
, _altitudeFact ( 0 , _altitudeFactName , FactMetaData : : valueTypeDouble )
, _layersFact ( 0 , _layersFactName , FactMetaData : : valueTypeUint32 )
{
@ -73,6 +75,10 @@ StructureScanComplexItem::StructureScanComplexItem(Vehicle* vehicle, QObject* pa
@@ -73,6 +75,10 @@ StructureScanComplexItem::StructureScanComplexItem(Vehicle* vehicle, QObject* pa
connect ( & _flightPolygon , & QGCMapPolygon : : pathChanged , this , & StructureScanComplexItem : : _flightPathChanged ) ;
connect ( _cameraCalc . distanceToSurface ( ) , & Fact : : valueChanged , this , & StructureScanComplexItem : : _rebuildFlightPolygon ) ;
connect ( & _flightPolygon , & QGCMapPolygon : : pathChanged , this , & StructureScanComplexItem : : _recalcCameraShots ) ;
connect ( _cameraCalc . adjustedFootprintSide ( ) , & Fact : : valueChanged , this , & StructureScanComplexItem : : _recalcCameraShots ) ;
connect ( & _layersFact , & Fact : : valueChanged , this , & StructureScanComplexItem : : _recalcCameraShots ) ;
}
void StructureScanComplexItem : : _setScanDistance ( double scanDistance )
@ -132,6 +138,7 @@ void StructureScanComplexItem::save(QJsonArray& missionItems)
@@ -132,6 +138,7 @@ void StructureScanComplexItem::save(QJsonArray& missionItems)
saveObject [ _altitudeFactName ] = _altitudeFact . rawValue ( ) . toDouble ( ) ;
saveObject [ _jsonAltitudeRelativeKey ] = _altitudeRelative ;
saveObject [ _layersFactName ] = _layersFact . rawValue ( ) . toDouble ( ) ;
saveObject [ _jsonYawVehicleToStructureKey ] = _yawVehicleToStructure ;
QJsonObject cameraCalcObject ;
_cameraCalc . save ( cameraCalcObject ) ;
@ -162,6 +169,7 @@ bool StructureScanComplexItem::load(const QJsonObject& complexObject, int sequen
@@ -162,6 +169,7 @@ bool StructureScanComplexItem::load(const QJsonObject& complexObject, int sequen
{ _jsonAltitudeRelativeKey , QJsonValue : : Bool , false } ,
{ _layersFactName , QJsonValue : : Double , true } ,
{ _jsonCameraCalcKey , QJsonValue : : Object , true } ,
{ _jsonYawVehicleToStructureKey , QJsonValue : : Bool , true } ,
} ;
if ( ! JsonHelper : : validateKeys ( complexObject , keyInfoList , errorString ) ) {
return false ;
@ -187,6 +195,7 @@ bool StructureScanComplexItem::load(const QJsonObject& complexObject, int sequen
@@ -187,6 +195,7 @@ bool StructureScanComplexItem::load(const QJsonObject& complexObject, int sequen
_altitudeFact . setRawValue ( complexObject [ _altitudeFactName ] . toDouble ( ) ) ;
_layersFact . setRawValue ( complexObject [ _layersFactName ] . toDouble ( ) ) ;
_altitudeRelative = complexObject [ _jsonAltitudeRelativeKey ] . toBool ( true ) ;
_yawVehicleToStructure = complexObject [ _jsonYawVehicleToStructureKey ] . toBool ( true ) ;
if ( ! _cameraCalc . load ( complexObject [ _jsonCameraCalcKey ] . toObject ( ) , errorString ) ) {
return false ;
@ -231,7 +240,22 @@ void StructureScanComplexItem::appendMissionItems(QList<MissionItem*>& items, QO
@@ -231,7 +240,22 @@ void StructureScanComplexItem::appendMissionItems(QList<MissionItem*>& items, QO
{
int seqNum = _sequenceNumber ;
double baseAltitude = _altitudeFact . rawValue ( ) . toDouble ( ) ;
MissionItem * item ;
if ( _yawVehicleToStructure ) {
MissionItem * item = new MissionItem ( seqNum + + ,
MAV_CMD_CONDITION_YAW ,
MAV_FRAME_MISSION ,
90.0 , // Target angle
0 , // Use default turn rate
1 , // Clockwise turn
0 , // Absolute angle specified
0 , 0 , 0 , // param 5-7 not used
true , // autoContinue
false , // isCurrentItem
missionItemParent ) ;
items . append ( item ) ;
} else {
MissionItem * item = new MissionItem ( seqNum + + ,
MAV_CMD_DO_MOUNT_CONTROL ,
MAV_FRAME_MISSION ,
@ -244,6 +268,7 @@ void StructureScanComplexItem::appendMissionItems(QList<MissionItem*>& items, QO
@@ -244,6 +268,7 @@ void StructureScanComplexItem::appendMissionItems(QList<MissionItem*>& items, QO
false , // isCurrentItem
missionItemParent ) ;
items . append ( item ) ;
}
for ( int layer = 0 ; layer < _layersFact . rawValue ( ) . toInt ( ) ; layer + + ) {
bool addTriggerStart = true ;
@ -386,3 +411,26 @@ void StructureScanComplexItem::_rebuildFlightPolygon(void)
@@ -386,3 +411,26 @@ void StructureScanComplexItem::_rebuildFlightPolygon(void)
_flightPolygon = _structurePolygon ;
_flightPolygon . offset ( _cameraCalc . distanceToSurface ( ) - > rawValue ( ) . toDouble ( ) ) ;
}
void StructureScanComplexItem : : _recalcCameraShots ( void )
{
if ( _flightPolygon . count ( ) < 3 ) {
_setCameraShots ( 0 ) ;
return ;
}
// Determine the distance for each polygon traverse
double distance = 0 ;
for ( int i = 0 ; i < _flightPolygon . count ( ) ; i + + ) {
QGeoCoordinate coord1 = _flightPolygon . vertexCoordinate ( i ) ;
QGeoCoordinate coord2 = _flightPolygon . vertexCoordinate ( i + 1 = = _flightPolygon . count ( ) ? 0 : i + 1 ) ;
distance + = coord1 . distanceTo ( coord2 ) ;
}
if ( distance = = 0.0 ) {
_setCameraShots ( 0 ) ;
return ;
}
int cameraShots = distance / _cameraCalc . adjustedFootprintSide ( ) - > rawValue ( ) . toDouble ( ) ;
_setCameraShots ( cameraShots * _layersFact . rawValue ( ) . toInt ( ) ) ;
}