一百块硬件飞起开源无人机:ESP-Drone 的 ESP32 飞控拆解与调参实操
【免费下载链接】esp-droneMini Drone/Quadcopter Firmware for ESP32 and ESP32-S Series SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-drone
想花一百块左右造一架能定高、能悬停的开源无人机?ESP-Drone 就是干这个的——乐鑫基于 ESP32/ESP32-S2/ESP32-S3 芯片做的四旋翼完整固件,飞控核心移植自经过长期验证的 Crazyflie 项目。我翻了一遍源码,结论先放这:架构分层清楚,关键路径都标了注释,新手能读懂,二开也有抓手。
拆开看看:三层代码怎么分工
整个工程按"驱动—飞控—接入"三层切,对应目录一目了然:
- 硬件驱动层
components/drivers/:I2C 挂 MPU6050 六轴 IMU、MS5611 气压计、HMC5883L 磁力计;SPI 挂 PMW3901 光流和 VL53L1X 激光测距(都在spi_devices/pmw3901/下);另有电机 PWM(motors.c)、LED、WiFi 与 ADC 通用驱动。 - 飞控核心层
components/core/crazyflie/:姿态估计、控制器、通信协议(CRTP)、参数与日志系统,全部按 Crazyflie 的模块化风格组织,一个功能一个.c/.h对。 - 接入层:手机 APP 走 WiFi,ESP-BOX3 手柄走 ESP-NOW 广播,PC 端可以直接用 cfclient 连进来,参数、日志、调参一个界面搞定。
好处是耦合度低——换传感器只动驱动层,动算法不碰硬件初始化。
稳定器主循环:1000 次/秒里在算什么
入口在main/main.c的app_main:先初始化 NVS(WiFi 要用),platformInit()认硬件,systemLaunch()拉起 FreeRTOS 任务群。真正干活的是稳定器任务。
stabilizer.c里有一行注释写得很直白:主循环 stock 模式跑1kHz,切到 Kalman 估计器时降到500Hz。每个 tick 的固定管线是五步:
sensorsWaitDataReady()等传感器数据就绪;stateEstimator()跑状态估计(互补滤波或 EKF);commanderGetSetpoint()把 APP 或手柄的期望值解析成设定点;sitAwUpdateSetpoint()做一次"空中姿态保持"修正;controller()算出四个电机的推力分配,直接写 PWM。
任务里还内建了急停超时和 rateSupervisor 掉率检测,主循环卡住会自己报出来,这点做调试时很省心。
EKF 融合逻辑:四路数据喂一个滤波器
光流到底怎么帮无人机定住悬停的?靠的是components/core/crazyflie/modules/src/estimator_kalman.c里的扩展卡尔曼滤波器。它基于 Mueller 和 Hamer 那篇经典的无人机状态估计论文实现,滤波器和 OS 相关的逻辑是分开的(kalman_core.c纯数学,好单测)。
输入侧四路数据,各司其职:陀螺仪高频积分管姿态快速响应;加速度计当低频校正防陀螺漂移;气压计提供相对高度;光流/激光测距提供水平与垂直的绝对位置约束。输出侧是完整的姿态、位置、速度状态。说实话这里有点绕,但源码把过程噪声、测量噪声矩阵都显式写出来了,对着论文读并不吃力。不想上 EKF 的话,estimator_complementary.c的互补滤波器也够用,主循环能动态切换两者。
控制器选型:PID 串级是基线,还有两个进阶
默认控制器在controller_pid.c,是标准串级结构:
- 外环:
positionController()把位置误差转成期望姿态角attitudeDesired,再决定总升力; - 内环:
attitudeControllerCorrectAttitudePID()把姿态误差压成角速度指令,最后映射到电机差动。
各轴的模式是独立可配的(禁用/角度/速度),所以"手动打杆 + 自动定高"这种混合玩法天然支持。另外两个进阶选项:controller_mellinger.c走 Mellinger 力矩分配思路,适合更激进的机动;controller_indi.c则针对姿态变化率做了更平滑的处理。切控制器不用重烧固件——稳定器循环每个 tick 都在检查getControllerType()有没有变,CRTP 通道下发即生效。
硬件 BOM 与成本拆解
以 ESP32-S2-Drone V1.2 主板为例,核心料位和大致成本:
- 主控:ESP32-S2-WROVER,自带 WiFi,约 15~20 元;
- IMU:MPU6050,主板直连 I2C0,约 8~12 元;
- 气压计:MS5611,走 MPU6050 的 I2C 从机总线,约 10~15 元;
- 光流板:PMW3901 + VL53L1X 扩展板(SPI+I2C),约 25~35 元——这是定点模式的关键;
- 电机:8520 空心杯 ×4,约 20 元;
- 电池 + 机架 + PCB 打样:约 40 元。
整机压在 100~150 元区间。注意定高/定点模式依赖扩展板,只飞自稳模式的话 BOM 还能再砍。
编译烧录:ESP-IDF 三步起飞
用 ESP-IDF 的 release/v5.0 分支,官方默认支持 S2:
git clone https://gitcode.com/GitHub_Trending/es/esp-drone cd esp-drone idf.py set-target esp32s2 && idf.py build && idf.py flash monitor烧录完串口直接能看到传感器校准进度和 "Ready to fly"。sdkconfig.defaults里已经把 FreeRTOS 调度、双核分配这些坑都替你调好了,不用自己碰。
调参实操:三个环按顺序来
调参走 cfclient,图形界面能实时读写参数和日志:
顺序别乱:
- 角速度环先行:无人机架在架子上(或护着),从纯 P 起步,振荡出现时往 D 上加,收敛后停手;
- 姿态环:飞离手指,小量油门下修 roll/pitch 的 P,保证机身能"顶住"倾斜而不晃;
- 位置环:装上光流板再动,幅度要小,这环动了直接体现在漂移量上。
校准三件套:陀螺仪零偏保持静止 10 秒自动完成;加速度计按提示翻六个面;磁力计走 8 字流程。日志系统会把 acc、motion、setpoint 都记下来,飞出问题回看曲线比反复试快得多。
故障速查:起飞前先看这份清单
- 起飞后电机转向不对:
components/drivers/general/motors/motors.c里改电机顺序或相序; - 飞行中高频抖动:
controller_pid.c降 P 增益,或补 D 抑制振荡,别一次调两个; - 高度慢慢漂移:
estimator_kalman.c里检查高度测量融合权重,MS5611 有温度漂移,必要时加补偿; - 定点模式飘:
components/drivers/spi_devices/pmw3901/pmw3901.c,先擦镜头再怀疑算法; - WiFi 断连:
components/drivers/general/wifi/wifi_esp32.c,换信道或确认天线没被电池金属压住。
飞起来之后:教学、组网与二开
这个项目在 STEAM 教学里用得很多,一条完整学习链就藏在代码里:main.c讲启动流程,stabilizer.c讲实时任务调度,estimator_kalman.c讲滤波器,controller_pid.c讲控制理论落地,学生跟着读一圈,嵌入式和控制两块知识都过了一遍。
二开方向也很实际:在components/drivers/i2c_devices/里照葫芦画瓢加一路温湿度传感器,就是环境监测机;多架机器共用 CRTP 协议栈,配合peer_localization.c做机间相对定位,小规模编队就能跑起来;collision_avoidance.c的避障框架也留了扩展位。固件本身是 GPL3.0,二次开发成果回流的门槛也不高。
百元预算、开源全栈、主循环 1kHz 还带看门狗——这个性价比,拿去玩真的不亏。
【免费下载链接】esp-droneMini Drone/Quadcopter Firmware for ESP32 and ESP32-S Series SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-drone
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考