两轮自平衡机器人 (Two-Wheeled Self-Balancing Robot)
Published:
🛠 项目概述 (Project Overview)
这是一个基于倒立摆原理设计的两轮自平衡小车。项目核心在于利用 IMU(惯性测量单元)实时解算姿态角,并通过 PID 闭环控制算法 驱动直流电机,使系统保持动态平衡。
- 核心难点:多环 PID 控制系统的参数整定(直立环、速度环、转向环)。
- 传感器融合:使用 MPU6050 六轴传感器,结合互补滤波算法融合加速度计与陀螺仪数据。
💻 技术栈 (Tech Stack)
| 模块 | 详细参数 |
|---|---|
| 主控芯片 | STM32F103C8T6 (Cortex-M3) |
| 传感器 | MPU6050 (加速度计 + 陀螺仪) |
| 电机驱动 | TB6612FNG / L298N |
| 动力系统 | N20 减速电机 (带霍尔编码器) |
| 控制算法 | 串级 PID (直立 PD + 速度 PI) |
| 姿态解算 | 互补滤波 (Complementary Filter) |
⚙️ 核心算法实现 (Algorithm)
1. 姿态解算 (互补滤波)
由于加速度计动态响应慢但长期稳定,陀螺仪动态响应快但有积分漂移。我采用了互补滤波来融合两者数据,得到精准的 Pitch(俯仰)角。
// 互补滤波核心代码片段
float angle = 0.0;
void Get_Angle(void) {
// alpha 为互补系数,通常取 0.98
// Gyro_Y 为陀螺仪积分角度,Accel_Angle 为加速度计计算角度
angle = alpha * (angle + Gyro_Y * dt) + (1 - alpha) * Accel_Angle;
}
2. 串级 PID 控制器
为了让小车既能直立又能受控移动,我设计了双环控制系统:
- 直立环 (PD):极性保护,提供高频响应的恢复力矩,让小车“站起来”。(P: 回复力, D: 阻尼力)
- 速度环 (PI):作为外环,通过编码器积分消除静差,让小车保持静止或匀速运动。
📝 调试过程与踩坑 (Debugging Log)
[2024-11-20] 高频抖动问题
- 现象:小车能站立,但电机发出滋滋的电流声,且伴随剧烈的高频抖动。
- 原因:直立环的 D (微分项) 给得太大了,导致系统对噪声过度敏感。
- 解决:减小 Kd 参数,并对陀螺仪数据进行软件低通滤波。
[2024-11-25] “往一边跑” (零点漂移)
- 现象:小车平衡时总是慢慢往一个方向加速,最后倒下。
- 原因:机械零点(重心垂直点)没有校准,MPU6050 安装有微小倾斜。
- 解决:在静止平衡状态下记录 MPU6050 的原始偏移值,在代码中减去该 Offset。
🎥 实物运行演示 (Live Demo)
这里展示了从参数整定到最终稳定的两个阶段。
1. PID 调试阶段 (Tuning Phase) 视频说明:此时正在整定速度环参数。可以看到小车虽然能勉强直立,但无法静止,会不由自主地向前“漂移”移动,说明速度环积分项(I)还不够强。
2. 最终效果:抗干扰测试 (Robustness Test) 视频说明:参数整定完成。小车不仅能稳稳静止,当用手给予外部推力(干扰)时,能够迅速产生反向力矩回正,表现出良好的鲁棒性。
[Image of PID control loop diagram]