void bmi160_init(void)
{
uint8_t ret = 0,i,imu_data[12];
uint16_t acc_x,acc_y,acc_z;
uint16_t gyr_x,gyr_y,gyr_z;
//Read chip_id
ret = BMI160_Read_Reg(0x00);//0xD1
if(ret != 0xD1){
ret = 0;
}
//Config
BMI160_Write_Reg( 0x41, 0x05);//acc_range
ret = BMI160_Read_Reg(0x41);
if(ret != 0x05){
ret = 0;
}
BMI160_Write_Reg( 0x43, 0x01);//gyr_range
ret = BMI160_Read_Reg(0x43);
if(ret != 0x01){
ret = 0;
}
while(1){
//Read acc and gyr data
for(i=0;i<12;i++){
imu_data[i] = BMI160_Read_Reg(0x0C+i);//gyr acc
}
acc_x = imu_data[1]<<8 | imu_data[0];
acc_y = imu_data[3]<<8 | imu_data[2];
acc_z = imu_data[5]<<8 | imu_data[4];
gyr_x = imu_data[7]<<8 | imu_data[6];
gyr_y = imu_data[9]<<8 | imu_data[8];
gyr_z = imu_data[11]<<8 | imu_data[10];
ret = 1;
}
uint8_t BMI160_Read_Reg(uint8_t reg)
{
uint8_t reg_val;
BMI160_CS = 0;
delay_ms(1);
SPI1_ReadWriteByte(reg | 0x80);
reg_val=SPI1_ReadWriteByte(0xFF);
delay_ms(1);
BMI160_CS = 1;
return(reg_val);
}
uint8_t BMI160_Write_Reg(uint8_t reg,uint8_t value)
{
uint8_t status;
BMI160_CS=0;
status =SPI1_ReadWriteByte(reg & 0x7f);
SPI1_ReadWriteByte(value);
BMI160_CS=1;
return(status);
}
姿态结算算法:
https://blog.csdn.net/wwws1994/article/details/108591750
惯性单元测量原理:
https://zhuanlan.zhihu.com/p/84925247
姿态估计理论
https://www.zhihu.com/column/c_1113915993360990208
https://www.jianshu.com/p/e273b69449ec
关于MPU6050前言简介
首先,个人是通过野火的视频,有专门介绍MPU6050的版块来做的了解。
然后关于MPU6050
基本认识跟坐标系就不做阐述了
MPU6050主要是陀螺仪跟加速度计“:
最直观的角度检测器就是陀螺仪了,它可以检测物体绕坐标轴转动的“角
速度”,如同将速度对时间积分可以求出路程一样,将角速度对时间积分就可以计算出旋转的“角度”。
陀螺仪检测的缺陷:
由于陀螺仪测量角度时使用积分,会存在积分误差,若积分时间 Dt 越小,误差就越小。不断提高采样频率,就可以使积分时间 Dt 变小,降低误差。同样地,提高陀螺仪传感器的采样频率,即可减少积分误差,目前非常普通的陀螺仪传感器的采样频率都可以达到 8KHz,已能满足大部分应用的精度要求。
更难以解决的是器件本身误差带来的问题。例如,某种陀螺仪的误差是 0.1 度/秒,当陀螺仪静止不动时,理想的角速度应为 0,无论它静止多久,对它进行积分测量得的旋转角度都是 0,这是理想的状态;而由于存在 0.1 度/秒的误差,当陀螺仪静止不动时,它采样得的角速度一直为 0.1 度/秒,若静止了 1 分钟,对它进行积分测量得的旋转角度为 6 度,
若静止了 1 小时,陀螺仪进行积分测量得的旋转角度就是 360 度,即转过了一整圈,这就变得无法忍受了。只有当正方向误差和负方向误差能正好互相抵消的时候,才能消除这种累计误差。
关于加速度计
在电子设备中,一般使用加速度传感器来检测倾角,它通过检测器件在各个方向的形变情况而采样得到受力数据,根据 F=ma 转换,传感器直接输出加速度数据,因而被称为加速度传感器。由于地球存在重力场,所以重力在任何时刻都会作用于传感器,当传感器静止的时候(实际上加速度为 0),传感器会在该方向检测出加速度 g,不能认为重力方向测出的加速度为 g,就表示传感器在该方向作加速度为 g的运动。当传感器的姿态不同时,它在自身各个坐标轴检测到的重力加速度是不一样的,利用各方向的测量结果,根据力的分解原理,可求出各个坐标轴与重力之间的夹角
因为重力方向是与地理坐标系的“天地”轴固连的,所以通过测量载体坐标系各轴与重力方向的夹角即可求得它与地理坐标系的角度旋转关系,从而获知载体姿态。
加速度传感器检测的缺陷
由于这种倾角检测方式是利用重力进行检测的,它无法检测到偏航角(Yaw),原理跟 T字型水平仪一样(自行搜索),无论如何设计水平仪,水泡都无法指示这样的角度。
另一个缺陷是加速度传感器并不会区分重力加速度与外力加速度,当物体运动的时候,它也会在运动的方向检测出加速度,特别在震动的状态下,传感器的数据会有非常大的数据变化,此时难以反应重力的实际值。
关于姿态融合(结合陀螺仪和加速度计两种来检测角度)
姿态融合与四元数
可以发现,使用陀螺仪检测角度时,在静止状态下存在缺陷,且受时间影响,而加速度传感器检测角度时,在运动状态下存在缺陷,且不受时间影响,刚好互补。假如我们同时使用这两种传感器,并设计一个滤波算法,当物体处于静止状态时,增大加速度数据的权重,当物体处于运动状时,增大陀螺仪数据的权重,从而获得更准确的姿态数据。
在姿态融合解算的时候常常使用“四元数”来表示姿态,在这里我们只要了解四元数是姿态的另一种表示方式即可,感兴趣的话可自行查阅相关资料。
————————————————
版权声明:本文为CSDN博主「顾之何益」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44754131/article/details/102095051