3. 项目总览:QGC源码目录结构、核心模块划分、构建系统解析、依赖库说明

好,咱们直接进入正题。这一章我会带你从高空俯瞰整个QGC项目。说白了,就是先搞清楚“东西在哪儿”、“谁负责什么”、“怎么把它跑起来”。

我记得刚接手QGC二次开发那会儿,打开源码文件夹直接懵了——几百个文件,几十个目录,完全不知道从哪下手。后来花了整整一周,才把骨架摸清楚。今天我把这些经验直接给你,省得你走弯路。

3.1 源码目录结构:别被文件夹吓到

QGC的源码根目录大概长这样。我建议你先记住这几个核心目录:

qgroundcontrol/
├── src/                    # 核心源码
│   ├── QGCApplication.cc   # 应用入口
│   ├── MainRootWindow.cc   # 主窗口
│   ├── FlightDisplay/      # 飞行显示
│   ├── PlanView/           # 航线规划
│   ├── SetupView/          # 飞控设置
│   ├── Vehicle/            # 飞行器抽象
│   ├── MAVLink/            # 通信协议
│   ├── MissionManager/     # 任务管理
│   ├── Settings/           # 应用设置
│   ├── Joystick/           # 摇杆支持
│   └── Utilities/          # 工具类
├── resources/              # 资源文件
├── libs/                   # 第三方库
├── plugins/                # 插件系统
├── tests/                  # 单元测试
├── cmake/                  # CMake配置
└── deploy/                 # 打包部署

嗯,这里要注意:src/ 下面每个子目录,基本就是一个独立的功能模块。你改哪个功能,就进哪个目录,别到处乱翻。

我的习惯: 拿到一个新项目,先看 src/ 下的目录名。名字本身就说明了职责。比如 FlightDisplay/ 就是管飞行界面显示的,MissionManager/ 就是管任务规划的。

3.2 核心模块划分:谁负责什么

我把QGC的核心模块分成5大块。你想想看,一个地面站软件,无非就是:连上飞机、看到数据、下发指令、规划航线、设置参数。对吧?

模块 目录 核心职责
通信层 src/MAVLink/ MAVLink协议解析、串口/UDP/TCP通信
飞行器抽象 src/Vehicle/ 飞行器状态管理、参数读写、指令封装
显示层 src/FlightDisplay/ 地图、仪表盘、视频流、HUD
任务规划 src/MissionManager/ 航点编辑、任务上传下载、地理围栏
设置与校准 src/SetupView/ 飞控参数、传感器校准、电源设置

我在项目中遇到过一个问题:有个同事想改地图显示,结果跑到 Vehicle/ 目录里找代码,找了半天没找到。其实地图相关全在 FlightDisplay/ 下面。模块划分清楚了,找代码就快。

3.3 构建系统解析:CMake是怎么工作的

QGC用的是CMake构建系统。说白了,CMake就是帮你生成Makefile或Visual Studio工程文件的工具。你不需要手动写复杂的编译命令。

根目录下的 CMakeLists.txt 是总入口。它会调用各个子目录的 CMakeLists.txt。我建议你重点关注这几个变量:

# 选择构建目标
set(QGC_USE_ANDROID OFF)   # 是否构建Android版
set(QGC_USE_IOS OFF)       # 是否构建iOS版
set(QGC_USE_WEBENGINE ON)  # 是否使用WebEngine(地图支持)

# 编译选项
set(CMAKE_BUILD_TYPE Debug)  # Debug或Release
set(QGC_ENABLE_TESTING ON)   # 是否启用测试
我曾经踩过的坑: 第一次编译时,我直接用了默认配置,结果地图显示不出来。后来才发现 QGC_USE_WEBENGINE 默认是 OFF,需要手动打开。你如果遇到地图空白,先检查这个选项。

构建命令也很简单。我个人习惯用命令行:

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Debug -DQGC_USE_WEBENGINE=ON
make -j4

Windows用户可以用Qt Creator直接打开 CMakeLists.txt,它会自动解析。嗯,这里要注意:Qt Creator的版本最好和QGC要求的Qt版本一致,否则会有兼容问题。

3.4 依赖库说明:少了谁都不行

QGC依赖了不少第三方库。我把主要的列出来,你心里有个数:

依赖库 用途 说明
Qt 5.15+ UI框架、网络、串口 核心依赖,必须安装
MAVLink 无人机通信协议 QGC自带,在 libs/ 下
libcurl HTTP网络请求 用于地图瓦片下载
libxml2 XML解析 参数文件解析
SDL2 摇杆输入 可选,没有也能编译
OpenGL 3D渲染 用于仪表盘和地图

你想想看,如果没有Qt,整个界面都出不来。没有MAVLink,飞机和地面站就是聋子和哑巴。每个库都有自己的角色。

避坑指南: 我曾经在Ubuntu 20.04上编译,系统自带的Qt版本是5.12,结果编译报错。QGC要求最低5.15。解决办法是手动安装Qt 5.15 LTS版本,或者用Qt官方安装器。

3.5 整体架构图:一张图看懂一切

说了这么多,不如一张图来得直观。下面是我画的QGC整体架构图,把模块关系、数据流向、构建依赖都串起来了。

QGC整体架构图 QGC 整体架构图 用户界面层 (UI Layer) FlightDisplay PlanView SetupView Settings 飞行显示 航线规划 飞控设置 应用设置 业务逻辑层 (Business Logic) VehicleManager MissionManager ParameterManager GeoFenceManager 飞行器管理 任务管理 参数管理 地理围栏 通信层 (Communication Layer) MAVLinkProtocol SerialLink UDPLink TCPLink 协议解析 串口通信 UDP通信 TCP通信 硬件/外部接口层 (Hardware Interface) 飞控硬件 摇杆/遥控器 GPS模块 视频流设备 依赖:Qt 5.15+ / MAVLink / libcurl / SDL2 构建:CMake + Qt Creator / 命令行

这张图我画了四层:用户界面层、业务逻辑层、通信层、硬件接口层。数据从上往下走,指令从下往上回。每一层都只跟相邻层打交道,这就是分层设计的好处——你改显示层,不会影响到通信层。

核心思路: 二次开发时,你大部分时间都在改“用户界面层”和“业务逻辑层”。通信层和硬件接口层基本不动,除非你要加新的通信方式或硬件支持。