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,飞机和地面站就是聋子和哑巴。每个库都有自己的角色。
3.5 整体架构图:一张图看懂一切
说了这么多,不如一张图来得直观。下面是我画的QGC整体架构图,把模块关系、数据流向、构建依赖都串起来了。
这张图我画了四层:用户界面层、业务逻辑层、通信层、硬件接口层。数据从上往下走,指令从下往上回。每一层都只跟相邻层打交道,这就是分层设计的好处——你改显示层,不会影响到通信层。