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

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
QGC(QGroundControl)是一种开源的地面站软件,用于控制和监视无人机系统。在四旋翼(Quadcopter)的逻辑控制方面,QGC提供了以下功能和特性: 1. 飞行模式选择:QGC支持多种预定义的飞行模式,如手动模式、稳定模式、定高模式、定点模式等。用户可以根据需求选择合适的飞行模式。 2. 遥控器输入:QGC接收来自遥控器的输入信号,包括油门、方向舵、升降舵和副翼等控制通道。通过解析遥控器输入,QGC可以实现对四旋翼的基本控制。 3. 姿态估计与控制:QGC利用传感器(如加速度计、陀螺仪和磁力计)获取四旋翼的姿态信息,并根据设定的控制算法实现姿态控制。这包括保持平衡、稳定飞行和执行用户指令等。 4. 高度控制:QGC通过测量气压或激光高度计来获取四旋翼的高度信息,并通过控制电机转速或倾斜角度来实现高度控制。这使得四旋翼能够在定高模式下保持一定的飞行高度。 5. 航点导航:QGC支持航点导航功能,用户可以在地图上设置航点,并指定飞行路径。四旋翼将按照指定的航点序列自动飞行,实现自主导航功能。 6. 飞行参数调整:QGC允许用户调整和优化四旋翼的飞行参数,如最大速度、最大倾斜角度、控制增益等。这些参数可以根据四旋翼的特性和任务需求进行调整,以提高飞行性能和稳定性。 总的来说,QGC提供了丰富的功能和控制选项,可以实现对四旋翼的姿态、高度和导航等方面的控制和监视。具体的逻辑与算法实现可能会因具体的四旋翼型号和配置而有所不同。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土拨鼠不是老鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值