前言
最初的接触是在2020跨入2021的寒假之中,偶然间发现;大生兴趣,但最终因种种原因(懒)没有深入尝试,近期因参与竞赛的相关需要,被平衡小车折磨了将近一个月左右,现写下一些困惑与心得,希望能与更多大佬交流解决问题。
一、调试过程
1.初步尝试
最开始拿到手时首先参考的是网上盛行的平衡之家的开源代码,可以说是平衡车控制调试里经典中的经典,现将其摘录如下
float Movement;
float Balance_Kp=120,Balance_Kd=2;
int last_bias=0;
int balance(float Angle,float Gyro)
{
float Bias;
int balance;
Bias=Angle-1.8f+Movement;
balance=Balance_Kp*Bias-Gyro*Balance_Kd;
last_bias=Bias;
return balance;
}
float Velocity_Kp=0.5f,Velocity_Ki=0.01;
int velocity(void)
{
static float Velocity,Encoder_Least,Encoder;
static float Encoder_Integral;
Velocity_Ki=Velocity_Kp/200.0f;
Encoder_Least =(Left.m_real_v+Right.m_real_v)-0;
Encoder *= 0.8f;
Encoder += Encoder_Least*0.2f;
Encoder_Integral +=Encoder;
Encoder_Integral=Encoder_Integral-Movement;
if(Encoder_Integral>100000) Encoder_Integral=100000;
if(Encoder_Integral<-100000) Encoder_Integral=-100000;
Velocity=Encoder*Velocity_Kp+Encoder_Integral*Velocity_Ki;
return Velocity;
}
(1).存在的问题
1.因使用的陀螺仪存在一定零漂,且机械并未使其较好自平衡,导致单直立环的情况下无法稳定直立; 2.因使用的电机存在死区电流和空程,速度累加时,死区电流的影响使得在速度环输出过大时对整车稳定雪上加霜,过小时又十分鸡肋, 多次调试终未能取得较好效果.
(2).解决思路
将直立环改为位置式PID,加入积分对其误差进行一定补偿,使其稳定直立
2.初步改进
将陀螺仪当前数据和中值差算作误差输入位置式PID计算,相关代码如下
float Balance_cal(float expect_angle)
{
err=expect_angle-midangle;
integral+=err;
result=(kp*err+ \
ki*integral+ \
kd*(err-last_Err));
last_Err=err;
return result;
}
(1).存在问题
1.位置式PID的积分在很大程度上阻碍了平衡车移动状态的变化,既使其在静止时更加稳定,同时也因积分饱和的存在使得其在受扰移动后难以再次稳定直立; 2.单独对积分进行的各种处理在使其响应更灵敏时,也降低了其稳定性,目前笔者暂未发现较好的方式解决其移动问题,陷入无积分难直立,有积分难运动的尴尬境地。
二、困惑与改进思路
1.存在困惑
开源算法中速度环的作用是累加速度获得路程,还是修正陀螺仪漂移数值,又或二者兼得,其输出极性的确定亦然存在问题,且一旦积分饱和,亦会使平衡车的直立陷入困境
2.改进思路
(1).位置式
1.尝试更改平衡小车控制输入模式,使得对直立环的积分影响减小; 2.对积分和整体输出作相关处理,使其积分效果不减的同时更难达到积分饱和
(2)开源式
1.多作速度环极性的尝试,对其积分作相关处理,防止其迅速饱和后影响整车直立 2.对每个电机单独作速度累加,使其反馈更加平滑
总结
以上便是本人目前主要思路和心得,有不当之处欢迎各位大佬指正。目前笔者调试陷入困境,若有好思路与想法,恭迎交流与指点,感激不尽!
|