卡尔曼滤波和角度测定_第1页
卡尔曼滤波和角度测定_第2页
卡尔曼滤波和角度测定_第3页
卡尔曼滤波和角度测定_第4页
卡尔曼滤波和角度测定_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

小车下面就是L3G4200D+ADXL345两个模块,加速度模块没固定好,板子太小了没地方打孔,有时间将两个模块焊到一个万能板上应该会容易固定一些。加速度模块角度计算:如果传感器x轴朝下,y轴朝前那竖直方向弧度计算公式为:angle=atan2(y,z)〃结果以弧度表示并介于-pi到pi之间(不包括-pi)如果要换算成具体角度:angle=atan2(y,z)*(180/3.14)陀螺仪角度计算:angle^■angle^+gyroH•市式中angle(n)为陀螺仪采样到第n次的角度值;angle(n-1)为陀螺仪第n-1次采样时的角度值;gyron为陀螺仪的第n次采样得到的瞬时角速率值;dt为运行一遍所用时间;angle_n+=gyro(n)*dt〃积分计算卡尔曼滤波网上找的kalman滤波,具体代码如下staticconstfloatdt=0.02;staticfloatP[2][2]={{1,0},{0,1}};floatangle;floatq_bias;//偏心、倾向于floatrate;//比率staticconstfloatR_angle=0.5;//R倾角staticconstfloatQ_angle=0.001;//Q倾角

staticconstfloatQ_gyro=0.003;//Q陀螺仪floatstateUpdate(constfloatgyro_m){/*状态更新*/floatq;floatPdot[4];q=gyro_m-q_bias;Pdot[0]=Q_angle-P[0][1]-P[1][0];/*0,0*/Pdot[1]=-P[1][1];/*0,1*/Pdot[2]=-P[1][1];/*1,0*/Pdot[3]=Q_gyro;/*1,1*/rate==q;angle+=q*dt;TOC\o"1-5"\h\zP[0][0]+=Pdot[0]*dt;P[0][1]+=Pdot[1]*dt;P[1][0]+=Pdot[2]*dt;P[1][1]+=Pdot[3]*dt;returnangle;floatkalmanUpdate(constfloatincAngle)floatangle_m=incAngle;floatangle_err=angle_m-angle;floath_0=1;constfloatPHt_0=h_0*P[0][0];/*+h_1*P[0][1]=0*/constfloatPHt_1=h_0*P[1][0];/*+h_1*P[1][1]=0*/floatE=R_angle+(h_0*PHt_0);

floatK_0=PHt_0/E;floatK_1=PHt_1/E;floatY_0=PHt_0;/*h_0*P[0][0]*/floatY_1=h_0*P[0][1];TOC\o"1-5"\h\zP[0][0]-=K_0*Y_0;P[0][1]-=K_0*Y_1;P[1][0]-=K_1*Y_0;P[1][1]-=K_1*Y_1;angle+=K0*angleerr;qg+=K1*an"r.^^^_j_i_as+^iiig_i_eerr,returnangle;复制代码}波形显示测试说明一一单片机采集加速度和陀螺仪的信号,并使用上面的kalman滤波,计算出最优倾角,通过串口发送到pc机,pc机运行的串口示波器将相关波形显示出来。1、蓝色为加速度换算后的角度。2、黄色为陀螺仪直接积分后的角度。3、红色为kalman滤波后的角度。

