平衡车PID算法 学习日记
我的学习日记是基于平衡车pid算法上,在其他方向可能会有欠缺。
开环与闭环
开环控制系统(Open-loop Control System)是指被控对象的输出(被控制量)对控制器(controller)的输出没有影响,在这种控制系统中,不依赖将被控制量返送回来以形成任何闭环回路。
闭环控制系统(Closed-loop Control System)的特点是系统被控对象的输出(被控制量)会返送回来影响控制器的输出,形成一个或多个闭环。
闭环控制的优点就是可以根据目前与期望的差距,更精确的调整数据的输入,更好达到你的期望数值,达到想要的结果。
PID总述
PID算法是闭环控制系统中常用的算法,PID分别是 Proportion(比例)、Integral(积分)、Differential(微分)的首字母缩写。它是一种结合比例、积分和微分三个环节于一体的闭环控制算法。在闭环控制系统中,引入了反馈回路,利用输出(实际值)和输入(目标值)的偏差,对系统进行控制,避免偏离预定目标。闭环控制系统又称反馈控制系统
流程图
PID模拟程序
下面是一个最简单的pid程序,用于理解算法的原理
int PID_value(float measure, float calcu)
{
err = measure - calcu; // 计算误差
err_sum += err; // 误差积分
I_xianfu(2000); // 积分项的限幅,防止积分饱和
err_difference = err - last_err; // 计算误差的微分
last_err = err; // 更新上一次的误差
return Kp*err + Ki*err_sum+Kd*err_difference; // 返回PID控制信号
/*
p值乘以误差 用于矫正系统达到期望值
i值乘以误差总积分,用于平衡稳态误差
d值乘以变化的数值,用于减小单次,所改变的数据防止出现大幅度震荡的情况
*/
}
PID在线模拟程序(镜像)这是文章所用到的模拟程序
Kp 比例环节( Proportion)
我们需要根据所需要的数量级,合理调节p的值,也可以通过实际测试,来预估判断,不能过大,也不能过小
计算公式 Kp*err
kp值为0,无法对系统进行矫正。
通过p值的调节,可以使误差减小,但是还是会存在一些差距,我们称他为稳态误差,这时就需要进行ki的调节
稳态误差(个人鄙见):Kp乘以误差相当与力的输出量,方向是向上的,有重力等其他的力会对系统进行干扰,这个状态是相对静止的
Ki 积分环节(Integral)
通过调节ki的值,误差不断减小
计算公式 Ki*err_sum
调节ki的输出总量这个状态是运动的,由上面状态转化为下面状态时一个移动的过程,需要时间,你们可以在调试时,更直观的感受
积分限幅的作用
当我对原来只有kp的数据调节加上ki的时候 无人机会迅速向上冲一段距离,这是由于err 的总和在不断累加,根据时间的延长他的总和会逐渐扩大,甚至成为一个难以想象的数值,这是积分限幅的作用,防止长时间的开机后,出现一些难以预测的错误。
ps 冲上去后,也会逐渐下降到我们的目标高度,只是时间问题,因为err是有正有负的,正的累加负的输入也可以中和,逐渐变为一个相反的值,i积分的输出量中和回去
Kd 微分环节(Differential)
计算公式 Kd*err_difference
Kd微分环节,有利于减小高频振荡,在起步或是改变期望值时,会出现过调,在目标高度线周围震荡的效果
difference 是调整的幅度,幅度大就会阻尼,减小震荡的幅度,进行精确控制
在目标高度附近来回震荡,减小步进的幅度
小结
并不是所有控制都需要用到pid三个环节,而是其中的两个,或三个,这些要根据控制量的不同,综合选择。