|
前几天一直在整平衡小车,想用这个理解一下pid,并调一调带编码盘的电机。
首先谈谈我对pid算法的理解,刚开始以为平衡小车是采取的串级pid来是小车平衡,就是通过角度算出此时的pwm,在通过这个pwm去当作速度环的入口参数,通过编码盘来获取小车的速度控制小车由角度环指定速度下行驶。但通过实践并不是这样,速度环和角度环应该是两个独立的系统,角度环用来让小车快速的恢复到平衡状态,如果初始化陀螺仪时陀螺仪的角度正好重力重合,那么你的小车就会平衡,否则就会向一个方向加速,只至倒下,加上速度环就会解决这一问题,速度环是为了消除小车的位移,让小车能够在一定的位移范围内调整角度,如果下车像一个方向一直加速,那么速度环累计的位移就会越来越大最后达到一定程度,导致小车减速甚至反向到达以前的位置。
再谈谈角度环的pid公式的理解,角度环的公式是:车轮加速度=小车倾斜角度×kp+小车角速度×kd 。我对他的理解就是 小车倾斜角度×kp 是为了让小车能基本的立起来,而
小车角速度×kd 则是让小车能在突然改变角度的时候能够做出快速的反应增强其稳定性。那么角度环为什么没有积分项呢,我将在最后的总结里讲到。
我们再看看速度环的公式:pwm的修正量(我自己给取得,不用在意叫什么名字)=小车速度×kp+小车位移×ki (我不懂为什么没有微分项)。我对这个公式的理解则是 小车速度×kp 是让小车不会一直加速,要知道速度一快,这个公式计算出来的值就越大,最后用角度环计算出来的值加上这个值就会越大了,就可以将车身摆正了。那么基本上就可以解决角度环一直加速的问题,但是如果小车以一个比较慢的速度一直向一个方向移动(这种情况是有可能出现的)我们是不允许这种情况发生的,所以现在就必须要有积分项小车位移×ki (有大神说ki=kp÷200,我试了,的确很好使) 的作用了这个加上以后就可以消除小车有大的位移这个问题,让小车可以在一个区域内调整姿态。
那么让小车立起来了如何改变方向和速度了。改变速度有两种方式,一是可以通过改变给速度环的的输入部分先给一个偏差,这样速度就会稳定在你给的那个偏差里,还有一种就是你可以给积分项给一个偏差,这样你不动的时候就已经有了积分作用,小车就会向一边偏然后慢慢加速直至小车车轮产生的积分作用能够抵消小车刚开始已有的积分作用,然后小车达到平衡状态,匀速运动(我用的是第二种所以比较清楚)在积分项里还有一个积分限伏,这个是非常重要的如果你不加的话小车可能会因为打滑,而向一边一直加上速,或者你将小车提起来时就会发现,小车会向一边一直加速然后就停不下来了,这是因为速度环是一个正反馈调节的过程,(这点是非常重要的,我刚开始以为是一个负反馈调节的过程结果小车车轮就一动不动,因为它会产生和你运动方向相反的pwm波),你如果明确这个你就会知道积分限伏的重要性,积分限幅就规定了你最大可以倾斜的角度和你的最大速度,所以收这个范围是越大越好,但也不能超过小车的极限,你可以将小车拿起在放下,一直增加这个范围,直到小车会无法调整到平衡状态为止。网上有人说小车重心越高越好,说什么重心高转动惯量越大也好控制,我认为这是错的,重心越高,你的电机能够产生的扭矩就得越大,才能抵消重力的作用,而且我个人认为,重心越低,能够偏转的角度就越大,你小车的最大速度就越大,这是你提高小车速度的最好方法。
小车转弯这个问题其实非常简单,就两行代码的事,你给在前面工作都做完的条件下,让左轮的pwm加上一个值,右轮减去一个值就行了。但要注意的是,你必须使用两个编码盘(前面所有功能只要一个就够)比如说原地打转的时候位移应该是零的但是由于只有一个编码盘,就只计算了一个轮胎的位移导致积分项越加越大。
最后谈谈我对pid的理解:
pid其实就是两种
增量式:pwm =Kp[e(k)-e(k-1)] Ki*e(k) Kd[e(k)-2e(k-1) e(k-2)]
位置式:pwm =Kp*e(k) Ki*∑e(k) Kd[e(k)-e(k-1)]
其他形式的pid只是为了解决积分饱和和让算法更加优化的问题
对于这两种pid的选择网上说增量式pid的执行器件一定要自带积分效果,以下是我在网上找到的两种pid之间的区别。
(1)位置式PID控制的输出与整个过去的状态有关,用到了误差的累加值;而增量式PID的输出只与当前拍和前两拍的误差有关,因此位置式PID控制的累积误差相对更大;
(2 )增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。
(3 )由于增量式PID输出的是控制量增量,如果计算机出现故障,误动作影响较小,而执行机构本身有记忆功能,可仍保持原位,不会严重影响系统的工作,而位置式的输出直接对应对象的输出,因此对系统影响较大。
我对位置式pid的理解就是 你要用于改变你需要控制状态的一个值=比例项+积分项+微分项,这三者之间的取舍需要根据实际用途去舍取,积分项是要控制变量偏差的积分比如速度环里面的积分,速度环是为了消除小车一直加速的问题,那么你要控制的就是速度,而速度的积分正是位移,微分项则是你要控制的偏差的微分,角度环控制的是角度,那么其微分则是角速度,这样我们便可以理解为什么角度环没有积分项(角度积分的不出实际的物理意义,而速度微分是加速度,这是我不理解的,加速度不就正是我们要控制的量吗?我们可以将陀螺仪X轴的加速度取出来(其实最好重新安装一个加速度计,尽量低一点)加速度为零,小车就可以静止,或者匀速运动,我觉得加上微分后小车能够更快的加速,和更稳定平衡,我不理解为什么网上众多的代码中都是pi算法)至于参数,你觉得应该调成多大就多大吧file:///C:\Users\ASUS\AppData\Local\Temp\QBHO~D%B_59OH5TDLN0$I5X.png
我对增量式pid不是很清楚,增量式pid必须在执行器件自带积分作用的器件,比如步进电机,我还没用增量式pid调过东西,调了在说吧,要是谁有这个方面的资料希望大家能够分享出来啊 o( ̄▽ ̄///)
PID部分只是我个人的看法,有什么问题,大佬们指正哦(⊙o⊙)
下面是我写的程序,以及自己总结的几种pid的形式,还有网上得一些资料希望对大家有用
|
评分
-
查看全部评分
|