文档库 最新最全的文档下载
当前位置:文档库 › 四轴飞行器姿态控制算法注释

四轴飞行器姿态控制算法注释

四轴飞行器姿态控制算法注释
四轴飞行器姿态控制算法注释

从开始做四轴到现在,已经累计使用了三个月的时间,从开始的尝试用四元数法进行姿态检测,到接着使用的卡尔曼滤波算法,我们走过了很多弯路,我在从上周开始了对德国人四轴代码的研究和移植,发现德国人的代码的确有他的独到之处,改变了很多我对模型的想法,因为本人是第一次尝试着制作模型,因此感觉很多想法还是比较简单。经过了一周的时间,我将德国人的代码翻译并移植到了我目前的四轴上,并进行了调试,今天,专门请到了一个飞直升机的教练,对我们的四轴进行试飞,并与一个华科尔的四轴进行了现场比较,现在我们四轴的稳定性已经达到了商品四轴的程度。下面是我这一周时间内对德国人代码的一些理解:

德国人代码中的姿态检测算法:

首先,将陀螺仪和加速度及的测量值减常值误差,得到角速度和加速度,并对角速度进行积分,然后对陀螺仪积分和加速度计的数值进行融合。融合分为两部分,实时融合和长期融合,实时融合每一次算法周期都要执行,而长期融合没256个检测周期执行一次,(注意检测周期小于控制周期的2ms)

实时融合:

1.将陀螺仪积分和加表滤波后的值做差;

2.按照情况对差值进行衰减,并作限幅处理;

3.将衰减值加入到角度中。

长期融合:

长期融合主要包括两个部分,一是对角速度的漂移进行估计(估计值是要在每一个控制周期都耦合到角度中的),二是对陀螺仪的常值误差(也就是陀螺仪中立点)进行实时的修正。

1.将陀螺仪积分的积分和加速度积分做差(PS:为什么这里要使用加表积分和陀螺仪积分的积分,因为在256个检测周期内,有一些加速度计的值含有有害的加速度分量,如果只使用一个时刻的加表值对陀螺仪漂移进行估计,显然估计值不会准确,使用多个周期的值进行叠加后做座平均处理,可以减小随机的有害加速度对估计陀螺仪漂移过程中所锁产生的影响)

2.将上面两个值进行衰减,得到估计的陀螺仪漂移

3.对使考虑了陀螺仪漂移和不考虑陀螺仪漂移得到的角度做差,如果这两个值较大,说明陀螺仪在前段时间内测到的角速率不够准确,需要对差值误差(也就是陀螺仪中立点)进行修正,修正幅度和差值有关

长期融合十分关键,如果不能对陀螺仪漂移做修正,则系统运行一段时间后,速率环的稳定性会降低。

下面比较一下德国四轴中姿态检测部分和卡尔曼滤波之间的关系:

卡尔曼滤波是一种线性系统的最优估计滤波方法。对于本系统而言,使用卡尔曼滤波的作用是通过对系统状态量的估计,和通过加速度计测量值对系统状态进行验证,从而得到该系统的最优状态量,并实时更新系统的各参数(矩阵),而最重要的一点,改滤波器能够对陀螺仪的常值漂移进行估计,从而保证速率环的正常运行,并在加速度计敏感到各种有害加速度的时候,使姿态检测更加准确。但是卡尔曼滤波器能否工作在最优状态很大程度上取决于系统模型的准确性,模型参数的标定和系统参数的选取。然而,仅仅通过上位机观测而得到最优工作参数是不显示的,因为参数的修改会导致整个系统中很多地方发生改变,很难保证几个值都恰好为最优解,这需要扎实的理论知识,大量的测量数据和系统的仿真,通过我对卡尔曼滤波器的使用,发现要想兼顾锁有的问题,还是有一定难度的。

而德国人的姿态检测部分是在尝试使用一种简单方法去解决复杂问题,他既没有使用传统的四元数法进行姿态检测,也么有使用卡尔曼滤波。他的计算量不比最简单的卡尔曼滤程序波程序的计算量小,但与卡尔曼滤波相比,更加直观,易于理解,参数调节也更加方便。我个人理解,这个方法是在尝试着对卡尔曼滤波这一复杂相互耦合的多状态变量的线性系统状态估计过程进行了简单的解耦,从而将姿态的最优估计和陀螺仪漂移的最优估计分隔开,这样,就可以通过比较直观的观测手段对两个部分的参数进行调整,但是,这种方法的理论性肯定不如使用四元数法和卡尔曼滤波,在一些特殊的情况下还可能出现问题,但是,由于卡尔曼滤波器设计的难度,使用这种方法还是比较现实的。

控制算法:

德国人的控制算法的核心是对角速度做PI计算,P的作用是使四轴能够产生对于外界干扰的抵抗力矩,I的作用是让四轴产生一个与角度成正比的抵抗力。

如果只有P的作用,将四轴拿在手上就会发现,四轴能够抵抗外界的干扰力矩的作用,而且这个抵抗力非常快速,只要手妄图改变四轴的转速,四轴就会产生一个抵抗力矩,但是,如果用手将四轴扳过一个角度,则四轴无法自己回到水平的角度位置,这就需要I的调节作用。

对角速度做I(积分)预算实际得到的就是角度,德国人四轴里面用的也是角度值,如果四轴有一个倾斜角度,那么四轴就会自己进行调整,直到四轴的倾角为零,它所产生的抵抗力是与角度成正比的,但是,如果只有I的作用,会使四轴迅速产生振荡,因此,必须将P 和I结合起来一起使用,这时候基本上就会得到德国四轴的效果了。

在对角速度进行了PI调节之后,德国人将操纵杆的值融合到结果中去,并对得到的新的值有进行了一次PI计算,这个积分参数很小,使用这个积分的作用因为,四轴在有一个非常小的倾角的情况下产生的抵抗力矩很小,无法使四轴回到水平位置,这就会导致无论怎么手动调节微调,四轴都很难做到悬停,会不停得做水平漂移运动,这就必须不停的进行调整。

下面是我给德国四轴中飞控程序的一些注释:

void Piep(unsigned char Anzahl)

{

while(Anzahl--)

{

if(MotorenEin) return; //auf keinen Fall im Flug!

beeptime = 100;

Delay_ms(250);

}

}

//函数:SetNeutral设定传感器发出参数的中立数值,因为有漂移所以要使其每次工作都要测量出来。

//######################################################################### ###

// Nullwerte ermitteln

/*设置中立点*/

void SetNeutral(void)

//######################################################################### ###

{

/*加速度计中立点*/

NeutralAccX = 0;

NeutralAccY = 0;

NeutralAccZ = 0;

/*陀螺仪中立点*/

AdNeutralNick = 0;

AdNeutralRoll = 0;

AdNeutralGier = 0;

Parameter_AchsKopplung1 = 0;

Parameter_AchsGegenKopplung1 = 0;。。。

/*这个地方我还没有弄得太明白,检测中立点的函数被调用了两次,但是第一次的数据好像没有保存,只用到了

第二次的数据*/

/*记录中立点*/

CalibrierMittelwert();

Delay_ms_Mess(100);

/*记录中立点*/

CalibrierMittelwert();

/*既然只使用了后一次的数据,为什么要进行两次记录中立点的函数*/

if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG))

{

if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset();//如果气压表输出在

950外750内,则设定气压初始的偏差。

}

/*将量测值作为陀螺仪的中立点*/

AdNeutralNick= AdWertNick;

AdNeutralRoll= AdWertRoll;

AdNeutralGier= AdWertGier;

/*这两个参数在飞控程序中没有用到*/

StartNeutralRoll = AdNeutralRoll;

StartNeutralNick = AdNeutralNick;

if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) //

{

/*由于在函数CalibrierMittelwert()中加速度计的输出乘以了ACC_AMPLIFY,所以这里必须处以ACC_AMPLIFY,

在这段程序中,所有的对加速度计和陀螺仪的数值的衰减或者放大都是为了让

陀螺仪积分和加速度计数值在同样的角度偏差的情况下能基本匹配,如果不匹配,那么就谈不上用加速度计来补

偿陀螺仪积分了*/

NeutralAccY = abs(Mittelwert_AccRoll) / ACC_AMPLIFY;

NeutralAccX = abs(Mittelwert_AccNick) / ACC_AMPLIFY;

NeutralAccZ = Aktuell_az;

}

else

{

/*如果发现变化不大,则仍然储存上一次的*/

NeutralAccX = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) * 256 + (int)

eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1]);

NeutralAccY = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL]) * 256 + (int)

eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1]);

NeutralAccZ = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z]) * 256 + (int)

eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1]);

}

/*将所有数据清零,这里带2的变量都是加入了陀螺仪漂移补偿值之后得到的角度*/ Mess_IntegralNick = 0;

Mess_IntegralNick2 = 0;

Mess_IntegralRoll = 0;

Mess_IntegralRoll2 = 0;

Mess_Integral_Gier = 0;

MesswertNick = 0;

MesswertRoll = 0;

MesswertGier = 0;

StartLuftdruck = Luftdruck;

HoeheD = 0;

Mess_Integral_Hoch = 0;

KompassStartwert = KompassValue;

GPS_Neutral();

beeptime = 50; //

/*从EEPROM中读取陀螺仪积分到达90°时候的值,并储存,当得到的姿态角度大于这个范围时,说明超过了90°

,就要进行相应的处理*/

Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L;

Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L;

ExternHoehenValue = 0;

}

///////////////////////////////

//函数描述:求参数的平均数值

//////////////////////////////

//######################################################################### ###

// Bearbeitet die Messwerte

void Mittelwert(void)

// 根据测量值计算陀螺仪和加速度计数据

//######################################################################### ###

