注册 登录
查看: 478|回复: 4

L3g4200和MMA8452调的波形

[复制链接]
发表于 2014-11-24 10:40:45 | 显示全部楼层 |阅读模式
本帖最后由 boy307195764 于 2014-11-24 10:44 编辑

第一次调车看不太懂波形怎么调。麻烦各位看一下卡尔曼滤波那个抖动的为什么那么大而不像山外的波形那样


#define MMA8452_vertical            1200 //1780  
#define MMA8452_ratio                0.075 //0.012   //0.016  //0.12
#define GYRO_VAL                          0         //加大向后,减少向前
#define Gyro_ratio                         0.2       //0.8
#define GRAVITY_ADJUST_TIME_CONSTANT 2

float angle, angle_dot;         //外部需要引用的变量
//angle 融合后最终角度
//angle_dot 陀螺仪角速度
//-------------------------------------------------------
const float Q_angle=0.001, Q_gyro=0.003,R_angle=0.05 ,dt=0.2;
//Q_angle 激励噪声协方差矩阵
//R_angle 观测噪声协方差矩阵
//注意:dt的取值为kalman滤波器采样时间;         //0.8
static float P[2][2] = {
    {1, 0 },
    {0, 1 }
};

static float Pdot[4] ={0,0,0,0};

static const char C_0 = 1;

static float q_bias, angle_err, PCt_0,PCt_1, E, K_0, K_1, t_0, t_1;
//-------------------------------------------------------
void Kalman_Filter(float angle_m,floatgyro_m)          //gyro_m:gyro_measure
{
   angle+=(gyro_m-q_bias) * dt;       //先验估计

   Pdot[0]=Q_angle - P[0][1] - P[1][0];        //先验估计误差协方差的微分
   Pdot[1]=- P[1][1];
   Pdot[2]=- P[1][1];
   Pdot[3]=Q_gyro;

   P[0][0] += Pdot[0] * dt;           //先验估计误差协方差微分的积分 = 先验估计误差协方差
   P[0][1] += Pdot[1] * dt;
   P[1][0] += Pdot[2] * dt;
   P[1][1] += Pdot[3] * dt;


   angle_err = angle_m - angle;                //先验估计



   PCt_0 = C_0 * P[0][0];
   PCt_1 = C_0 * P[1][0];

    E= R_angle + C_0 * PCt_0;

   K_0 = PCt_0 / E;
   K_1 = PCt_1 / E;

   t_0 = PCt_0;
   t_1 = C_0 * P[0][1];

   P[0][0] -= K_0 * t_0;              //后验估计误差协方差
   P[0][1] -= K_0 * t_1;
   P[1][0] -= K_1 * t_0;
   P[1][1] -= K_1 * t_1;


   angle   += K_0 * angle_err;         //后验估计
   q_bias  += K_1 * angle_err;         //后验估计
   angle_dot = gyro_m-q_bias;         //输出值(后验估计)的微分 = 角速度
}
//**************************************************************************
/*
*  功能说明:直立角度计算
*  参数说明:

*  函数返回:无符号结果值
*  修改时间:2013-2-10
* 备注:参考清华源码
*/
//**************************************************************************
void AD_Calculate(void)
{


   Rd_Ad_Value();                          //采集加速度计z
   L3G4200_result();                                                    //采集陀螺仪resultz

   Gyro_Now = (GYRO_VAL - resultz ) * Gyro_ratio;                            //陀螺仪采集到的角速度归一化
   angle_offset_vertical = (MMA8452_vertical - MMA8452_z) * MMA8452_ratio;//将加速度计采集到的角度归一化,乘上0.075是为了归一化到0~90°

   if(angle_offset_vertical > 90)angle_offset_vertical = 90;               //防止加速度角度溢出
   if(angle_offset_vertical < -90)angle_offset_vertical = -90;

//计算融合后的角度
   Kalman_Filter(angle_offset_vertical,Gyro_Now);


   /*****************************串口看波形(选择使用)****************************/
#if 1                       //宏条件编译 选择是否使用 虚拟示波器   0表示不输出,1表示输出信息到上位机)
//   OutData[0] = angle_dot;
   OutData[1] = resultz;//Gyro_Now;
   OutData[2] = angle_offset_vertical;//MMA8452_z
   OutData[3] = angle;

   OutPut_Data();
#endif
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-11-24 12:30:41 | 显示全部楼层
你的x轴坐标要调一下。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-24 20:01:35 | 显示全部楼层
本帖最后由 boy307195764 于 2014-11-24 20:28 编辑
山外メ雲ジ 发表于 2014-11-24 12:30
你的x轴坐标要调一下。

请问能具体一下怎么调吗?
之前的归一化有点小问题。调整过来了
但是粉色这条线跳的还是比较严重。粉色的信任度好像跟陀螺仪的关系比较大
还有我想请教一下
Q_angle, Q_gyro, R_angle ,dt;
这四个参数具体应该怎么调。
目前的参数是这样的
float Q_angle = 0.02, Q_gyro=0.001, R_angle=0.003 ,dt=0.005;
#define Gyro_ratio                   0.02   
#define MMA8452_vertical             0   
#define MMA8452_ratio                0.021
#define GYRO_VAL                     0

谢谢。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-26 19:31:08 | 显示全部楼层
本帖最后由 boy307195764 于 2014-11-27 09:47 编辑

                   。。
回复 支持 反对

使用道具 举报

发表于 2015-1-3 21:19:39 | 显示全部楼层
楼主能把你的程序发一份吗,我的L3G4200感觉读的数据有问题,谢了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部