• mahony互补滤波器C编程


    //gx...分别为重力加速度在三个轴向的分力 由加速度计测得
    //ax...分别为角速度在三个轴向的角速度 由陀螺仪测得
    //最后得到最终滤波完毕的x、y、z方向的角度值(°)

    void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az)
    {
        float norm;
        //  float hx, hy, hz, bx, bz;
        float vx, vy, vz;// wx, wy, wz;
        float ex, ey, ez;
        
        // 先把这些用得到的值算好
        float q0q0 = q0*q0;
        float q0q1 = q0*q1;
        float q0q2 = q0*q2;
        //  float q0q3 = q0*q3;
        float q1q1 = q1*q1;
        //  float q1q2 = q1*q2;
        float q1q3 = q1*q3;
        float q2q2 = q2*q2;
        float q2q3 = q2*q3;
        float q3q3 = q3*q3;
            
        if(ax*ay*az==0)
            return;
            
        norm = sqrt(ax*ax + ay*ay + az*az);       //acc数据归一化
        ax = ax /norm;
        ay = ay / norm;
        az = az / norm;
        
        // estimated direction of gravity and flux (v and w)              估计重力方向和流量/变迁
        vx = 2*(q1q3 - q0q2);                                                //四元素中xyz的表示
        vy = 2*(q0q1 + q2q3);
        vz = q0q0 - q1q1 - q2q2 + q3q3 ;
        
        // error is sum of cross product between reference direction of fields and direction measured by sensors
        ex = (ay*vz - az*vy) ;                                                //向量外积在相减得到差分就是误差
        ey = (az*vx - ax*vz) ;
        ez = (ax*vy - ay*vx) ;
        
        exInt = exInt + ex * Ki;                                  //对误差进行积分
        eyInt = eyInt + ey * Ki;
        ezInt = ezInt + ez * Ki;
        
        // adjusted gyroscope measurements
        gx = gx + Kp*ex + exInt;                                                   //将误差PI后补偿到陀螺仪,即补偿零点漂移
        gy = gy + Kp*ey + eyInt;
        gz = gz + Kp*ez + ezInt;                                               //这里的gz由于没有观测者进行矫正会产生漂移,表现出来的就是积分自增或自减
    
        // integrate quaternion rate and normalise                           //四元素的微分方程
        q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;
        q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;
        q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;
        q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;
        
        // normalise quaternion
        norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
        q0 = q0 / norm;
        q1 = q1 / norm;
        q2 = q2 / norm;
        q3 = q3 / norm;
        
        Q_ANGLE.Yaw = atan2(2 * q1 * q2 + 2 * q0 * q3, -2 * q2*q2 - 2 * q3* q3 + 1)* 57.3; // yaw
        Q_ANGLE.Y  = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; // pitch
        Q_ANGLE.X = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll    
    }
    
  • 相关阅读:
    【HDOJ】1086 You can Solve a Geometry Problem too【计算几何】
    【hiho】 147周 “五维数点” 问题【bitset优化】
    linux查看端口被占用情况,并根据PID kill掉相关进程。
    Git学习笔记
    Please, commit your changes or stash them before you can merge. Aborting
    安装UHD后出现非root用户权限的问题
    sudo 不用再输密码
    一个终端窗口打开多个标签页
    【SDR】UHD安装教程
    WARNING: 'automake-1.14' is missing on your system.
  • 原文地址:https://www.cnblogs.com/maskerk/p/7348824.html
Copyright © 2020-2023  润新知