{

static signed long tmpl,tmpl2;

/*将陀螺仪数据减去常值误差,得到实际的叫速率的倍数*/

MesswertGier = (signed int) AdNeutralGier - AdWertGier;

MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll;

MesswertNick = (signed int) AdWertNick - AdNeutralNick;

//DebugOut.Analog[26] = MesswertNick;

DebugOut.Analog[28] = MesswertRoll;

//加速度传感器输出

/*加速度计数据滤波,ACC_AMPLIFY=12 得到的Mittelwert_AccNick是加速度计数值的12倍*/

/*AdWertAccNick为测量值*/

// Beschleuni×gssensor ++++++++++++++++++++++++++++++++++++++++++++++++

Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) /

2L;//具有滤波功能的方法,用当前加速度和上次的加速度平均

Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 1 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 2L;

Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 1 + ((long)AdWertAccHoch)) / 2L;

/*计算加速度计的积分,加速度计对运动十分敏感,采用加速度计积分,可以减少瞬间的运动加速度的影响*/

IntegralAccNick += ACC_AMPLIFY * AdWertAccNick;

IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll;

IntegralAccZ += Aktuell_az - NeutralAccZ;

// Gier ++++++++++++++++++++++++++++++++++++++++++++++++

/*偏航方向无法进行滤波,因此直接进行积分得到偏航角度*/

Mess_Integral_Gier += MesswertGier;

Mess_Integral_Gier2 += MesswertGier;

/*耦合项应该是另外两个陀螺仪对这个轴上陀螺仪的影响,当四轴在稳定姿态不为水平的时候,进行偏航运动时

候所进行的补偿*/

/*假设目前的俯仰角是30°,而横滚角是0°,这时候如保持俯仰和横滚轴没有任何运动,而将偏航轴转动90°

,那么实际的俯仰角就会变为0°,横滚角就会变为30°

但是,按照目前的算法,由于俯仰和横滚方向没有运动,因此就不会有陀螺仪的积分,俯仰和横滚角是不变的

,这就是采用陀螺仪直接积分测角度的不完善性,这时候

使用加速度计对姿态进行修正能够起到作用,但是需要一段时间,使用下面的这段话,就是将偏航轴的运动耦

合在另外两个轴上,使姿态角度能够迅速收敛到真实值上*/

/*注:使用四元数法进行姿态结算可以避免出现这种问题,但这种方法需要有准确的陀螺仪和加表的数学模型,四元数法还需要进行大量的矩阵计算,

而且对四元数姿态进行加速度计的融合不太方便*/

if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig &

CFG_ACHSENKOPPLUNG_AKTIV))//不在俯仰滚转控制循环中

{

tmpl = Mess_IntegralNick / 4096L;

tmpl *= MesswertGier;

tmpl *= Parameter_AchsKopplung1; //125

tmpl /= 2048L;

tmpl2 = Mess_IntegralRoll / 4096L;

tmpl2 *= MesswertGier;

tmpl2 *= Parameter_AchsKopplung1;

tmpl2 /= 2048L;

}

else tmpl = tmpl2 = 0;

// Roll ++++++++++++++++++++++++++++++++++++++++++++++++

MesswertRoll += tmpl;

MesswertRoll += (tmpl2*Parameter_AchsGegenKopplung1)/512L;

Mess_IntegralRoll2 += MesswertRoll;

Mess_IntegralRoll += MesswertRoll - LageKorrekturRoll;

/*积分超过半圈的情况*/

if(Mess_IntegralRoll > Umschlag180Roll)

{

Mess_IntegralRoll = -(Umschlag180Roll - 10000L);

Mess_IntegralRoll2 = Mess_IntegralRoll;

}

if(Mess_IntegralRoll <-Umschlag180Roll)//一样

{

Mess_IntegralRoll = (Umschlag180Roll - 10000L);

Mess_IntegralRoll2 = Mess_IntegralRoll;

}

if(AdWertRoll < 15) MesswertRoll = -1000;

if(AdWertRoll < 7) MesswertRoll = -2000;

if(PlatinenVersion == 10)

{

if(AdWertRoll > 1010) MesswertRoll = +1000;

if(AdWertRoll > 1017) MesswertRoll = +2000;

}

else

{

if(AdWertRoll > 2020) MesswertRoll = +1000;

if(AdWertRoll > 2034) MesswertRoll = +2000;

}

// Nick ++++++++++++++++++++++++++++++++++++++++++++++++

MesswertNick -= tmpl2;

MesswertNick -= (tmpl*Parameter_AchsGegenKopplung1)/512L;

Mess_IntegralNick2 += MesswertNick;

/*LageKorrekturNick是通过加速度计积分和角速率积分的积分进行做差比较得到的,*/

Mess_IntegralNick += MesswertNick - LageKorrekturNick;

if(Mess_IntegralNick > Umschlag180Nick)

{

Mess_IntegralNick = -(Umschlag180Nick - 10000L);

Mess_IntegralNick2 = Mess_IntegralNick;

}

if(Mess_IntegralNick <-Umschlag180Nick)

{

Mess_IntegralNick = (Umschlag180Nick - 10000L);

Mess_IntegralNick2 = Mess_IntegralNick;

}

if(AdWertNick < 15) MesswertNick = -1000;

if(AdWertNick < 7) MesswertNick = -2000;

if(PlatinenVersion == 10)

{

if(AdWertNick > 1010) MesswertNick = +1000;

if(AdWertNick > 1017) MesswertNick = +2000;

}

else

{

if(AdWertNick > 2020) MesswertNick = +1000;

if(AdWertNick > 2034) MesswertNick = +2000;

}

//++++++++++++++++++++++++++++++++++++++++++++++++

// ADC einschalten

ANALOG_ON; //重新开始模拟量的采集

//++++++++++++++++++++++++++++++++++++++++++++++++

/*上一步计算完了积分之后,现在将积分赋值,因此后面使用的就将是IntegralNick,IntegralNick2等数据了

*/

Integral_Gier = Mess_Integral_Gier;

IntegralNick = Mess_IntegralNick;

IntegralRoll = Mess_IntegralRoll;

IntegralNick2 = Mess_IntegralNick2;

IntegralRoll2 = Mess_IntegralRoll2;

/*这部分代码不执行,因为在EEPROM中CFG_DREHRATEN_BEGRENZER这一位为0*/ if(EE_Parameter.GlobalConfig & CFG_DREHRATEN_BEGRENZER && !Looping_Nick

&& !Looping_Roll)

{

if(MesswertNick > 200) MesswertNick += 4 * (MesswertNick - 200);

else if(MesswertNick < -200) MesswertNick += 4 * (MesswertNick + 200);

if(MesswertRoll > 200) MesswertRoll += 4 * (MesswertRoll - 200);

else if(MesswertRoll < -200) MesswertRoll += 4 * (MesswertRoll + 200);

}

if(Poti1 < PPM_in[EE_Parameter.Kanalbe le×g[K_POTI1]] + 110) Poti1++;

else if(Poti1 > PPM_in[EE_Parameter.Kanalbele×g[K_POTI1]] + 110 && Poti1) Poti1--;

