Arduino BLDC 机器人 IMU 角度读取与 PID 互补滤波控制
基于 Arduino 平台实现 BLDC 机器人的 IMU 角度读取、互补滤波融合以及 PID 控制,构成了一个典型的姿态闭环控制系统。这套架构是自平衡机器人(如两轮平衡车、倒立摆)或稳定云台的核心技术栈。系统通过互补滤波融合 IMU 原始数据以获得精准姿态角,再利用 PID 控制器计算出维持平衡所需的电机驱动力矩,驱动 BLDC 电机执行动作。
核心机制解析
1. 传感器融合:互补滤波 (Complementary Filter)
这是系统的'感知中枢',解决了单一传感器无法同时满足动态与静态精度需求的矛盾。
- 频域分割策略:本质上是一个频域滤波器。利用低通滤波处理加速度计数据,提取低频的重力方向分量(长期稳定,用于修正漂移);同时利用高通滤波处理陀螺仪数据,提取高频的角速度变化分量(动态响应快,短期精度高)。
- 时域加权实现:在离散的嵌入式系统中,该过程通常简化为加权平均公式:
Angle = α * (Angle + Gyro_Rate * dt) + (1 - α) * Accel_Angle其中 α 通常取值在 0.95~0.98 之间,决定了系统对陀螺仪的信任程度。 - 优势:相较于复杂的卡尔曼滤波,互补滤波计算量极小,仅需几次乘法和加法,非常适合 Arduino 这类资源受限平台,且参数调节直观。
2. 核心算法:PID 控制器
这是系统的'决策大脑',负责将姿态误差转化为电机控制指令。
- 比例项 (P):提供与当前倾角误差成正比的恢复力。这是维持平衡的主力项,决定了系统的'刚度'。P 值过小会导致软瘫(无法站稳),过大则会引起高频振荡。
- 微分项 (D):提供与倾角变化率(即角速度)成正比的阻尼力。它能预测未来的倾角趋势并提前刹车,有效抑制系统的超调和振荡,使运动更加平滑。
- 积分项 (I):通常在此类平衡系统中设为 0 或极小值。因为平衡环是快速动态环,积分累积容易导致过冲。但在需要消除静差(如精确位置控制)时,需谨慎加入 I 项并配合抗饱和策略。
3. 执行机构:BLDC 电机闭环驱动
这是系统的'肌肉',负责将控制信号转化为物理动作。
- 快速响应特性:BLDC 电机相较于有刷电机,具有更高的功率密度和更快的动态响应速度,能够迅速跟随 PID 控制器输出的 PWM 指令,产生所需的恢复力矩。
- 驱动模式:通常工作在速度环或电流环(力矩环)模式。对于自平衡机器人,速度环更为常用,通过控制轮子的转速来抵消车身的倾角。
实战代码示例
1. 两轮自平衡机器人基础控制
这个案例展示了最基础的 IMU 角度读取 + PID 控制逻辑。注意代码中使用了 SimpleFOC 库来驱动无刷电机,并配合编码器反馈。
#include <Wire.h>
#include <MPU6050.h>
#include <SimpleFOC.h>
MPU6050 mpu;
;
;
Kp = , Ki = , Kd = ;
targetAngle = ;
previousError = , integral = ;
alpha = ;
dt = ;
filteredAngle = ;
{
Serial.();
Wire.();
mpu.();
mpu.(MPU6050_GYRO_FS_250);
mpu.(MPU6050_ACCEL_FS_2);
motor.();
encoder.();
motor.(&encoder);
}
{
ax, ay, az, gx, gy, gz;
mpu.(&ax, &ay, &az, &gx, &gy, &gz);
accelAngle = (ay, az) * RAD_TO_DEG;
gyroRate = gx / ;
gyroAngle = ;
gyroAngle += gyroRate * dt;
filteredAngle = alpha * (filteredAngle + gyroAngle * dt) + ( - alpha) * accelAngle;
error = targetAngle - filteredAngle;
integral += error * dt;
derivative = (error - previousError) / dt;
output = Kp * error + Ki * integral + Kd * derivative;
previousError = error;
motor.((output, , ));
Serial.();
Serial.(filteredAngle);
Serial.();
Serial.(output);
(dt * );
}


