一、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 的功能很多,但核心就这几块。我按使用频率排了个序:

  1. 飞行数据显示——高度、速度、姿态、电池、GPS 状态,所有关键参数实时刷新。这是地面站最基础的功能。
  2. 任务规划——在地图上点几个航点,设置动作,生成航线,上传给飞控。QGC 的任务规划器做得相当成熟。
  3. 参数调参——PID 参数、传感器校准、飞行模式设置,所有飞控参数都可以在这里改。
  4. 日志分析——飞行结束后下载 .bin 或 .ulog 文件,回放分析问题。
  5. 视频流显示——支持 RTSP、UDP、TCP 等多种视频源,可以叠加 OSD 信息。
  6. 多飞行器管理——v4.x 之后支持同时连接多架无人机,切换控制。

嗯,这里要注意一点:QGC 本身不包含飞控算法。它只负责地面端的人机交互和数据链路管理。飞控上的姿态解算、导航控制,那是 PX4 或 ArduPilot 的事。

1.4 QGC 的适用场景

我这些年接触过的 QGC 应用场景,大致可以分成三类:

场景类型 典型用户 使用方式
科研教育 高校实验室、无人机爱好者 直接使用原版,或轻度定制 UI
行业应用 测绘、巡检、农业公司 深度二次开发,集成业务逻辑
产品集成 无人机整机厂商 OEM 定制,品牌化改造

举个例子,我在做电力巡检项目时,客户要求地面站能自动识别杆塔坐标并生成航线。原版 QGC 没有这个功能,我们就基于它的任务规划模块做了二次开发,加了一个「杆塔识别」插件。这就是典型的行业应用场景。

避坑提醒:如果你打算把 QGC 集成到自己的产品里,一定要提前评估它的许可协议。Apache 2.0 是商业友好的,但如果你修改了代码并分发,需要保留原版权声明。我曾经见过有人直接把 QGC 改个 Logo 就卖,结果被社区点名——这不只是道德问题,是法律风险。

1.5 QGC 整体架构速览

为了让你对 QGC 有个全局印象,我画了一张架构图。这张图会贯穿我们整个课程,后面每一章都会对应到图上的某个模块。

QGC 整体架构图 用户界面层 (QML + Qt Quick) 飞行仪表 | 地图控件 | 任务规划面板 | 参数编辑器 | 设置页面 视频显示 | 日志查看器 | 多飞行器管理 业务逻辑层 (C++ / QML 混合) MAVLink 协议解析 | 飞行状态机 | 任务管理器 | 参数管理 地理围栏 | 日志管理 | 视频流处理 | 插件系统 通信层 (C++) 串口通信 | UDP/TCP 链路 | MAVLink 编解码 | 链路管理 PX4 / ArduPilot 飞控硬件 本课程覆盖范围

这张图你看懂了吗?从上到下依次是:

  • 用户界面层——你看到的所有界面元素,都是 QML 写的。二次开发最常改的就是这一层。
  • 业务逻辑层——核心功能实现,C++ 和 QML 混合编程。这是二次开发的难点。
  • 通信层——跟飞控打交道的地方,MAVLink 协议是核心。
  • 硬件/飞控层——QGC 不直接控制硬件,它通过 MAVLink 跟飞控通信。

后面每一章,我们都会深入拆解其中一个模块。你先把这张图记在脑子里,后面学起来会轻松很多。

一个小技巧:刚开始看 QGC 源码时,别从 main.cpp 开始读。先打开 QML 目录,看看界面是怎么组织的。界面结构清楚了,再往下追 C++ 逻辑。我当年就是反着来的,结果在 C++ 的类继承关系里绕了三天。