3、传感器冗余设计:IMU冗余配置与数据融合
IMU,也就是惯性测量单元,是飞控系统里最核心的传感器之一。它测量角速度和加速度,说白了就是告诉飞控「我现在是歪了还是斜了」。但IMU这东西有个毛病——它怕坏,也怕飘。一个IMU出问题,整个系统可能就跟着完蛋。
所以,我们得用多个IMU。我习惯用3个,互为备份。为什么是3个?两个也能做冗余,但3个可以做投票,容错能力更强。你想想看,两个IMU打架了,你信谁?三个就好办,少数服从多数。
3.1 冗余配置方案
常见的IMU冗余配置有几种:
- 冷备份:主IMU工作,备IMU断电。主IMU坏了,再切到备IMU。优点是省电,缺点是切换有延迟。
- 热备份:所有IMU同时上电,同时工作。数据实时融合,故障瞬间切换。我建议用热备份,飞控系统对实时性要求极高,冷备份那点延迟可能就炸机了。
- 温备份:介于两者之间,备IMU上电但不输出数据,只保持状态。我个人不太推荐,因为「温」的状态不好定义,容易出幺蛾子。
我在项目中遇到过一件事:某次无人机试飞,用了两个IMU做热备份。结果其中一个IMU的加速度计突然跳变,数据直接飞了。幸好另一个IMU正常,飞控切过去了。但如果是冷备份,切换那几毫秒里,飞控可能就已经失控了。
核心原则:IMU冗余配置,首选热备份。3个IMU互为备份,是最稳妥的方案。
3.2 数据融合:中值表决
有了3个IMU的数据,怎么融合成一个可信的值?我常用的方法是中值表决。
中值表决的原理很简单:把3个IMU的同一轴数据(比如X轴角速度)排个序,取中间那个值。为什么取中间?因为如果有一个IMU坏了,它的数据大概率是异常值,要么极大要么极小。取中间值,就能把异常值剔除掉。
举个例子:
IMU1: 0.52 rad/s
IMU2: 0.48 rad/s
IMU3: 0.99 rad/s // 这个明显异常
排序后:0.48, 0.52, 0.99
中值:0.52 rad/s
你看,IMU3的数据被自动排除了。这就是中值表决的好处——简单、高效、不需要复杂的数学计算。
小技巧:中值表决对单个传感器故障非常有效。但如果两个IMU同时坏了,中值表决就失效了。所以,我还会配合故障检测一起用。
3.3 故障检测:马氏距离
中值表决能处理单个异常值,但遇到更复杂的故障,比如IMU数据缓慢漂移,中值表决就不好使了。这时候,马氏距离就派上用场了。
马氏距离,说白了就是衡量一个数据点跟「正常数据群体」有多远。它跟欧氏距离不一样,欧氏距离只看绝对差值,马氏距离还考虑了数据的分布和相关性。
举个例子:
假设3个IMU的X轴加速度数据:
IMU1: 9.81 m/s²
IMU2: 9.79 m/s²
IMU3: 9.82 m/s²
正常范围应该在9.78~9.84之间。
如果IMU3突然变成9.50,马氏距离就会很大,说明它出故障了。
马氏距离的计算公式:
D² = (x - μ)ᵀ · Σ⁻¹ · (x - μ)
其中:
x 是当前数据点
μ 是正常数据的均值向量
Σ 是协方差矩阵
嗯,这里要注意:马氏距离的计算量比中值表决大得多。在嵌入式系统里,你得权衡一下计算资源和实时性。我一般只在关键轴(比如俯仰、横滚)上用马氏距离,其他轴用中值表决就够了。
避坑指南:我曾经在某个项目里,把所有IMU数据都跑马氏距离检测,结果CPU负载飙到80%以上,飞控差点卡死。后来我改成只在起飞和降落阶段做马氏距离检测,巡航阶段用中值表决,问题就解决了。
3.4 整体架构图
下面这张图展示了IMU冗余设计的整体流程:
流程很简单:3个IMU的数据先进入融合模块,做中值表决和马氏距离检测。如果检测到故障,就隔离那个IMU,同时把故障信息反馈回去。最终输出一个可信的融合数据给飞控。
3.5 实际工程中的注意事项
最后,我总结几个实际工程中的坑:
- IMU安装位置:3个IMU尽量靠近安装,减少机械振动差异。我见过有人把IMU装在机翼两端,结果数据差异巨大,中值表决都救不了。
- 时间同步:3个IMU的数据必须时间对齐。差1毫秒,融合出来的数据可能就错了。我习惯用硬件触发同步,软件同步不太靠谱。
- 故障阈值设置:马氏距离的阈值不能太紧,也不能太松。太紧容易误报,太松容易漏报。我一般先用仿真数据跑一遍,再根据试飞数据微调。
- 降级策略:如果3个IMU坏了2个,系统要能降级到单IMU模式。别直接炸机,至少让无人机能安全降落。
个人习惯:我每次做IMU冗余设计,都会在代码里加一个「健康状态」变量。每个IMU的健康状态用0~100表示,低于某个阈值就自动隔离。这样调试起来特别方便。
好了,IMU冗余设计这块就讲这么多。说白了,核心就是三个字:冗余、融合、检测。你只要把这三点做好,IMU这块基本不会出大问题。
公众号:蓝海资料掘金营,微信deep3321