一、QGC 概述:从入门到二次开发,你首先得认识它
做 QGC 二次开发,第一步不是急着看代码,而是先搞清楚——QGC 到底是什么。
我刚开始接触这个项目时,也犯过类似的错误。拿到源码就往上冲,结果连地面站的基本定位都没搞明白,改出来的东西自己都觉得别扭。后来花了点时间把 QGC 的来龙去脉捋了一遍,才发现很多设计决策其实都有历史原因。
这一节,我们就从四个角度把 QGC 说透:它是什么、怎么演变的、能干什么、适合用在哪儿。
1.1 QGC 是什么
QGC,全称 QGroundControl,是一个开源的无人机地面站软件。说白了,它就是你在电脑或平板上用来控制无人机的那套界面。
你想想看,无人机在天上飞,你在地面上怎么跟它交互?总不能在机身上装个键盘吧。地面站就是干这个的——通过无线数传链路,把飞行器的状态数据传下来显示,同时把你的指令发上去执行。
QGC 是其中做得最成熟、社区最活跃的一个。它基于 Qt 框架开发,支持 Windows、macOS、iOS、Android 全平台。代码完全开源,遵循 Apache 2.0 协议。
核心定位:QGC 不是某个厂商的专属工具,它是 PX4 和 ArduPilot 两大开源飞控生态的官方推荐地面站。
1.2 QGC 的历史版本
QGC 不是一天建成的。我整理了一下它的主要版本脉络,你看完就知道为什么代码里有些地方看起来「有点老」了。
| 版本阶段 | 时间范围 | 关键变化 |
|---|---|---|
| v1.x / v2.x | 2012 - 2015 | 早期原型,基于 Qt4,功能简单,主要用于 PX4 早期测试 |
| v3.0 - v3.3 | 2016 - 2018 | 全面重写为 Qt5,引入 QML 界面,支持 ArduPilot |
| v4.0 - v4.2 | 2019 - 2021 | 架构大调整,引入 MAVLink 2.0,支持多飞行器管理 |
| v4.3 - v4.4 | 2022 - 2023 | UI 现代化,新增任务规划器重构,支持自定义插件 |
| v4.5+ | 2024 至今 | 持续迭代,重点在稳定性、性能优化和二次开发接口 |
我的建议:如果你现在开始做二次开发,直接基于最新的 v4.5+ 版本。v3.x 的代码结构差异很大,很多接口已经废弃了。我曾经见过有人拿着 v3.2 的教程去改 v4.4 的代码,结果光适配就花了两周。
1.3 QGC 的核心功能
QGC 的功能很多,但核心就这几块。我按使用频率排了个序:
- 飞行数据显示——高度、速度、姿态、电池、GPS 状态,所有关键参数实时刷新。这是地面站最基础的功能。
- 任务规划——在地图上点几个航点,设置动作,生成航线,上传给飞控。QGC 的任务规划器做得相当成熟。
- 参数调参——PID 参数、传感器校准、飞行模式设置,所有飞控参数都可以在这里改。
- 日志分析——飞行结束后下载 .bin 或 .ulog 文件,回放分析问题。
- 视频流显示——支持 RTSP、UDP、TCP 等多种视频源,可以叠加 OSD 信息。
- 多飞行器管理——v4.x 之后支持同时连接多架无人机,切换控制。
嗯,这里要注意一点:QGC 本身不包含飞控算法。它只负责地面端的人机交互和数据链路管理。飞控上的姿态解算、导航控制,那是 PX4 或 ArduPilot 的事。
1.4 QGC 的适用场景
我这些年接触过的 QGC 应用场景,大致可以分成三类:
| 场景类型 | 典型用户 | 使用方式 |
|---|---|---|
| 科研教育 | 高校实验室、无人机爱好者 | 直接使用原版,或轻度定制 UI |
| 行业应用 | 测绘、巡检、农业公司 | 深度二次开发,集成业务逻辑 |
| 产品集成 | 无人机整机厂商 | OEM 定制,品牌化改造 |
举个例子,我在做电力巡检项目时,客户要求地面站能自动识别杆塔坐标并生成航线。原版 QGC 没有这个功能,我们就基于它的任务规划模块做了二次开发,加了一个「杆塔识别」插件。这就是典型的行业应用场景。
避坑提醒:如果你打算把 QGC 集成到自己的产品里,一定要提前评估它的许可协议。Apache 2.0 是商业友好的,但如果你修改了代码并分发,需要保留原版权声明。我曾经见过有人直接把 QGC 改个 Logo 就卖,结果被社区点名——这不只是道德问题,是法律风险。
1.5 QGC 整体架构速览
为了让你对 QGC 有个全局印象,我画了一张架构图。这张图会贯穿我们整个课程,后面每一章都会对应到图上的某个模块。
这张图你看懂了吗?从上到下依次是:
- 用户界面层——你看到的所有界面元素,都是 QML 写的。二次开发最常改的就是这一层。
- 业务逻辑层——核心功能实现,C++ 和 QML 混合编程。这是二次开发的难点。
- 通信层——跟飞控打交道的地方,MAVLink 协议是核心。
- 硬件/飞控层——QGC 不直接控制硬件,它通过 MAVLink 跟飞控通信。
后面每一章,我们都会深入拆解其中一个模块。你先把这张图记在脑子里,后面学起来会轻松很多。
一个小技巧:刚开始看 QGC 源码时,别从 main.cpp 开始读。先打开 QML 目录,看看界面是怎么组织的。界面结构清楚了,再往下追 C++ 逻辑。我当年就是反着来的,结果在 C++ 的类继承关系里绕了三天。