029、传感器时间同步与数据预处理
飞控算法从入门到精通 | 029 传感器时间同步与数据预处理一次炸机让我重新认识时间戳去年夏天调试一架四轴,悬停时突然剧烈抖动,日志里IMU数据看起来正常,但和光流数据对不上。当时以为是光流坏了,换了三个模块,问题依旧。后来把原始log拉出来逐帧看,发现IMU的时间戳比光流快了大约12毫秒——这个偏移量在姿态估计里刚好能把融合结果推到发散边缘。那次炸机之后,我花了两周时间专门重写了传感器时间同步模块,从此再没出过类似问题。很多做飞控的朋友把精力全放在滤波算法上,觉得时间同步不过是“打个时间戳”而已。实际上,传感器时间不同步是飞控系统中最隐蔽、最致命的bug之一。它不会直接报错,只会让你的姿态估计、位置估计慢慢变差,直到某次剧烈机动时彻底崩掉。时间戳的坑,你踩过几个?先说说最常见的几种情况。IMU通常有硬件FIFO,数据输出频率固定,但每次读取时可能因为中断延迟、DMA传输等原因,实际获取时间比数据产生时间晚了几个毫秒。气压计和GPS更惨,它们的输出延迟可能达到几十甚至上百毫秒。如果你把所有传感器数据都打上“当前系统时间”,那融合算法就是在处理一堆时间错位的数据。另一个坑是不同传感器的时钟源不同。IMU用内部晶振,GPS用卫星时钟,气压计可能用MCU的定时器。这些时钟的漂移速率不一样,长时间运行后,时间偏差会越来越大。我见过一个项目,飞了半小时后,IMU和GPS的时间差从最初的2毫秒漂到了80毫秒。还有个容易被忽略的问题:传感器数据到达MCU的顺序和产生顺序可能不一致。比如SPI总线上挂了IMU和磁力计,如果磁力计的转换时间比IMU长