if(Poti2 < PPM_in[EE_Parameter.Kanalbele×g[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in

[EE_Parameter.Kanalbele×g[K_POTI2]] + 110 && Poti2) Poti2--;

if(Poti3 < PPM_in[EE_Parameter.Kanalbele×g[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in

[EE_Parameter.Kanalbele×g[K_POTI3]] + 110 && Poti3) Poti3--;

if(Poti4 < PPM_in[EE_Parameter.Kanalbele×g[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in

[EE_Parameter.Kanalbele×g[K_POTI4]] + 110 && Poti4) Poti4--;

if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255;

if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255;

if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255;

if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255;

}

//函数:校正平均值

//######################################################################### ###

// Messwerte beim Ermitteln der Nullage

/*确定零位*/

/*记录中立点*/

void CalibrierMittelwert(void)

###

{

// ADC auschalten, damit die Werte sich nicht w鋒rend der Berechnung 鋘dern ANALOG_OFF;

MesswertNick = AdWertNick;

MesswertRoll = AdWertRoll;

MesswertGier = AdWertGier;

/*要乘以 ACC_AMPLIFY 是为了进行数值的匹配*/

Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick;

Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll;

Mittelwert_AccHoch = (long)AdWertAccHoch;

// ADC einschalten

ANALOG_ON; //开模拟量

if(Poti1 < PPM_in[EE_Parameter.Kanalbele×g[K_POTI1]] + 110) Poti1++;

else if(Poti1 > PPM_in[EE_Parameter.Kanalbele×g[K_POTI1]] + 110 && Poti1) Poti1--;

if(Poti2 < PPM_in[EE_Parameter.Kanalbele×g[K_POTI2]] + 110) Poti2++;

else if(Poti2 > PPM_in[EE_Parameter.Kanalbele×g[K_POTI2]] + 110 && Poti2) Poti2--;

if(Poti3 < PPM_in[EE_Parameter.Kanalbele×g[K_POTI3]] + 110) Poti3++;

else if(Poti3 > PPM_in[EE_Parameter.Kanalbele×g[K_POTI3]] + 110 && Poti3) Poti3--;

if(Poti4 < PPM_in[EE_Parameter.Kanalbele×g[K_POTI4]] + 110) Poti4++;

else if(Poti4 > PPM_in[EE_Par ameter.Kanalbele×g[K_POTI4]] + 110 && Poti4) Poti4--;

if(Poti1 < 0) Poti1 = 0;

else if(Poti1 > 255) Poti1 = 255;

if(Poti2 < 0) Poti2 = 0;

else if(Poti2 > 255) Poti2 = 255;

if(Poti3 < 0) Poti3 = 0;

else if(Poti3 > 255) Poti3 = 255;

if(Poti4 < 0) Poti4 = 0;

else if(Poti4 > 255) Poti4 = 255;

/*这两个数据是在对陀螺仪积分区域进行的限制,如果超过这个范围,说明就超出了+-90°的范围,则需要相应

的改变*/

Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L;

Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagNick * 2500L;

}

//发送电机数据

###

// Senden der Motorwerte per I2C-Bus

void SendMotorData(void)

//######################################################################### ###

{

if(MOTOR_OFF || !MotorenEin)//关机或未工作

{

Motor_Hinten = 0;

Motor_Vorne = 0;

Motor_Rechts = 0;

Motor_Links = 0;//都置零

if(MotorTest[0]) Motor_Vorne = MotorTest[0];

if(MotorTest[1]) Motor_Hinten = MotorTest[1];

if(MotorTest[2]) Motor_Links = MotorTest[2];

if(MotorTest[3]) Motor_Rechts = MotorTest[3];//如果是试验就干。

}

DebugOut.Analog[12] = Motor_Vorne;

DebugOut.Analog[13] = Motor_Hinten;

DebugOut.Analog[14] = Motor_Links;

DebugOut.Analog[15] = Motor_Rechts;

//Start I2C Interrupt Mode

twi_state = 0;

motor = 0;

i2c_start();

}

//函数:参数分配

//######################################################################### ###

// Tr鋑t ggf. das Poti als Parameter ein

void ParameterZuordnung(void)

//######################################################################### ###

{

//

/*这个宏定义的作用是:将a中的值赋给b,并将b限制在max和min之间*/

#define CHK_POTI(b,a,min,max) { if(a > 250) { if(a == 251) b = Poti1; else if(a == 252) b =

Poti2; else if(a == 253) b = Poti3; else if(a == 254) b = Poti4;} else b = a; if(b <= min) b =

min; else if(b >= max) b = max;}

CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe,0,255);

CHK_POTI(Parameter_Luftdruck_D,EE_Parameter.Luftdruck_D,0,100);

CHK_POTI(Parameter_Hoehe_P,EE_Parameter.Hoehe_P,0,100);

CHK_POTI(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung,0,255);

CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung,0,255);

CHK_POTI(Parameter_Gyro_P,EE_Parameter.Gyro_P,10,255);

CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I,0,255);

CHK_POTI(Parameter_I_Faktor,EE_Parameter.I_Faktor,0,255);

CHK_POTI(Parameter_UserParam1,EE_https://www.wendangku.net/doc/e212763335.html,erParam1,0,255);

CHK_POTI(Parameter_UserParam2,EE_https://www.wendangku.net/doc/e212763335.html,erParam2,0,255);

CHK_POTI(Parameter_UserParam3,EE_https://www.wendangku.net/doc/e212763335.html,erParam3,0,255);

CHK_POTI(Parameter_UserParam4,EE_https://www.wendangku.net/doc/e212763335.html,erParam4,0,255);

CHK_POTI(Parameter_UserParam5,EE_https://www.wendangku.net/doc/e212763335.html,erParam5,0,255);

CHK_POTI(Parameter_UserParam6,EE_https://www.wendangku.net/doc/e212763335.html,erParam6,0,255);

CHK_POTI(Parameter_UserParam7,EE_https://www.wendangku.net/doc/e212763335.html,erParam7,0,255);

CHK_POTI(Parameter_UserParam8,EE_https://www.wendangku.net/doc/e212763335.html,erParam8,0,255);

CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255);

CHK_POTI(Parameter_LoopGasLimit,EE_Parameter.LoopGasLimit,0,255);

CHK_POTI(Parameter_AchsKopplung1, EE_Parameter.AchsKopplung1,0,255);

CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255 );

CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability,0,255);

Ki = (float) Parameter_I_Faktor * 0.0001;

MAX_GAS = EE_Parameter.Gas_Max;

MIN_GAS = EE_Parameter.Gas_Min;

}

/*飞控核心*/

//######################################################################### ###

//

void MotorRegler(void)

//######################################################################### ###

{

int motorwert,pd_ergebnis,h,tmp_int;//电机数值,PI算法的计算数值

int GierMischanteil,GasMischanteil;//偏航混合数值,油门混和数值

static long SummeNick=0,SummeRoll=0;//俯仰积分总和,滚转积分总和

static long sollGier = 0,tmp_long,tmp_long2;//标准偏航值,

static long IntegralFehlerNick = 0;//俯仰误差积分

static long IntegralFehlerRoll = 0;//滚转误差积分

static unsigned int RcLostTimer;

static unsigned char delay_neutral = 0;

static unsigned char delay_einschalten = 0,delay_ausschalten = 0;//延迟接通,延迟关闭

static unsigned int modell_fliegt = 0;//飞机飞行时间

static int hoehenregler = 0;//高度调节

static char TimerWerteausgabe = 0;//时间数值

static char NeueKompassRichtungMerken = 0;//罗盘方向调整中立值

static long ausgleichNick, ausgleichRoll;//俯仰均衡,滚转均衡

/*根据测量值计算陀螺仪和加速度计数据*/

Mittelwert();

GRN_ON;//打开端口

//

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++

// Gaswert ermitteln//判断油门数值

//

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++

GasMischanteil = StickGas;

if(GasMischanteil < 0) GasMischanteil = 0;

//

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++

// Emfang schlecht//无线电故障,不好

//

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++

if(SenderOkay < 100)

{

if(!PcZugriff)

{

if(BeepMuster == 0xffff)

{

beeptime = 15000;

BeepMuster = 0x0c00;

}

}

if(RcLostTimer) RcLostTimer--;

else

{

MotorenEin = 0;

Notlandung = 0;

}

ROT_ON;

if(modell_fliegt > 2000)

{

GasMischanteil = EE_Parameter.NotGas;

Notlandung = 1;

PPM_in[EE_Parameter.Kanalbele×g[K_NICK]] = 0;

PPM_in[EE_Parameter.Kanalbele×g[K_ROLL]] = 0;

PPM_in[EE_Parameter.Kanalbele×g[K_GIER]] = 0;

}

else

MotorenEin = 0;

} // end of if(SenderOkay < 100)

//

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++

// Emfang gut//

//

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++

else if(SenderOkay > 140)

{

Notlandung = 0;

RcLostTimer = EE_Parameter.NotGasZeit * 50;

if(GasMischanteil > 40)

{

if(modell_fliegt < 0xffff)

modell_fliegt++;

}

if((modell_fliegt < 200) || (GasMischanteil < 40))

{

SummeNick = 0;

SummeRoll = 0;

Mess_Integral_Gier = 0;

Mess_Integral_Gier2 = 0;

}

//

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++

// auf Nullwerte kalibrieren

//

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++

if((PPM_in[EE_Parameter.Kanalbele×g[K_GAS]] > 80) && MotorenEin == 0) {

if(PPM_in[EE_Parameter.Kanalbele×g[K_GIER]] > 75)

{

if(++delay_neutral > 200)

{

GRN_OFF;

MotorenEin = 0;

delay_neutral = 0;

modell_fliegt = 0;

if(PPM_in[EE_Parameter.Kanalbele×g[K_NICK]] > 70 || abs(PPM_in

[EE_Parameter.Kanalbele×g[K_ROLL]]) > 70)

{

unsigned char setting=1;

if(PPM_in[EE_Parameter.Kanalbele×g[K_ROLL]] > 70 && PPM_in

[E E_Parameter.Kanalbele×g[K_NICK]] < 70) setting = 1;

if(PPM_in[EE_Parameter.Kanalbele×g[K_ROLL]] > 70 && PPM_in

[EE_Parameter.Kanalbele×g[K_NICK]] > 70) setting = 2;

if(PPM_in[EE_Parameter.Kanalbele×g[K_ROLL]] < 70 && PPM_in

[EE_Parameter.Kanalbele×g[K_NICK]] > 70) setting = 3;

if(PPM_in[EE_Parameter.Kanalbele×g[K_ROLL]] <-70 && PPM_in

[EE_Parameter.Kanalbele×g[K_NICK]] > 70) setting = 4;

if(PPM_in[EE_Parameter.Kanalbele×g[K_ROLL]] <-70 && PPM_in

[EE_Parameter.Kanalbele×g[K_NICK]] < 70) setting = 5;

eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], setting);

}

if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // H鰄enregelung aktiviert?

{

if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset();

}

ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *)

&EE_Parameter.Kanalbele×g[0], STRUCT_PARAM_LAENGE);

SetNeutral();

Piep(GetActiveParamSetNumber());

}

}

else if(PPM_in[EE_Parameter.Kanalbele×g[K_GIER]] < -75)

{

if(++delay_neutral > 200) // nicht sofort

{

GRN_OFF;

eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK],0xff); // Werte l鰏chen MotorenEin = 0;

delay_neutral = 0;

modell_fliegt = 0;

SetNeutral();//设立中性点。

eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK],NeutralAccX / 256); // ACC-NeutralWerte speichern

eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1],NeutralAccX % 256); // ACC-NeutralWerte speichern

eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL],NeutralAccY / 256);

eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1],NeutralAccY % 256);

eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_Z],(int)NeutralAccZ / 256);

eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1],(int)NeutralAccZ % 256);

Piep(GetActiveParamSetNumber());

}

}

else

delay_neutral = 0;

} // end if of if(PPM_in[EE_Parameter.Kanalbele×g[K_GIER]] > 75)

//

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++

// Gas ist unten

//

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++

if(PPM_in[EE_Parameter.Kanalbele×g[K_GAS]] < 35-120)

{

// Starten

if(PPM_in[EE_Parameter.Kanalbele×g[K_GIER]] < -75)

{

//

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++

// Einschalten

//

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++

if(++delay_einschalten > 200)

{

delay_einschalten = 200;

modell_fliegt = 1;

MotorenEin = 1;

sollGier = 0;

Mess_Integral_Gier = 0;

Mess_Integral_Gier2 = 0;

Mess_IntegralNick = 0;

Mess_IntegralRoll = 0;

Mess_IntegralNick2 = IntegralNick;

Mess_IntegralRoll2 = IntegralRoll;

SummeNick = 0;

SummeRoll = 0;

}

}

else

delay_einschalten = 0;//没事,就让其延迟关闭为0

//Auf Neutralwerte setzen

//

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++

// Auschalten

/*切换*/

//

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++

if(PPM_in[EE_Parameter.Kanalbele×g[K_GIER]] > 75)

{

if(++delay_ausschalten > 200) // nicht sofort

{

MotorenEin = 0;

delay_ausschalten = 200;

modell_fliegt = 0;

}

}

else delay_ausschalten = 0;

}

} // end if of else if(SenderOkay > 140)

