我们上一年的师兄给出的调参方法是有问题的,按照PID原理来说,应该是 Kp+Ki 控制,Kd是可以抑制震荡,但是也会拖慢系统响应,而且过大的Kd会导致电机在正常运动时会出现抖动现象。但是之前他们为什么要 Kp+Kd 控制,我猜测可能是因为当时都是用彬哥制造的陀螺仪,而彬哥制造的陀螺仪由于实时性很差,接收周期大概在 14ms 左右,只有不到 100HZ 的响应时间,按照正常来说,云台陀螺仪至少要有 500HZ 以上(也就是 2ms 以上)才能调,但是他们就是由于实时性太低,所以正统的调参方式并没有太大效果,而且由于实时性太低,要是不给前馈补偿,是无法调到像华工等学校这么“硬”。
目前使用的陀螺仪是大疆 A 板的板载陀螺仪,使用 SPI 通讯,1ms读取信息。调试方法使用华工交流回来的办法。大概思路是先把内环的 Kp和Ki 先确定,积分分离和积分阈值也要确定好,之后外环就可以随便给。
具体方法:
先确定外环的限幅值,用一个位置单环,随便给一个 Kp ,把陀螺仪速度值作为测量值,目标值自行定义,看目标值到哪里的时候云台转动的速度合理(目测),就把这个目标值作为外环输出限幅。
然后换回双环,首先开始调试内环,给 Kp 和 Ki,然后目标值是给阶跃形式,用上位机看内环的目标值和测量值,**理想状态是在外环输出值(内环目标值)缓慢往下降的时候,内环的测量值要贴紧内环目标值,到末端的时候一定不能抖,而且都要一直贴紧。**至于峰值之前的就不用在意,只需要看峰值与峰值之后的曲线即可
这是调试使用彬哥陀螺仪作为云台角度时的例子:
其中黄色的是内环输入值,蓝色的是内环的输出值。可以看到现在的内环参数是不可以的,首先:
遇到这种情况我们一般可以把内环 Kp 增大。
其中黄色的是内环输入值,蓝色的是内环的输出值。可以看到现在的内环参数也是不可以的:
可以看出,实时性不高的话不加任何的前馈是没法做到精准的。
加入 Ki 后,会使得输出峰值贴紧输入峰值(绿色圈处),但是太大也会引起抖动,对于实时性高的外设,Kp 给大了峰值也不会超调,只会抖动; 要是 Kp 作用下不抖动,这个时候可以加入 Ki,把峰值积上去。Ki 积分分离阈值可以根据 Kp 作用开始减弱的附近作为限幅值。
加入 Ki 后,可能会出现只加一点点,但是却出现曲线开始出现抖动,这个时候就可以开始适当把 Ki 限幅降低(限幅一开始可以给很大),然后 Ki 再给大,一点点尝试,直到两边达到一个合适值。待两条曲线峰值和峰值后完全贴合不抖动,内环基本就完成了,这个时候外环可以随意加。
上诉的方法只在内环进行 PI 控制,外环进行 P 控制,但是有时调到不抖且响应快的时候,阻尼感并不会很强烈。但这个时候其实系统并不是最极限的状态,要是对此不满意,还能在此基础上再往极限方向发展。可以在外环上加上 Kd 控制。
但是加上 Kd 控制会出现一个问题,加大了云台会开始抖,但是给小了对效果还是不满意,那么就要进行滤波操作了。
对输入误差进行滤波
对传入 PID 的数据进行滤波,低通或者一阶卡尔曼等都可以。
对外环 Kd 进行滤波
系统是由于我们加入 Kd 才会出现抖动,那么我们也可以用滤波去消除低频抖动。也是可以使用低通或一阶卡尔曼滤波器进行滤波,但是我尝试后觉得一阶卡尔曼的滤波效果要比低通更好,这个可以看本身现象调整。滤波的对象就是 Kd 算出的结果——d_out。
pid_t->d_out = pid_t->Kd * (pid_t->err - pid_t->err_last); //得到 Kd 输出值
pid_t->d_out = KalmanFilter(&Cloud_YAWODKalman, pid_t->d_out); //一阶卡尔曼滤波
滤掉低频抖动后,Kd 的参数还能继续给大,但总会有一个极限,实在到了极限也就没办法了。
单纯单环位置式PID在云台摆动大角度时底盘会出现超调现象,一个是与地面摩擦力和机械结构有关,还有一个是与功率有关。
实验室楼下场地地胶本来比较滑,加上功率限制,导致底盘在大幅度自旋的时候停下时无法提供比较大的反向电流,底盘就会超调。