百元、4个电机、1块WiFi芯片:自制四旋翼能真正飞起来吗?
【免费下载链接】esp-droneMini Drone/Quadcopter Firmware for ESP32 and ESP32-S Series SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-drone
如果你接到过这样的任务——做一架能自稳悬停的小型四旋翼,预算卡在200元以内,还要能用手机控制——那么 ESP-Drone 值得放进你的候选清单。它是乐鑫为 ESP32 / ESP32-S2 / ESP32-S3 系列 SoC 编写的开源无人机飞控固件,核心控制代码移植自 Bitcraze 的 Crazyflie 开源飞控,整架飞机通过 Wi-Fi 与手机 APP、PC 上位机或游戏手柄交互。你不需要从零写控制回路:硬件按图纸焊好、固件烧进去,通电当天就能实现姿态自稳。
这篇文章按一条可复现的路径展开:先说清楚为什么选它,再带着你完成编译烧录,然后逐段读懂 1kHz 稳定器主循环,最后给出物料清单和已知边界。
选型理由:百元硬件里装下了哪套完整飞控栈
选飞控方案时,真正决定体验的往往不是芯片型号,而是"控制链是否闭环"。ESP-Drone 的价值在于它把三层东西打包进了一个仓库:
- 底层驱动层:components/drivers/ 下按总线组织了所有外设——I2C 的 MPU6050、MS5611、HMC5883L,SPI 的 PMW3901 光流模块,以及电机、LED、ADC 等通用驱动。
- 飞控核心层:components/core/crazyflie/ 是移植自 Crazyflie 的算法主体,估计器、控制器、CRTP 通信协议、参数服务全部就绪。
- 应用接入层:Wi-Fi 链路、手机 APP 协议解析、手柄控制(ESP-NOW)直接可用。
这种分层带来的直接效果是:想换传感器就动drivers,想改控制律就动core,两层互不牵连。对教学或二次开发来说,这比"能飞但读不懂"的成品方案重要得多。
编译命令:git clone 到 flash monitor 只需三步
开发环境的关键约束是版本:README 明确要求使用ESP-IDF release/v5.0 分支,仓库根目录的 sdkconfig.defaults.esp32s2 已预置 S2 平台的默认配置。
# 1. 获取仓库 git clone https://gitcode.com/GitHub_Trending/es/esp-drone cd esp-drone # 2. 指定目标芯片(按你的板子选 esp32s2 或 esp32s3) idf.py set-target esp32s2 # 3. 编译、烧录并进入串口监视 idf.py build idf.py flash monitor烧录完成后,入口逻辑非常简单:main/main.c 里的app_main()先初始化 NVS(为 Wi-Fi 存配置),再调用platformInit()完成硬件探测,最后systemLaunch()拉起整套 FreeRTOS 任务。如果固件跑在不匹配的硬件上,platformInit()会直接卡死——这其实是个友好的自检设计。
stabilizer.c 主循环拆解:每 1 毫秒发生了什么
飞控的心脏是稳定器任务,位于 components/core/crazyflie/modules/src/stabilizer.c。它等待传感器校准完成后进入 1kHz 死循环,每一圈严格按固定顺序执行:
| 循环步骤 | 做什么 | 关键函数 |
|---|---|---|
| ① 等采样 | 等 1kHz 的 IMU 数据就绪 | sensorsWaitDataReady() |
| ② 状态估计 | 融合出姿态/速度/位置 | stateEstimator() |
| ③ 取指令 | 读取 APP/手柄发来的设定值 | commanderGetSetpoint() |
| ④ 起降辅助 | 按状态修正设定值(如自动起飞曲线) | sitAwUpdateSetpoint() |
| ⑤ 控制律 | 由状态与设定值算出期望推力/角速度 | controller() |
| ⑥ 配电决策 | 未解锁则断电机,解锁则输出 PWM | powerDistribution()/powerStop() |
两个值得注意的工程细节:第一,估计器和控制器都可以在运行中热切换(循环内getStateEstimator()/getControllerType()与当前实例比对,不同就重初始化),这意味着你改参数不用重新烧录;第二,急停与解锁状态在第 ⑥ 步统一仲裁,安全逻辑收敛在最后一道闸口。
姿态估计二选一:互补滤波器还是扩展卡尔曼滤波器
估计器回答的问题是"我现在处于什么姿态、什么位置"。仓库内置两套:
- 互补滤波(estimator_complementary.c):用一阶低通思路把加速度计和陀螺仪的互补特性结合起来。资源占用极低、响应快,适合只用主控板的基础自稳场景。
- 扩展卡尔曼滤波器(estimator_kalman.c):以状态空间模型融合多路传感器,光流、气压计接入后,位置和高度估计的长期漂移显著收敛,是定高/定点模式的算法基础。
选型原则一句话:只飞姿态模式选互补滤波,要上定高定点就上 EKF,代价是每毫秒多花一点浮点运算——对 ESP32-S2 的 240MHz 主频来说这点开销可以忽略。IMU 本身的数据通路在 components/drivers/i2c_devices/mpu6050/,仓库文档中还附有 MPU6050 DMP 模式的说明,可作为进一步降低 CPU 负载的参考方向。
三种控制律:PID、INDI 与 Mellinger 各管哪类飞行
估计出状态后,控制律负责回答"四个电机该怎么转"。components/core/crazyflie/modules/src/controller.c 是调度入口,按需分派到具体实现:
| 控制律 | 结构特点 | 适用场景 | 源文件 |
|---|---|---|---|
| PID | 位置外环出期望姿态、姿态内环出电机量级的串级结构 | 默认选择,自稳与常规悬停 | controller_pid.c |
| INDI | 力/力矩分配器思想,动态响应更好 | 想改善机动性时替换 | controller_indi.c |
| Mellinger | 基于四元数的非线性姿态控制 | 激进机动、姿态跟踪精度优先 | controller_mellinger.c |
调参路径也对应这条链:先调姿态环的 P 直到稳定,再加 D 抑制振荡,最后才碰位置环。上位机侧的 PID 调节界面(cfclient 支持)可以实时改参数并观察响应,不用反复烧录。
操控链路:设定值是如何从手柄和 APP 走进控制回路的
设定值有三个来源,最终都汇入第 ③ 步的commanderGetSetpoint():
- 手机 APP(iOS/Android):经 Wi-Fi 走 CRTP 协议,链路实现在 components/core/crazyflie/hal/src/wifilink.c;
- PC 端 cfclient:同样基于 CRTP,可直接查看日志、调参数、读传感器曲线;
- ESP-BOX3 游戏手柄:走 ESP-NOW 免连接链路,由 espnow_ctrl.c 接收摇杆量,延迟比 TCP 链路更低。
三条链路共享同一套 commander 抽象,好处是切换操控方式时飞行层零改动——这也解释了为什么手柄、APP 和 PC 客户端可以并存使用。
百元 BOM 单:解锁完整模式还差哪两块扩展板
基础姿态模式只需要主控板,下表按固件模块标注了每个零件的落点(价格为常见渠道的参考区间):
| 部件 | 型号 | 价格区间(元) | 在固件中的落点 |
|---|---|---|---|
| 主控 | ESP32-S2 | 15–20 | 全项目,Wi-Fi 链路宿主 |
| 六轴 IMU | MPU6050 | 8–12 | mpu6050/ |
| 电机×4 | 8520 空心杯无刷 | 4×5=20 | motors.c |
| 锂电池 | 3.7V 500mAh | 15–20 | 经 adc_esp32.c 监测电压 |
| 主控 PCB | 双面板自制 | 10–15 | 图源文件在 hardware/ESP32_S2_Drone_V1_2/ |
| 气压计 | MS5611(扩展板) | 10–15 | ms5611/,定高模式 |
| 光流模块 | PMW3901(扩展板) | 25–35 | pmw3901.c,定点模式 |
| 磁力计 | HMC5883L | 5–10 | hmc5883l/ |
主控制器实物与扩展板如下:
两点提醒:其一,README 明确说明定高/定点模式必须加装对应扩展板,否则固件里相应的估计分支拿不到数据;其二,电机接线方向错了会出现"起飞就横滚"的现象,对照 motors_direction.png 核对四个电机的安装方向即可。基础配置总成本大致落在 100–150 元区间。
已知局限:ESP-Drone 现在还不能做什么
把预期管理好,比多吹一个功能更有帮助。基于仓库现状:
- 维护状态:README 声明自 2022 年 12 月起仅提供有限支持,但 Pull Request 仍然被欢迎——把它当作"稳定的参考实现"而非"高速迭代的框架"更准确;
- 工具链锁定:建议固定在 ESP-IDF v5.0 分支,盲目升级到新版 IDF 可能触发 API 变动;
- 场景边界:方案面向室内/短距使用,没有 GPS 与远距离图传链路,室外抗风能力受限于空心杯电机的推力储备;
- 扩展位:光流+气压是官方给出的位置估计路径,超声波阵列、视觉 SLAM 等属于社区可自行接入的改进方向,仓库的
drivers+estimator分层结构为这类接入留了清晰的位置。
本周末可行的三步飞行计划
- Day 1:按 sdkconfig.defaults.esp32s2 编译烧录,用 APP 完成解锁与姿态自稳测试,期间保持无人机离地 30cm 以上防误触;
- Day 2:加装机型对应的光流扩展板,走一遍 IMU 校准流程(静止放置 + 按提示翻转姿态),验证 EKF 下的定点悬停;
- Day 3:打开 stabilizer.c 的第 ⑤ 步,用 cfclient 实时对比
controller_pid.c的三组增益改动——改一个参数、飞一次、看一条曲线,这比通读整份文档更快建立直觉。
飞起来只是入口。当你读得懂那个 1kHz 循环里每一步为什么存在时,换控制律、接新传感器、改通信协议,都只是在对应目录里加一个文件的事。
【免费下载链接】esp-droneMini Drone/Quadcopter Firmware for ESP32 and ESP32-S Series SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-drone
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考