参照轮趣科技开发手册进行复刻平衡车,以下为调参全过程
一、 Pid的个人理解
PID 即比例 积分 微分
KP值 在目标点位产生的震荡的幅度
KD值 决定了产生的阻尼大小 减小震荡幅度 很大反而会出现震荡
KI值 抵消恒力
二、 调参过程:
**确定机械中值**
轮趣科技开发手册原话是:
说白了就是从一边往另一边推 观察roll值多少时 倒下
相加/2得到
本人实测是-21+22 接近零了 也赋值的0
**预估大致数量级**
直立环PD控制器函数:
1. int Vertical(float Med,float Angle,float gyro_Y)
2. {
3. int temp;
4. temp=Vertical_Kp*(Angle-Med)+Vertical_Kd*gyro_Y;
5. return temp;
6. }
temp是给到电机的参数 即-7200到7200范围
angle 0-60
7200/60 即 120
7200/10 即 720
KP 范围 即0-1k
实际观测 角速度gyox 范围约0-2k
7200/2k 3.6
KD 范围即0-10
直立环函数:
1. static int Err_LowOut_last,Encoder_S;
2. 4. static float a=0.7;
3. 5. int Err,Err_LowOut,temp;
4. 6. Velocity_Ki=Velocity_Kp/200;
5. 7. Err=(encoder_L+encoder_R)-Target;
6. 8. Err_LowOut=(1-a)*Err+a*Err_LowOut_last;
7. 9. Err_LowOut_last=Err_LowOut;
8. 10. Encoder_S+=Err_LowOut;
9. 11. Encoder_S=Encoder_S>20000?20000:(Encoder_S<(-20000)?(-20000):Encoder_S);
10. 12. if(stop==1)Encoder_S=0,stop=0;
11. 13. temp=Velocity_Kp*Err_LowOut+Velocity_Ki*Encoder_S;
12. 14. return temp;
13. 15. }
Err_LowOut是编码器速度 让Load(7200,7200)观察编码器测出的速度 68 两个相加即140
60/140 即3/7
KD 0-1
而KI固定=KD/200
**确定极性**
只给直立环的KP or KD 赋值 观察是否车轮,旋转方向与小车倾斜,方向同向
速度环:直立环KP kD 给其最大值的十分之一 赋给速度环最大值 观察倾斜是车轮速度
如果很快则极性正确 很慢则极性相反
**正式调节**
其实无非就是确定以下几个参数:
float Vertical_Kp,Vertical_Kd; //直立环 数量级(Kp:0~1000、Kd:0~10)
float Velocity_Kp,Velocity_Ki; //速度环 数量级(Kp:0~1)
float Turn_Kp,Turn_Kd; //转向环
直立环:PD
k p 小电击反应迟钝,kp 大 电机反应猛烈
k d 小抖动范围大,kd 正好的时候抖动范围比较小,达到高频
注意高频抖动时不要持续太久,否则容易烧掉驱动模块
从小开始调 速度环先给0 转向环暂时不用赋值
1. float Vertical_Kp=-100,Vertical_Kd; //直立环 数量级(Kp:0~1000、Kd:0~10)
2. float Velocity_Kp=0,Velocity_Ki=0; //速度环 数量级(Kp:0~1)
3. float Turn_Kp,Turn_Kd ////转向环
发现 电机反应迟钝
逐渐加大
Kp=-400时电机反应过于猛烈
最终给到-300
kd=-1 抖动范围大
kd最终给到-3.4
调好之后乘以0.6,赋值,再去调速度环 KP
速度环:PI
kp赋值0.4 ki固定=kp/200 即 0.02
发现 小车晃动幅度大 难以保持平衡 说明速度环kp给小了
kp 0.8 发现来回摆动的频率过大 说明给大了
kp最终赋值0.6 ki赋值0.003
转向环:PD
转向环没有写严格的PD控制器 因为 mpu6050测量的转向角误差比较大
在计算平衡角的时候,把误差进行了累积
KP主要是起到放大作用 越大转向越快 对于平衡而言不是很重要
KD和速度环ki数量级是一样的
分别按照手册取经验值 50和0.6即可
最终参数为:
float Vertical_Kp=-180,Vertical_Kd=-2; //直立环 数量级(Kp:0~1000、Kd:0~10)
float Velocity_Kp=0.6,Velocity_Ki=0.003; //速度环 数量级(Kp:0~1)
float Turn_Kp=10,Turn_Kd=0.6; ////转向环