4. 数据采集与预处理:陀螺仪静态数据采集规范、采样率选择、数据长度要求、去趋势处理
做Allan方差分析,第一步不是写代码,而是把数据采对。我见过太多人花大把时间调算法,结果数据本身就有问题,分析出来的东西根本没法用。说白了,数据采集这个环节要是没做好,后面全是白搭。
4.1 静态数据采集规范
陀螺仪的静态数据,指的是传感器在完全静止状态下输出的数据。注意,我说的是「完全静止」。你把它放在桌面上,桌面本身有没有振动?周围有没有人走动?空调风吹没吹到?这些都会影响。
我个人习惯的做法是这样的:
- 固定安装:把陀螺仪用螺丝固定在一个刚性平台上,最好是铸铁或者大理石台面。别用手拿着,也别用双面胶粘。
- 环境隔离:放在无风、无振动的环境中。我在项目中遇到过,有一次数据里出现了周期性的波动,查了半天,结果是隔壁实验室的离心机在转。
- 预热充分:上电后至少等30分钟再开始采集。陀螺仪内部有温度敏感元件,刚上电时温度还没稳定,数据会有漂移。
- 接地处理:确保传感器和采集系统的地线连接良好,避免共模干扰。
4.2 采样率选择
采样率怎么定?这取决于你想分析的时间尺度。Allan方差能分析的时间范围,是从采样间隔的2倍到总时长的一半。
举个例子:
- 采样率100Hz,采样间隔10ms,能分析的最短时间是20ms
- 采样率1Hz,采样间隔1s,能分析的最短时间是2s
我建议的采样率选择原则:
| 应用场景 | 推荐采样率 | 理由 |
|---|---|---|
| 消费级MEMS陀螺仪 | 100Hz | 噪声较大,高频成分需要足够采样点 |
| 工业级光纤陀螺 | 10-50Hz | 噪声较低,采样率可以低一些 |
| 高精度激光陀螺 | 1-10Hz | 主要关注长期漂移,高频信息意义不大 |
你想想看,采样率太高会怎样?数据量太大,处理起来慢,而且高频噪声会掩盖掉你关心的低频特性。采样率太低呢?又看不到短时间尺度上的噪声特性。所以,得根据你的陀螺仪类型来选。
4.3 数据长度要求
数据长度,说白了就是你要采多久。这个跟采样率一样,取决于你想分析的时间尺度。
核心公式很简单:总时长 = 采样间隔 × 采样点数
但实际中,我一般遵循这个经验法则:
- 想分析到100秒的时间尺度,至少采1000秒的数据
- 想分析到1000秒的时间尺度,至少采10000秒的数据
- 以此类推
为什么会这样?因为Allan方差在长相关时间上的置信度,取决于你拥有的独立样本数量。样本太少,方差估计就不准。我在项目中吃过这个亏,有一次只采了30分钟的数据,结果Allan方差曲线在末端抖得跟心电图似的,根本没法用。
4.4 去趋势处理
陀螺仪的静态数据里,通常包含一个缓慢变化的趋势项。这个趋势可能来自温度漂移、电源波动,或者传感器本身的零偏稳定性。
如果不把这个趋势去掉,Allan方差分析的结果会被严重扭曲。说白了,你会把趋势误认为是噪声,得出错误的结论。
去趋势的方法,我常用两种:
- 线性去趋势:用最小二乘法拟合一条直线,然后从原始数据中减去这条直线。适用于趋势近似线性的情况。
- 多项式去趋势:用高阶多项式拟合趋势项。适用于趋势比较复杂的情况,但阶数不要太高,一般2-3阶就够了。
代码实现很简单,Python里用scipy.signal.detrend就行:
import numpy as np
from scipy import signal
# 假设 data 是采集到的陀螺仪数据
# 线性去趋势
data_detrended = signal.detrend(data, type='linear')
# 也可以做常数去趋势(减去均值)
data_detrended = data - np.mean(data)
嗯,这里要注意一点:去趋势操作本身会引入一些误差,尤其是当你用高阶多项式拟合时。所以,能简单就别复杂。我曾经为了追求完美,用了一个5阶多项式去拟合趋势,结果把一些低频噪声也给去掉了,Allan方差曲线在长相关时间上出现了不正常的下降。后来换成线性去趋势,问题就解决了。
4.5 本章小结
数据采集和预处理,是整个Allan方差分析的基础。采样率、数据长度、去趋势处理,这三个环节环环相扣。采样率决定了你能看到的最短时间尺度,数据长度决定了你能看到的最长时间尺度,去趋势处理则保证了分析结果的准确性。
做这一章的时候,我脑子里一直在回想自己踩过的那些坑。希望你能少走弯路,把数据采好、处理好,后面的分析才能顺风顺水。