ESP32也能造无人机:Flix详细教程
一套能从裸板、仿真一路做到真机试飞的 ESP32 四旋翼项目。这里把适合谁、硬件清单、烧录、校准、无桨检查和首次试飞一次讲清。

成品无人机负责飞,Flix 负责把“为什么能飞”摊开给你看。
这是一套基于 ESP32 的四旋翼项目。飞控固件采用 Arduino 风格,主循环约 1000Hz,里面有 IMU 读取、姿态估计、级联 PID 、电机混控、 MAVLink 遥测和失控保护。手机、 USB 手柄、 SBUS 遥控器都能控制,QGroundControl 可以看姿态和改参数,Gazebo 还能先在电脑里试飞。
它有一定门槛:要写固件、焊 MOSFET 、检查电机方向、校准 IMU,还要处理锂电池和高速旋翼。想买一台开箱即飞的航拍机,可以直接跳过。想把飞控拆开学明白,这套项目很合适。
哪些人适合试
比较适合:
- 学过一点 Arduino 或 ESP32,想继续碰机器人、嵌入式和控制算法的人;
- 正在学 IMU 、姿态解算、四元数、 PID 、 MAVLink 的学生;
- 有电烙铁、万用表和 3D 打印条件的创客;
- 想给课程、创客营做一套可拆解无人机实验的老师;
- 计划用 Python 读取遥测、改参数或做自动飞行实验的人。
暂时不适合:
- 只想开箱起飞,不想调试硬件的人;
- 需要 GPS 定点、自动航线、成熟位置控制或商业级可靠性的人;
- 没有锂电池和旋翼安全经验,又准备独自操作的低龄用户;
- 希望直接下载编译好的固件包的人。当前 v1.5 Release 只有源码包,需要自行编译。
别急着买齐零件,先走三条试用路径

最低成本的办法是一块裸 ESP32 。 Flix 允许在没有 IMU 和电机的板子上烧录,启动后应出现名为 flix 的 Wi-Fi,命令行和 QGroundControl 基础连接也能测试。
第二条路是 Gazebo 11 仿真。官方推荐 Ubuntu 20.04,适合先理解飞行模式、摇杆输入和参数变化。较新的 macOS 对这套旧版 Gazebo 支持不理想。
第三条路才是完整硬件,而且先拆桨检查。这样能把 USB 驱动、编译环境、 Wi-Fi 、 IMU 和电机问题分开处理,排错省很多时间。
准备哪些硬件

一套常见组合包括:
- ESP32 Mini 、 ESP32-S3 或 ESP32-C3 开发板 1 块;
- GY-91(MPU-9250/6500)、 ICM-20948 或 GY-521(MPU-6050)IMU 1 块;
- 8520 、 3.7V 有刷电机 4 个;
- 55mm 或 65mm 螺旋桨 4 片;
- UMW 100N03A MOSFET 4 个、 10kΩ 电阻 6 个;
- 3.7V Li-Po 电池,建议至少 25C,并核对实际持续放电电流;
- 28AWG 导线、 MX2.0 2P 插头、充电器和螺丝;
- 3D 打印机架、 ESP32 固定座和 IMU 垫片。
工具至少要有电烙铁、焊锡、助焊剂、万用表和螺丝刀。 ICM-20948 等模块只能接 3.3V 时,别接到 5V/VIN 。电机要买准确标称 3.7V 的型号,轴径也要和桨孔匹配。
详细教程:从烧录到首次试飞
第一步:下载源码
git clone https://github.com/okalachev/flix.git
cd flix
想复现本次教程,可锁定到核验时的提交:
git checkout d64bf24c6d1b18e7b9ef7093c395ac176568118c
也可以下载 v1.5 源码 ZIP 。 Release 页面没有可直接烧录的 .bin。
第二步:配置 Arduino IDE
- 安装 Arduino IDE 2;
- 安装 ESP32 Arduino Core
3.3.10; - 在 Library Manager 安装最新版
FlixPeriph; - 安装
MAVLink 2.0.25; - 打开
flix/flix.ino; - ESP32 Mini 选择
WEMOS D1 MINI ESP32; Tools → Core Debug Level选Error;- ESP32-S3/C3 把
USB CDC on Boot设为Enabled; - 选择串口并上传。
喜欢命令行也可以直接运行:
make
make upload
make upload monitor
ESP32-S3 示例:
make BOARD=esp32:esp32:esp32s3:DebugLevel=error,FlashSize=4M,CDCOnBoot=cdc upload
第三步:先做裸板验证
烧录后打开串口监视器,波特率设为 115200,输入:
help
能看到命令列表,并能搜到 flix Wi-Fi,说明编译、 USB 和无线部分已经跑起来。默认 Wi-Fi 密码是:
flixwifi
装好后应修改默认 SSID 和密码:
ap my-flix-ssid mypassword123
p WIFI_MODE 1
参数在重启后生效。
第四步:打印机架并焊接
官方仓库提供主机架 STL/STEP 、 ESP32 固定座和 IMU 垫片。主机架建议用 0.2mm 层高、 0.4mm 线宽和 100% 填充。默认孔位更适合 GY-91,换其他 IMU 时可能要改孔位。

