| 
 
中级会员  
 
	积分487金钱487 注册时间2017-12-25在线时间105 小时 | 
 
30金钱 
| 请问各位大神,MiniFly微型四轴飞行器里的差值ex,ey,ez为什么是这样计算
 /*加速计读取的方向与重力加速计方向的差值,用向量叉乘计算*/
 ex = (acc.y * rMat[2][2] - acc.z * rMat[2][1]);
 ey = (acc.z * rMat[2][0] - acc.x * rMat[2][2]);
 ez = (acc.x * rMat[2][1] - acc.y * rMat[2][0]);
 
 源代码如下
 
 复制代码void imuUpdate(Axis3f acc, Axis3f gyro, state_t *state , float dt)        /*数据融合 互补滤波*/
{
        float normalise;
        float ex, ey, ez;
        float halfT = 0.5f * dt;
        float accBuf[3] = {0.f};
        Axis3f tempacc = acc;
        
        gyro.x = gyro.x * DEG2RAD;        /* 度转弧度 */
        gyro.y = gyro.y * DEG2RAD;
        gyro.z = gyro.z * DEG2RAD;
        /* 加速度计输出有效时,利用加速度计补偿陀螺仪*/
        if((acc.x != 0.0f) || (acc.y != 0.0f) || (acc.z != 0.0f))
        {
                /*单位化加速计测量值*/
                normalise = invSqrt(acc.x * acc.x + acc.y * acc.y + acc.z * acc.z);
                acc.x *= normalise;
                acc.y *= normalise;
                acc.z *= normalise;
                /*加速计读取的方向与重力加速计方向的差值,用向量叉乘计算*/
                ex = (acc.y * rMat[2][2] - acc.z * rMat[2][1]);
                ey = (acc.z * rMat[2][0] - acc.x * rMat[2][2]);
                ez = (acc.x * rMat[2][1] - acc.y * rMat[2][0]);
                
                /*误差累计,与积分常数相乘*/
                exInt += Ki * ex * dt;
                eyInt += Ki * ey * dt;
                ezInt += Ki * ez * dt;
                
                /*用叉积误差来做PI修正陀螺零偏,即抵消陀螺读数中的偏移量*/
                gyro.x += Kp * ex + exInt;
                gyro.y += Kp * ey + eyInt;
                gyro.z += Kp * ez + ezInt;
        }
        /* 一阶近似算法,四元数运动学方程的离散化形式和积分 */
        float q0Last = q0;
        float q1Last = q1;
        float q2Last = q2;
        float q3Last = q3;
        q0 += (-q1Last * gyro.x - q2Last * gyro.y - q3Last * gyro.z) * halfT;
        q1 += ( q0Last * gyro.x + q2Last * gyro.z - q3Last * gyro.y) * halfT;
        q2 += ( q0Last * gyro.y - q1Last * gyro.z + q3Last * gyro.x) * halfT;
        q3 += ( q0Last * gyro.z + q1Last * gyro.y - q2Last * gyro.x) * halfT;
        
        /*单位化四元数*/
        normalise = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
        q0 *= normalise;
        q1 *= normalise;
        q2 *= normalise;
        q3 *= normalise;
        
        imuComputeRotationMatrix();        /*计算旋转矩阵*/
        
        /*计算roll pitch yaw 欧拉角*/
        state->attitude.pitch = -asinf(rMat[2][0]) * RAD2DEG; 
        state->attitude.roll = atan2f(rMat[2][1], rMat[2][2]) * RAD2DEG;
        state->attitude.yaw = atan2f(rMat[1][0], rMat[0][0]) * RAD2DEG;
        
        if (!isGravityCalibrated)        /*未校准*/
        {                
//                accBuf[0] = tempacc.x* rMat[0][0] + tempacc.y * rMat[0][1] + tempacc.z * rMat[0][2];        /*accx*/
//                accBuf[1] = tempacc.x* rMat[1][0] + tempacc.y * rMat[1][1] + tempacc.z * rMat[1][2];        /*accy*/
                accBuf[2] = tempacc.x* rMat[2][0] + tempacc.y * rMat[2][1] + tempacc.z * rMat[2][2];        /*accz*/
                calBaseAcc(accBuf);                /*计算静态加速度*/                                
        }
}
 
 | 
 
最佳答案
查看完整内容[请看2#楼] 请看这个https://blog.csdn.net/Leyvi_Hsing/article/details/54293690 |