【四轴】四轴PID解释 经验

admin 2019-1-16 3254

经常能遇到没做过飞行器或者刚做飞行器的同学,他们觉得四个电机都给一样的占空比飞行器就能飞起来了。更有甚者用 pcb板子粘了个桨 用飞思卡尔智能车B车电机就想造个直升机,我想说的是“这样要是能飞起来那猪都能飞上天了”。
四轴飞行器之所以这样流行主要得益于它精简的结构:
如图所示,电机1和电机3逆时针旋转的同时,电机2和电机4顺时针旋转,因此当飞行器平衡飞行时,陀螺效应和空气动力扭矩效应均被抵消。与电直相比,四旋翼飞行器有下列优势:各个旋翼对机身所施加的反扭矩与旋翼的旋转方向相反,因此当电机1和电机3逆时针旋转的同时,电机2和电机4顺时针旋转,可以平衡旋翼对机身的反扭矩。四旋翼飞行器在空间共有6个自由度(分别沿3个坐标轴作平移和旋转动作),这6个自由度的控制都可以通过调节不同电机的转速来实现。

因为电机、机械、电路的各种差异,给同样的占空比四轴没办法平稳飞起来,平衡差的一起飞就翻了,我们要想平稳飞行,必须给这个不稳定的系统做一个反馈调整,也就是这里所说的“自平衡算法”。所以四轴的飞行器研究中其实还有其它的一些算法,譬如滤波算法等等。。。

可见四轴飞行器有以下几个状态:
垂直运动

图(a)中,因有两对电机转向相反,可以平衡其对机身的反扭矩,当同时增加四个电机的输出功率,旋翼转速增加使得总的拉力增大,当总拉力足以克服整机的重量时,四旋翼飞行器便离地垂直上升;反之,同时减小四个电机的输出功率,四旋翼飞行器则垂直下降,直至平衡落地,实现了沿z轴的垂直运动。当外界扰动量为零时,在旋翼产生的升力等于飞行器的自重时,飞行器便保持悬停状态。保证四个旋翼转速同步增加或减小是垂直运动的关键。

俯仰运动

图(b)中,电机1的转速上升,电机3的转速下降,电机2、电机4的转速保持不变。为了不因为旋翼转速的改变引起四旋翼飞行器整体扭矩及总拉力改变,旋翼1与旋翼3转速改变量的大小应相等。由于旋翼1的升力上升,旋翼3的升力下降,产生的不平衡力矩使机身绕y轴旋转(方向如图所示),同理,当电机1的转速下降,电机3的转速上升,机身便绕y轴向另一个方向旋转,实现飞行器的俯仰运动。

滚转运动

与图(b)的原理相同,在图(c)中,改变电机2和电机4的转速,保持电机1和电机3的转速不变,则可使机身绕x轴旋转(正向和反向),实现飞行器的滚转运动。

偏航运动

四旋翼飞行器偏航运动可以借助旋翼产生的反扭矩来实现。旋翼转动过程中由于空气阻力作用会形成与转动方向相反的反扭矩,为了克服反扭矩影响,可使四个旋翼中的两个正转,两个反转,且对角线上的来年各个旋翼转动方向相同。反扭矩的大小与旋翼转速有关,当四个电机转速相同时,四个旋翼产生的反扭矩相互平衡,四旋翼飞行器不发生转动;当四个电机转速不完全相同时,不平衡的反扭矩会引起四旋翼飞行器转动。在图(d)中,当电机1和电机3的转速上升,电机2和电机4的转速下降时,旋翼1和旋翼3对机身的反扭矩大于旋翼2和旋翼4对机身的反扭矩,机身便在富余反扭矩的作用下绕z轴转动,实现飞行器的偏航运动,转向与电机1、电机3的转向相反。前后运动

要想实现飞行器在水平面内前后、左右的运动,必须在水平面内对飞行器施加一定的力。在图(e)中,增加电机3转速,使拉力增大,相应减小电机1转速,使拉力减小,同时保持其它两个电机转速不变,反扭矩仍然要保持平衡。按图(b)的理论,飞行器首先发生一定程度的倾斜,从而使旋翼拉力产生水平分量,因此可以实现飞行器的前飞运动。向后飞行与向前飞行正好相反。当然在图(b)图(c)中,飞行器在产生俯仰、翻滚运动的同时也会产生沿x、y轴的水平运动。前后运动侧向运动

在图(f)中,由于结构对称,所以侧向飞行的工作原理与前后运动完全一样。
俯仰 —— 俯仰角度也就是我们常说的pitch
横滚 —— 横滚角度roll
偏航 —— 偏航角度yaw
悬停 —— 保持高度不变,需要做高度PID控制
我们以这三个角度(ROW.PITCH,YAW)为自平衡系统的反馈量,为了简单起见去掉积分I,做一个PD控制,这个控制系统的模型:
所以在假设我们已经得到row,pit,yaw的情况下,电机的PID十分的简单,三个方向都做pid控制,叠加在一起就好了。以下就是飞控Control.c中的源码:
void CONTROL(float rol, float pit, float yaw)
{
u16 moto1=0,moto2=0,moto3=0,moto4=0;
PID_ROL.pout = PID_ROL.P * rol;PID_ROL.dout = PID_ROL.D * MPU6050_GYRO_LAST.X;PID_PIT.pout = PID_PIT.P * pit;
PID_PIT.dout = PID_PIT.D * MPU6050_GYRO_LAST.Y;PID_YAW.dout = PID_YAW.D * MPU6050_GYRO_LAST.Z;
PID_ROL.OUT = PID_ROL.pout + PID_ROL.iout + PID_ROL.dout;PID_PIT.OUT = PID_PIT.pout + PID_PIT.iout + PID_PIT.dout;
PID_YAW.OUT = PID_YAW.pout + PID_YAW.iout + PID_YAW.dout;
if(Rc_Get.THROTTLE>1200)//油门小于1200不起飞

moto1 = Rc_Get.THROTTLE - 1000 - PID_ROL.OUT - PID_PIT.OUT + PID_YAW.OUT; 
moto2 = Rc_Get.THROTTLE - 1000 + PID_ROL.OUT - PID_PIT.OUT - PID_YAW.OUT;
moto3 = Rc_Get.THROTTLE - 1000 + PID_ROL.OUT + PID_PIT.OUT + PID_YAW.OUT;
moto4 = Rc_Get.THROTTLE - 1000 - PID_ROL.OUT + PID_PIT.OUT - PID_YAW.OUT;}
else{moto1 = 0;moto2 = 0;moto3 = 0;moto4 = 0;}if(ARMED/*如果遥控已解锁*/)
Moto_PwmRflash(moto1,moto2,moto3,moto4);//更新占空比elseMoto_PwmRflash(0,0,0,0);
}

向右倾的时候上位机显示右侧两电机应该增加输出,左侧两电机减少输出

实际上为了让大家能够上手的快一些,我没有提到如何获得空间中的角度(YAW、PIT、ROW),上面的程序是假设在我们已经得到了四轴飞行器空间中的角度的情况下所做的控制。
细心的同学可能会有两个问题:
1.yaw轴PD控制却只有d*一个系数。这是因为加速度计无法检测水平方向的偏航角,参看陀螺仪加速度计和电子罗盘的原理
2.四个电机在占空比row,pit,yaw的out有加有减

最新回复 [0]
返回