QGC无人机地面站从安装到二次开发完整指南
简介QGC学习资料是一套针对开源地面站QGroundControl进行二次开发的系统性教程合集适合具备一定飞控或上位机基础的开发者以及需要定制无人机地面站功能的工程人员。资料以阿木实验室QGC开发手册为主线按章节拆解软件框架、地面站使用与开发接口、MAVLink通信协议、简洁QT地面站搭建、界面自定义、多机优化等核心主题覆盖从环境编译到功能扩展的全链路。压缩包共38个文件其中7个PDF为开发手册与教程文档25个PNG为界面截图和架构示意图3个HTML为说明页面另有2个ZIP示例工程和1个RAR源码包可对照学习示例代码与扩展案例整体约688MB目录按章节组织便于定位和检索。资源已有4079人学习对于想深入QGC源码、掌握二次开发流程的开发者是一份兼顾原理与实操的完整参考资料无论用于源码研读还是功能扩展都能找到相应指引。 最近在整理移动硬盘的时候翻出一个“QGC学习资料.rar”这个压缩包我存了快两年当初是从一个飞控交流群里拖下来的里面东西挺杂有官方文档、二次开发笔记、编译脚本甚至还有几个老版本的安装包。我自己是搞无人机地面站开发的这些年靠这套资料踩了不少坑也攒了不少经验干脆把这篇文章写出来把QGC从安装到二次开发的完整链路捋一遍。如果你正准备接触QGC地面站或者已经在用但想搞二次开发这篇文章应该能帮你少走很多弯路。1. 先搞清楚QGC到底是什么1.1 它不是“一个APP”而是一整套地面控制系统QGC全称QGroundControl是目前开源界最主流的无人机地面站软件之一和Mission Planner、ArduPilot Mission Planner这些老牌地面站齐名。它可以运行在Windows、macOS、Linux甚至Android和iOS上。它的用途通俗点说就是给无人机当下行控制台实时显示飞行姿态、航迹、电池电量、GPS信号规划航线任务调节飞控参数执行起飞降落还能看日志回放。很多人第一次接触QGC以为它就是个“遥控器模拟器”其实完全不是它是飞控和操作员之间的核心枢纽。在我接触过的项目里QGC最常见的应用场景是这几个测绘无人机航测任务规划KML航点导入导出带状航线、仿地航线。农业植保机的喷洒路径规划配合PX4飞控做变量喷洒。行业巡检比如电力巡线、石油管道巡查需要做复杂的多航点自动任务。教学和科研很多高校无人机实验室直接用QGC做二次开发平台。QGC之所以普及率高核心原因是它对PX4和ArduPilot两个主流开源飞控原生的支持而且它的通信协议MAVLink是开放的这意味着想改哪里都改得动。对于做行业项目的人来说这种可定制性很重要因为几乎每个实际项目都需要在地面站里加点自己的东西比如私有协议解析、定制告警、云端数据上报。1.2 谁在学QGC三种典型人群我观察下来学习QGC的人群基本可以分成三类第一类是飞手或者刚入行的无人机从业者他们需要的是熟练使用QGC完成任务规划、飞行监控、固件更新不需要碰代码但需要了解常用的设置项和操作逻辑。第二类是嵌入式或飞控开发工程师他们的工作重心在PX4、ArduPilot这类飞控上QGC只是他们的调试工具但有时候需要修改QGC里某些显示逻辑或者抓取分析MAVLink报文这种属于轻度二次开发。第三类是地面站产品开发者他们要把QGC改造成自己的商业化地面站换上自己的Logo、修改界面布局、添加私有功能模块、对接自己的云平台这种属于深度二次开发需要掌握QGC的整个架构。了解自己属于哪一类决定了你的学习路线。最怕的是目标不清晰上来就抱着一堆源码看结果被QGC庞大的代码量劝退。我见过很多人下载了源码之后编译都过不去就放弃了问题就在于没有把学习目标拆解清楚。2. QGC的安装和环境准备Ubuntu 22.04实测2.1 为什么我推荐Ubuntu 22.04做开发环境QGC官方支持多个平台但如果目标是二次开发我用下来的经验是开发环境首选Ubuntu。原因有三点第一QGC的源码编译脚本对Linux的支持最成熟没什么隐藏的坑第二很多飞控相关的工具链比如PX4工具链、MAVLink工具链本身就更倾向于Linux环境第三Ubuntu下调试串口、USB设备、网络连接的权限管理比Windows清晰得多少很多莫名其妙的驱动问题。在Ubuntu版本选择上我建议直接用22.04 LTS。因为QGC从4.2版本开始对Qt6的支持已经比较完善了而Ubuntu 22.04预装的Qt版本和系统库版本都比较合适不需要折腾太多兼容性问题。如果你还在用18.04或者20.04也可以装但可能会遇到OpenGL版本不匹配或者Qt库版本过旧的警告。用22.04可以省去这些麻烦。2.2 源码编译的详细步骤和依赖QGC的安装有两种方式直接下载官方编译好的二进制安装包或者从源码编译。如果你是纯使用不打算改代码直接用官方AppImage或者Windows安装包就行没必要自己编译。但如果想做二次开发编译源码这一步是躲不掉的。源码编译的完整步骤我记录一下不同版本之间可能微调但大方向不变sudo apt-get update sudo apt-get install -y build-essential cmake git sudo apt-get install -y qt6-base-dev qt6-declarative-dev qt6-tools-dev-tools sudo apt-get install -y libqt6svg6-dev libqt6serialport6-dev sudo apt-get install -y libsdl2-dev libsdl2-image-dev sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev sudo apt-get install -y libssl-dev libdw-dev sudo apt-get install -y libgl1-mesa-dev libglu1-mesa-dev sudo apt-get install -y libsdl1.2-dev sudo apt-get install -y speech-dispatcher sudo apt-get install -y libgcrypt20-dev依赖装完之后再拉代码git clone --recursive https://github.com/mavlink/qgroundcontrol.git cd qgroundcontrol git submodule update --init --recursive mkdir build cd build cmake .. make -j$(nproc)这个编译过程我第一次跑的时候花费了将近40分钟之后每次增量编译会快一些。注意那个--recursive参数很关键QGC依赖一些子模块比如mavlink库和Qt安卓相关的库如果不加这参数后面cmake的时候会报找不到头文件的错。如果你只是想快速安装使用不想编译可以到QGC官网下载现成的安装包Windows适合选.exe安装包Ubuntu选.AppImage。有一点我必须提醒Ubuntu 22.04上跑QGC如果你的显卡驱动是NVIDIA闭源驱动有时会出现OpenGL渲染异常症状是地图区域黑屏或者画面撕裂。解决办法是关闭Qt的硬件加速在启动QGC之前设置环境变量export QGC_DISABLE_GPU_ACCELERATION1 ./qgroundcontrol这个变量不是官方文档里刻意宣传的但是论坛里老玩家基本都知道实测能解决大部分渲染异常的问题。3. 二次开发入门把QGC改造成“你的”地面站3.1 看懂代码结构先从3个目录入手QGC的代码量很大我记得3.x时代源码就有几万行4.x之后又引入了QML大量重构。直接从头到尾读源代码是不现实的我学习时的策略是先抓住三个关键目录src/QmlControls/ QML界面控件 src/Vehicle/ 飞行器核心逻辑MAVLink消息处理 src/Comm/ 通信链路管理src/Vehicle是核心中的核心它管理飞行器的所有状态包括位置、姿态、电池、任务列表、参数读写。你在界面上看到的几乎所有数据最终都是从这个目录下的类模型里读取的。如果你想加一个自定义数据字段大概率要在这里动刀。src/QmlControls是界面层QGC的界面全部是用QML写的QML和C通过注册自定义QML类型来交互。比如你界面上看到的一个按钮、一个仪表盘、一个设置页面都能在QmlControls里找到对应的QML文件。想改界面结构重点看这个目录。src/Comm负责通信链路管理包括串口、TCP、UDP。如果你想接入自定义链路比如加一个私有数传模块需要在这里扩展。初次接触代码我建议先做一件事编译通过之后把软件打开连上模拟器QGC自带一个“模拟器连接”功能可以模拟MAVLink通信不需要真机然后用QtCreator的调试模式设置断点去看数据流是怎么从MAVLink报文变成界面上的数字的。这个过程比看任何文档都直观。3.2 插件系统和自定义面板的实战操作QGC的界面定制有两种思路。一种是小改动通过QML文件直接修改比如改Logo、改窗口标题、调整布局。另一种是插件化通过FactSystem和自定义Fact来扩展。我讲一个实际案例我之前给某电力巡检团队做过一套定制地面站客户要求在主界面上增加一个“航线覆盖率”的实时显示。这个功能如果放在标准QGC里需要自己写计算逻辑。实现路径是这样的第一步在C里定义一个自定义Factclass CoverageCalculator : public QObject { Q_OBJECT Q_PROPERTY(double coveragePercent READ coveragePercent NOTIFY coveragePercentChanged) public: double coveragePercent() const { return m_coveragePercent; } signals: void coveragePercentChanged(); public slots: void calculateCoverage(); private: double m_coveragePercent 0.0; };第二步在QML里注册这个类型并在界面上使用import QtQuick 2.15 import QGroundControl.Controls 1.0 QGCButton { text: 计算覆盖率 onClicked: coverageCalc.calculateCoverage() }第三步是在主界面qml里添加这个控件并绑定数据。这个过程不复杂但涉及到QGC的两个核心设计Fact机制和QML类型注册。QGC内部有一套将C数据模型发布到QML层的机制你在界面上看到的每一个参数比如电池电压、飞行模式都对应一个Fact对象。理解了这个机制你就能往界面上挂任何你想挂的数据了。3.3 定制MAVLink消息处理一个必须绕过的坑作为行业开发者你迟早会遇到需要自定义MAVLink消息的场景。QGC里MAVLink消息的处理是这个链路串口/TCP/UDP收到字节流 - 解析MAVLink帧 - 分发到Vehicle - 更新Fact对象 - QML界面刷新如果你想新增一种MAVLink消息比如自定义的载荷状态需要在src/MAVLink相关的代码里注册新的消息类型然后在Vehicle里添加对应的处理函数。有个很典型的坑是QGC使用的MAVLink消息定义是官方mavlink库的某个固定版本你不能直接把自己机器上生成的mavlink消息代码塞进去因为消息ID可能冲突或者库里已经定义但QGC没处理。正确做法是修改mavlink子模块中对应的定义文件然后重新生成代码。这个操作需要用到mavgen工具不支持的话很容易在编译时卡住。另一个实用技巧如果你想快速看MAVLink报文不用自己写代码。QGC自带MAVLink分析器在“工具栏 - Widgets - MAVLink Inspector”里能实时看到所有收发消息的原始数据。初学二次开发我建议多花时间在这个工具上把常见消息的字段看熟比如HEARTBEAT、GPS_RAW_INT、ATTITUDE后面写代码会顺手很多。4. 常见编译问题与排查技巧实录4.1 编译阶段的问题QGC编译失败的原因五花八门我把这两年里遇到最多的几个整理成了一张速查表常见报错根本原因解决办法GLIBCXX_3.4.29 not found系统GCC版本过旧升级编译器或使用Ubuntu 22.04Could not find Qt6Qml缺少Qt6 QML模块安装qt6-declarative-devSubmodule qmlcontrols not updated子模块未同步执行git submodule update --init --recursiveerror: Poco/JSON.h: No such file缺少POCO依赖sudo apt-get install libpoco-devQt5 vs Qt6 冲突系统里同时装了Qt5和Qt6清理Qt5或在cmake时显式指定Qt6路径编译的时候还有一个小技巧QGC官方默认使用ccache来加速重复编译如果你改了源码之后每次重新编译都很慢检查一下ccache是否启用。没有的话sudo apt-get install ccache然后在cmake时加-DCMAKE_CXX_COMPILER_LAUNCHERccache后面编译会快很多。4.2 运行阶段的问题编译通过之后运行又会出现另一批问题。第一个高发问题是连接不上飞控。QGC连接不上飞控排查路径要按这个顺序来先确认USB串口权限很多Linux用户卡在这。执行sudo usermod -a -G dialout $USER然后注销重新登录。如果还不行再查看设备是否被识别ls /dev/ttyUSB*或ls /dev/ttyACM*有输出说明设备正常。接着确认串口波特率QGC一般用115200但有些飞控固件默认57600要两边对齐。最后再检查数据线是不是纯充电线这个问题听着低级但真的很多人中招充电线完全无法通信。第二个高发问题是地图加载不出来。QGC默认使用OpenStreetMap等在线地图源如果网络环境不佳地图就会空白。解决办法是在设置里切换地图源比如换用ArcGIS或者自定义瓦片服务器。在应用设置 - 一般设置 - 地图提供商里调整。第三个高发问题是视窗里飞行器状态显示NaNNot a Number。这个通常是飞控的传感器数据异常导致的和QGC本身关系不大。但有一种情况是QGC的坐标系转换出错常见于飞控固件版本和QGC版本不匹配。官方推荐的组合是QGC尽可能升级到最新版因为旧版本QGC往往无法适配新版本PX4固件的消息格式变化。4.3 连接稳定性和性能调整QGC连接不稳定的表现是日志里频繁出现link loss飞行器状态卡死几秒钟又恢复。如果你的数传模块没有问题大概率是QGC的通信超时参数没配好。在设置里找到MAVLink选项调大超时时间默认是1秒或者调小重传频率可以减少虚报链路丢失的情况。还有一次我遇到一个棘手的情况无人机飞远了之后QGC经常断线重连排查了很久最后发现是数传透传模块的缓冲区太小长时间运行后因为串口阻塞导致数据丢失。这不是QGC的bug但QGC提供了一些诊断工具——在MAVLink Inspector里看消息序号是否跳变如果序号不连续就说明有丢包这招对于排查链路质量问题非常有效。QGC对计算机性能的要求不算太高但如果你在做长时间航测任务建议用台式机或者性能较好的笔记本。我自己的经验是开着QGC同时开地图缓存、日志记录再加一个视频串流内存占用能到2-3GB如果机器配置比较老内存不够会导致地图刷新卡顿严重时甚至崩溃。可以提前在设置里限制日志记录时间长度或者关掉视频流预览省一部分资源。5. 学习路径建议与资料利用思路5.1 拿到资料包后怎么按顺序学如果你手里也有一份“QGC学习资料”之类的压缩包里面的东西通常包括官方文档、开发教程、源码工程、编译工具链等。我的建议是不要贪多按照这个顺序学第一步先用现成的安装包把QGC跑起来连一次模拟器完整体验一遍航线规划、起飞降落、参数设置这些基础操作。这一步的目标是建立整体感知知道QGC长什么样、能干什么。第二步把源码下载下来编译通过。这个过程可能会遇到不少问题按照上面我列的排查表格对照解决这个过程本身就是一次很好的学习。第三步选择一个你最关心的模块小范围修改。比如把主界面左上角的Logo改成自己的或者加一个显示自定义信息的状态栏。这是你第一次亲手改动一个大型开源项目跑通了基本就算是入门了。第四步深入一个功能链路。比如追踪一个“读取电池电压”的消息从飞控到界面的全过程把链路里的每个类都看一遍。跟着这个链路走完你对QGC架构的理解比看十篇架构分析文章都扎实。5.2 我踩过的坑分享一下我最早接触QGC时犯过一个错误一直在纠结于把界面翻译成中文花了很多时间去找汉化包、翻译文件。后来发现对开发来说这完全没有必要QGC的核心操作和项目逻辑其实就那些中英文界面不影响理解。如果确实需要汉化官方其实有翻译工具但翻译质量参差不齐自己维护一套又很费精力不如直接适应英文界面。还有一个经验是关于日志的。QGC的日志功能非常强大在应用设置 - 日志里可以打开详细日志输出包括MAVLink消息日志、地面站事件日志、飞控遥测日志。开发调试的时候日志一定要开特别是MAVLink消息日志能记录所有二进制报文。后来我遇到问题第一件事就是抓日志比看屏幕上的报错弹窗有用得多。最后说一个小技巧QGC的源码里有很多注释和文档字符串质量非常高有些关键模块的注释甚至比官方Wiki还详细。阅读源码的时候不要只顾着看代码逻辑认真读注释经常能发现作者对设计思路的说明这对于理解一些反直觉的代码非常有帮助。学习QGC是一个长期的过程它不是那种看一遍文档就能上手的东西需要反复编译、运行、调试踩坑才能形成自己的理解。但只要你愿意花时间这个平台的能力上限非常高从个人飞控调试到商业化地面站定制它都能撑得起来。希望这篇文章能给你省下一些时间和精力。本文还有配套的精品资源点击获取