RIG-Hover自平衡搭建教程:ESP32加LQR控制

2026-10-25 20:03:02 56阅读

RIG-Hover自平衡搭建教程:ESP32加LQR控制

玩两轮自平衡机器人的朋友不少,但大多数停在买套件烧固件跑起来的阶段。陆吾智能开源的RIG-Hover给了一个不太一样的机会——固件工程把语音交互、表情显示、Wi-Fi配网、MCP远程控制和LQR平衡控制全塞进一颗ESP32-S3里,等于把智能机器人固件骨架直接摊开了给你看。这篇把搭建流程、关键参数和调参踩坑全捋一遍。

硬件清单与核心模块

RIG-Hover的硬件不复杂,但每个模块分工明确。主控用ESP32-S3-WROOM-1-N16R8,双核240MHz,自带Wi-Fi和BLE 5.0,16MB Flash加8MB PSRAM,跑LVGL表情渲染和音频处理绑绑有余。所有感知控制AI逻辑全靠它完成,没有协处理器。

圆屏用的GC9A01 240乘240分辨率,SPI接口,跑LVGL加EAF表情动画。音频输入是INMP441 MEMS数字麦克风,输出走MAX98357A功放推8欧2W扬声器。摄像头可选,用GC0308通过DVP接口接入。

姿态传感器用QMI8658C六轴IMU走I2C总线,实时输出roll、pitch、yaw和角速度。左右轮用两颗串口FOC电机,ID分别是1和2,走UART2总线波特率1Mbps。FOC电机力矩输出平滑响应快,比普通PWM驱动强不少。头部还有一个XGO串口舵机ID为3。

关键引脚配置

所有Hover专属引脚集中在一个头文件里,改引脚只动这一个文件:

#define XGO_UART_TX_PIN GPIO_NUM_46
#define XGO_UART_RX_PIN GPIO_NUM_38
#define TOUCH_BUTTON_GPIO GPIO_NUM_3
#define IMU_I2C_SDA GPIO_NUM_14
#define IMU_I2C_SCL GPIO_NUM_48

几个容易踩的坑:UART的GPIO46和38不能和其他外设冲突;IMU的I2C要和摄像头SCCB分开;Touch按键GPIO3别被复用。改完引脚一定先悬空测试,别急着上地。

固件编译与烧录

环境需要ESP-IDF v5.5.3以上,Python 3.8+。编译流程:

git clone https://github.com/LuwuDynamics/rig_omni.git
cd rig_omni
source ~/esp/esp-idf/export.sh
idf.py set-target esp32s3
idf.py menuconfig
idf.py build
idf.py -p /dev/ttyUSB0 flash monitor

选板型进menuconfig找RIG-Omni然后Board Type选RIG-Hover。烧完第一次开机串口应该能看到Initialize UART、XGO control tasks created、IMU control tasks created这几行。看到这些说明板级初始化跑通了,LCD会播放启动表情。

LQR平衡控制核心逻辑

运动控制全在xgo.cc文件里。原来串级PID注释保留了,现在主路径用离散LQR全状态反馈。控制器初始化默认参数:

pid_pos.fpKp = 60.0;
pid_vel.fpKp = 0.15;
kd_pit = 2.3;
imu_zero = -5.0;
lqr_k[0] = 1400.0f;
lqr_k[1] = 6.8f;
lqr_k[2] = 32.0f;
lqr_k[3] = 1.6f;

LQR核心状态量四个:位置误差、速度误差、俯仰角误差、俯仰角速度。控制输出就是各乘对应增益后求和取反:

pitch_ref = imu_zero * cosf(q_head * PI / 180.0f);
lqr_x = wheel_x - stable_pos;
lqr_vx = wheek_vx - vx;
lqr_q = pitch - pitch_ref;
lqr_dq = dq;
temp_u = -(lqr_k[0]*lqr_x + lqr_k[1]*lqr_vx + lqr_k[2]*lqr_q + lqr_k[3]*lqr_dq);
temp_u = Clip(temp_u, -pid_pit.fpUMax, pid_pit.fpUMax);

航向控制独立一路,用k_yaw乘航向偏差输出限幅正负80。左右轮力矩一正一负差速实现转向。

调参顺序和安全边界

调参是最容易翻车的环节。推荐顺序是先imu_zero每次0.5度,再LQR_k2每次1到3,然后LQR_k3每次0.1到0.3是阻尼项太小会摆太大迟钝,LQR_k1每次0.5到1,最后LQR_k0每次50到100。保护条件必须保留:pitch超60度或roll超40度持续500毫秒切力矩,pitch和roll都小于7度持续1500毫秒才重新开启控制。

Web调参和MCP远程控制

RIG-Hover内置Web调试服务器,连Wi-Fi后浏览器访问设备IP就能看到实时姿态和参数页面。有个坑:Web页面标签写YAW_kp但代码里index 8设的是imu_zero,俩东西完全不同,调的时候别被标签忽悠了。MCP远程控制注册了三个工具:head_angle控制头部舵机负45到45度,move修改stable_pos前进后退,rotate修改stable_yaw原地转向。

上手建议

第一次玩自平衡建议按这个顺序来:第一天跑通工程确认编译烧录;第二天读懂板级初始化;第三天搞清串口电机协议收发;第四天才碰平衡控制参数;第五天尝试加新动作。原则是先悬空测试确认电机方向和IMU坐标系,再手扶测试感受平衡,最后才放地让它自己站。别一上来就大改LQR参数,不对的话直接倒车或剧烈抖动。

项目开源在GitHub的LuwuDynamics/rig_omni仓库,wiki在陆吾知识库上,3D打印模型在MakerWorld。全套结构件固件文档都有。对想深入理解ESP32机器人固件架构的人来说,这套代码值得花时间读一遍。


作者:隔壁老王的教程
链接:https://www.aiddithome.com/p/1a4bbe4ad4b88e.html
本作版权归作者所有,未经允许请勿转载。若存在违规行为,您可以点击 “举报”。


登录 后发表评论
4条评论
阿强焊点总飞
1楼 · 2026-10-25 20:03:03

请问3D打印件用PLA还是PETG 我打了一版PLA夏天晒到就软了

装过才知道
2楼 · 2026-10-25 20:03:02

这套固件把语音表情和平衡控制全塞一颗ESP32里 成本确实压下来了 FOC电机比普通PWM稳太多了

探头看一眼
3楼 · 2026-10-25 20:03:02

LQR调参那段实用 之前看论文公式一头雾水 这里直接给参数范围和顺序

调参到凌晨
4楼 · 2026-10-25 20:03:02

Web调参那个坑我也踩过 页面标签YAW_kp实际设的是imu_zero 被坑了半天