//

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++

// neue Werte von der Funke

//

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++

if(!NewPpmData-- || Notlandung)

{

int tmp_int;

static int stick_nick,stick_roll;//俯仰杆,倾斜杆

ParameterZuordnung();

/*新老数据滤波混合,这里改变的应该是期望角位置,必须知道EE_Parameter.Stick_P 的数值才可以得到滤波效

果*/

StickNick = (StickNick * 3 + PPM_in[EE_Parameter.Kanalbele×g[K_NICK]] * EE_Parameter.Stick_P) / 4; //新数据和老数据混合起滤波作用

/*将期望角位置的微分加入操纵杆变量上,这里必须知道

EE_Parameter.Kanalbele×g[K_ROLL]的求法,和

EE_Parameter.Stick_D得数值*/

StickN ick += PPM_diff[EE_Parameter.Kanalbele×g[K_NICK]] *

EE_Parameter.Stick_D;//增加上微分

量,用于提高反应的快速性。

StickRoll = (StickRoll * 3 + PPM_in[EE_Parameter.Kanalbele×g[K_ROLL]] * EE_Parameter.Stick_P) / 4;

StickRoll += PPM_diff[EE_Parameter.Kanalbele×g[K_ROLL]] *

EE_Parameter.Stick_D;

StickGier = -PPM_in[EE_Parameter.Kanalbele×g[K_GIER]];

StickGas = PPM_in[EE_Parameter.Kanalbele×g[K_GAS]] + 120;

/*用此记录历史上的最大给杆量,如果给杆量很小,则Max数值会不断减小,用于在后面给陀螺仪积分做补偿时

,对加速度计数据和陀螺仪积分的差值做衰减*/

if(abs(PPM_in[EE_Parameter.Kanalbele×g[K_NICK]]) > MaxStickNick)

MaxStickNick = abs(PPM_in[EE_Parameter.Kanalbele×g[K_NICK]]); else MaxStickNick--;

if(abs(PPM_in[EE_Parameter.Kanalbele×g[K_ROLL]]) > MaxStickRoll)

MaxStickRoll = abs(PPM_in[EE_Parameter.Kanalbele×g[K_ROLL]]); else MaxStickRoll--;

/*如果在降落过程中,则数据为0,也就是说降落的过程中不需要衰减,降落时候的保持位置全部为0,所以不需

要衰减*/

if(Notlandung)

{

MaxStickNick = 0; MaxStickRoll = 0;

}

/*可以认为是控制参数,前一个是陀螺仪的比例项(速率环参数) 后一个是陀螺仪积分即姿态角的比例(位置

环参数)*/

GyroFaktor = ((float) Parameter_Gyro_P + 10.0) / 256.0;

IntegralFaktor = ((float) Parameter_Gyro_I) / 44000;

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++

//+ Digitale Steuerung per DubWise

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++

#define KEY_VALUE (Parameter_UserParam1 * 4) //(Poti3 * 8)//为了增加杆的输入的丰富性,提供了扩展

的杆的描述,对最终杆的描述更加丰富。

if(DubWiseKeys[1])

beeptime = 10;

if(DubWiseKeys[1] & DUB_KEY_UP)

tmp_int = KEY_VALUE;

else if(DubWiseKeys[1] & DUB_KEY_DOWN)

tmp_int = -KEY_VALUE;

else

tmp_int = 0;

ExternStickNick = (ExternStickNick * 7 + tmp_int) / 8;

if(DubWiseKeys[1] & DUB_KEY_LEFT)

tmp_int = KEY_VALUE;

else if(DubWiseKeys[1] & DUB_KEY_RIGHT)

tmp_int = -KEY_VALUE;

else

tmp_int = 0;

ExternStickRoll = (ExternStickRoll * 7 + tmp_int) / 8;

if(DubWiseKeys[0] & 8)

ExternStickGier = 50;

else if(DubWiseKeys[0] & 4)

ExternStickGier =-50;

else

ExternStickGier = 0;

if(DubWiseKeys[0] & 2)

ExternHoehenValue++;

if(DubWiseKeys[0] & 16)

ExternHoehenValue--;

StickNick += ExternStickNick / 8;

StickRoll += ExternStickRoll / 8;

StickGier += ExternStickGier;

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++

//+ Analoge Steuerung per Seriell

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++

if(ExternControl.Config & 0x01 && Parameter_UserParam1 > 128)//同上,具有扩展功能的控制输入

{

StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P;

StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P;

StickGier += ExternControl.Gier;

ExternHoehenValue = (int) ExternControl.Hight *

(int)EE_Parameter.Hoehe_Verstaerkung;

if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas;

}

/*陀螺仪积分比例为零,应该是Looping的情况?*/

if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD)

IntegralFaktor = 0;

if(GyroFaktor < 0) GyroFaktor = 0;

if(IntegralFaktor < 0) IntegralFaktor = 0;

//

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++

// Looping?//这里是在空中转圈的情况

//

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++

if((PPM_in[EE_Parameter.Kanalbele×g[K_ROLL]] > EE_Parameter.LoopThreshold) &&

EE_Parameter.LoopConfig & CFG_LOOP_LINKS) Looping_Links = 1;

else

{

{

if((PPM_in[EE_Parameter.Kanalbele×g[K_ROLL]] < (EE_Parameter.LoopThreshold -

EE_Parameter.LoopHysterese))) Looping_Links = 0;

}

}

if((PPM_in[EE_Parameter.Kanalbele×g[K_ROLL]] < -EE_Parameter.LoopThreshold) &&

EE_Parameter.LoopConfig & CFG_LOOP_RECHTS) Looping_Rechts = 1;

else

{

if(Looping_Rechts) // Hysterese

{

if(PPM_in[EE_Parameter.Kanalbele×g[K_ROLL]] > -(EE_Parameter.LoopThreshold -

EE_Parameter.LoopHysterese)) Looping_Rechts = 0;

}

}

if((PPM_in[EE_Parameter.Kanalbele×g[K_NICK]] > EE_Parameter.LoopThreshold) &&

EE_Parameter.LoopConfig & CFG_LOOP_OBEN) Looping_Oben = 1;

else

{

if(Looping_Oben) // Hysterese

{

if((PPM_in[EE_Parameter.Kanalbele×g[K_NICK]] < (EE_Parameter.LoopThreshold -

EE_Parameter.LoopHysterese))) Looping_Oben = 0;

}

}

if((PPM_in[EE_Parameter.Kanalbele×g[K_NICK]] < -EE_Parameter.LoopThreshold) &&

EE_Parameter.LoopConfig & CFG_LOOP_UNTEN) Looping_Unten = 1;

else

{

if(Looping_Unten) // Hysterese

{

if(PPM_in[EE_Parameter.Kanalbele×g[K_NICK]] > -(EE_Parameter.LoopThreshold -

EE_Parameter.LoopHysterese)) Looping_Unten = 0;

}

}

/*不应该出现轴都是Looping的情况*/

if(Looping_Links || Looping_Rechts) Looping_Roll = 1; else Looping_Roll = 0;

if(Looping_Oben || Looping_Unten) {Looping_Nick = 1; Looping_Roll = 0; Looping_Links = 0;

Looping_Rechts = 0;} else Looping_Nick = 0;

} // end if of if(!NewPpmData-- || Notlandung)

if(Looping_Roll) beeptime = 100;

if(Looping_Roll || Looping_Nick)

