智能车制作

标题: 平衡车互补滤波后的图象,求鉴定是否可用 [打印本页]

作者: hanlinson    时间: 2013-8-4 08:05
标题: 平衡车互补滤波后的图象,求鉴定是否可用





以下图象是加速度计和陀螺仪进入互补滤波器后的结果,
红色为加速度计的角度输入,黄色为陀螺仪的角速度输入,绿色为互补滤波后的角度输出
第一张为加速度计和陀螺仪直接输入互补滤波器的图象
第二张为MPU6050装在小车上面,未启动电机,手动模拟小车摆动时
最后请懂互补滤波的大哥,看看这样的滤波器能行吗?、







作者: 奋斗小青年、    时间: 2013-8-4 08:29
碉堡了 不能用
作者: ℡单身旅行    时间: 2013-8-4 09:53
貌似情况不妙啊、、、
作者: glacier0    时间: 2013-8-4 11:21
指定是不能用啊
作者: yxw_bob    时间: 2013-8-4 11:36
本帖最后由 yxw_bob 于 2013-8-4 11:39 编辑

感觉滞后太大。(互补输出角度) 应该等于 (加速度计的角度输入)— K*[SIGMA(陀螺仪的角加速度输入*DELTA_T)]。    你最好给出陀螺仪的角加速度输入曲线(也就是 陀螺仪的输出信号)。
   另外,你最好给出一个 陀螺仪的角加速度输入 的积分曲线,也就是陀螺仪的角速度输入 的 曲线


