本帖最后由 huxiaoyingying 于 2016-2-23 21:17 编辑
我的也是跟你一样!请问你找到什么原因了吗?
求楼主大神解答一下跪拜!!!
const float g_kp=2.0f;//加速度权重,越大则向加速度测量值收敛越快
const float g_ki=0.005f;//误差积分增益
const float g_period=0.04f;//单位秒
float q0=1,q1=0,q2=0,q3=0;
float exInt=0,eyInt=0,ezInt=0;//scaled integral error
void CCCOMDealDlg::Quaternion_CF(FLOAT_SENSORDATA stSensor, float *roll, float *pitch, float *yaw)
{
float norm;
float vx, vy, vz;
float ex, ey, ez;
float ax,ay,az;
float gx,gy,gz;
ax = stSensor.fAx;//加速度
ay = stSensor.fAy;
az = stSensor.fAz;
gx = stSensor.fTx;//角速度
gy = stSensor.fTy;
gz = stSensor.fTz;
// normalise the measurements(加计的三维向量转成单位向量)
norm = sqrt(ax*ax + ay*ay + az*az);
ax = ax / norm;
ay = ay / norm;
az = az / norm;
// estimated direction of gravity(提取四元数的等效余弦矩阵中的重力分量)
vx = 2*(q1*q3 - q0*q2);
vy = 2*(q0*q1 + q2*q3);
vz = q0*q0 - q1*q1 - q2*q2 + q3*q3;
// error is sum of cross product between reference direction of field and direction measured by sensor
// 向量叉积得出姿态误差
ex = (ay*vz - az*vy);
ey = (az*vx - ax*vz);
ez = (ax*vy - ay*vx);
// integral error scaled integral gain
// 对误差进行积分
exInt = exInt + ex*g_ki;
eyInt = eyInt + ey*g_ki;
ezInt = ezInt + ez*g_ki;
// adjusted gyroscope measurements
// 互补滤波,姿态误差补偿到角速度上,修正角速度积分漂移
gx = gx + g_kp*ex + exInt;
gy = gy + g_kp*ey + eyInt;
gz = gz + g_kp*ez + ezInt;
// integrate quaternion rate and normalise
// 一阶龙格库塔法更新四元数
q0 = q0 + (-q1*gx - q2*gy - q3*gz)*g_period/2;
q1 = q1 + (q0*gx + q2*gz - q3*gy)*g_period/2;
q2 = q2 + (q0*gy - q1*gz + q3*gx)*g_period/2;
q3 = q3 + (q0*gz + q1*gy - q2*gx)*g_period/2;
// normalise quaternion
// 四元数归一化
norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
q0 = q0 / norm;
q1 = q1 / norm;
q2 = q2 / norm;
q3 = q3 / norm;
//TRACE("%.2f %.2f %.2f %.2f\n", q0, q1, q2, q3);
float radian;
//四元数转欧拉角
if(roll)
{
//radian = atan2f(2.0f*(q0*q1 + q2*q3), 1 - 2.0f*(q1*q1 + q2*q2));
radian = atan2f(-2.0f*(q1*q3 - q0*q2),1 - 2.0f*(q1*q1 + q2*q2));
*roll = radian*180/3.14f;
}
if(pitch)//俯仰角
{
// 使用safe_asin()来处理pitch接近90/-90时的奇点
//radian = asin(2.0f*(q0*q2 - q1*q3));
radian = asin(2.0f*(q2*q3 + q0*q1));
*pitch = radian*180/3.14f;
}
if(yaw)//航向角
{
//radian = atan2f(2.0f*(q1*q2 - q0*q3), 2.0f*(q0*q0 + q1*q1) - 1);
radian = atan2f(2.0f*(q1*q2 - q0*q3), 1- 2.0f*(q1*q1 + q3*q3));
*yaw = radian*180/3.14f;
}
//TRACE("%.2f\t%.2f\t%.2f\n", *roll, *pitch, *yaw);
}
|