机器人 - 无人机基础(5) - 飞控中的传感器(ing)
目录
一、加速度计
1.1 加速度计原理
1.2 加速度计校准
1.2.1 误差模型
1.2.2 关于MPU6050校准方式 与 代码思路
二、陀螺仪
2.1 陀螺仪原理
2.1.1 科里奥利力
2.1.2 陀螺仪原理
2.2 陀螺仪校准
三、加速度计与陀螺仪滤波部分
四、磁力计
4.1 磁力计原理
一、加速度计
1.1 加速度计原理
首先说一下以前没有GNSS全球卫星定位系统时,导弹是用惯性测量元件获取信息;
比如 加速度计、角速度计;
我们知道获取到了加速度,可以根据加速度对时间进行积分得到速度,对速度进行积分又可以得到路程;对角速度进行积分可以得到角度;
看上去确实很棒,但是惯性测量元件本身会有误差,在通过时间积分之后误差会累积...大多数情况下,成本越低...误差越大...也累积得越快...
在出现GNSS后,现代导弹是利用卫星和惯导同步获取信息的,等于说卫星定位系统来给惯导系统做补偿,来修正这个累积的误差值;
人体的惯导+GNSS
耳蜗中有液体,液体有惯性,运动时耳中神经可以感受到运动特征,所以把耳蜗比作惯导;
眼睛比作GNSS,但是工作方式不同;
那么我们睁着眼睛走路,耳蜗在感受运动特征时,即使出现误差值,可以利用眼睛作修正;
但是闭着眼睛走路,仅仅只有耳蜗作为定位,没有修正,误差值一直累积,导致人很难走直线;
耳蜗受损时,保持平衡的能力受损也类似;
1.2 加速度计校准
1.2.1 误差模型
这里的误差模型中,am'是原始数据,ba‘是零点偏移补偿,
首先,什么是零点偏移补偿?因为芯片生产、装配有瑕疵,哪怕静止(理论加速度为 0),它也会输出一个错误的小数值,这时候需要ba’零点偏移补偿,来把这个误差抵消;
Sa是尺度因子(尺度比例补偿)
加速度计测量时,可能存在 “量程缩放不准” 的问题 。比如真实加速度是 1g,理论该输出 1,但因为芯片 “放大 / 缩小” 了信号,实际输出 0.9(或 1.1)。Sa 就是给 x 轴 “修正比例”,让它从错误的 0.9→1(或 1.1→1 )。乘以Sa后,得到 “消除零点偏移 + 修正尺度比例后的理论值” 。
安装 / 扭转误差补偿
加速度计芯片理论上 x 轴要和 “实际测量方向” 完全对齐,但实际安装时,可能歪了一点点(比如绕 y 轴转了个小角度),导致测出来的 x 轴数据 “混进了 y 轴的分量”。旋转矩阵Ra 就像 “把歪掉的坐标系,旋转回正确方向”,把混进的错误分量 “转回去”,得到 “消除所有误差后的真实加速度am” 。
说这些可能难懂,我们把加速度计想成个出厂时不准的尺子,
(1).首先 零点飘了,零刻度线位置不对,这时候我们用ba’将其恢复到正确位置;
(2).接着,刻度不均匀,我们利用Sa重新刻刻度;
(3).尺子不够直,是歪的,我们利用Ra把尺子"掰正";
这样使得加速度计这个“尺子”的误差被修正;
1.2.2 关于MPU6050校准方式 与 代码思路
使用MPU6050时,假如没有高精度平台情况下,可以考虑用下列简易的方法进行校准;
(1).把装了加速度计的飞控水平放置,这时候Z轴朝着正下方,XY轴的重力分量是0,Z轴测到加速度量为1g;
(2).这时候,XY轴上读到的数据就是零点飘移,Z轴的数据-1g也可以认为是Z轴的零点飘移;
下列代码中:
sum[7] 前三个是存加速度计ax/ay/az 原始数据累加的;
acc_sum_cnt 是统计加速度计采样次数,判断有没有达到校准所需要的多次采样;/********************************************************** * 函数原型: void MPU6050_calibration() * 功 能: 校准加速度计和陀螺仪 **********************************************************/ void MPU6050_calibration(void) {static uint16_t acc_sum_cnt = 0, gyro_sum_cnt = 0;static int32_t sum[7] = {0,0,0,0,0,0};if(mpu6050.Acc_CALIBRATE){acc_sum_cnt++;sum[0] += mpu6050.ax_raw;sum[1] += mpu6050.ay_raw;sum[2] += mpu6050.az_raw - 4096; if(acc_sum_cnt >= MEMS_CALIB_AVG_NUM){mpu6050.Ax_offset = (float)sum[0]/MEMS_CALIB_AVG_NUM;mpu6050.Ay_offset = (float)sum[1]/MEMS_CALIB_AVG_NUM;mpu6050.Az_offset = (float)sum[2]/MEMS_CALIB_AVG_NUM;acc_sum_cnt = 0;if(mpu6050.Acc_CALIBRATE == 1){Param_SaveAccelOffset(mpu6050.Ax_offset, mpu6050.Ay_offset, mpu6050.Az_offset);}mpu6050.Acc_CALIBRATE = 0;sum[0] = sum[1] = sum[2] = 0;}}if(mpu6050.Gyro_CALIBRATE){gyro_sum_cnt++;sum[3] += mpu6050.gx_raw;sum[4] += mpu6050.gy_raw;sum[5] += mpu6050.gz_raw; if(gyro_sum_cnt >= MEMS_CALIB_AVG_NUM){mpu6050.Gx_offset = (float)sum[3]/MEMS_CALIB_AVG_NUM;mpu6050.Gy_offset = (float)sum[4]/MEMS_CALIB_AVG_NUM;mpu6050.Gz_offset = (float)sum[5]/MEMS_CALIB_AVG_NUM;gyro_sum_cnt = 0;if(mpu6050.Gyro_CALIBRATE == 1){Param_SaveGyroOffset(mpu6050.Gx_offset, mpu6050.Gy_offset, mpu6050.Gz_offset);}mpu6050.Gyro_CALIBRATE = 0;sum[3] = sum[4] = sum[5] = 0;}} }
二、陀螺仪
2.1 陀螺仪原理
2.1.1 科里奥利力
用立创eda画的...先凑合着看...
这里我只是提一嘴,所以不够严谨,以理解个大概就行...需要深入的可以去查一下;
首先,假设有个圆盘,它不动的。那么盘上点A有个物体,受到F作用到点B直线运动,此时它运动路程也是直线的,很好理解吧...
现在,在次基础上,圆盘以ω逆时针运动,那么路径是下面这样的吧
我们可以引入一个虚拟力,
,来表述另物体m改变运动轨迹的力...
2.1.2 陀螺仪原理
现在,假如有两个小方块,沿着x轴,同时做反向振动 - 你动我也动,方向相反,但是速度大小相同;根据刚刚上面说到的科里奥利力,会发现它们两个受到的科里奥利力相反,这一对相反的力会把两个小块往相反的方向拉,导致它们和固定电极的间距变化;从而导致电容差分变化;
说人话一点就是,陀螺仪里面两小玩意在那振动,你让这陀螺仪旋转了,里面电容变化了,然后这个电容变化被映射到角速度上面去,然后反馈回来给我们知道;
2.2 陀螺仪校准
这部分直接参考加速度计那里
三、加速度计与陀螺仪滤波部分
因为无人机电机旋转产生的振动容易引起传感器与加速度计的高频噪声;
所以在采集数据之后,可以试着采用平滑滤波,或者FIR、IIR滤波进行处理;
滤波算法 - 滑动平均滤波_滑动平均滤波算法原理-CSDN博客
这篇文章有我之前工作中用过的一种简单的滤波方法,直接复制粘贴就能用了;
四、磁力计
4.1 磁力计原理
利用磁致电阻AMR来检测空间中磁感应强度大小;
磁场的强弱变化会导致AMR阻值发生变化;
AMR磁阻效应:
(1).首先,磁场方向 / 强度变化时,阻值也跟着变化;
(2).制造AMR时,先用强磁预磁化,让材料内部形成一个主磁域,或者说是给它固定一个初始磁场方向;这时,材料有一个“敏感轴”,与主磁域垂直方向,磁场变化最敏感;
(3).根据资料显示,为了使测量结果以线性的方式变化,AMR材料上的金属导线是呈45°角排列;
(4).外界有磁场时,AMR主磁域方向会变化,导致磁场方向和电流夹角也变化,夹角的变化导致AMR阻值变化;
之后利用惠斯通电桥检测AMR阻值变化;
磁场变化的时候,假设R1R2增加a,R3R4减少a,电桥失衡,那么会出现一个微小电压被检测到;