ESP32 Mini 与 IMU 的常用 SPI 接线:
- GND → GND
- 3.3V → 3.3V
- SCL/SCK → GPIO18
- SDA/MOSI → GPIO23
- SAO/MISO → GPIO19
- NCS → GPIO5
四路电机通过 MOSFET 驱动,默认 GPIO 为:后左 12、后右 13、前右 14、前左 15。每路 MOSFET 要配下拉电阻。

仓库的早期装配照片使用过一套反向电机方案。机械结构可以照着看,电机位置、转向和桨型请以当前接线表及 motors.svg 为准。
第五步:选对 IMU 型号
打开 flix/imu.ino。默认配置是:
MPU9250 imu(SPI);
ICM-20948 改为:
ICM20948 imu(SPI);
MPU-6050 改为:
MPU6050 imu(Wire);
改完重新编译上传。
第六步:连接 QGroundControl
- 给无人机上电;
- 电脑或手机连接
flixWi-Fi; - 启动 QGroundControl;
- 软件应自动显示姿态和遥测。

无线命令行入口:
Vehicle Setup → Analyze Tools → MAVLink Console
如果一直连不上,检查防火墙或 VPN 有没有拦截通信。
第七步:设置 IMU 朝向并校准
QGroundControl 参数页里有三个方向参数:
IMU_ROT_ROLL
IMU_ROT_PITCH
IMU_ROT_YAW
默认值为:
0
0
1.571
IMU 的实际安装方向不同,参数也要跟着调整。进入控制台运行:
ca
按提示依次把机身水平、机头朝上、机头朝下、右侧卧、左侧卧和倒置,每个姿态保持约 8 秒。
第八步:拆桨检查 IMU
首次检查前先拆掉四片桨。控制台输入:
imu
正常情况包括:status: OK,采样率接近 1000Hz;移动机身时 accel、gyro 会变化;静止放置时 landed = 1,拿起后变成 0。
第九步:用电池检查四个电机
USB 供电带不动电机,电机测试要接电池,同时保持无桨状态。分别输入:
mfr
mfl
mrl
mrr
它们对应前右、前左、后左、后右。逐个确认位置和旋转方向。若位置或方向不对,先修接线,别用软件参数硬顶。
第十步:配置遥控方式
手机最省事:QGroundControl 里启用 Virtual Joystick,关闭 Auto-Center Throttle。操纵过于灵敏时,可适当降低:
CTL_TILT_MAX
USB 手柄需要在 Vehicle Setup → Joystick 完成校准。 SBUS 接收机可以先设置接收 GPIO,再看通道并校准:
p RC_RX_PIN 4
rc
cr
第十一步:低高度首次试飞
装桨前再核对四个电机的位置、方向和 A/B 桨型。第一次选择开阔、无人、没有易碎物的场地,戴护目镜,先用很小油门做低高度测试。
默认摇杆布局:左摇杆控制油门和偏航,右摇杆控制俯仰和横滚。左摇杆推到右下角解锁,推到左下角上锁。
默认 STAB 只稳定姿态,不保持位置,轻微漂移需要手动修正。RAW 主要用于测试,正常飞行很难控制。AUTO 可能在有推力指令时自动解锁,写 Python 自动控制前先在仿真和无桨状态验证。
还没焊硬件,可以先跑仿真

官方 Gazebo 路径适合学习控制流程。 Ubuntu 20.04 上准备 Gazebo 11 、 CMake 、编译工具和 SDL2,再按 gazebo/README.md 构建。仿真会复用 Arduino 固件逻辑,手柄输入、飞行模式和参数调整都可以练。
Python 侧安装 pyflix:
pip install pyflix
读取遥测和执行命令:
from pyflix import Flix
flix = Flix()
print(flix.connected)
print(flix.attitude_euler)
print(flix.voltage)
print(flix.cli("imu"))

自动姿态控制示例:
flix.set_mode("AUTO")
flix.set_attitude([0.1, 0.2, 0.3], 0.6)
flix.set_attitude([0, 0, 0], 0)
最后一行把推力归零。真机上执行前,先确认失控保护、遥控接管和场地安全。
这几个限制要提前知道
- 位置控制仍在计划中,
set_position和set_velocity目前不可用; - 默认飞行日志存在 RAM,约 100Hz 、约 10 秒,断电后不能当长期黑匣子;
- Flix2 PCB 仍在开发;v1.5 的板载 IMU 没有正常工作,实际测试使用了外接 MPU-6050;
- 固件主循环是单线程,飞行命令里调用阻塞式
delay()可能导致坠机; - 仓库 README 将项目标为开源,但根目录当前没有
LICENSE或COPYING。引用图片和代码时保留来源,商业使用前最好联系项目维护者确认授权。
Flix 的乐趣在调试过程:先让一块 ESP32 出现 Wi-Fi,再看到 QGroundControl 的姿态跟着机身动,接着逐个电机转起来。做到这一步,飞控已经从黑盒变成了一串能测、能改、能解释的步骤。
你会先走裸板、 Gazebo 仿真,还是直接焊一台真机?