目前间的的测试如下:
ACCRead(); //读取acc
ea_EulerAngle[0]=-atan2(ax,az); //根据acc算出欧拉(弧度)
// ea_EulerAngle[1]= asin(ay / 0.981);
// ea_EulerAngle[0]=-atan(ax/sqrt((ay*ay)+(az*az)));
ea_EulerAngle[1]=atan(ay/sqrt((ax*ax)+(az*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]*rad; //将弧度转换为角度,便于观察
Pitch=ea_EulerAngle[1]*rad;
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); //四元转欧拉(弧度)
////////////////////////acc融合测试////////////////////////////////////////////
ACCRead(); //读取acc
ea_EulerAngle[0]=-atan2(ax,az); //根据acc算出欧拉(弧度)
// ea_EulerAngle[1]= asin(ay / 0.981);
// ea_EulerAngle[0]=-atan(ax/sqrt((ay*ay)+(az*az)));
ea_EulerAngle[1]=atan(ay/sqrt((ax*ax)+(az*az)));
ea_EulerAngle[2]=0;
ea_EulerAngle[0]=ea_EulerAngle[0]*0.7+ea_fRoll*0.3; //简单的融合
ea_EulerAngle[1]=ea_EulerAngle[1]*0.7+ea_fPitch*0.3;
Quaternion_FromEulerAngle( ea_EulerAngle[0],ea_EulerAngle[1],ea_fYaw ); //欧拉转四元 更新
ea_Quaternion[0]=w;
ea_Quaternion[1]=x;
ea_Quaternion[2]=y; //放入初始化数组
ea_Quaternion[3]=z;
////////////////////////////////////////////////////////////////////////////////////////////////////////
Roll=ea_fRoll*rad; //弧度转化为度
Pitch=ea_fPitch*rad;
Yaw=ea_fYaw*rad;
输出结果基本不漂移,晃动起来就没谱了。呵呵
roll翻转一周,显示过程: 0 - 90 - 180 - (-90)- 0
pitch翻转一周,显示过程:0 - 90 - 0 - (-90)-0 正常的话当pitch越过90度时,roll应当输出180度,现在当pitch到达90度附近(<90度),roll会有异常的输出,有30度左右的输出。当pitch越过90后就正常了
,下面改考虑滤波和更好地数据融合了。。。
[ 本帖最后由 峰回路转 于 2012-2-9 16:02 编辑 ] |