3. 测距原理与实现:TOF、TWR 与 DS-TWR

聊到 UWB 定位,测距是绕不开的核心。说白了,定位的精度天花板,就是由测距这一层决定的。我刚开始接触 UWB 时,也以为测距就是“发个包,算个时间差”这么简单。直到在项目中踩了坑,才发现里面的门道比想象中深得多。

这一章,我们就来拆解三种最主流的测距算法:TOF、TWR 和 DS-TWR。我会结合自己的项目经验,把它们的原理、优缺点和适用场景讲清楚。

核心观点:测距的本质是测量信号在空中的飞行时间。但时钟不同步、晶振漂移、多径干扰,才是真正的拦路虎。

3.1 TOF(飞行时间测距)—— 最朴素的思路

TOF 的原理非常直观:测量信号从 A 到 B 的飞行时间,乘以光速,就是距离。

公式很简单:距离 = 飞行时间 × 光速

但问题来了——你怎么知道信号是什么时候发出的?又是什么时候到达的?

这要求 A 和 B 的时钟必须严格同步。嗯,这里要注意,在真实的嵌入式系统里,两个设备的晶振频率不可能完全一致。哪怕只有 20ppm 的误差,在 100 米的距离上,测距误差就能达到几米。

我曾经踩过的坑:在早期的一个原型中,我直接用 TOF 做测距,结果发现距离越远,误差越大。排查了三天,最后发现是两边的晶振温漂不一致导致的。从那以后,我再也不敢在非同步系统里裸用 TOF 了。

所以,TOF 虽然简单,但实际应用中很少单独使用。它更适合那些有精确时钟同步的场景,比如基站之间通过有线连接共享时钟。

3.2 TWR(双边双向测距)—— 解决时钟同步问题

既然 TOF 受时钟同步困扰,那能不能绕过这个问题?TWR 就是答案。

TWR 的核心思想是:让两个设备各测一次往返时间,然后通过计算消除时钟偏差。

具体流程是这样的:

  1. 设备 A 发送一个 Poll 包,并记录发送时间 T1。
  2. 设备 B 收到 Poll 包,记录接收时间 T2。
  3. 设备 B 等待一个固定的延迟 T_reply,然后发送 Response 包,记录发送时间 T3。
  4. 设备 A 收到 Response 包,记录接收时间 T4。

这样,设备 A 就得到了两个时间差:

  • T_round1 = T4 - T1(A 的往返时间)
  • T_reply1 = T3 - T2(B 的回复延迟)

那么,信号的单向飞行时间就是:

T_prop = (T_round1 - T_reply1) / 2

你想想看,这个公式里,时钟偏差被巧妙地抵消了。只要 T_reply 是固定的,或者能被准确测量,T_prop 就只受晶振短期稳定度的影响,而不是绝对精度的影响。

我个人习惯:在实际项目中,我会把 T_reply 设为一个固定值,比如 1ms。这样计算简单,而且能避免一些意外的时序冲突。

TWR 的优点是实现简单,只需要一次往返。但它的缺点也很明显:如果 T_reply 很大,那么 T_round1 也会很大,晶振的累积误差就会被放大。

3.3 DS-TWR(非对称双边双向测距)—— 更精确的方案

为了进一步抑制误差,DS-TWR 出现了。它做了三次消息交换,而不是两次。

流程如下:

  1. A 发 Poll,记录 T1。
  2. B 收 Poll,记录 T2,然后发 Response,记录 T3。
  3. A 收 Response,记录 T4,然后发 Final,记录 T5。
  4. B 收 Final,记录 T6。

这样,我们得到了两组往返时间:

  • T_round1 = T4 - T1(A 的第一次往返)
  • T_reply1 = T3 - T2(B 的第一次回复延迟)
  • T_round2 = T6 - T3(B 的第二次往返)
  • T_reply2 = T5 - T4(A 的第二次回复延迟)

最终的飞行时间计算公式是:

T_prop = (T_round1 * T_round2 - T_reply1 * T_reply2) / (T_round1 + T_round2 + T_reply1 + T_reply2)

这个公式看起来复杂,但它的好处是:即使 T_reply 不对称,也能精确计算出飞行时间。它对晶振误差的抑制能力比 TWR 强了一个数量级。

我建议:如果你的项目对测距精度要求高(比如 10cm 以内),或者工作环境温度变化大,直接上 DS-TWR。别在 TWR 上浪费时间调参了。

3.4 三种算法的对比

为了让你一目了然,我把它们的核心差异整理成了表格:

特性 TOF TWR DS-TWR
消息交换次数 1 次(单向) 2 次(往返) 3 次(双往返)
是否需要时钟同步 是 否 否
对晶振误差的抑制 无 中等 强
实现复杂度 低 中 高
典型测距精度 受时钟影响大 10~30cm 5~10cm
适用场景 有线同步系统 一般定位需求 高精度定位

3.5 核心流程示意图

下面这张图,展示了三种算法在时间轴上的消息交互过程。你可以直观地看到它们的区别:

TOF / TWR / DS-TWR 时序对比图 三种测距算法时序对比 t TOF A 发 B 收 飞行时间 TWR Poll 收 Poll Resp 收 Resp T_prop T_prop T_reply (B 处理延迟) DS-TWR Poll 收 Resp 收 Final 收 T_prop T_prop T_prop T_reply1 (B) T_reply2 (A) 设备 A 设备 B

3.6 工程实现中的几个关键点

理论讲完了,聊聊落地时要注意的事。

第一,时间戳的精度。UWB 芯片通常能提供几十皮秒级别的时间戳分辨率。但前提是,你必须在硬件中断里第一时间读取时间戳寄存器。我见过有人用 GPIO 中断加软件延时来读,结果精度直接掉了一个数量级。

第二,天线延迟校准。信号从芯片到天线,经过 PCB 走线、匹配网络、天线本身,都会引入固定的延迟。这个延迟必须在出厂前校准掉。我记得在一个项目中,因为天线延迟没校准,所有测距结果都偏大了 30cm,排查了很久才发现。

第三,多径干扰。室内环境里,信号会反射、绕射。第一个到达的往往不是直射路径,而是反射路径。这会导致测距结果偏大。DS-TWR 虽然能抑制时钟误差,但对多径无能为力。这时候,就需要结合信道检测算法来识别首径。

一个小技巧:在 DS-TWR 中,尽量让 T_reply1 和 T_reply2 的值接近。这样计算出的 T_prop 对晶振误差的鲁棒性最好。