波形显示40T轴坐标1000300.200X轴坐标-20-30-40-50-60-70波形显示40T轴坐标1000300.200X轴坐标-20-30-40-50-60-70-80-90-100X.□,XTTIAT7r用手指敲小车可以看到加速度模块计算获取的角度震动比较厉害,经过卡尔曼滤波后的波形相对平缓一些。波形显示用了园子里xf_z1988的开源波形控件,他的主页是:/xf_z1988/也RelaxBlogrelaxcnblogscom第二个Arduino/小车两轮自平衡自从做了第一个Arduino小车兴趣大增,于是开始制作第二个Arduino小车,这次我想做得相对复杂一点。一直对SFGWAY非常着迷,查了些技术资料发现自平衡小车的原理也比较简单:利用陀螺仪和加速度模块获得小车角度,Arduino对获取的数据进行处理,然后控制电机运转纠正倾斜,从而达到平衡的效果。先来个视频:需要准备的硬件有:1、陀螺仪我选用的是L3G4200D三轴陀螺仪,其实自平衡小车只用到其中的一轴2、加速度计我用的是ADXL345三轴加速度计,自平衡小车也只用到其中两轴3、Arduino板子我用的是我使用的是arduinoduemilanove2009arduino硬件区别请看这里:http://arduino.cc/en/Main/Hardware4、L298N电机驱动模块一个需要带光耦5、直流减速电机两个小车轮胎两个塑料盒子一个还需要一些杜邦线、电池、螺丝等辅助的东西有朋友问我这些东西哪里能买到,其实这些材料拜一下淘宝大神就能找到的。组装过程比较简单,在塑料盒合适的位置打孔,然后用螺丝固定住电路板和电机即可:说露虬电机炬动模焕iLn陀螺输回加速I度曲5制作之前我们需要对陀螺仪+加速度计进行测试,看我们获取的角度数据是否满足要求。网上常用的方法是使用卡尔曼滤波将陀螺仪和加速度计的数据进行融合而得到一个相对稳定正确的角度值,具体方法在我前面的文章中提到过:L3G4200D+ADXL345卡尔曼滤波获取到角度以后需要找到小车的平衡点,也就是无外力作用的时候小车能够立在地面上的角度:角度差=小车角度-平衡点角度。用小车角度数据结合当前的倾斜目标值,通过PID运算,得出电机PWM脉宽数据,指挥电机运行即可。PID算法相对比较简单,而且arduino有现成的PIDlibraries:http://arduino.cc/playground/Code/PIDLibraryPID::PID(double*Input,double*Output,double*Setpoint,doubleKp,doubleKi,doubleKd,intControllerDirection)(PID::SetOutputLimits(0,255);//defaultoutputlimitcorrespondsto//thearduinopwmlimitsSampleTime=100;//defaultControllerSampleTimeis0.1secondsPID::SetControllerDirection(ControllerDirection);PID::SetTunings(Kp,Ki,Kd);

lastTime=millis()-SampleTime;inAuto=false;myOutput=Output;myInput=Input;复制代码PIDLIB的参数分别是这样的:Input输入值(这里输入卡尔曼融合获取的角度值)OutputPID计算的结果,供电机驱动的PWM使用Setpoint期望值(这里输入小车平衡点的角度值)Kp、Ki、Kd这是KPI的三个重要参数这三个参数的详细说明我从网上摘录了一段:比例(P)控制比例控制是一种最简单的控制方式。其控制器的输出与输入误差信号成比例关系。当仅有比例控制时系统输出存在稳态误差(Steady-stateerror)。积分(I)控制在积分控制中,控制器的输出与输入误差信号的积分成正比关系。对一个自动控制系统,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的或简称有差系统(SystemwithSteady-stateError)。为了消除稳态误差,在控制器中必须引入''积分项”。积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到等于零。因此,比例+积分(PI)控制器,可以使系统在进入稳态后无稳态误差。微分(D)控制在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。自动控制系统在克服误差的调节过程中可能会出现振荡甚至失稳。其原因是由于存在有较大惯性组件(环节)或有滞后(delay)组件,具有抑制误差的作用,其变化总是落后于误差的变化。解决的办法是使抑制误差的作用的变化''超前〃,即在误差接近零时,抑制误差的作用就应该是零。这就是说,在控制器中仅引入''比例''项往往是不够的,比例项的作用仅是放大误差的幅值,而目前

需要增加的是''微分项”,它能预测误差变化的趋势,这样,具有比例+微分的控制器,就能够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调。所以对有较大惯性或滞后的被控对象,比例+微分(PD)控制器能改善系统在调节过程中的动态特性。PID计算相关代码如下:PIDmyPID(&Input,&Output,&Setpoint,2,5,1,DIRECT);//PID对象声明setupPID();//PID初始化♦♦♦♦Kalman_Filter(Adxl_angle,Gyro_sensor);//卡尔曼融合获取angleInput=angle;myPID.Compute();//PID计算获取OutputDrive(Output);//根据Output驱动电机voidsetupPID(){Input=0;Setpoint=17;//我的小车自平衡角度为17myPID.SetSampleTime(100);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论