{

轴飞行器作品说明书

四轴飞行器 作品说明书 摘要 四轴飞行器在各个领域应用广泛。相比其他类型的飞行器,四轴飞行器硬件结构简单紧凑,而软件复杂。本文介绍四轴飞行器的一个实现方案,软件算法,包括加速度计校正、姿态计算和姿态控制三部分。校正加速度计采用最小二乘法。计算姿态采用姿态插值法、需要对比这三种方法然后选出一种来应用。控制姿态采用欧拉角控制或四元数控制。 关键词:四轴飞行器;姿态;控制

目录 1.引言 (1) 2.飞行器的构成? (1) .硬件构成..............................................1? 机械构成 (1) 电气构成 (3) .软件构成 (3) 上位机 (3) 下位机........... . (4) 3.飞行原理........... ................................ (4) . 坐标系统 (4) .姿态的表示 (5) .动力学原理 (5) 4.姿态测量........... ................................ (6) .传感器校正 (6) 加速度计和电子罗盘 (6) 5.姿态控制 (6) .欧拉角控制 (6) .四元数控制 (7) 6.姿态计算 (7) 7.总结 (8) 参考文献 (9)

四轴飞行器最开始是由军方研发的一种新式飞行器。随着MEMS?传感器、单片机、电机和电池技术的发展和普及,四轴飞行器成为航模界的新锐力量。到今天,四轴飞行器已经应用到各个领域,如军事打击、公安追捕、灾害搜救、农林业调查、输电线巡查、广告宣传航拍、航模玩具等。 目前应用广泛的飞行器有:固定翼飞行器和单轴的直升机。与固定翼飞行器相比,四轴飞行器机动性好,动作灵活,可以垂直起飞降落和悬停,缺点是续航时间短得多、飞行速度不快;而与单轴直升机比,四轴飞行器的机械简单,无需尾桨抵消反力矩,成本低?。 本文就小型电动四轴飞行器,介绍四轴飞行器的一种实现方案,讲解四轴飞行器的原理和用到的算法,并对几种姿态算法进行比较。 2.飞行器的构成 四轴飞行器的实现可以分为硬件和软件两部分。比起其他类型的飞行器,四轴飞行器的硬件比较简单,而把系统的复杂性转移到软件上,所以本文的主要内容是软件的实现。? .硬件构成? 飞行器由机架、电机、螺旋桨和控制电路构成。 机械构成? 机架呈十字状,是固定其他部件的平台,本项目采用的是碳纤维材料的机架。电机采用无刷直流电机,固定在机架的四个端点上,而螺旋桨固定在电机转子上,迎风面垂直向下。螺旋桨按旋转方向分正桨和反桨,从迎风面看逆时针转的为正桨,四个桨的中心连成的正方形,正桨反桨交错安装。 CA D设计机架如图: 整体如图2-1: 电气构成 电气部分包括:控制电路板、电子调速器、电池,和一些外接的通讯、传感器模块。控制电路板是电气部分的核心,上面包含MCU、陀螺仪、加速度计、电子罗盘、气压计等芯片,负责计算姿态、处理通信命令和输出控制信号到电子调速器。电子调速器简称电调,用于控制无刷直流电机。 电气连接如图2-2所示。 .软件构成

四轴飞行器运动分析

四轴飞行器运动分析 一、飞行原理 四轴飞行器的结构形如图所示,其中同一对角线上的电机转向应该相同,不同对角线上的电机转向应该相反。这样,当飞行器平衡飞行时,陀螺效应和空气动力扭矩效应均被抵消。 与传统的直升机相比,四旋翼飞行器有下列优势:各个旋翼对机身所施加的反扭矩与旋翼的旋转方向相反,因此当电机1和电机3逆时针旋转的同时,电机2和电机4顺时针旋转,可以平衡旋翼对机身的反扭矩。四旋翼飞行器在空间共有6个自由度(分别沿3个坐标轴作平移和旋转动作),这6个自由度的控制都可以通过调节不同电机的转速来实现。其基本运动状态可分为: (1)垂直运动; (2)俯仰运动; (3)滚转运动; (4)偏航运动; (5)前后运动; (6)侧向运动;

下面将逐个说明飞行器的各种飞行姿态: 垂直运动——在图中,因有两对电机转向相反,可以平衡其对机身的反扭矩,当同时增加四个电机的输出功率,旋翼转速增加使得总的拉力增大,当总拉力足以克服整机的重量时,四旋翼飞行器便离地垂直上升;反之,同时减小四个电机的输出功率,四旋翼飞行器则垂直下降,直至平衡落地,实现了沿z轴的垂直运动。当外界扰动量为零时,在旋翼产生的升力等于飞行器的自重时,飞行器便保持悬停状态。保证四个旋翼转速同步增加或减小是垂直运动的关键。 俯仰运动——在图(b)中,电机1的转速上升,电机3的转速下降,电机2、电机4的转速保持不变。为了不因为旋翼转速的改变引起四旋翼飞行器整体扭矩及总拉力改变,旋翼1与旋翼3转速该变量的大小应相等。由于旋翼1的升力上升,旋翼3的升力下降,产生的不平衡力矩使机身绕y轴旋转(方向如图所示),同理,当电机1的转速下降,电机3的转速上升,机身便绕y轴向另一个方向旋转,实现飞行器的俯仰运动。

四轴飞行控制原理

四轴(1)-飞行原理 总算能抽出时间写下四轴文章,算算接触四轴也两年多了,从当初的模仿到现在的自主创作经历了不少收获了也不少。朋友们也经常问我四轴怎么入门,今天就简单写下四轴入门的基本知识。尽量避开专业术语和数学公式。 1、首先先了解下四轴的飞行原理。 四轴的一般结构都是十字架型,当然也有其他奇葩结构,比如工字型。两种的力学模型稍微有些不一样,建议先从常规结构入手(其实是其他结构我不懂)。 常规十字型结构其他结构 常规结构的力学模型如图。 力学模型 对四轴进行受力分析,其受重力、螺旋桨的升力,螺旋桨旋转给机体的反扭矩力。反扭矩影响主要是使机体自旋,可以想象一下直升机没有尾桨的情况。螺旋桨旋转时产生的力很复杂,

这里将其简化成只受一个升力和反扭矩力。其它力暂时先不管,对于目前建模精度还不需要分析其他力,顶多在需要时将其他力设为干扰就可以了。如需对螺旋桨受力进行详细研究可以看些空气动力学的书,推荐两本, 空气螺旋桨理论及其应用(刘沛清,北航出版社) 空气动力学基础上下册(徐华舫,国防科技大学) 网易公开课:这个比麻省理工的那个飞行器构造更对口一些。 荷兰代尔夫特理工大学公开课:空气动力学概论 以上这些我是没看下去,太难太多了,如想刨根问底可以看看。 解释下反扭矩的产生: 电机带动螺旋桨旋转,比如使螺旋桨顺时针旋转,那么电机就要给螺旋桨一个顺时针方向的扭矩(数学上扭矩的方向不是这样定义的,可以根据右手定则来确定方向)。根据作用力与反作用力关系,螺旋桨必然会给电机一个反扭矩。 在转速恒定,真空,无能量损耗时,螺旋桨不需要外力也能保持恒定转速,这样也就不存在扭矩了,当然没有空气也飞不起来了。反扭矩的大小主要与介质密度有关,同样转速在水中的反扭矩肯定比空气中大。 因为存在反扭矩,所以四轴设计成正反桨模式,两个正桨顺时针旋转,两个反桨逆时针旋转,对角桨类型一样,产生的反扭矩刚好相互抵消。并且还能保持升力向上。六轴、八轴…类似。 我们控制四轴就是通过控制4个升力和4个反扭矩来控制四轴姿态。 如力学模型图,如需向X轴正方向前进,只需增加桨3的转速,减少桨1的转速,1、3桨的反扭矩方向是一样的,一个加一个减总体上来说反扭矩没变。此时飞机已经有向X轴方向的分力,即可前行。 如需向X轴偏Y轴45°飞行,那么增加桨2、3的转速,减少桨1、4的转速,即可实现。 如果将X正作为正前方,那么就是”十”模式,如果将X轴偏Y45°作为正前方向,那就是”×”模式。理论上这两种都可以飞行,”十”模式稍微比”×”模式好计算,但是”十”模式不如”×”模式灵敏。 四轴如需向任意方向飞行只需改变电机的转速,至于电机转速改变的量是多少,增量之比是多少就需要算法了。对于遥控航模,不需要知道具体到度级别的方向精度,飞行时手动实时调节方向即可。 四轴除了能前后左右上下飞行,还能自旋,自旋靠的就是反扭矩,如需顺时针旋转,只需增加桨1、3转速,减少2、4转速,注意不能只增加桨1、3而不减少2、4,这样会造成总体升力增加,飞机会向上飞的。 理想情况下,四轴结构完全对称,电机转速一样,飞机就可以直上直下飞行。但事实和理想还是有差距的,不存在完全对称的结构,也没有完全一样的电机螺旋桨。所以需要飞控模块进行实时转速调节,这样才能飞起来,不像直升机,螺旋桨加速就能飞。 2、分析完飞行原理,接下来分析四轴飞行器系统的主要部件。

四轴飞行器制作过程

DIY四轴飞行器制作过程,超清晰多图!!!本人是航模菜鸟,大概是去年11月份,迷上了四轴飞行器,经常上MK的网站看飞行录相,四轴飞行起来稳定性真好,简直是酷毙了。最终没能抵制住诱惑,冲动之下决定自已也做个来玩玩。从网上收集资料,一切从0起步。经历了几个月的走走停停,现在已陆续完成了无刷电调、四轴机架、遥控器多通道改造、IMU 模块、飞控板设计制作。现小有成果,公布出来和大家交流交流,以资进步由于水平所限,本人只熟悉和使用51架构的MCU,系统的所有模块都是架构在C8051F 的基础上。但四轴所涉及的原理、控制理论都是一样的原理,希望各位同好网友不吝赐教,多多指导,谢谢!!! 1.从旧货摊买的两个硬盘.JPG (94.34 KB) 2009-7-13 00:06

2.费了九牛二虎之力,最后改造一个拆手机用的起子,搞定了.JPG (91.37 KB) 2009-7-13 00:06 先贴两个图试试能否成功,下面接着来。机架打算用现有的电直尾管和管座配上硬盘片构成,电机用新西达2212 KV930,两正两反的桨用口碑不错的德国EPP1045 。

3.固定电直尾管的座子,好贵呀.JPG (103.48 KB) 2009-7-13 00:10

4.固定电直尾管的座子,好贵呀.JPG (103.48 KB) 2009-7-13 00:10

5.和到手的电机、尾管合张照.JPG (9 6.75 KB) 2009-7-13 00:10

6.外加工的4个电机安装座.JPG (73.54 KB) 2009-7-13 00:10

四轴飞行器电机控制模块设计

四轴飞行器电机控制模块设计

密级: NANCHANG UNIVERSITY 学士学位论文THESIS OF BACHELOR (2011—2015年) 题目四轴飞行器电机控制模块设计 学院:信息工程学院系自动化系专业班级:测控技术与仪器111班学生姓名:吕晴学号:5801211011 指导教师:张宇职称:讲师起讫日期:2015-3-5 ~ 2015-6-2

南昌大学 学士学位论文原创性申明 本人郑重申明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果。对本文的研究作出重要贡献的个人和集体,均已在文中以明确方式表明。本人完全意识到本申明的法律后果由本人承担。 作者签名:日期: 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权南昌大学可以将本论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 保密□,在年解密后适用本授权书。 本学位论文属于 不保密□。 (请在以上相应方框内打“√”) 作者签名:日期: 导师签名:日期:

摘要 四轴飞行器电机控制模块设计 专业: 测控技术与仪器学号: 58012110011 学生姓名:吕晴指导老师:张宇 摘要 本课题是针对四轴飞行器在已经获得传感器测得的精确数据的情况下,设计合理的电路和算法,实现四轴飞行器稳定飞行和各种姿态变换。本课题的主要内容是对四轴飞行器的电机控制模块进行软硬件设计。 四轴飞行器是智能机器人的一种,它是由四个旋翼旋转产生升力,通过协调各旋翼的转速来实现飞行器的姿态控制。与传统的无人机相比,四轴飞行器具有很强的机动灵活性和载荷能力,特别适合在理想稳态或者准稳态的飞行条件下进行全方位垂直起降,在军事和民用领域均拥有广阔的发展前景[2]。 本论文对四轴飞行器的电机控制模块进行了调研,并设计出了相关的硬件电路板以及软件控制算法。具体内容如下: 首先建立四轴飞行器的动力学模型,四轴飞行器的动力学建模分为力学建模和运动学建模两个部分,总体思想是将四轴飞行器看作一个刚体,选定当前的姿态角和目标姿态为输入量,在理想的条件下,推导出控制四轴飞行器所需的四个电机的控制量作为输出量的方程,即建立四轴飞行器受力与姿态之间的关系。 其次对四轴飞行器电机控制模块进行合理的硬件设计,硬件部分分为了电源模块、主控模块、电机驱动模块、检测模块、无线通讯模块五个模块。其中选择了STM32系列单片机作为主控模块的微处理器,选择了三相无刷直流电机作为动力源,无刷电调对其进行调速。 再次设计合理的控制算法,本课题采用了经典PID算法,临界比例度法对PID参数进行了初步整定,再在试验中对参数进行微调。 最后针对四轴飞行器电机控制模块设计了合理的软件流程。 关键词:四轴飞行器;动力学模型;电机;PID控制算法

四轴飞行器结题报告

学校名称: 队长姓名: 队员姓名: 指导教师姓名:2013年9月6日

摘要 本次比赛我们需要很好地控制飞行器,让它自主完成比赛应该完成的任务。 本文的工作主要针对微型四旋翼无人飞行器控制系统的设计与实现问题展开。首先制作微型四旋翼无人飞行器实验平台,其次设计姿态检测算法,然后建立数学模型并设计姿态控制器和位置控制器,最后通过实验对本文设计的姿态控制器进行验证。设计机型设计全部由小组成员设计并制作,部分元件从网上购得,运用RL78/G13作为主控芯片,自行设计算法对飞行器进行,升降,俯仰,横滚,偏航等姿态控制。并可以自行起飞实现无人控制的自主四轴飞行器。 关键字:四旋翼无人飞行器、姿态控制、位置控制

目录 第1章设计任务.................................................................................... 错误!未定义书签。 1.1 研究背景与目的........................................................................ 错误!未定义书签。 1.2 .................................................................................................... 错误!未定义书签。 1.3...................................................................................................... 错误!未定义书签。第2章方案论证.................................................................................... 错误!未定义书签。 2.1...................................................................................................... 错误!未定义书签。 .................................................................................................... 错误!未定义书签。 .................................................................................................... 错误!未定义书签。 2.2 ........................................................................................................... 错误!未定义书签。第3章理论分析与计算........................................................................ 错误!未定义书签。 ........................................................................................................... 错误!未定义书签。第4章测试结果与误差分析................................................................ 错误!未定义书签。 4.1...................................................................................................... 错误!未定义书签。 4.2...................................................................................................... 错误!未定义书签。 4.3...................................................................................................... 错误!未定义书签。 4.4 .................................................................................................... 错误!未定义书签。 ........................................................................................................... 错误!未定义书签。第5章结论心得体会............................................................................ 错误!未定义书签。 5.1 .................................................................................................................. 错误!未定义书签。.................................................................................................................. 错误!未定义书签。 2设计任务: 基本要求 (1)四旋翼自主飞行器(下简称飞行器摆放在图1所示的A区,一键式

四轴飞行器原理、设计与控制

四轴飞行器原理、设计与控制 四轴飞行器设计与用途 学院:广东白云技师学院 专业:电子信息工程与电气技术(技师本科) 制作学生:邹剑平 指导老师:廖高灵 四轴飞行器简介 配置: 单片机AVRATMEGA168PA 三轴数字陀螺仪MPU—3050电机(无刷)XXD22121000KV电子调速器(无刷)好盈天行者40A螺旋桨1045 电池格氏2200mAh11.1V25C机架DIY 机架材料玻璃纤维铝合金 四轴飞行器飞行原理 重心的距离相等,当对角两个轴产生的升力相同时能够保证力矩的平衡,四轴不会向任何一个四轴飞行器有四个电机呈十字形排列,驱动四片桨旋转产生推力;四个电机轴距几何中方 向倾转;而四个电机一对正转,一对反转的方式使得绕竖直轴方向旋转的反扭矩平衡,保证了四轴航向的稳定. 此飞行控制板规定四轴电机的排布方式如图所示:前(1号),后(4号),右(3号),左(2号). 1,4号电机顺时针方向旋转,2,3号电机逆时针方向旋转.四个电机的转速做相应的变化即可实现四轴横向、纵向、竖直方向和偏航方向上的运动:

当四轴需要向前方运动时,2,3号电机保持转速不变,1号电机转速下降,4号电机转速上升,此时4号电机产生的升力大于1号电机的升力,四轴就会沿几何中心向前倾转,桨叶升力沿纵向的分力驱动四轴向前运动. 当四轴要转向左转向时,1,4号电机转速上升,2,3号电机转速下降,使向左的反扭距大于向右的反扭矩,四轴在反扭距的作用下向左旋转. 四个桨产生的推力,超过或者低于四轴本身重力的时候能够实现竖直方向上升与下降的运动,当桨的升力与四轴本身的重力相等的时候即实现悬停. 其他方式的运动原理与以上过程类似.四轴飞行原理虽然简单,但实现起来还需很多工作要做. 四轴飞行器控制流程图 四轴飞行器的优点 四轴飞行器与其他飞机比较相对稳定性高;四轴飞行器与其他飞机比较相对抗风能力强;载重量大(本机最大安全载重1100g);姿态灵活,反应速度快;可超低空飞行; 四轴飞行器主要用途 可做无人侦察机,空中航拍(FPV),可作为新型微型机器人。娱乐飞行表演 四轴飞行器的特点及魅力除了深受DIY爱好者的青睐之外,还有几点供大家品味: 1、是它的相对简单地机械构造。正因为简单,安全指数大大提高。 无论是作为航空模型还是作为遥控平台,安全永远是第一位的。 2、是它的相对稳定性。飞行姿态平滑稳定,机械振动被仅可能地减小是四轴的又一魅力,装载图像设备再好不过了。 3、是它的相对成本低廉,花尽可能少的钱获取最大的性价比是我们追求的境界,为工业开发其商业用途奠定了必要的基础。

飞行器姿态控制法综述

飞行器姿态控制方法综述 一.引言 经过一个世纪的发展,各种飞行器如雨后春笋般出现,从飞机、导弹到火箭、卫星,从宇宙飞船、航天飞机、空间站到月球探测器、火星探测器。这些飞行器能在空中按预定的轨迹运动总离不开它的姿态控制系统,飞行器在空间的运动是十分复杂的。为使问题简单化,总是将一飞行器的空间运动分解为铅锤平面的纵向运动和水平面内的侧向运动,将飞行器在空间的角运动分解成俯仰、偏航和滚动三个角运动。由于角运.动使飞行器的姿态发生变化,所以对角运动的控制就是对飞行器姿态的控制。对于飞行器姿态的控制,不同的飞行器需要不同的策略,本文主要就飞行器姿态控制方法的应用与发展作一一论述。 二.姿态控制的数学模型 要控制飞行器的姿态,就是要控制使飞行器三个姿态角发生变化的力矩大小。飞行器的姿态模型可以认为是一类不确定MIMO 仿射非线性系统,如式(1)所示: ()//()//()//(cos sin )/cos cos sin sin tan cos tan x y z y x x x x x z x x x y y y x x y x y z z z x x x z x y z I I I M I I I I M I I I I M I ωωωωωωωωωψ ωθωθ??ωθωθ θωθ?ωωθ?=-+??=-+??=-+??=-??=+?=+-?? (1) 式中,x 、y 、z 下标表示空间飞行器的三个主轴方向;I 表示相对于飞行器质心的惯量矩,设飞行器是主轴对称的,则惯量积可以忽略;ω表示飞行器相对于惯性空间的角速度;M 表示控制力矩;,,ψ?θ分别是飞行器的欧拉角。控制了M 的大小,就可以控制飞行器按我们期望的轨迹运动。M 由飞行器上的执行机构产生,常见的有空气舵、推力矢量发动机、反作用飞轮、喷气执行机构或由其它环境力执行机构。 三.飞行器姿态控制方法 3.1空气动力控制 根据运动的相对性原理和气体流动时的基本定律,当飞行器在大气中以一定

四轴飞行器制作

用户名 UID Email 请登录后使用快捷导航 没有帐号?注册 窗体顶端 找回密码 密码注册 窗体底端 快捷导航 首页迟些门户开放时,指向门户首页 全部贴汇总 技术贴汇总所有技术性的帖子汇总,方便阅读 非技术汇总所有非技术性的帖子汇总,方便阅读 帮助Help 无图快速版 阿莫电子邮购本论坛由阿莫电子邮购独家赞助 窗体顶端 搜索热搜: 雕刻机阿莫淘金春风电源 窗体底端 本版 用户 amoBBS 阿莫电子论坛?论坛首页? 机械电子? 四轴飞行? 多旋翼直升机(四轴飞行器)之开源整合平台[电路模组原理... / 4 页下一页 返回列表 查看: 15733|回复: 126 多旋翼直升机(四轴飞行器)之开源整合平台[电路模组原理图] [复制链接] 电梯直达

1楼 发表于2011-1-20 12:12:02|只看该作者|倒序浏览 一、相关技术文件: 1. 程式控制基底ATmega 8 ATmega8 技术文件点击此处下载ourdev_611065Q176XE.PDF(文件大小:2.45M) (原文件名: ATmega8_cn.PDF) 2. 无线模组 CC2500 (2.4G Hz 无线IC) 技术文件点击此处下载ourdev_611064KBBYJG.pdf(文件大小:1.26M) (原文件名: cc2500_cn.pdf) RDA T212 (PA+LNA) 技术文件点击此处下载ourdev_611063XH619C.pdf(文件大小:229K) (原文件名: RDA_T212.pdf) RDA ES02 (SP2T Switch )技术文件点击此处下载ourdev_611062ACP4OA.pdf(文件大小:29K) (原文件名: RDA_ES02.pdf) 3. 无刷马达电子调速模组 FDS7764A (N-Channel) 技术文件点击此处下载ourdev_612408FW8MGC.pdf(文件大小:273K) (原文件名:FDS7764A.pdf) TPC810 (P-Channel) 技术文件点击此处下载ourdev_612409Y3Y2UA.pdf(文件大小:293K) (原文件名:TPC8103.pdf) 4. 液晶萤幕显示模组 16x02 (液晶萤幕) 技术文件点击此处下载ourdev_612410MVKKXZ.zip(文件大小:365K) (原文件名:LCD_1602.zip) 5. MAG 9 FOD 飞行姿态感测模组(3轴磁力计+3轴线性加速计+3轴陀螺仪) LSM303DLH (磁力计+线性加速计) 技术文件点击此处下载ourdev_612411H66HEH.zip(文件大小:2.02M) (原文件名:LSM303DLH.zip) IMU-3000 (陀螺仪) 技术文件点击此处下载ourdev_612412ORGL5T.zip(文件大小:1.93M) (原文件名:IMU_3000.zip) 6. GPS模组 U-BLOX NEO-5Q (GPS) 技术文件点击此处下载ourdev_612413K5MRZI.zip(文件大小:3.03M) (原文件名:NEO_5.zip) 7. 超音波测距模组 HIN-232 (RS-232 5V至10V升压IC) 技术文件点击此处下载ourdev_612414E8JL5V.pdf(文件大小:564K) (原文件名:HIN232.pdf) LM-324 (OP) 技术文件点击此处下载ourdev_612415WGYN7Y.pdf(文件大小:599K) (原文件名:LM324.pdf) 二、TWI(I2C) 通讯规划(用于各个电路模组通讯) M8 TWI(I2C) 规划(PDF档) 电路图档(Eagle档) 点击此处下载ourdev_611067JVY9ZR.zip(文

四轴飞行器说明书

四轴飞行器 作品名称:四轴飞行器 工作原理:四轴飞行器主机采用了意法半导体公司的STM32F103CBT6处理器,该芯片采用ARM32位Cortex-M3内核。具有128K的Flash与20K的SRAM,内部具有锁相环模块,最高频率可达到72MHZ。板载MPU6050,该芯片整合了3轴陀螺仪与3轴加速器的6轴运动处理组件,与处理器采用I2C通信进行数据传送。主机与遥控之间采用的是NRF24L01+模块,该模块工作在2.4~2.5GHz全球免申请ISM工作频段。支持125个通讯频率。使用增强型的Enhanced ShockBurst传输模式,支持6个数据通道(共用FIFO)。通过SPI与MCU连接,速率0~8Mbps。理论传输距离可达到2KM。 飞行器遥控器亦采用STM32F103CBT6处理器,通过摇杆的X,Y轴输出为两个电位器,再通过AD转换读出扭动角度,从而在程序内部定义其所读取角度信息的动作映射。遥控器具有三组微调旋钮,可以调整到其水平位置。遥控器也使用NRF24L01+芯片与飞行器主机进行数据传输。遥控器板载TP4057芯片,可以直接给电池充电。并且使用蜂鸣器,对主机状态(例如:无法连接,低电压,连接断开等)进行报警。 制作材料: 1.STM32F103CBT6:该芯片由意法半导体生产,采用ARM32位Cortex-M3内核。 具有128K的Flash与20K的SRAM,芯片集成丰富的外设,例如:定时器,CAN,ADC,SPI,I2C,USB,UART,PWM等。内部具有锁相环模块,最高频率可达到72MHZ。 2. MPU6050,全球首例整合性6轴运动处理组件,整合了3轴陀螺仪、3轴加速器, 并含可藉由第二个I2C端口连接其他厂牌的加速器、磁力传感器、或其他传感器的数位运动处理(DMP: Digital Motion Processor)硬件加速引擎,由主要I2C端口以单一数据流的形式,向应用端输出完整的9轴融合演算技术InvenSense的运动处理资料库,可处理运动感测的复杂数据,降低了运动处理运算对操作系统的负荷,并为应用开发提供架构化的API。 3. NRF24L01+:一款新型单片射频收发器件,工作于2.4 GHz~2.5 GHz ISM频段。 内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合了增强型ShockBurst技术,其中输出功率和通信频道可通过程序进行配置。nRF24L01功耗低,在以-6 dBm的功率发射时,工作电流也只有9 mA;接收时,工作电流只有12.3 mA,

四轴飞行器姿态控制算法

姿态解算 姿态解算(attitude algorithm),是指把陀螺仪,加速度计, 罗盘等的数据融合在一起,得出飞行器的空中姿态,飞行器从陀螺仪器的三轴角速度通过四元数法得到俯仰,航偏,滚转角,这是快速解算,结合三轴地磁和三周加速度得到漂移补偿和深度解算。 姿态的数学模型坐标系 姿态解算需要解决的是四轴飞行器和地球的相对姿态问题。地理坐标系是固定不变的,正北,正东,正上构成了坐标系的X,Y,Z轴用坐标系R表示,飞行器上固定一个坐标系用r表示,那么我们就可以适用欧拉角,四元数等来描述r和R的角位置关系。 姿态的数学表示 姿态有多种数学表示方式,常见的是四元数,欧拉角,矩阵和轴角。在四轴飞行器中使用到了四元数和欧拉角,姿态解算的核心在于旋转。姿态解算中使用四元数来保存飞行器的姿态,包括旋转和方位。在获得四元数之后,会将其转化为欧拉角,然后输入到姿态控制算法中。姿态控制

算法的输入参数必须要是欧拉角。AD值是指MPU6050的陀螺仪和加速度值,3个维度的陀螺仪值和3个维度的加速度值,每个值为16位精度。AD值必须先转化为四元数,然后通过四元数转化为欧拉角。在四轴上控制流程如下图: 下面是用四元数表示飞行姿态的数学公式,从MPU6050中采集的数据经过下面的公式计算就可以转换成欧拉角,传给姿态PID控制器中进行姿态控制.

PID控制算法 先简单说明下四轴飞行器是如何飞行的,四轴飞行器的螺旋桨与空气发生相对运动,产生了向上的升力,当升力大于四轴的重力时四轴就可以起飞了。四轴飞行器飞行过程中如何保持水平:我们先假设一种理想状况:四个电机的转速是完全相同的是不是我们控制四轴飞行器的四个电机保持同样的转速,当转速超过一个临界点时(升力刚好抵消重力)四轴就可以平稳的飞起来了呢?答案是否定的,由于四个电机转向相同,四轴会发生旋转。我们控制四轴电机1和电机3同向,电机2电机4反向,刚好抵消反扭矩,巧妙的实现了平衡, 但是实际上由于电机和螺旋

四旋翼无人机制作飞行规则

四旋翼无人机制作飞行(小学组) 技术要求: (1)四旋翼无人机模型现场制作,散件组装。参与现场制作并用现场制作四旋翼飞行的成绩系数1.5,非现场制作商品机系数1。 (2)飞行控制器组委会统一提供,旋翼数量为四旋翼,四轴机架对角电机轴距≤350MM,动力电池电压≤11.1V,无GPS装置加装,螺旋桨直径尺寸≤9寸。遥控器选用2.4G设备。 竞赛方法: 1.一人一机,自行准备安装调试的工具、接线板等设备设施。 2.选手在比赛前将飞行器拆散,拆散后必须等待裁判确认。飞行器拆散要求:通电部分之间互不连接,机架拆散。 3.选手在准备区搭建、调试四轴飞行器(时间120分钟),准备比赛器材。搭建调试过程中,选手应注意人身和财产安全,文明有序。 4.搭建结束后,选手在规定时间内上交四轴飞行器至指定地点,按比赛顺序号(赛前随机设置)准备比赛。第一轮比赛结束后选手可领回四轴飞行器进行调试,准备第二轮比赛。 5.根据比赛顺序,选手在指定赛场的等候区等待进场比赛,不得影响其他选手比赛。 6、裁判宣布“比赛开始”的同时,计时开始。 7、飞行过程中飞行器不得飞跃安全线,飞跃安全线立即终止该

学员比赛并判定0分。 8、计时停止代表比赛结束。以下情况计时停止:a)选手完成任务;b)飞行器有零件脱落;c)裁判认为出现其他应该停止计时的情况。 成绩评定: 比赛任务分值:总分120分 在起飞框架内垂直起飞至目视水平高度(20分),悬停5秒(10分)。正向穿越龙门(20)。拍摄并读出围栏数据(50)。返航着陆,分值区域现场抽签(20、10、5),着陆支架跨界按低分计,着陆区域外为0分。比赛标准时间为100秒,正负时间差以秒为单位,每差1秒总分扣1分。读出围栏数据(不计入飞行时间) 以飞机飞行实际分值计算成绩,如成绩相同以所用时间作为评定成绩。 场地:

四轴飞行器名词解释

四轴飞行器名词解释 网上找的,自己稍微整理的一下: 1、遥控器篇 什么是通道? 通道就是可以遥控器控制的动作路数,比如遥控器只能控制四轴上下飞,那么就是1个通道。但四轴在控制过程中需要控制的动作路数有:上下、左右、前后、旋转 所以最低得4通道遥控器。如果想以后玩航拍这些就需要更多通道的遥控器了。 什么是日本手、美国手? 遥控器上油门的位置在右边是日本手、在左边是美国手,所谓遥控器油门,在四轴飞行器当中控制供电电流大小,电流大,电动机转得快,飞得高、力量大。反之同理。判断遥控器的油门很简单,遥控器2个摇杆当中,上下板动后不自动回到中间的那个就是油门摇杆。 2、飞行控制板篇 飞控的用途? 四轴飞行器相对于常规航模来说,最最复杂的就是电子部分了。之所以能飞行得很稳定,全靠电子控制部分对四轴飞行状态进行快速调整。在常规固定翼飞机上,陀螺仪并非常用器件,在相对操控难度大点的直机上,如果不做自动稳定系统,也只是锁尾才用到陀螺仪。四轴飞行器与其不同的地方是必须配备陀螺仪,这是最基本要求,不然无法飞行,更谈不上飞稳了。不但要有,还得是3轴向(X、Y、Z)都得有,这是四轴飞行器的机械结构、动力组成特性决定的。在此基础上再辅以3轴加速度传感器,这6个自由度,就组成了飞行姿态稳定的基本部分,也是关键核心部分---惯性导航模块,简称IMU。飞行中的姿态感测全靠这个IMU了,可见它是整架模型的核心部件。 什么是x模式和+模式?说白了就是飞行器正对着你本人的时候是呈现X形状还是+形状,之前有介绍过四轴原理的,前进的时候后面加速前面减速两侧不变那个是针对+模式的,而如果是X模式的话,前进就需要后面两个同时加速,前面两个同时减速了。据说X模式的稳定性比+模式的稳定性要高点。 注意:考虑到飞控板上的陀螺仪安装的是固定的,所以,模式不同的话飞控板的安装方向也是不同的。 3、电调篇 为什么需要电调? 电调的作用就是将飞控板的控制信号,转变为电流的大小,以控制电机的转速。 四轴飞行器四个桨转动时的离心力是分散的。不象直机的桨,只有一个能产生集中的离心力形成陀螺性质的惯性离心力,保持机身不容易很快的侧翻掉。所以通常用到的舵机控制信号更新频率很低。四轴为了能够快速反应,以应对姿态变化引起的飘移,需要高反应速度的电调,常规PPM电调的更新速度只有50Hz左右,满足不了这种控制所需要的速度,且PPM电调MCU内置PID稳速控制,能对常规航模提供顺滑的转速变化特性,用在四轴上就

四旋翼飞行器基本原理

四旋翼飞行器无刷直流电机调速系统的设计 孟磊,蒋宏,罗俊,钟疏桐 武汉理工大学自动化学院、武汉理工大学信息工程学院 摘要,关键字:略 近年来,无人机的研究和应用广泛受到各个方面的重视。四旋翼飞行器作为无人机的一种,能够垂直起落、空中悬停、可适用于各种飞行速度与飞行剖面,具有灵活度高、安全性好的特点,适用于警务监控、新闻摄影、火场指挥、交通管理、地质灾害调查、管线巡航等领域实现空中时时移动监控。 四旋翼飞行器的动力来源是无刷直流电机,因此针对该型无刷直流电机的调速系统对飞行器的性能起着决定性的作用。为了提高四旋翼飞行器的性能,本文设计制作了飞行试验平台,完成了直流无刷电机无感调速系统的硬件、软件设计。通过实验证明该系统的设计是可行的。 四旋翼飞行器平台结构 四旋翼平台呈十字形交叉,有四个独立电机驱动螺旋桨组成。当飞行器工作时,平台中心对角的螺旋桨转向相同,相邻的螺旋桨转向相反同时增加减少四个螺旋桨的速度,飞行器就垂直上下运动;相反的改变中心对角的螺旋桨速度,可以产生滚动、俯仰等运动。结构图如下: 四旋翼飞行器的控制系统分为两个部分:飞行控制系统和无刷直流电机调速系统。飞行控制系统通过IMU惯性测量单位(由陀螺传感器和加速度传感器组成)检测飞行姿态,通过无线通讯模块与地面遥控器通信。4个无刷直流电机调速系统通过I2C总线与飞行控制器通信,通过改变4个无刷直流电机的转速来改变飞行姿态,系统采用12V电池供电。控制系统结构图如下:

无刷直流电机调速系统 无刷直流电动机既具有运行效率高、调速性能好,同时又具有交流电动机结构简单、运行可靠、维护方便的优点,是电机主要发展方向之一,现已成功运用与军事、航空、计算机数控机床、机器人、电动自行车等多个领域。在该四旋翼飞行器上使用了新西达2217外转子式无刷直流电机,其结构为12绕组7对磁极,典型KV值为1400. 通常无刷直流电机的控制方式分为有位置传感器控制方式和无位置传感器控制方式。有位置传感器控制方式通过再定子上安装电磁式、光电式或者磁敏式位置传感器来检测转子的位置,为驱动电路提供转向信息。无位置传感器的控制方式有很多,包括磁链计算法‘反电动势法、状态观测器法、电感法等。在各种无位置传感器控制方法中,反电动势法是目前技术最为成熟的、应用最为广泛的一种位置检测方法。本系统采用的饭店董事过零检测法是反电动势法中的一种,通过检测各相绕组反电动势的过零点来判断转子的位置。根据无刷直流电机的特性,电机的最佳转向时刻是想反电动势过零点延迟30电角度的时刻,而该延迟的电角度对应的时间可以有两次过零点时间间隔计算得到。 无刷直流电机调速系统硬件设计 该无刷直流电机调速系统有三相全桥驱动电路、反电势过零电路、电流电压检测电路组成电机驱动器。使用一片ATmega8单片机作为控制器,该单片机内部集成了8kB的flash,最多具有23个可编程的I/O口,输出时为推挽结构输出,驱动能力较强。片上集成了AD 转换器、模拟比较器、通用定时器、可编程计数器等资源。 三相全桥驱动电路利用功率型MOS管作为开关器件,选用P型MOS管FD6637与N型MOS管FD6635搭配使用,设计容量为允许通过的最大电流为30A。FD6637的开关利用三极管9013进行驱动、FD6635的开关直接用单片机的I/O口进行驱动。电路如图3所示。通过R17、R19、R25来减少下管FDD6635的栅极充电电流峰值,防止震荡并保护MOS管;R16、R23、R24作为下拉电阻,保证下关的正常导通与关断;R2、R5、R8作为上管栅极上拉电阻,阻值选择470Ω,既保证了MOS管的开关速率不降低,同时也防止三极管Ic电流过大。A+、B+、C+提供驱动桥的上桥臂的栅极导通信号,分别通过ATmega8的三个硬件PWM通道驱动,通过改变PWM信号的占空比来实现电机调速;A-、B-、C-提供下桥臂栅极驱动信号,由单片机的I/O口控制,只有导通和关闭两种状态。

四轴飞行器制作应用实例大全

四轴飞行器制作应用实例大全 玩四轴这个东西,不是发明创造,人家懂只是知道得比你早一点,新手们入手四轴飞行器总是抱怨苦于无人可以指导,可是莫怪我等无言呀,往往一种问题有好几种原因,有时我是这么解决就好了,到你那边就不行了,所以玩四轴还是需要有扎实的基础,下面这些四轴设计实例是玩四轴总结出来的,有些是老前辈传授的,这些都是飞行模友的智慧。玩四轴不要怕当新鸟,老鸟也是新鸟飞出来的。 1. 微型四旋翼航拍器 本四旋翼航拍器采用OV7725C彩色摄像头,飞控板主控芯片为STM32,遥控器主控芯片为STM32,本系统在正常飞行过程中,通过按下遥控器,右键即可拍下此刻的照片,并实时存储到SD卡中,四轴和遥控器均已集成锂电池智能充电功能,通过USB数据线直接插入电脑即可充电。飞行器稳定,算法成熟,适合有一定基础的人开发。 2. mini小型四轴飞行器 网络上的小型四轴飞行器的PCB板都是要打烊的,打样的价格非常昂贵,我们学生党要怎么吧这么复杂的电路自己做出来呢,本人在集成飞小飞机上进行有效的更改,自己用普通做板的方式自己做出来了亲测成功哦。 3. STM32F103T8U6 +MPU6050微型四轴飞行器开源程序和PCB图有上位机 这个微型四轴飞行器使用的是STM32F103T8U6(STM 32F103T8U6数据手册)+MPU6050(MPU6050数据手册)等,开源程序和PCB图、有上位机,分享给大家学习。附件提供了飞行器原理图和PCB、飞行源码、测试程序、上位机软件、相关芯片资料。 4. 基于WiFi通信的四旋翼无人飞行控制器 目标是使用STM32开发板并配合由Altium Designer电路板设计软件绘制的扩展板设计实现一套四旋翼无人飞行器控制器系统,同时完成一套PC端和手机端APP地面站控制软件的编写,并加入GPS进行惯性导航,使飞行器能够在地面站或遥控器的控制下完成平稳高速飞行,并能够实现空中自稳。飞行器能够按地面站规划的路径实现自主巡航,并可携带摄像设备完成空中拍摄任务。四旋翼无人飞行控制器已经经过验证,可以飞起来了,放心使用。 5. STM32 WIFI 四轴飞行器全部资料 采用WIFI技术控制飞行器,简单又方便,只要你有安卓手机就可以了,有做好的安卓AP,直接安装即可,附件有1.有原理图,pcb文件99和AD都可以打开;2.源代码,有STM32源码,有测试程序和主程序,焊接好后方便大家测试用的。采用了RT_THREAD操作系统3.芯片资料;4.wifi开发手册和使用指南;5.有安卓上位机软件,有2.3版本和4.0版本。 6. 匿名迷你四轴飞行器,飞行器里的行家 资源包含主板PCB源码,遥控器源码, CPU: STM32F103CB(STM32F103CB数据手册) 2.4G: NRF24L01(NRF24L01数据手册) 电子罗盘:HMC5883(HMC5883数据手册) 陀螺仪+加速度计:MPU-6050 (MPU-6050数据手册) 电机:7*16

相关文档
相关文档 最新文档