第二章:开发环境搭建

说实话,很多学飞控的朋友,第一关就卡在环境搭建上。

源码下载下来编译不过,仿真跑不起来,连个日志都看不到。我当年刚入行时也踩过不少坑,有一次折腾了整整两天,最后发现是交叉编译工具链版本不对。嗯,今天咱们就把这事彻底理清楚。

2.1 源码获取:PX4 和 ArduPilot

先说说源码从哪来。这两个项目都托管在 GitHub 上,我建议你直接用 git clone,别去下载 zip 包。为什么?因为后续你要切换分支、拉取更新,git 操作会方便得多。

PX4 源码获取:

git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
git checkout v1.14.0  # 我习惯用稳定版

ArduPilot 源码获取:

git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot
git checkout Copter-4.5.0  # 稳定版分支
git submodule update --init --recursive

这里有个细节——--recursive 参数。这两个项目都依赖很多子模块,不加这个参数,你编译时会发现一堆头文件找不到。我曾经因为这个卡了半小时,后来才发现是子模块没拉全。

2.2 交叉编译工具链安装

说白了,交叉编译就是在 PC 上编译出能在飞控板(比如 STM32)上运行的代码。你的电脑是 x86 架构,飞控板是 ARM 架构,编译器得知道怎么生成 ARM 指令。

2.2.1 PX4 的工具链

PX4 官方推荐用他们自己的脚本,一键安装。我个人觉得这方式最省心:

cd PX4-Autopilot
make px4_sitl  # 这会自动检测并安装缺失的工具链

如果你想手动装,也可以:

# Ubuntu 20.04/22.04
sudo apt-get install gcc-arm-none-eabi gdb-multiarch
# 验证版本
arm-none-eabi-gcc --version

嗯,这里要注意版本。PX4 v1.14 要求 GCC 版本不低于 10.3。我遇到过有人装了 9.x 版本,编译报一堆莫名其妙的错误,其实就是编译器太老了。

2.2.2 ArduPilot 的工具链

ArduPilot 稍微复杂点,它支持多种飞控板。以 Pixhawk 系列为例:

# 安装基础工具
sudo apt-get install gcc-arm-none-eabi python3-pip
pip3 install pyserial

# 编译测试
cd ardupilot
./waf configure --board Pixhawk1
./waf copter

小技巧:如果你网络不好,可以提前下载好 ARM GCC 工具链的压缩包,解压到 /opt/gcc-arm-none-eabi,然后配置环境变量。我经常这么干,省得每次重装系统都要重新下载。

2.3 仿真环境配置

仿真有多重要?你想想看,没有仿真,每次改代码都要往真机上烧录,炸机了还得换桨叶。我刚开始做飞控时,一周炸了三架飞机,后来老老实实先跑仿真。

2.3.1 Gazebo 仿真

Gazebo 是目前最主流的飞控仿真环境。PX4 和 ArduPilot 都支持它。

安装步骤:

# 安装 Gazebo(Ubuntu 20.04)
sudo apt-get install gazebo11 libgazebo11-dev

# 安装 PX4 的 Gazebo 插件
cd PX4-Autopilot
make px4_sitl gazebo

第一次启动时,Gazebo 会下载一些模型文件,大概几百兆。我建议你提前挂个代理,或者直接去 GitHub 上把 PX4/Firmware 的模型库 clone 下来放到 ~/.gazebo/models 目录下。

注意:Gazebo 对显卡驱动有要求。如果你用的是虚拟机,可能会遇到 OpenGL 渲染问题。我踩过这个坑,最后换成了双系统才解决。

2.3.2 JMavSim 仿真

JMavSim 是另一个选择,它比 Gazebo 轻量很多。说白了,Gazebo 是 3D 物理引擎,JMavSim 更偏向于 2D 可视化。

# 安装 JMavSim
cd PX4-Autopilot
make px4_sitl jmavsim

启动后你会看到一个简单的 3D 场景,一架四旋翼在草坪上。按 Ctrl+T 可以打开终端,输入 commander takeoff 就能看到飞机起飞了。

我个人更喜欢 JMavSim 做快速验证。Gazebo 虽然真实,但启动慢、吃资源。JMavSim 几秒钟就能跑起来,改完代码马上就能看效果。

2.4 核心逻辑:环境搭建的依赖关系

为了让你更直观地理解这些组件之间的关系,我画了一张图:

飞控开发环境搭建核心逻辑 源码获取 PX4 / ArduPilot 交叉编译工具链 ARM GCC / CMake / Python 仿真环境 Gazebo / JMavSim 编译输出 .elf / .bin / .px4 固件文件 真实飞控板 Pixhawk / CUAV / Holybro 仿真运行 SITL 模式 + 可视化 源码 → 编译 → 运行,三者缺一不可

从这张图可以看得很清楚:源码是原材料,工具链是加工厂,仿真环境是测试场。三者缺一不可。

2.5 常见问题与避坑指南

问题1:编译时提示 "arm-none-eabi-gcc: not found"

工具链没装或者没加到 PATH 里。检查一下 /usr/bin/arm-none-eabi-gcc 是否存在。我建议用 which arm-none-eabi-gcc 确认路径。

问题2:Gazebo 启动后黑屏

这通常是显卡驱动问题。试试 export SVGA_VGPU10=0 再启动。如果还不行,检查一下 ~/.gazebo/gui.ini 里的渲染设置。

问题3:JMavSim 连接不上

检查端口号。默认是 14560(UDP)。有时候防火墙会拦截,关掉防火墙试试。我曾经在实验室的电脑上折腾了一下午,最后发现是 IT 部门统一配置的防火墙规则。

2.6 验证环境是否正常

装完了,怎么知道环境没问题?跑一个最简单的仿真测试:

# PX4 SITL 测试
cd PX4-Autopilot
make px4_sitl gazebo

# 等终端出现 "INFO [commander] Ready for takeoff"
# 然后在 QGroundControl 里应该能看到飞机

如果你看到 QGC 的地图上出现了一架四旋翼,恭喜你,环境搭建成功了。

嗯,这一步走通了,后面的事情就好办了。下一节咱们会真正开始写代码,从最基础的姿态解算讲起。


公众号:蓝海资料掘金营,微信deep3321