作者: hanlinson    时间: 2013-8-4 16:13
yxw_bob 发表于 2013-8-4 11:36
感觉滞后太大。(互补输出角度) 应该等于 (加速度计的角度输入)— K*[SIGMA(陀螺仪的角加速度输入*DELT ...

void complement_filter(float angle_m_cf,float gyro_m_cf)//分别进入加速度计角度和陀螺仪角速度
{ //采样率为0.01
//    bias_cf*=0.0001;            //陀螺仪零飘低通滤波;500次均值;0.998
//    bias_cf+=gyro_m_cf*0.009;           //0.002
//    angle_dot=0.6*angle_dot+0.4*gyro_m_cf;
    Gyro_angle=angle+gyro_m_cf*0.01;//把陀螺仪的原始数据进行积分得到陀螺仪角度           
    angle=Gyro_angle*0.95+angle_m_cf*0.05;//使用互补滤波得到最终角度
    Send_data((int)angle_m_cf);    //发送原始加速度计角度到串口上位机
    Send_data((int)Gyro_angle);//发送陀螺仪角度到上位机
    Send_data((int)angle);    // 发送最终角度
}
上位机图象如下:红色的为加速度计的角度输入,黄色的为陀螺仪积分后的角度,绿色的为互补滤波器最后输出的角度
[attach]49474[/attach]



作者: hanlinson    时间: 2013-8-4 16:15
本帖最后由 hanlinson 于 2013-8-4 16:24 编辑
奋斗小青年、 发表于 2013-8-4 08:29
碉堡了 不能用

void complement_filter(float angle_m_cf,float gyro_m_cf)//分别进入加速度计角度和陀螺仪角速度
{ //采样率为0.01
//    bias_cf*=0.0001;            //陀螺仪零飘低通滤波;500次均值;0.998
//    bias_cf+=gyro_m_cf*0.009;           //0.002
//    angle_dot=0.6*angle_dot+0.4*gyro_m_cf;
    Gyro_angle=angle+gyro_m_cf*0.01;//把陀螺仪的原始数据进行积分得到陀螺仪角度           
    angle=Gyro_angle*0.95+angle_m_cf*0.05;//使用互补滤波得到最终角度
    Send_data((int)angle_m_cf);    //发送原始加速度计角度到串口上位机
    Send_data((int)Gyro_angle);//发送陀螺仪角度到上位机
    Send_data((int)angle);    // 发送最终角度
}
上位机图象如下:红色的为加速度计的角度输入,黄色的为陀螺仪积分后的角度,绿色的为互补滤波器最后输出的角度[attach]49475[/attach]
下面在上传一张;
下图为把加速度计角度和最角度融合在一起的图片,,红线为加速度计的角度,绿线为互补滤波最后输出的角度,黄线为陀螺仪的角速度
[attach]49477[/attach]
作者: yxw_bob    时间: 2013-8-4 17:49
本帖最后由 yxw_bob 于 2013-8-4 18:13 编辑

再说一下,陀螺仪的原始输出信号为角加速度w=d(theita) /dt。  你的系数为应该与你的采样率相关的。我上面给你的公式是在直立车偏离垂直方向比较小的角度(theita)下得到的。
真正的过程如下:
  (1) 计算 小车的等效运动加速度 a= g*cos(theita)-w*L ,[ g*cos(theita)为三轴加速度的小车运动方向的分量] ;;;[应该在这里进行卡尔曼滤波,或者互补滤波;但是有的为了利用非线性,对角度进行卡尔曼滤波,或者互补滤波]。
  {在这里a= g*cos(theita)-w*L,中 g*cos(theita)这项的值可能有误,请参照卓老师给出的第2版的计算}
   ( 2)  利用上面求出的  a来反求theita,[即小车偏离垂直方向的角度(theita)],其实这个角度theita,表明你的小车是出于加速状态,还是减速状态,还是匀速速度状态。根据这里得出的状态和你期望的状态来对小车进行直立、方向、加/减速状态进行控制。[请注意为了进行得到更大的加速度,必须先进行减速/加速得到相应的偏离角度后再进行加速/减速操作。为了保证加速度是持续的,必须保证小车偏离垂直方向的角度在合理的区域内]  。
         在这里,小车偏离垂直方向是指小车偏离重心的垂直方向。而不是车体作为垂直方向。


作者: yxw_bob    时间: 2013-8-4 18:20
本帖最后由 yxw_bob 于 2013-8-4 18:22 编辑

对了。你的波形差不多了,比较不错啦。       如果采用互补滤波的话,在表达式中angle_dot=k1*angle_dot+k2*gyro_m_cf;
    主参数所占的比重必须在0.95以上,最好在0.98-0.999之间。我是说转换为相同的单位的情况下的主参数的比重值。如果单位不同则没法给出限定。


作者: hanlinson    时间: 2013-8-4 22:30
yxw_bob 发表于 2013-8-4 18:20
对了。你的波形差不多了,比较不错啦。       如果采用互补滤波的话,在表达式中angle_dot=k1*angle_dot+k2 ...

你又没有办法办法确定主控,因为你不知道到底是陀螺仪准,还是加速度计准,我这儿选的陀螺仪准,但是事实上我的陀螺仪也不准,在PMU6050静止时,输出为三分之一是15,三分之二是0,然后我前面先加了一个求平均然后再搞了一个低通滤波,呵呵!我这儿取得是,0.95和0.05,效果还是不错,

作者: 1249652816    时间: 2013-8-10 20:51
hanlinson 发表于 2013-8-4 22:30
你又没有办法办法确定主控,因为你不知道到底是陀螺仪准,还是加速度计准,我这儿选的陀螺仪准,但是事实 ...

MPU6050求教学

作者: hanlinson    时间: 2013-8-10 21:02
1249652816 发表于 2013-8-10 20:51
MPU6050求教学

给你核心程序,你慢慢琢磨把!
float Read_Acc_x()
{
    float Accel_x,Accel_z, Angle_accel;
    //------加速度--------------------------

    //加速度计量程为2g时,换算关系:16384 LSB/g
    //角度较小时,x=sinx得到角度(弧度), deg = rad*180/3.14
    //因为x>=sinx,故乘以1.3适当放大

    Accel_x  = GetData(ACCEL_XOUT_H);      //从mpu6050读取X轴加速度
    Accel_z  = GetData(ACCEL_ZOUT_H);      //从mpu6050读取z轴加速度
            if(Accel_x>0)
            {
                Angle_accel = atan2((float)Accel_x,(float)Accel_z)*(180/3.14159265);//反正切计算rad
/*    atan2(y,x)是表示X-Y平面上所对应的(x,y)坐标的角度,
                  它的值域范围是(-Pi,Pi)   
      用数学表示就是:atan2(y,x)=arg(y/x)-Pi   
      当y<0时,其值为负,   
      当y>0时,其值为正. atan2*180/Pi可以计算出角度值         */
               
            }
                else
                {
                   Angle_accel = atan2((float)Accel_z,(float)Accel_x)*(180/3.14159265)-90;//反正切计算
                        if(Accel_z<0)
                            Angle_accel=Angle_accel+360;
                    Angle_accel = -Angle_accel;
                }
                                    /*    atan2(y,x)是表示X-Y平面上所对应的(x,y)坐标的角度,
                                              它的值域范围是(-Pi,Pi)   
                                  用数学表示就是:atan2(y,x)=arg(y/x)-Pi   
                                  当y<0时,其值为负,   
                                  当y>0时,其值为正. atan2*180/Pi可以计算出角度值         */
                return Angle_accel;
}


作者: 1249652816    时间: 2013-8-10 21:31
hanlinson 发表于 2013-8-10 21:02
给你核心程序,你慢慢琢磨把!
float Read_Acc_x()
{

其实我想要的是IO口模拟IIC通信程序

作者: 仪124    时间: 2014-8-29 10:38
hanlinson 发表于 2013-8-10 21:02
给你核心程序,你慢慢琢磨把!
float Read_Acc_x()
{



作者: 仪124    时间: 2014-9-11 18:27
hanlinson 发表于 2013-8-10 21:02
给你核心程序,你慢慢琢磨把!
float Read_Acc_x()
{

你好,我对“X-Y平面上所对应的(x,y)坐标的角度”不太理解,为什么要这样算,加速度计输出值减平衡值乘以比例, 陀螺仪输出值乘以比例 ,按互补滤波公式写好,保持互补滤波曲线与陀螺仪曲线跟随性一致,这样基础上调平衡车可以不?





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2