上图是目前测试的,我前几天用的算法是增量式
float code kp=0.3,ki=0.1,kd=0.15; //0.3 0.1 0.15
char e_x1,e_x2,e_x3,e_y1,e_y2,e_y3,e_z1,e_z2,e_z3,x_set,y_set,z_set;
duk=(kp*(e_y1-e_y2)+ki*e_y1+kd*(e_y1-e_y2*2+e_y3));
PWM3+=duk;
PWM4+=duk;
PWM1-=duk;
PWM2-=duk;
我用的这种方法分配力度,我的想法是这样的,Y轴上的两个电机一边加多少力,另一边就减多少力,为了保持升力不变,不知道是否合理?因为我放在床上,可以保持在X,Y都为0度,用手轻轻推它,它能马上回正,如何我手故意摇晃它,也就是Y轴大角度摇晃,飞机立马一直左右晃,会出现超调,最多晃两下,马上失控。然后我在百度上找到了那个浅谈四轴PID的帖子,它用的是位置式PD,没有用I。如下
duk=(kp*e_y1+kd*y_jiaosudu);
他说的是利用角速度,去抑制飞机超调引起的振荡,这时候duk输出值,就是电机直接输出力大小了,我要怎么把他分配到Y轴上的4个电机呢,我想了几个小时也没有想明白,增量式,就简单Y轴上的电机,低说0度的两个电机就加速,高于0度的一边,就减速,可问题就是大角度摆动一次,就马上失控。
我特来论坛请教各位。问题
1:增量式PID,能不能改善成当大角度晃动时也能平滑回到理想角度呢?什么方法
2:位置式PID,计算出来的输出力度,如何分配到4个电机身上?
图片上有标出X,Y轴,和电机编号。
|