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

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

追踪了 一下 当点击 【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