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

本文详细介绍了在点击【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

<think>好的,我现在需要帮助用户在Linux系统中打包他们二次开发的Qt程序,并确保这个程序能在Windows系统上运行。用户提到了一个名为qgc-4.3-leader-follow-swarm的文件夹,里面包含他们的程序。我需要仔细分析这个问题,并给出详细的步骤。 首先,用户的需求很明确:在Linux下打包Qt程序,但目标是在Windows运行。这涉及到跨平台编译和打包的问题。Qt通常需要在目标平台上进行编译,所以在Linux下直接编译Windows的可执行文件需要使用交叉编译工具链。 我想到,通常跨平台打包Qt程序的方法有两种:一种是在Windows系统上直接编译和打包,另一种是在Linux上使用MXE(M cross environment)这样的工具链进行交叉编译。由于用户可能希望在Linux环境下完成所有步骤,可能需要指导他们设置MXE或者类似的工具。 不过,用户可能不太熟悉交叉编译的配置,这可能比较复杂。另外,如果用户没有Windows环境,可能需要其他方法。但根据引用[2]中提到,Windows下的Qt打包是使用windeployqt工具,而Linux下打包是通过脚本将依赖库复制到目录。但用户的问题是要在Linux下打包,让程序在Windows运行,这显然需要生成Windows的可执行文件,所以交叉编译是必须的步骤。 接下来,我需要整理步骤。首先,用户需要在Linux上安装MXE,然后使用MXE中的Qt工具链来编译程序。之后,将编译后的exe文件和相关依赖库(包括Qt的DLL和其他必要的库)打包。可能还需要处理第三方依赖,比如用户提到的qgc-4.3-leader-follow-swarm中的程序可能有其他依赖项。 可能的步骤包括: 1. 在Linux上安装MXE,并添加i686-w64-mingw32或x86_64-w64-mingw32工具链。 2. 使用MXE中的qmake来编译Qt项目,生成Windows的exe文件。 3. 使用MXE提供的windeployqt工具来收集Qt相关的依赖库。 4. 手动复制其他必要的DLL(如第三方库)。 5. 测试打包后的程序是否能在Windows上运行。 不过,MXE的安装和使用可能需要详细说明。例如,用户需要克隆MXE的仓库,然后编译所需的Qt版本。这可能需要较长时间,尤其是编译Qt本身。另外,用户的Qt项目可能需要调整.pro文件,确保正确指向交叉编译的工具链。 另外,用户的项目可能包含特定于Linux的代码,需要处理平台相关的部分,比如路径分隔符或系统调用,这可能需要进行条件编译或修改代码以适应Windows环境。 总结一下,主要的步骤应该是: - 设置交叉编译环境(MXE)。 - 使用交叉编译工具链编译项目。 - 收集依赖项(Qt DLL、第三方库等)。 - 打包所有文件,传输到Windows测试。 现在需要确保每个步骤都详细,避免用户遇到障碍。比如,在MXE安装过程中可能需要安装依赖包,编译Qt可能需要指定版本,使用正确的qmake路径等。 此外,用户的项目结构可能需要注意,比如qgc-4.3-leader-follow-swarm文件夹中的程序是否有子模块或额外的资源文件需要处理。可能需要提醒用户检查项目中的资源路径,确保在Windows下正确访问。 最后,测试步骤很关键,用户需要在Windows环境中运行打包后的程序,检查是否有缺失的DLL或运行时错误,如MSVC运行库是否需要安装等。 可能遇到的问题包括:MXE编译过程中的依赖缺失,项目代码中的平台特定代码未处理,第三方库的兼容性等。需要提示用户如何处理这些常见问题。</think>以下是在Linux系统中打包Qt二次开发程序并使其在Windows上运行的详细步骤: ### 一、搭建交叉编译环境(MXE) 1. **安装MXE依赖** ```bash sudo apt-get install autoconf automake autopoint bash bison bzip2 flex g++ g++-multilib gettext git gperf intltool libc6-dev-i386 libgdk-pixbuf2.0-dev libltdl-dev libssl-dev libtool-bin libxml-parser-perl lzip make openssl p7zip-full patch perl pkg-config python ruby sed unzip wget xz-utils ``` 2. **下载并编译MXE** ```bash git clone https://github.com/mxe/mxe.git cd mxe # 编译Qt5基础组件(根据项目需求选择版本,示例为Qt5.15) make MXE_TARGETS=i686-w64-mingw32.static qtbase ``` ### 二、配置Qt项目交叉编译 1. **设置环境变量** ```bash export PATH=/path/to/mxe/usr/bin:$PATH ``` 2. **使用MXE的qmake生成Makefile** ```bash cd /path/to/qgc-4.3-leader-follow-swarm i686-w64-mingw32.static-qmake-qt5 ``` 3. **编译项目** ```bash make -j$(nproc) ``` ### 三、收集Windows依赖项 1. **使用windeployqt工具** 将编译生成的`.exe`文件复制到新目录,运行: ```bash i686-w64-mingw32.static-windeployqt --release --dir ./deploy your_program.exe ``` 2. **手动添加第三方依赖** 将项目依赖的非Qt库(如OpenCV、MAVSDK等)的Windows版DLL复制到`deploy`目录。 ### 四、处理平台兼容性问题 - **代码调整**: - 替换Linux特有路径(如`/dev/ttyUSB0`)为Windows兼容格式(如COM端口) - 使用`Q_OS_WIN`宏隔离平台相关代码 ```cpp #ifdef Q_OS_WIN // Windows专用代码 #else // Linux专用代码 #endif ``` ### 五、打包与测试 1. **压缩部署目录** ```bash zip -r windows_package.zip deploy/ ``` 2. **Windows环境测试** 将压缩包复制到Windows系统后: - 解压后直接双击运行`.exe` - 若提示缺失DLL,使用[Dependency Walker](https://dependencywalker.com/)分析依赖 ### 六、高级处理(可选) - **静态编译**:修改MXE编译参数为`make MXE_TARGETS=i686-w64-mingw32.static MXE_PLUGIN_DIRS=plugins/qt5`生成完全静态版本 - **NSIS打包**:使用[NSIS](https://nsis.sourceforge.io/)创建安装程序 - **Qt资源系统**:将配置文件等资源通过`.qrc`嵌入可执行文件 **注意事项**: 1. MXE完整编译Qt5可能需要10GB+磁盘空间和数小时时间 2. 确保Windows目标机安装[VC++运行库](https://support.microsoft.com/en-us/topic/the-latest-supported-visual-c-downloads-2647da03-1eea-4433-9aff-95f26a218cc0) 3. 调试时可使用`wine your_program.exe`在Linux端初步测试 [^1]: 注册属性或方法时需使用Qt元对象系统特性 [^2]: Windows下Qt打包需使用windeployqt工具收集依赖
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

土拨鼠不是老鼠

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

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

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

打赏作者

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

抵扣说明:

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

余额充值