您的位置:首页 > 其它

QGC 任务规划 -》Survey功能 底层执行逻辑

2018-03-07 13:11 597 查看


追踪了 一下 当点击 【Survey】按钮后,地图上 绘制出了 一个多边形,这个交互的 底层执行顺序。

1,首先加载给地图加载代理。PlanView.qml  。给FlightMap 添加了一个代理(MissionItemMapVisual),用来展示 不同的任务 效果。比如简单的航点任务 和多边形的测量任务。

Repeater{                model:_editingLayer==_layerMission?_missionController.visualItems:undefined                delegate:MissionItemMapVisual{                    map:        editorMap                    onClicked:  setCurrentItem(sequenceNumber,false)                    visible:    _editingLayer==_layerMission                }            } 

2,MissionItemMapVisual.qml  代理 调用 mapVisualQML 属性

Component.onCompleted:{       if(object.mapVisualQML){//载入地图效果。添加 抽象基类代理            varcomponent=Qt.createComponent(object.mapVisualQML)           if(component.status===Component.Error){                console.log("ErrorloadingQml:",object.mapVisualQML,component.errorString())           }           _visualItem=component.createObject(map,{"map":_root.map})           _visualItem.clicked.connect(_root.clicked)       }}

3,VisualMissionItem.h 一个代理的抽象基类 .提供了 mapVisualQML 属性,供第2步使用。

// Abstract base class for all Simple and Complex visual mission objects.
class VisualMissionItem : public QObject
Q_PROPERTY(QString          mapVisualQML                        READ mapVisualQML                                                   CONSTANT)                                           ///< QMl code for map visuals

classSimpleMissionItem:publicVisualMissionItem //单独 航点 简单任务
classComplexMissionItem:publicVisualMissionItem
classSurveyMissionItem:publicComplexMissionItem //多边形 航线   加载多边形航线(SurveyMapVisual.qml) -》

QString             mapVisualQML        (void)constfinal{returnQStringLiteral("SurveyMapVisual.qml");}//加载 SurveyMapVisual.qml 文件

4,按下 【Survey】按钮时。 PlanView.qml

case1:                        if(_singleComplexItem){                           addComplexItem(_missionController.complexMissionItemNames[0])                       }
//////////
functionaddComplexItem(complexItemName){       varcoordinate=editorMap.center       coordinate.latitude=coordinate.latitude.toFixed(_decimalPlaces)       coordinate.longitude=coordinate.longitude.toFixed(_decimalPlaces)       coordinate.altitude=coordinate.altitude.toFixed(_decimalPlaces)       insertComplexMissionItem(complexItemName,coordinate,_missionController.visualItems.count)
    }
//////////
functioninsertComplexMissionItem(complexItemName,coordinate,index){       varsequenceNumber=_missionController.insertComplexMissionItem(complexItemName,coordinate,index)       setCurrentItem(sequenceNumber,true)
    }

5,MisssonController.h

intMissionController::insertComplexMissionItem(QStringitemName,QGeoCoordinatemapCenterCoordinate,inti){    ComplexMissionItem*newItem;    intsequenceNumber=_nextSequenceNumber();    if(itemName==_surveyMissionItemName){        newItem=new  SurveyMissionItem(_controllerVehicle,_visualItems);

6,SurveyMissionItem.h  定义一个代理 使用,mapVisualQML ,根据按下的 按钮 来加载不同代理的不同文件内容

QString             mapVisualQML        (void) const final { return QStringLiteral("SurveyMapVisual.qml"); }

7,SurveyMapVisual.qml

Component.onCompleted:{       _addInitialPolygon()//组件加载完毕 添加四边形           _addVisualElements()    }
/////

addInitalPolygon()_mapPolygon.appendVertex(topLeftCoord)           _mapPolygon.appendVertex(topRightCoord)           _mapPolygon.appendVertex(bottomRightCoord)
            _mapPolygon.appendVertex(bottomLeftCoord)

8,QGCMapPolygon.h

voidQGCMapPolygon::appendVertex(constQGeoCoordinate&coordinate){    _polygonPath.append(QVariant::fromValue(coordinate));    _polygonModel.append(newQGCQGeoCoordinate(coordinate,_newCoordParent));    emitpathChanged();
}
////
connect(&_mapPolygon,&QGCMapPolygon::pathChanged,  this,&SurveyMissionItem::_generateGrid);

9,SurveyMissionItem.h   网格生成

voidSurveyMissionItem::_generateGrid(void)  生成网格
emitlastSequenceNumberChanged(lastSequenceNumber());  最后一个索引  添加完

10,具体算法  基于凸多边形的往复运动

https://www.jianshu.com/p/015dd5b53263?from=singlemessage
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