|
本帖最后由 zzipeng 于 2014-11-15 16:40 编辑
如题,我现在弄四轴代码。姿态已经初步解算出来。但是遇到一个很奇怪的问题。即加速度数据平滑滤波时,输出的数据莫名变大。先上代码:
- #define gyro_denominator 3753.15f //陀螺仪灵敏度
- #define acc_denominator 836.943f //加计灵敏度 8192/9.788=836.943 广州重力加速度 9.788m/s^2
- int16_t G_X,G_Y,G_Z,A_X,A_Y,A_Z;//减去零偏后的数据
- int16_t ACC_Axis_X,ACC_Axis_Y,ACC_Axis_Z;//加计滑动滤波后输出的数据
- float IMU_GYRO_X,IMU_GYRO_Y,IMU_GYRO_Z;//角速度rad/s
- float IMU_ACC_X,IMU_ACC_Y,IMU_ACC_Z;//加速度m/s^2
- 。。。。。。。。
- if(Data_Slid_Analys==TRUE)//检测加计平滑滤波标志
- {
- uint8_t i;
- static u8 coun=0;
- static int16_t ACC_BUF_X[20];
- static int16_t ACC_BUF_Y[20];
- static int16_t ACC_BUF_Z[20];
- int32_t Tempx,Tempy,Tempz;
-
-
- ACC_BUF_X[coun] = A_X;
- ACC_BUF_Y[coun] = A_Y;
- ACC_BUF_Z[coun] = A_Z;
-
- for(i=0;i<20;i++)
- {
- Tempx+=ACC_BUF_X[i];
- Tempy+=ACC_BUF_Y[i];
- Tempz+=ACC_BUF_Z[i];
- }
-
- ACC_Axis_X=Tempx / 20;//求平均输出
- ACC_Axis_Y=Tempy / 20;
- ACC_Axis_Z=Tempz / 20;
-
- IMU_ACC_X=ACC_Axis_X / acc_denominator; //将滑动滤波后的加计数据转换成以m/s^2为单位的加速度数据
- IMU_ACC_Y=ACC_Axis_Y / acc_denominator;
- IMU_ACC_Z=ACC_Axis_Z / acc_denominator;
-
- IMU_GYRO_X=G_X / gyro_denominator; //将陀螺仪数据转换成以rad/s为单位的角速度数据
- IMU_GYRO_Y=G_Y / gyro_denominator;//
- IMU_GYRO_Z=G_Z / gyro_denominator; //
-
- coun++;
- if(coun==20) {coun=0; IMUupdate_Flag=TRUE;//可以解算姿态了}
-
-
- }
复制代码
可以看到,代码其实很简单的。就是对减去零偏后的加计数据平滑滤波后转换成加速度输出,陀螺仪数据不作滤波处理,直接转换成角速度输出。问题是我用匿名的上位机对加计平滑滤波后的数据进行显示观看。发现变量ACC_Axis_X明显变大,直接飙到26000!见图1。奇怪的是ACC_Axis_Y,ACC_Axis_Z并无影响。于是我将ACC_Axis_X=Tempx / 20;//求平均输出这语句屏蔽掉;将IMU_ACC_X=ACC_Axis_X / acc_denominator; 这语句中的ACC_Axis_X 改为A_X,即X轴加计数据放弃滤波输出,这时发现轮到ACC_Axis_Y数据发飙了,ACC_Axis_Z无影响!
试过将acc_denominator,gyro_denominator两个参数改为整数,结果并无变化。。。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|