做动态ToF + IMU这套东西,最麻烦的其实不是单个传感器的数据质量,而是把“测距值”和“运动信息”在时间轴上对齐。项目名字里三个关键词——Ranging、Timestamp、dynamic——基本就把核心痛点说完了:ToF在动,IMU在动,你怎么知道某一帧测距值到底是哪个时刻测的,又怎么把IMU的信息用上去补偿这个动态误差。这篇文章我就从这几个点展开,把我实际做这套组合传感器时踩过的坑、验证过的方案、以及最后沉淀下来的处理流程整理一遍,给后面接手类似项目的朋友做个参考。
这套组合适合谁看?如果你正在做机器人避障、无人机定高、AR设备的近距离感知,或者任何需要“在运动状态下用ToF测距并用IMU做补偿”的场景,这篇文章的内容应该都能直接借鉴。如果你只是静态测距,那ToF本身就能干得很好,但一旦传感器开始运动,测距值里混入的运动伪影(motion blur)和时刻模糊(temporal ambiguity)就会让精度断崖式下跌,这时候IMU的价值就体现出来了。我下面讲的方案,全部基于一个前提:你手上有一颗能输出原始测量数据的ToF传感器,和一颗能输出加速度计/陀螺仪数据的IMU,这两颗传感器挂在同一个嵌入式系统里,时间戳可以软件同步,最好也能硬件触发。
1. 项目概述:这套组合到底要解决什么问题
1.1 为什么是ToF + IMU
ToF(Time of Flight)传感器的核心优势很直接:它能输出绝对的测距值,不像视觉那样需要特征匹配,也不像超声波那样受环境反射干扰严重。它的原理是发射调制光,测量光从发射到接收的飞行时间,乘上光速再除以二,得到距离。这个原理看起来简单,但有一个天然短板——它测的是一个时间窗口内的“平均效果”,而不是某个瞬间的瞬时距离。
当传感器静止时,这个短板根本没有存在感。但一旦传感器开始运动,问题就来了:如果光在飞行期间(对几米的距离来说大约是几十纳秒量级,本身可以忽略)或者调制光在积分期间(这个才是大头,通常是几毫秒到几十毫秒)传感器发生了位移,那么测出来的距离值就不是某个时刻的真实距离,而是积分时间窗内距离的某种加权平均。这个效应类比到视觉上就像是拍照时手抖导致的运动模糊,只是ToF表现出来的是测距值被“拖影”了。
IMU正好补上这个短板。IMU以几百赫兹的帧率输出加速度和角速度,虽然它有积分漂移,但在几十毫秒的短时间窗口内,它对运动的估计是相当可靠的。我们可以用IMU的运动信息去推算ToF测距时刻传感器的位移或速度,然后对测距值做补偿,或者至少给测距值标上一个更精确的“测量时刻”。这就是ToF + IMU组合的核心逻辑:ToF负责绝对距离,IMU负责短时运动,两者一融合,动态测距精度就有救了。
1.2 整套系统的核心矛盾:测距、时间戳、动态三者之间的耦合
先理清一下这套系统里要处理的核心矛盾。ToF输出的是距离值d,IMU输出的是加速度a和角速度ω。如果系统是静态的,d就是d,完全不需要IMU。但在动态场景下,ToF输出d的时刻是什么?这个时刻传感器的速度是多少?如果不回答这两个问题,d和IMU数据之间就存在一个“时间错位”,而且这个错位不是固定的——传感器运动越快,错位造成的误差越大。
举一个具体数字:假设传感器以2 m/s的速度沿测距方向运动,而我们的时间戳误差是1 ms,那么距离误差就是2 mm。如果时间戳误差达到5 ms,误差就是1 cm。对于一颗本身精度在毫米级的ToF传感器来说,1 cm的误差是不可接受的。更棘手的是,这个误差不是随机的,而是和运动速度强相关的,表现出来就是“运动越快,测距越漂”,看起来像系统性问题,其实是时间戳问题。
所以整套系统有三个环环相扣的任务:第一,把ToF测距时刻精确标定出来;第二,把IMU数据通过时间同步映射到同一个时刻;第三,用IMU的运动信息对ToF测距值做动态补偿。下面每一章基本就是围绕这三个任务展开的。整个过程里,我发现最容易被忽视的其实是第一个任务——很多人以为“拿到ToF数据时打个时间戳就行了”,但这里面的门道比想象的多不少。
2. ToF测距核心逻辑与帧结构设计
2.1 ToF测距原理和动态场景下的挑战
ToF测距有好几种实现方式,最常见的两类是直接ToF(dToF)和间接ToF(iToF)。dToF直接测量单个光子的飞行时间,适合长距离、高动态场景,苹果的激光雷达扫描仪就是这类方案;iToF则是发射调制后的连续光,通过测量反射光和发射光之间的相位差来反推距离,成本低、分辨率高,但更容易受多径干扰和运动伪影影响。
无论哪种方案,动态场景下的核心挑战都是同一件事:单个测量值不是“瞬时”的,而是在一个积分窗口内累积出来的。iToF尤其明显,因为相位解算需要采集多个采样点,典型积分时间从几百微秒到几十毫秒不等。在这个窗口内,如果传感器沿着测距方向移动了哪怕几个毫米的几分之一,也会给相位解算引入误差,表现出来就是测距值偏向某个“平均位置”而不是当前位置。
我之前测试过一颗iToF传感器,在传感器以约1 m/s速度靠近目标时,测距值会出现持续几十毫米的滞后误差。这个滞后误差的方向和运动方向相反——靠近时测距偏大,远离时测距偏小,看起来像系统的“惯性”。用IMU补偿后,这个滞后误差能显著减小,但前提是时间戳足够准。所以说,ToF测距的“测距时刻”这个概念,远比想象中要微妙。
2.2 帧结构设计:时间片分配与关键参数选择
很多ToF传感器(特别是单点测距芯片)内部并不是“一帧一测”这么简单,而是由多个子测量(sub-measurement)组合成一帧。比如一颗典型的单点ToF芯片,一帧内可能包含若干个不同积分时长或不同测距区间的子测量,芯片内部会把这些子测量的结果融合为最终输出。这个设计在静态场景下没有任何问题,但在动态场景下就会引入一个隐患:每个子测量发生的时间点不同,而融合算法默认它们是在同一时刻测量的。
如果你要把它用在动态场景里,我的建议是:尽量把帧结构简化。优先选择单区间、单积分时间的配置,不要在动态测距时开多区间融合。实在要多区间,也要精确记录每个子测量在帧内的起始时间和结束时间,最后做时间加权处理。以我常用的VL53L1X为例,它的测距模式(ranging mode)可以配置为short、medium、long,每种模式的积分窗口长度不同。short模式积分时间短,适合近距离和动态场景;long模式积分时间长,适合远距离和静态场景。我的实际选择是,动态场景强制用short模式,哪怕损失一些最大测距范围也在所不惜。
积分时间(integration time)是另一个关键参数。积分时间越长,信噪比越高,测距精度越好,但运动伪影越严重。这是一个需要权衡的参数。我的经验是,在动态场景下把积分时间压到能保证所需最大测距范围的最低值。比如目标距离在1米内时,我把积分时间控制在3-5 ms以内,这样即使传感器以2 m/s运动,积分窗口内的位移也只有6-10 mm,再通过IMU补偿掉大部分残余误差。温度补偿也不能忽视,很多ToF芯片内部有个温度传感器,用来校正VCSEL(垂直腔面发射激光器)的波长漂移。在实际项目中,温度变化直接影响测距偏移,所以我把温度读数也一并记录下来,离线标定时能发现明显的相关性。
2.3 测距帧时间戳的捕获点选择
这是整个项目里我认为最容易被忽视也最关键的一步。I2C或SPI总线上读到ToF数据的那一瞬间,远不是测距真正发生的时刻。一颗ToF芯片从启动测距到数据就绪,中间隔着一个完整帧的时间。如果直接拿读取数据的中断时间当时间戳,误差就是整整一帧的时长,加上帧内子测量分布的不确定性,误差可能高达几十毫秒。
正确做法是去读芯片内部的时序信息。以VL53L1X为例,它有一个寄存器(RANGE_STATUS)可以读出当前帧的状态,还有INTERMEASUREMENT_PERIOD等寄存器可以推算出帧的起始时间。另外,读取芯片内部的时间戳寄存器(如果有的话)是更直接的方案。具体做法是:记录下“测距开始触发”的时刻T_start,加上子测量的偏移时间T_offset(通常是积分窗口的一半),得到测距有效时刻T_effective。这个T_effective才是应该和IMU数据对齐的时间点。
我在实际代码中是这样处理的:用一个硬件定时器作为统一时间基准,在写入触发命令时记录T_cmd,在收到数据就绪中断时记录T_int,同时读取芯片寄存器里的实际子测量配置,估算出积分窗口的中心位置T_center。最终的时间戳取 T_cmd + T_center,而不是 T_int。这样处理后,时间戳误差从原来的“一帧时长”级别降到了“微秒到几百微秒”级别。对2 m/s的运动来说,500微秒的时间误差对应1 mm的距离误差,这样补偿后的精度就有保障了。
3. IMU数据质量处理:静止初始化与噪声建图
3.1 IMU噪声模型与你真正需要的参数
IMU的原始输出看起来是加速度和角速度,但真正能在融合里用上的,是它的噪声统计特性。IMU的误差可以拆成几层:固定零偏(bias)、随温度漂移的零偏、比例因子误差、以及高频随机噪声。对于短时间尺度的动态补偿,固定零偏和高频随机噪声是主要的;对于长时间尺度的导航,温度漂移和比例因子误差才会浮出水面。
Allan方差是分析IMU噪声特性的标准工具。做法是采集一段长时间的静态数据(通常至少半小时),计算出不同积分时间下的方差曲线,从曲线上能读出角度随机游走(ARW)、速率随机游走(RRW)和零偏不稳定性(bias instability)这几个关键指标。ARW决定了你短时间内的姿态/速度积分发散速度,RRW决定了长时间零偏的漂移速度,零偏不稳定性则代表零偏自身的稳定性下限。
但这套完整流程对很多项目来说偏重了。如果你的应用只需要几十毫秒级别的运动补偿,那么你真正需要的其实只有两个参数:加速度计的随机噪声方差和陀螺仪的随机噪声方差。这两个参数完全可以通过静止初始化来估计,不需要等半小时。不过我还是建议至少做一次完整的Allan方差分析,因为它能告诉你这颗IMU的“底子”如何,以及你的静止初始化需要采多长时间的数据才能把方差估计准。
3.2 静止初始化流程与测量方差估计
静止初始化的操作很简单:把传感器固定在一个不会动的平台上(最好用双面胶粘住,防止高频微振动),静置几分钟,采集IMU数据。然后对加速度计和陀螺仪分别计算均值和标准差。均值可以用于零偏的初始估计,方差则是对测量噪声的估计。
实际操作中有一个很容易踩的坑:很多人直接用原始方差作为系统里的测量噪声方差R,但别忘了,拿到的原始数据里其实已经混入了平台本身的微振动。如果平台不够稳,估计出来的方差会偏大,导致融合算法过于信任预测而忽视观测。所以,静止初始化时平台稳定性很重要。我自己的习惯是找一张大理石台面,或者直接把传感器粘在墙上,静置5分钟采样。采样时间不必太长,5分钟基本够用。对一颗典型消费级IMU,加速度计的标准差大约在0.005-0.02 m/s²,陀螺仪的角速度标准差大约在0.01-0.05°/s,具体数值跟芯片型号和采样率有关。
这里还要注意一个细节:IMU数据往往带有低通滤波或者过采样处理,原始输出数据的标准差会受到滤波器截止频率的影响。所以,尽量把IMU配置成你最终在融合中使用的那个配置,再去做静止初始化。我见过有人用默认配置做了标定,后来改成了更高带宽的配置,方差直接翻倍,融合参数全部要重调,白白浪费了时间。
3.3 静止初始化得到的测量方差与ESKF过程噪声Q的关系
这个点比较多朋友问,我单独拿出来说。在ESKF( error-state Kalman filter)这类滤波框架里,有两个协方差矩阵容易混淆:一个是测量噪声协方差R,一个是过程噪声协方差Q。静止初始化直接估计出来的,是IMU输出的噪声方差,这个量在滤波器中对应的是R——它是用来更新卡尔曼增益的“观测噪声”。而Q描述的是状态预测步骤中不确定性随时间的累积,它并不是直接等于测量噪声方差,而是由测量噪声经历状态转移方程传播后得到的。
举个最简单的例子:状态向量里有速度v,IMU加速度计测量值a作为输入 u,状态预测方程是 v_k+1 = v_k + a·dt。那么加速度计噪声σ_a²经过这个方程传播后,对速度预测方差的影响是 σ_v² = σ_a² · dt²。也就是说,Q_v(速度的过程噪声)并不是σ_a²,而是σ_a²dt²。类似地,对于姿态估计,陀螺仪噪声σ_g²通过四元数积分传播后,对姿态增量的方差贡献大约是σ_g²dt²。
所以,正确的做法是:用静止初始化估计出IMU测量噪声方差R,然后根据状态预测方程的形式,把这个方差传播成状态空间的Q。直接拿R当Q用,会导致滤波器对预测过度信任或过度怀疑,最终表现为估计结果抖动过大或响应迟钝。类似的推导在概率机器人学教材里都有,但在实际项目里经常被偷懒处理。我的做法是写一个小脚本,输入静止初始化得到的σ_a和σ_g、IMU采样率dt,直接输出Q矩阵的对角线,省得每次手动算。
4. ToF与IMU的时间同步方案实操
4.1 硬件触发还是软件时间戳
时间同步方案的选择,会在项目一开始就决定后面所有调试的难度。我的建议很明确:只要硬件支持,优先用硬件触发同步。以VL53L1X为例,它有一个外同步引脚,可以接收外部触发信号来启动测距;很多IMU(如BMI088、ICM-20602)也支持数据就绪(data ready)中断输出。用一个MCU的定时器同时触发ToF启动和IMU采样,可以把两路数据的时间戳对齐到微秒级。这样后面做任何离线分析,都不用担心时间轴对不齐的问题。
但硬件触发也有它的代价:接线和驱动配置麻烦,还要小心信号完整性问题。如果ToF和IMU分别挂在不同的I2C总线上,触发信号也可能有几十微秒的偏差。如果你的项目对时间同步精度要求不是特别苛刻(比如厘米级测距精度、运动速度不太快),那么纯软件时间戳也够用。做法是:给每个传感器事件打上统一时钟域的时间戳,然后在后处理里对齐。
纯软件方案的坑在于,不同的传感器中断优先级可能不同,中断响应延迟也不同。我的经验是,处理高优先级传感器中断的代码尽量精简,不要在中断里做I2C读取、浮点运算等耗时操作,而是只记录当前时钟值并置标志位,数据读取放到主循环里做。这样可以把中断响应延迟控制在一个相对稳定的范围内。
4.2 时间偏移标定的最小二乘实现
无论采用硬件触发还是软件时间戳,ToF和IMU之间都可能存在一个固定的时间偏移(time offset)。这个偏移来源于:触发信号到实际采样的延迟差异、传感器内部的曝光/积分等待时间差异、以及读取路径上的延迟差异。即使采用硬件触发,这个偏移也不会完全为零,只是稳定在一个固定值附近。
标定这个偏移的思路很朴素:让传感器做已知运动,同时记录ToF测距值和IMU数据,然后寻找一个时间偏移τ,使得ToF测距值和IMU预测的距离变化趋势对齐得最好。简单实现可以这样做:在离线数据中,让传感器沿测距方向做正弦运动(比如用滑台或者手持前后摆动),记录ToF距离序列d_tof(t_i)和IMU加速度积分的位移序列d_imu(t_j)。然后在τ的候选范围内搜索,使相关性或负均方误差最小的τ就是最佳偏移。
具体计算可以写成,给定一系列时间戳对应的测距值和IMU位移预测值,定义误差函数E(τ) = Σ_i [d_tof(t_i) - d_imu(t_i - τ)]²,通过网格搜索或高斯牛顿迭代求解τ。如果数据长度是几百个点,直接在这段区间上做量纲对齐、线性插值,用三次样条把两个序列重采样到同一时间基,再去求误差函数的最小值,这个操作离线做一遍就够了。如果在线的场景里传感器运动模式会变化,也可以把这个偏移纳入状态向量做在线估计,做法与相机-IMU时间偏移标定类似。
我自己的经验是,这个固定偏移在常温下相对稳定,但温度变化比较大的环境里还是可能漂移,所以有条件的话,每次重新上电后都做一次快速标定。如果系统里存在明显的同步时钟漂移(比如使用两颗晶振分别给ToF和IMU提供时钟),那还要额外估计时钟漂移率(skew),这就更复杂了。对于大多数嵌入式项目来说,优先保证使用同一个晶振/同一套时钟树,比费劲去估计skew要划算得多。
4.3 动态场景下的测量时间点对齐与测距补偿
当你有了精确的时间戳和估计出的固定偏移之后,接下来的工作就是把ToF测距值补偿到“当前时刻”。这里我采用的是一个很直接的模型:假设在积分窗口中心时刻T_effective,传感器的运动速度在测距方向的分量为v_proj,参考时刻为T_ref,我们需要把ToF测距值从T_effective补偿到T_ref时刻。那么补偿公式为:
d_comp = d_raw + v_proj × (T_ref - T_effective)
注意这里的符号:如果传感器正在靠近目标(v_proj为负),而T_ref在T_effective之后,那么补偿后的距离应该减去速度乘以时间差。直观上,如果传感器在T_effective之后还在继续靠近目标,当前时刻的真实距离应该更短一些。这个公式成立的前提是补偿时间差很小(几十毫秒以内),且认为这段时间内速度近似恒定。如果运动加速度比较大,还需要引入加速度项。
v_proj可以从IMU数据中获得:先估计出IMU坐标系到ToF坐标系的外参,然后把IMU在IMU坐标系下的速度投影到ToF测距轴方向。速度本身可以用IMU加速度积分得到,或者更稳妥地,从ESKF状态估计中读取。如果用ESKF,状态里本身就有速度估计,直接取出来投影就好。如果你不想在上位机跑完整滤波器,也可以简单地对加速度做积分,同时用高通滤波把零偏漂移的影响压掉,短时间窗口内的速度估计也能用。
实测中,这个补偿对缩短测距滞后非常有效。我在IMU补偿开启后,把一台手持ToF设备在1米距离附近做快速前后摆动,测距值的滞后从原来的几十毫米降到了个位数毫米。这也验证了前文说的:动态ToF的主要误差源不是测距原理本身,而是时间轴没有对齐。
5. 常见问题与排查技巧实录
5.1 常见问题速查表
下面这张表总结了我在实际调试中遇到频率比较高的问题、可能的原因和分析思路。它不是教科书式的答案,而是基于真实场景的排查经验,可以按图索骥去查。
| 问题现象 | 可能原因 | 排查方法 |
|---|---|---|
| 测距值间歇性跳变 | 多径干扰、目标表面反射率突变 | 切换测距模式,检查目标材质,观察跳变是否与入射角度相关 |
| 测距值整体偏大或偏小 | 温度漂移、校准参数失效 | 记录温度读数,对比不同温度下的测距偏差,重新标定偏移 |
| 时间戳出现明显乱序 | 中断优先级配置不当、I2C总线被长操作阻塞 | 精简中断回调,避免在中断里做I2C读取,检查总线时序 |
| IMU数据存在周期性丢帧 | FIFO溢出、采样率超过总线带宽 | 检查IMU的FIFO配置,降低采样率或改用SPI接口 |
| 动态补偿效果不稳定 | 时间偏移估计不准、外参矩阵有误 | 重新执行时间偏移标定,检查IMU到ToF的旋转/平移外参 |
| 静止初始化方差偏大 | 平台不稳、周围有振动源 | 更换平台,远离振动源,延长采集时间到10分钟以上 |
| ESKF估计抖动剧烈 | Q/R矩阵数量级不匹配 | 检查Q是否由R传播得到,而不是直接把R当Q |
这个表格的价值在于,它把“现象—原因—方案”的对应关系直接给出来了。后面项目里再遇到类似问题,第一反应不是去翻数据手册,而是先对照这几条最常见的坑去排查。
5.2 实测踩坑记录
第一个坑是VL53L1X的测距状态。它内置了一个状态机,如果两次测距之间的间隔设置过短,芯片会自动跳过某些测量,导致数据不是连续等间隔的。很多朋友拿到数据后发现时间戳间隔乱七八糟,大概率就是这个问题。解决办法是严格按照数据手册计算最小允许的测量周期,并考虑到积分时间对周期的影响。当时我花了一整天才发现,不是我代码的问题,而是芯片的自动测距节流机制。
第二个坑是电源纹波耦合。IMU的VDD上如果有较大的纹波,加速度计信号会出现周期性抖动,表现为“即使静止,测距和IMU之间的动态补偿也在小幅振荡”。排查了很久,最后发现是同一个DCDC电源上接了电机驱动,电机转动时纹波飙升。解决方法是给IMU加一级LDO,或者至少加大电容滤波。对传感器这种模拟前端,电源质量直接决定数据质量,这个原则到哪里都适用。
第三个坑是I2C总线速度与多从机共存。ToF和IMU如果共用一条I2C总线,而总线时钟设置不合理,或者某个从机拉低时钟线时间过长,会导致另一个传感器数据丢失。这个问题的排查方法是用逻辑分析仪抓包,观察总线上的NACK和时钟拉伸(clock stretching)行为。最终方案是给两条外设分配不同的总线,并且启用各传感器的FIFO,避免总线繁忙时丢失数据。
5.3 时间偏置标定中的激励设计
时间偏置标定这件事,有个很容易被忽略但影响很大的点:传感器必须有足够的运动激励,才能把时间偏置“试”出来。如果传感器几乎不动,那么无论时间偏置是多少,测距值和IMU位移序列的误差函数都差不多,标定结果就非常脆弱。我们在这上面踩过坑——最初用手持传感器做小幅摆动,标定出来的时间偏置每次都不一样,后来换成大幅度的正弦滑台运动后,标定结果就稳定了。
具体来说,运动激励要满足两个条件:第一,运动幅度要足够大,使传感器在测距方向上的位移变化明显大于测距噪声;第二,运动频率要覆盖你关心的频段,最好包含快速的加减速过程,这样时间偏置导致的误差能充分体现出来。我的做法是让传感器做大幅度、快频率的正弦往复运动,频率大约0.5-2 Hz,幅度10-30 cm,持续30秒以上,然后把数据交给标定脚本。脚本会在候选时间偏置范围内做网格搜索,找到最佳偏移。这个流程跑完后,时间偏置通常能稳定在几百微秒以内。
如果你做的是在线标定,激励不足的问题更严重。在线估计时间偏置时,系统会自然地收敛到一个使预测残差最小的值,但这个值只有在运动激励足够时才准确。我见过一些项目的在线时间偏置估计在机器人原地不动时持续漂移,一运动又恢复正常,其实就是激励不足导致的。这时可以对估计值做置信度加权——运动激励小的时候降低时间偏置的更新率,运动激励大的时候提高更新率,这样能显著提升稳定性。
5.4 外参标定对测距补偿的影响
最后再聊一个容易被忽略的环节:IMU坐标系到ToF传感器坐标系的旋转外参。动态补偿公式里用到的是“测距方向的速度分量”,而这个速度分量必须在ToF坐标系下计算。如果IMU和ToF之间存在安装角偏差,比如IMU坐标系偏了5度,那么当传感器沿着某个方向运动时,投影到测距轴上的速度就会有一个系统性误差。
这个问题的严重程度取决于运动方向和测距方向的关系。如果传感器主要沿测距方向运动(比如无人机垂直上下测距),那么方位角误差的影响相对小一些;但如果传感器做任意方向的平移和旋转,外参误差就会直接转化为补偿误差。我在项目里用了一个很直接的方法标定旋转外参:让传感器贴着墙面平移,记录IMU速度方向和ToF测距变化之间的对应关系,通过最小化预测误差来估计旋转角。多组不同方向的运动数据叠在一起,就能把三个旋转角都标出来。
如果外参标定不到位,动态补偿后的测距值可能会有“方向相关性误差”——往一个方向运动时偏大,往另一个方向运动时偏小。这个特征比较明显,如果你在测试中发现补偿效果不对称,大概率就是外参的问题,而不是时间同步的问题。
尾声:几个关于这套方案的个人体会
做完整套ToF + IMU动态测距流程之后,我最大的体会是:动态传感器融合,时序比数据本身更重要。测距芯片的精度再高,IMU的指标再好,只要时间戳对不齐,系统性能就会停留在“静态精度”的一半甚至更低。很多朋友拿着很好的硬件,却始终调不出该有的动态精度,问题往往不在硬件性能上,而是时间轴这个基础工程没打好。
还有一个体会是关于数据记录的:一定要把原始数据完整地保存下来,包括温度、传感器状态、时间戳原始值。调试中我们多次发现,看起来像随机故障的问题,回到原始数据里分析,都能找到明确的规律。如果当时只记录了处理后的结果,很多问题根本无从追溯。这一条我建议所有做传感器研发的朋友都强制执行。
这套方案后续可以扩展的方向还不少:比如把ToF和IMU一起放进ESKF做紧耦合,而不是只做松耦合补偿;比如用深度学习对多径干扰做去噪;再比如把多个ToF传感器组成阵列,结合IMU做更鲁棒的SLAM前端。不过在这些高级玩法之前,先把本文讲的时间同步、噪声建模、补偿公式这几个基础工程做扎实,价值就已经非常大了。