BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / smartcar / #219同步于 2017/2/26
Smartcar机器人发帖

互补滤波代码示例

Ncer
2017/2/26镜像同步0 回复
以下是直立控制获得角度的三个函数,摘自去年我们车的代码,简洁起见,删去了后期加的一些过坡的处理。 完整代码: http://pan.baidu.com/s/1kVJllLP (很多地方未写注释,因此仅供参考) void GetGyroResult(){ //读陀螺仪输出 s32 s32_AD_result_X,s32_AD_result_Y; s32_AD_result_Y=ad_ave(ENC_AD,ENC_Y_CH,ADBITS,50); //采样50次,均值滤波 g_f_gyro_result_Y=s32_AD_result_Y-g_f_gyro_offset_Y; //减去0偏 g_f_gyro_result_Y*=GYRO_ANGLE_RATIO; //将陀螺仪的输出归一到0-180度。比例系数的调整参考官方方案,与AD位数有关。 } void GetGravityResult(){ //读加速度计输出 s32 s32_AD_result=GET_ADVAL(ACCER_AD,ACCER_Z_CH); //读加速度计的值 g_f_gravity_result=s32_AD_result-g_u16_gravity_offset; //减去0偏 g_f_gravity_angle=g_f_gravity_result*GRAVITY_ANGLE_RADIO; //同理,将加速度计的读数归一到0-180°。 } void GetAngle(){ //互补滤波函数 float f_angle_sub; g_f_angle=g_f_angle_integral; f_angle_sub=(g_f_gravity_angle-g_f_angle)/g_u16_Tg; //求陀螺仪积分出来的角度与加速度计的角度的差值,并除以补偿系数,得到加速度计对陀螺仪的校准量。补偿系数取1-4,补偿系数越大,静态误差越大。我们最后取了Tg=1; g_f_angle_integral+=(f_angle_sub-g_f_gyro_result_Y)/ANGLE_CALCULATE_FREQENCY; //将校准量加到陀螺仪上 } 最后一个互补滤波函数,原理其实就是此图: 最后的滤波效果:(红色为滤波完后的角度,可看出毛刺不多。蓝色为加速度计输出的角度) 可看出,红色的角度基本能跟随上加速度计的角度。 当然,这个图还有点问题(因为加速度计零偏不对的问题,导致两个波形不重合。) (我手头只剩下这个图了,见谅)
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。