恩智浦(飞思卡尔)智能车舵机和电机PID控制

这篇文章主要是基于B车模这种单电机四轮车模来写的,内容是讲两者PID之间的差异,以及两者各自的主要控制参数,并不讲它们的完整的PID程序要如何写。
写PID的时候,首先要理解电机控制与舵机控制的区别。很多人有一个误区就是把电机和舵机当成同一个系统来控制,在调车的时候也是用同样的方法来进行调车。我们首先来看两个公式:
1、err = target - measure(偏差 = 设定值 - 实际值);
2、out(控制量) = P * err + I*err的累积 +D * (err - pre_err);
在舵机中,err就是摄像头计算的中线与中线的偏差值,控制量则是舵机引脚的电压值,也就是舵机打角角度大小。
在电机中,err是电机的设定速度与实际速度的差值,而我们的控制量则是电机输入电压的大小
比如都是单纯的P(比例)控制,假设target(设定值)不变,measure(实际值)小于target的情况下,舵机的P输出会使得err逐渐减小,并随之时间的推移趋近于0,其实理论上单纯的P控制是不会达到target的,但是现实中的系统是个连续的,而我们在程序上控制是一个差分系统,舵机就会在保持上一个时间的状态直到下一个状态的输出,假设小车一开始是直线行驶,但中线在小车右侧,那么P输出会让舵机向右打角,越接近中线,舵机打角越小直到达到中心线,但我们会认为小车还是直线行驶吗?是不是越接近中线小车转弯角度越小呢?实际恰恰相反,单纯的P控制会让小车在达到中线时转弯角度最大,因为小车的转弯角度是由之前舵机打角一直积累下来的, 在这段时间内,舵机就会保持转弯的状态导致超过target,所以舵机的P控制会导致超调现象
而在电机中,情况则不同。在理想状态下,不考虑电机死区的问题,电机的转速是与电机的输入功率接近线性关系,在单纯的P控制的情况下,假设target(设定值)不变,measure(实际值)小于target的情况下,电机的P输出会导致怎样的变化呢?结果应该是一开始的err值是最大的,所以out值最大,电机转速加快,导致err值变小,out值相应变小,电机转速减慢,err值又变大,out值相应变大,电机转速加快,电机一直这两个过程中来回变化,如果在变化不大的情况下,在我们眼中看来,电机是基本没有变化的,但measure值与target值相差甚远,所以如果不是特别极端的情况下,电机的P控制是不会导致超调现象的
那在调车的过程中,我们要怎样去调节参数呢?其实在上面的内容中,我们能知道舵机的P控制能够去达到我们的设定值了,也就是说单纯的P控制理论上是可以控制小车的运动了,即P是舵机最主要的参数,我们可以单纯通过调节P来控制小车的转弯了,但单纯的P控制是不完美的,因为它会使得measure会在target上下浮动,要经过很长的时间才能达到target,这时候就引入了I值和D值了,D值比较容易理解,就是抑制误差剧烈变化,能够使得measure会比较平缓地接近target。而I值则是通过误差的累积来控制输出角度的大小。但赛道不仅仅是直道,有直角弯,也有小弯,还有S弯之类的,这些都是要通过情况分类和慢慢调参数才能得到一个最合适的值。所以一般调舵机的参数的时候一般都是先把I值和D值设为0,再通过调P值慢慢地使得小车能够比较好地转弯后,再引入I值和D值。
在调节电机的过程中,我当时对它的理解是电机的转速主要是与误差的累积是相关的,当电机没有达到target时,控制量会持续增大,直到转速等于target为止,即I是电机最主要的参数。即我们可以单纯控制I值来让电机达到我们的target,在电机控制中,P值由于与err值相关联,当measure一定时,当err逐渐变小时,P值的输出量也会变小,也就是说,P值除了一开始促进电机的转速外,其他时候都是抑制电机的转速变化。所以一般我们在调电机的参数时,是先把P值和D值设为0,然后慢慢调I值直到找到一个合适的值,再引入P值和D值。

你可能感兴趣的:(智能车,比赛,PID)