2. 开发环境搭建:Qt/C++环境配置、交叉编译工具链、模拟器与仿真环境搭建
说实话,地面站开发最让人头疼的往往不是代码本身,而是环境搭建。我见过太多新手,代码写得挺好,结果卡在环境配置上,一卡就是两三天。这一章,我就把这几年的实战经验掰开揉碎,带你一步步搞定。
2.1 Qt/C++ 开发环境配置
Qt 版本怎么选?我个人习惯用 Qt 5.15 LTS。为什么?因为 Qt 6 虽然新,但有些老模块还没完全稳定。地面站这种对稳定性要求极高的项目,没必要追新。
2.1.1 Windows 环境配置
步骤其实很简单,但有几个坑我得提前说:
- 下载安装包:去 Qt 官网下载在线安装器,选择 qt-opensource-windows-x86-5.15.2.exe
- 组件选择:记得勾选 MSVC 2019 64-bit 和 MinGW 8.1.0 32-bit。我建议两个都装,因为有时候交叉编译需要不同工具链
- 环境变量:安装完后,把 Qt 的 bin 目录加到 PATH 里。比如:
C:\Qt\5.15.2\msvc2019_64\bin
2.1.2 Linux 环境配置
Linux 下就简单多了。Ubuntu 20.04 为例:
sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install qt5-default
sudo apt-get install qtcreator
sudo apt-get install libqt5charts5-dev
sudo apt-get install libqt5serialport5-dev
嗯,这里要注意:有些发行版默认不带 Qt Charts,你得手动装。我当年在 CentOS 上折腾了一下午,就是因为没装这个库。
2.2 交叉编译工具链配置
地面站最终要跑在嵌入式设备上,比如树莓派、RK3588 之类的开发板。这时候就需要交叉编译了。说白了,就是在你的 PC 上编译出能在 ARM 架构上运行的二进制文件。
2.2.1 工具链选择
| 目标平台 | 工具链 | 备注 |
|---|---|---|
| ARM Cortex-A7 | arm-linux-gnueabihf | 32位,常用于低端飞控 |
| ARM Cortex-A72 | aarch64-linux-gnu | 64位,树莓派4B/5B |
| RISC-V | riscv64-linux-gnu | 新兴架构,逐渐普及 |
2.2.2 配置步骤
以树莓派 4B 为例,我常用的工具链是 Linaro 的:
# 下载工具链
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
# 解压到 /opt
sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C /opt/
# 配置环境变量
export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin
export CROSS_COMPILE=aarch64-linux-gnu-
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
~/.bashrc 里,这样每次打开终端就不用重新设了。但要注意,不同项目可能用不同工具链,所以最好在项目目录下建一个 setenv.sh 脚本,用 source 命令加载。
2.3 模拟器与仿真环境搭建
没有硬件怎么办?模拟器就是你的救星。地面站开发中,我至少 70% 的调试工作是在模拟器上完成的。为什么?因为真机调试太慢了,每次烧录都要等好几分钟。
2.3.1 QEMU 模拟器
QEMU 是最常用的模拟器。它不仅能模拟 CPU,还能模拟整个开发板。我常用它来跑 ARM 架构的 Linux 系统:
# 安装 QEMU
sudo apt-get install qemu-system-arm
# 下载树莓派内核
wget https://github.com/dhruvvyas90/qemu-rpi-kernel/raw/master/kernel-qemu-4.19.50-buster
# 启动模拟器
qemu-system-arm \
-kernel kernel-qemu-4.19.50-buster \
-cpu arm1176 \
-m 256 \
-M versatilepb \
-serial stdio \
-append "root=/dev/sda2 rootfstype=ext4 rw" \
-hda 2020-02-13-raspbian-buster.img
你看,这样就能在 PC 上跑一个完整的树莓派系统了。地面站的串口通信、网络通信,全都能在模拟器里调试。
2.3.2 Gazebo 仿真环境
如果你做的是无人机地面站,那 Gazebo 是绕不开的。它和 ROS 配合,能模拟真实的飞行物理:
# 安装 Gazebo
sudo apt-get install gazebo9
sudo apt-get install libgazebo9-dev
# 安装 ROS 与 Gazebo 接口
sudo apt-get install ros-melodic-gazebo-ros-pkgs
sudo apt-get install ros-melodic-gazebo-ros-control
2.3.3 硬件在环仿真(HIL)
这是最接近真实情况的仿真方式。你把地面站软件跑在 PC 上,通过串口或网口连接一个真实的飞控硬件(比如 Pixhawk),飞控再通过 USB 连接一个仿真计算机。这样,地面站发出的指令会真实地传给飞控,飞控的响应也会反馈回来。
配置 HIL 的关键点:
- 串口波特率:地面站和飞控之间通常用 115200 或 57600
- MAVLink 协议:确保地面站和飞控使用相同版本的 MAVLink
- 时间同步:HIL 模式下,仿真时间必须和真实时间同步,否则会出现奇怪的 bug
sudo chrt -f 99 ./simulation
2.4 环境验证
环境搭好了,怎么知道对不对?写个简单的测试程序:
#include <QApplication>
#include <QMainWindow>
#include <QSerialPort>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 测试串口
QSerialPort serial;
serial.setPortName("ttyUSB0");
serial.setBaudRate(QSerialPort::Baud115200);
if (serial.open(QIODevice::ReadWrite)) {
qDebug() << "串口打开成功";
serial.close();
} else {
qDebug() << "串口打开失败";
}
// 测试窗口
QMainWindow window;
window.setWindowTitle("地面站环境测试");
window.resize(800, 600);
window.show();
return app.exec();
}
编译命令:
# 本地编译
g++ -o test_env test_env.cpp -I/usr/include/qt5 -lQt5Core -lQt5Widgets -lQt5SerialPort
# 交叉编译(以树莓派为例)
aarch64-linux-gnu-g++ -o test_env_arm test_env.cpp \
-I/opt/qt5.15.2-arm/include \
-L/opt/qt5.15.2-arm/lib \
-lQt5Core -lQt5Widgets -lQt5SerialPort
如果编译通过,运行后能看到窗口,串口也能正常打开,那恭喜你,环境搭建成功了。
setup_env.sh,里面包含了所有依赖和配置,换过三台电脑了,每次都是几分钟搞定。
本章小结: 环境搭建是地面站开发的第一步,也是最容易踩坑的一步。Qt 环境要选对版本,交叉编译要配好工具链,模拟器能帮你省下大量真机调试时间。把这套流程跑通,后面的开发就会顺畅很多。