3. UWB定位原理基础
聊到 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 的核心思想是:让两个设备各测一次往返时间,然后通过计算消除时钟偏差。
具体流程是这样的:
- 设备 A 发送一个 Poll 包,并记录发送时间
T1。 - 设备 B 收到 Poll 包,记录接收时间
T2。 - 设备 B 等待一个固定的延迟
T_reply,然后发送 Response 包,记录发送时间T3。 - 设备 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 出现了。它做了三次消息交换,而不是两次。
流程如下:
- A 发 Poll,记录
T1。 - B 收 Poll,记录
T2,然后发 Response,记录T3。 - A 收 Response,记录
T4,然后发 Final,记录T5。 - 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 核心流程示意图
下面这张图,展示了三种算法在时间轴上的消息交互过程。你可以直观地看到它们的区别:
3.6 工程实现中的几个关键点
理论讲完了,聊聊落地时要注意的事。
第一,时间戳的精度。UWB 芯片通常能提供几十皮秒级别的时间戳分辨率。但前提是,你必须在硬件中断里第一时间读取时间戳寄存器。我见过有人用 GPIO 中断加软件延时来读,结果精度直接掉了一个数量级。
第二,天线延迟校准。信号从芯片到天线,经过 PCB 走线、匹配网络、天线本身,都会引入固定的延迟。这个延迟必须在出厂前校准掉。我记得在一个项目中,因为天线延迟没校准,所有测距结果都偏大了 30cm,排查了很久才发现。
第三,多径干扰。室内环境里,信号会反射、绕射。第一个到达的往往不是直射路径,而是反射路径。这会导致测距结果偏大。DS-TWR 虽然能抑制时钟误差,但对多径无能为力。这时候,就需要结合信道检测算法来识别首径。
一个小技巧:在 DS-TWR 中,尽量让 T_reply1 和 T_reply2 的值接近。这样计算出的 T_prop 对晶振误差的鲁棒性最好。