前面的文章(知乎专栏 https://zhuanlan.zhihu.com/c_60591778)曾简单讲过IMU数据(陀螺仪、加速度数据)的校准以及一阶低通滤波。本文在此基础上更进一步讲一下数据的指标分析与滤波器的选择问题。
IMU数据的重要性
IMU数据在飞控中处于最底层的数据,其重要性可见一斑。一般可降级的飞控,在遇到如GPS故障时,可降级飞行模式,来保证飞行安全性。其中,由陀螺仪数据决定的角速度飞行模式是所有飞行模式的基础,换而言之,一个飞机飞的稳不稳主要要看陀螺仪的数据。
采样频率
前面的文章有提到过控制带宽的问题,一般来说,由于电调的响应在400hz左右,所以设计的角速度控制环最高可到400hz左右(再高就没有什么意义了);而一般飞行器的带宽在30-40hz左右,所以控制频率最好不低于200hz。所以,角速度的反馈数据,频率最好在200-400hz左右(至少与控制频率一致)。
频率混叠
如果IMU的采样频率降到与干扰频率差不多时,比如IMU的采样为200hz,而实际可能有192hz的高频干扰,因为采样只有200hz,只能分辨出100hz的数据,这时192hz的干扰会对数据造成频率混叠,即低频段的数据波形错误,数据失真。
结论:数据的采样频率尽可能高,这里既有控制器的考虑,也避免频率混叠的情况。
如何减震?
有过飞机组装设计经验的人知道,飞机在飞行时,由于电机的转动,导致机身的震动过大,而这些震动对飞控的数据影响很大,所以必须要做一定的减震处理(实际有些飞行器可能不需要减震,由各个飞机的情况决定)。
而最头痛的就是如何设计减震?或者说,怎么判定减震是否设计良好?由于最终目的是处理好IMU的数据,所以就飞控而言,即通过IMU数据的质量好坏来辨别是否减震设计良好。
如何分析IMU数据质量?
时域上来看的话,取一组悬停飞行的波形观察,经验值是陀螺仪的数据噪声波动不超过正负0.15rad/s,加速度不超过正负3m/s2。
笔者这里取出一组飞行良好的数据,200hz采样,200hz回传保存。飞行动作包括悬停与roll轴的动作。数据包含两个部分,200hz采样的原始数据,和进行50hz的巴特沃斯低通滤波后的数据。数据波形如下:
放大悬停部分:
图中可以看出,原始数据噪音很大,波动范围约正负0.6rad/s,而红色滤波后的数据则表现良好。
对数据进行FFT分析:
图2可以看到原始数据在80-100hz左右具有高频干扰,而图3,滤波后的FFT表明这段高频干扰已经去除,低频段的波形基本一致,证明滤波器有效。
滤波器截止频率选择
如上数据波形所示,对原始数据进行FFT分析后,得到其各个频段的幅值,比如这里的80-100hz有干扰,则将滤波器设置在70以下都可以。
结论:滤波器截止频率的选择与原始数据的FFT有关。通常有个经验值30-50都可。
滤波器是否有差别?
这里尝试三个不同的滤波器,一阶低通、2阶IIR和FIR。
设计一个6阶的FIR滤波器,截止频率50hz,对比二阶巴特沃斯,50hz滤波器,以及50hz一阶低通。
对比滤波后的FFT,放大观察
可见6阶FIR滤波器滤波效果更佳,高频段几乎滤掉。所以6阶FIR > 2阶IIR > 一阶低通
IIR与FIR的区别?
简单来说就是一个是非线性相位延迟,一个是线性相位延迟。比如FIR,无论在低频还是高频段,其滤波后的数据延迟是固定的。而IIR则不是,在低频段的延迟小于其高频段的延迟。
为什么开源用的都是IIR?
这里笔者分析主要是实现问题,IIR结构简单,只需在代码中设置好采样频率和截止频率,则自动生成对应的滤波器参数,而FIR这里,笔者是在matlab下设计的滤波器,再将得到的参数放置在代码中,过程较为繁琐,且优势不明显。另外,IIR滤波器的运算量也较FIR要小。
其次,这里,在动态下,6阶FIR的延迟较大,所以滤波时不能光考虑数据的平滑,还要考虑延迟对控制器的影响,综合来看,还是IIR较为好用。
数据延时约0.01s。
所以,综上,一般采用2阶IIR滤波即可,其在数据的平滑性和可接受的延迟两个指标下综合最优。
延时有处理办法吗?
如果基于上面FIR滤波过后的数据,数据质量良好,但是延时过大,如何处理?
给数据加上微分量作为预测。
放大观察
这里延时是处理了,但是牺牲了数据的质量,数据的幅值发生变化,因此该处理是有严格条件的。实际应用中,并不一定好用。
卡尔曼滤波
这里笔者设计了一个单维的卡尔曼滤波,模型如下:
解释一下,认为状态转移为1,即数据无变化,u为模型的输入,以角速度的微分即角加速度。观测值即模型的输出,所以C也为1.
时域:
放大观察:
该模型下kalman,其性能与2阶IIR几乎一致。无特别明显优势处。
总结: