终于调通了。代码如下
ea_EulerAngle[0]=0;//(atan2(ax,az)); //根据acc算出欧拉(弧度)
ea_EulerAngle[1]=0;//(-atan2(ay,az));
ea_EulerAngle[2]=0;
Quaternion_FromEulerAngle( ea_EulerAngle[0],ea_EulerAngle[1],ea_EulerAngle[2] ); //欧拉转四元 初始值
ea_Quaternion[0]=w;
ea_Quaternion[1]=x;
ea_Quaternion[2]=y; //放入初始化数组
ea_Quaternion[3]=z;
Roll=ea_EulerAngle[0]*57.29578; //将弧度转换为角度,便于观察
Pitch=ea_EulerAngle[1]*57.29578;
delay_ms(21);
while(1)
{test=!test;
GyroRead(); //读取gyro
new_EulerAngle[0]=(gx/rad*f); //读取到的为度/s /pi/180
new_EulerAngle[1]=(gy/rad*f);
new_EulerAngle[2]=(gz/rad*f);
Quaternion_FromEulerAngle( new_EulerAngle[0],new_EulerAngle[1],new_EulerAngle[2] ); //欧拉转四元 更新
new_Quaternion[0]=w;
new_Quaternion[1]=x; //得到新的四元
new_Quaternion[2]=y;
new_Quaternion[3]=z;
Quaternion_Multiply(ea_Quaternion[0],ea_Quaternion[1],ea_Quaternion[2],ea_Quaternion[3],new_Quaternion[0],new_Quaternion[1],new_Quaternion[2],new_Quaternion[3] ) ;//四元乘法,和原始姿态融合
ea_Quaternion[0]=c_w;
ea_Quaternion[1]=c_x; //得到新的四元
ea_Quaternion[2]=c_y;
ea_Quaternion[3]=c_z;
Quaternion_ToEulerAngle(c_w,c_x,c_y,c_z); //四元转欧拉(弧度)
Roll=ea_fRoll*57.29578; //弧度转化为度
Pitch=ea_fPitch*57.29578;
Yaw=ea_fYaw*57.29578;
LED1=!LED1;
delay_ms(21);
}
实际初始化是没有计算角度
出现的问题:得到的roll pitch yaw值转换为角度后数值缩小了10倍,例如:90度,算出来的是9.0度,仔细检查了adc和弧度-度转换没发现问题在哪。还有就是ea_fPitch = asin(CLAMP(2 * (w * x - y * z) , -1.0 , 1.0));中的clamp函数,应该是clamp(x,min,max)if x<min x=min;if x>max x=max. 但是一旦加加上CLAMP ,pitch的输出始终为零。只好写成 ea_fPitch = asin(2 * (w * x - y * z));
目前静态漂移在每分钟18度左右。
[ 本帖最后由 峰回路转 于 2012-2-2 02:05 编辑 ] |