注:本文为 “UWB ” 相关合辑。
图片清晰度受引文原图所限。
略作重排,如有内容异常,请看原文。
UWB 的主要作用与应用领域
酷酷的boy 于 2021-04-18 22:13:18 发布
前言
一、UWB 是什么?
UWB 技术是一种使用 1 GHz 以上频率带宽的无线载波通信技术,利用纳秒至微微秒级的非正弦波窄脉冲传输数据。由于脉冲时间宽度极短,因此可以实现频谱上的超宽带:使用的带宽在 500 MHz 以上。
其优点包括:穿透力强、功耗低、抗多径效果好、安全性高、系统复杂度低、能提供精确定位精度。
二、应用领域
- 工业/汽车:实时追踪资产和库存,改进流程,提高搜索效率,减少资源浪费。
- 物流仓储:跟踪条码阅读器和叉车,减少保险检查的环节,使仓储管理变得灵活。
- 军事:人员定位和设备追踪,例如城市作战训练、弹药仓库管理、高级研发。
- 医疗保健:实时跟踪病人,进行照顾和管理,利于病情分析和治疗改进,方便人力资源管理。
- 危险环境:定位个人和资源,安全位置紧急搜索,人员监控,优化管理过程,做到安全有效;例如煤矿。
- 重点安保区域:人员的进出管理、实时位置查询、禁区监管、隔离距离控制、人员调度,能对人员的位置、行进路线、距离、速度进行监控和统计。
- 体育:实时跟踪与计算运动员的方向和速度等,进行详细的性能分析,记录队伍的比赛实况,视频集成。
三、优缺点对比
| 定位技术 | 硬件部署 | 定位精度 | 抗干扰 | 功耗 |
|---|---|---|---|---|
| WIFI | 无 | 5-15米 | 弱 | 高 |
| 蓝牙 | 大量 | 5-10米 | 弱 | 低 |
| RFID | 大量 | 3-5米 | 弱 | 低 |
| ZIGBEE | 大量 | 3-5米 | 中等 | 低 |
| UWB | 大量 | 10-30厘米 | 强 | 低 |
| 室内定位技术 | 优点 | 缺点 |
|---|---|---|
| 超声波定位技术 | 精度较高,结构简单。 | 受多径效应和非视距传播影响很大,同时需要大量的底层硬件设施投资,成本太高。 |
| 蓝牙定位技术/iBeacon | 设备体积小、易于集成,容易推广普及。标识的体积比较小,造价比较低。 | 对于复杂的空间环境,蓝牙系统的稳定性稍差,受噪声信号干扰大。作用距离近,不具有通信能力,而且不便于整合到其他系统之中。 |
| UWB 超带宽技术 | 穿透力强、功耗低、抗多径效果好、安全性高、系统复杂度低、能提供精确定位精度。 | 遇到遮挡物、金属等会有一定影响,价格略贵,离大规模生产仍有一段距离。 |
| SLAM 技术 | 在自身位置不确定的条件下,在完全未知环境中创建地图,同时利用地图进行自主定位和导航。 | 图像数据量巨大,设备价格非常贵,适合研究,不适合量产。 |
四、影响因素
- 实体墙:一堵实体墙的遮挡将使得 UWB 信号衰减 60% - 70%,定位精度误差上升约 30 厘米;两堵或两堵以上的实体墙遮挡,将使得 UWB 无法定位。
- 钢板:钢铁对 UWB 脉冲信号吸收很严重,将使得 UWB 无法定位。
- 玻璃:玻璃遮挡对 UWB 定位精度有较大影响。
- 木板或纸板:一般厚度约 10 厘米的木板或纸板对 UWB 定位精度影响不大。
- 电线杆或树木:电线杆或树木遮挡时,需看其与基站或标签的距离,以及基站和标签的相对距离是否很小。例如,基站和定位标签距离 50 米,电线杆或树木正好在两者中间(25 米处),这种遮挡影响不大;若离基站或标签距离很近(小于 1 米),影响则很大。
五、发展前景
在物联网行业,室内定位是极为重要的组成部分之一。UWB 定位系统因具有高精度、高动态、高容量、低功耗等优点,被广泛应用。据市场调研机构 Market & Market 预测,全球室内定位市场规模将由 2017 年的 71.1 亿美元增长到 2022 年的 409.9 亿美元,并将保持 42%的复合增长率。据恒高科技统计,2018 年上半年较 2017 年下半年,恒高科技 UWB 定位系统的市场增量为 500%以上。因此,UWB 定位行业正处于快速发展时期。
在 2002 年以前,UWB 主要用于军事领域。2002 年,美国联邦通信委员会(FCC)对 UWB 做了严格的功率限制,将其解禁,准许进入民用领域。此后,UWB 技术进入高速发展期,各种技术方案围绕 UWB 国际标准的制定展开了激烈竞争。2007 年,IEEE 在 802.15.4a 标准中对 UWB 技术进行了标准化。经过近十年的发展,UWB 的标准也在不断完善。

发展前景良好。
UWB 模块的基本操作
酷酷的boy 于 2021-04-18 22:57:37 发布
前言
一、UWB Mini 3s 模块介绍
UWB Mini 3s 模块采用 STM32F103T8U6 单片机为主控芯片,外围电路包括 DW1000 芯片、电源模块、LED 指示模块、复位电路等。该模块既可以作为基站,也可以作为标签,通过 USB 指令进行切换。

二、支持频段与专业术语
UWB 发射功率比 WIFI 小,通常不会对人体造成伤害。根据 DW1000 数据手册,目前在中国可使用的信道仅为 Channel 5 和 Channel 7。
三、使用方式
1. ANCHOR 与 TAG 的模式配置
模式配置在出厂时已设置好,如无特殊情况,无需变更,模块到手即可测试。
2. 设置方式
将 Mini3s 通过 USB 线连接到电脑,打开串口调试助手 XCOM 软件,发送命令,结尾需加回车换行。例如:
- 将模块设置为基站,传输速率为 110 kbps,通道 2,地址为 3,应发送
AT+SW=10010110。 - 将模块设置为标签,传输速率为 6.8 Mbps,通道 5,地址为 7,应发送
AT+SW=11101110。
注意:基站的地址只能是 0、1、2、3,暂不支持超过 4 个基站;默认速率为 110 kbps,信道 2;在一套系统中,基站和标签的传输速率、频段应保持一致。
3. 设置方式模块默认配置指令
| 模块 | 指令 | 模块 | 指令 | 模块 | 指令 |
|---|---|---|---|---|---|
| 基站 A0 | AT+SW=10010000 | 标签 T0 | AT+SW=10000000 | 标签 T4 | AT+SW=10001000 |
| 基站 A1 | AT+SW=10010010 | 标签 T1 | AT+SW=10000010 | 标签 T5 | AT+SW=10001010 |
| 基站 A2 | AT+SW=10010100 | 标签 T2 | AT+SW=10000100 | 标签 T6 | AT+SW=10001100 |
| 基站 A3 | AT+SW=10010110 | 标签 T3 | AT+SW=10000110 | 标签 T7 | AT+SW=10001110 |
串口烧录 AT 指令:

4. 产品摆放注意事项
基站和标签的摆放直接影响测距的准确性,进而影响定位的准确度与精确度。以下是几种常见的摆放错误:
- 将模块放在金属附近。无论是内置陶瓷天线还是外置棒状天线,遇到金属时,天线信号会被金属直接吸收。
- 将模块平放在桌面、黏在墙壁或手拿住天线,会影响 UWB 天线的波束,且可能造成一定的多径效应。
正确的安装方式如下图所示:

四、玩法
玩法 1:室内 2D 定位(3 基站 + 1 标签测试)

玩法 2:室内 3D 定位(4 基站 + 多标签测试)

例如,下面的上位机:
五、PC 上位机通讯数据格式

其中,1、2、3、4 为基站,其余为两标签的运动轨迹。



UWB 的定位算法(简单详细易懂)
酷酷的boy 于 2021-04-19 23:53:37 发布
前言
一、控制部分

二、UWB 的测距原理
双向飞行时间法(TW-TOF, two way-time of flight):每个模块从启动开始即会生成一条独立的时间戳。模块 A 的发射机在其时间戳上的 T a 1 T_{a1} Ta1 时刻发射请求性质的脉冲信号,模块 B 在 T b 2 T_{b2} Tb2 时刻发射一个响应性质的信号,被模块 A 在自己的时间戳 T a 2 T_{a2} Ta2 时刻接收。由此可以计算出脉冲信号在两个模块之间的飞行时间,从而确定飞行距离 S S S。计算公式为:
S = C × [ ( T a 2 − T a 1 ) − ( T b 2 − T b 1 ) ] 2 S = \frac{C \times [(T_{a2} - T_{a1}) - (T_{b2} - T_{b1})]}{2} S=2C×[(Ta2−Ta1)−(Tb2−Tb1)]
其中, C C C 为光速。
图示:

UWB 定位的原理如下:
- 距离 = 光速 × 时间差 / 2;
- 在 X Y XY XY 平面内,3 个圆可以确定一个点;
- 在 X Y Z XYZ XYZ 空间中,4 个圆可以确定一个空间点。
三、TOF 数学计算


T 1 T_1 T1 - T 6 T_6 T6 会在下一节代码中标注出来,官方提供的代码主要使用此类算法。
四、Trilateration 三边测量法的原理与计算方法 (TDOA 平面)
三边测量法的原理如右图所示,以三个节点 A、B、C 为圆心作圆,坐标分别为 ( X a , Y a ) (X_a, Y_a) (Xa,Ya)、 ( X b , Y b ) (X_b, Y_b) (Xb,Yb)、 ( X c , Y c ) (X_c, Y_c) (Xc,Yc),这三个圆周相交于一点 D,交点 D 即为移动节点,A、B、C 即为参考节点,A、B、C 与交点 D 的距离分别为 d a d_a da、 d b d_b db、 d c d_c dc。假设交点 D 的坐标为 ( X , Y ) (X, Y) (X,Y)。
计算公式为:
{
(
X
−
X
a
)
2
+
(
Y
−
Y
a
)
2
=
d
a
(
X
−
X
b
)
2
+
(
Y
−
Y
b
)
2
=
d
b
(
X
−
X
c
)
2
+
(
Y
−
Y
c
)
2
=
d
c
\begin{cases} \sqrt{(X - X_a)^2 + (Y - Y_a)^2} = d_a \\ \sqrt{(X - X_b)^2 + (Y - Y_b)^2} = d_b \\ \sqrt{(X - X_c)^2 + (Y - Y_c)^2} = d_c \end{cases}
⎩
⎨
⎧(X−Xa)2+(Y−Ya)2=da(X−Xb)2+(Y−Yb)2=db(X−Xc)2+(Y−Yc)2=dc
如图所示:

可以得到交点 D 的坐标为:
(
X
Y
)
=
(
2
(
X
a
−
X
c
)
2
(
Y
a
−
Y
c
)
2
(
X
b
−
X
c
)
2
(
Y
b
−
Y
c
)
)
−
1
(
X
a
2
−
X
c
2
+
Y
a
2
−
Y
c
2
+
d
c
2
−
d
a
2
X
b
2
−
X
c
2
+
Y
b
2
−
Y
c
2
+
d
c
2
−
d
b
2
)
\begin{pmatrix}X \\Y\end{pmatrix}=\begin{pmatrix}2(X_a - X_c) & 2(Y_a - Y_c) \\2(X_b - X_c) & 2(Y_b - Y_c)\end{pmatrix}^{-1}\begin{pmatrix}X_a^2 - X_c^2 + Y_a^2 - Y_c^2 + d_c^2 - d_a^2 \\X_b^2 - X_c^2 + Y_b^2 - Y_c^2 + d_c^2 - d_b^2\end{pmatrix}
(XY)=(2(Xa−Xc)2(Xb−Xc)2(Ya−Yc)2(Yb−Yc))−1(Xa2−Xc2+Ya2−Yc2+dc2−da2Xb2−Xc2+Yb2−Yc2+dc2−db2)
1. 三边测量法的缺陷
由于各个节点的硬件和功耗不尽相同,所测出的距离不可能是理想值,从而导致上面的三个圆未必刚好交于一点。在实际中,三个圆会相交于一个小区域,因此利用此方法计算出来的 ( X , Y ) (X, Y) (X,Y) 坐标值存在一定的误差。这就需要通过一定的算法来估计一个相对理想的位置,作为当前移动节点坐标的最优解。
2. Z 轴准确度比 X 轴、Y 轴差一些
如图所示, A 0 A_0 A0、 A 1 A_1 A1、 A 2 A_2 A2 为 3 个基站, T 0 T_0 T0 为标签, L A 0 T 0 LA_0T_0 LA0T0、 L A 1 T 0 LA_1T_0 LA1T0、 L A 2 T 0 LA_2T_0 LA2T0 表示每个基站到标签的距离。在测距完全准确的情况下,解算的 Tag 坐标应该在 T 0 T_0 T0,但实际测量值 L A 0 T 0 LA_0T_0 LA0T0、 L A 1 T 0 LA_1T_0 LA1T0、 L A 2 T 0 LA_2T_0 LA2T0 可能偏大,解算的位置在 T 0 ′ T_0' T0′。因为 A 0 A_0 A0、 A 1 A_1 A1、 A 2 A_2 A2 都在 xoy 平面,所以测距的误差绝大多数会累加到 z 轴上,造成 z 轴数据的抖动。

五、TDOA(3D 空间)
-
概念
到达时间差(Time Difference of Arrival,TDOA)是一种利用到达时间差进行定位的方法,又称为双曲线定位。标签卡对外发送一次 UWB 信号,在标签无线覆盖范围内的所有基站都会收到无线信号。如果有两个已知坐标点的基站收到信号,标签距离两个基站的间隔不同,那么这两个基站收到信号的时间点是不一样的。
-
举例
例如,小明的妈妈在村口喊“小明,回家吃饭啦!”。
根据距离 = 时间 × 速度,其中速度不变(声音在空气中的传播速度是 340 m/s),那么声音传播的时间是由距离决定的,因此村里的人听到小明妈妈声音的时间点是不一样的。同理,标签与不同基站的距离不同,不同基站收到同一标签信号的时间节点不同,因此得出一个“到达时间差”的概念。TDOA 定位的原理正是利用多个基站接收到信号的时间差来确定标签的位置。
-
图解

d i 12 = r 1 − r 2 = ( t 1 − t 2 ) × c d i 23 = r 2 − r 3 = ( t 2 − t 3 ) × c d i 34 = r 3 − r 4 = ( t 3 − t 4 ) × c d i 14 = r 1 − r 4 = ( t 1 − t 4 ) × c \begin{align*} d_{i12} &= r_1 - r_2 = (t_1 - t_2) \times c \\ d_{i23} &= r_2 - r_3 = (t_2 - t_3) \times c \\ d_{i34} &= r_3 - r_4 = (t_3 - t_4) \times c \\ d_{i14} &= r_1 - r_4 = (t_1 - t_4) \times c \\ \end{align*} di12di23di34di14=r1−r2=(t1−t2)×c=r2−r3=(t2−t3)×c=r3−r4=(t3−t4)×c=r1−r4=(t1−t4)×c{ d i 12 = ( x 1 − x i ) 2 + ( y 1 − y i ) 2 + ( z 1 − z i ) 2 − ( x 2 − x i ) 2 + ( y 2 − y i ) 2 + ( z 2 − z i ) 2 d i 23 = ( x 2 − x i ) 2 + ( y 2 − y i ) 2 + ( z 2 − z i ) 2 − ( x 3 − x i ) 2 + ( y 3 − y i ) 2 + ( z 3 − z i ) 2 d i 34 = ( x 3 − x i ) 2 + ( y 3 − y i ) 2 + ( z 3 − z i ) 2 − ( x 4 − x i ) 2 + ( y 4 − y i ) 2 + ( z 4 − z i ) 2 d i 41 = ( x 4 − x i ) 2 + ( y 4 − y i ) 2 + ( z 4 − z i ) 2 − ( x 1 − x i ) 2 + ( y 1 − y i ) 2 + ( z 1 − z i ) 2 \begin{cases} d_{i12} = \sqrt{(x_1 - x_i)^2 + (y_1 - y_i)^2 + (z_1 - z_i)^2} - \sqrt{(x_2 - x_i)^2 + (y_2 - y_i)^2 + (z_2 - z_i)^2} \\ d_{i23} = \sqrt{(x_2 - x_i)^2 + (y_2 - y_i)^2 + (z_2 - z_i)^2} - \sqrt{(x_3 - x_i)^2 + (y_3 - y_i)^2 + (z_3 - z_i)^2} \\ d_{i34} = \sqrt{(x_3 - x_i)^2 + (y_3 - y_i)^2 + (z_3 - z_i)^2} - \sqrt{(x_4 - x_i)^2 + (y_4 - y_i)^2 + (z_4 - z_i)^2} \\ d_{i41} = \sqrt{(x_4 - x_i)^2 + (y_4 - y_i)^2 + (z_4 - z_i)^2} - \sqrt{(x_1 - x_i)^2 + (y_1 - y_i)^2 + (z_1 - z_i)^2} \end{cases} ⎩ ⎨ ⎧di12=(x1−xi)2+(y1−yi)2+(z1−zi)2−(x2−xi)2+(y2−yi)2+(z2−zi)2di23=(x2−xi)2+(y2−yi)2+(z2−zi)2−(x3−xi)2+(y3−yi)2+(z3−zi)2di34=(x3−xi)2+(y3−yi)2+(z3−zi)2−(x4−xi)2+(y4−yi)2+(z4−zi)2di41=(x4−xi)2+(y4−yi)2+(z4−zi)2−(x1−xi)2+(y1−yi)2+(z1−zi)2
TDOA 技术不需要定位标签与定位基站之间进行往复通信,只需要定位标签发射一次 UWB 信号,工作时长缩短了,功耗也就大大降低了,故能做到更高的定位动态和定位容量。
六、优化定位,更加准确
UWB 模块测量值通常比实际距离要大一些;部分用户反馈,UWB 模块测量值比实际距离要小。这是由于现场环境不同,受经纬度、空气质量、环境障碍物、海拔等因素干扰,所以在产品化进程中,必须对模块进行校准。一般情况下,校准只需在现场进行一次,通过 1 个 Anchor 和 1 个 Tag 的测距,得到修正系数,无需每个 Anchor 和 Tag 都进行标定。
利用 Microsoft Excel 2016 软件进行数据拟合,并生成拟合公式。拟合公式有很多种,最简单的是线性方程。

测距值存在 instancegetidist_mm(0)、instancegetidist_mm(1)、instancegetidist_mm(2)、instancegetidist_mm(3) 这四个变量中,每个距离都需要代入刚才计算出来的校准公式内。在 main.c 函数中,对于 mc 帧的程序:

修正后:

解释如下:
消息 ID 共有三类,分别为 mr、mc、ma。
- mr:代表标签 - 基站距离(原生数据)。
- mc:代表标签 - 基站距离(优化修正过的数据,用于定位标签)。
- ma:代表基站 - 基站距离(修正优化过,用于基站自动定位)。
七、图示测试
注意:其中一个基站必须与电脑的 USB 口相连。



四个基站,两个标签的运动轨迹。
UWB 代码讲解注释
酷酷的boy 于 2021-04-21 18:23:48 发布
前言
虽然官方代码注释较多,但略显杂乱。其原理其实很简单。

- 前面定义的代码无需过多关注,其目的只有一个:找出 T 1 T_1 T1、 T 2 T_2 T2、 T 3 T_3 T3、 T 4 T_4 T4、 T 5 T_5 T5、 T 6 T_6 T6,求出飞行时间 T T T。所有代码都是围绕这几个值展开的。
- 从主函数开始阅读(从
main开始)。 - 代码中存在许多延迟,大致是数据发送给天线,天线发送给芯片,芯片再发送给天线,天线再发送出去的过程(彩色部分为延迟时间,只需大致理解即可)。
- 基站到标签的距离 = 光速 × 飞行时间 T T T。实际距离可能受其他因素影响,可进行校正(上一章有校正方法)。
工程源代码.
链接:https://pan.baidu.com/s/1duk1rVdAu7vnes2i5zHsvg?pwd=lt0s
注: 评论区反馈,源码带加密。
UWB 测距原理及实现
liyinuo2017 已于 2024-08-20 17:43:13 修改
1. 测距
距离(长度)是常用的物理量之一。在日常生活中,距离测量十分常见,例如物体的长度尺寸测量、人身高的测量等。长度是一维空间的度量,表示点到点的距离。

长度的国际单位是“米”(“m”),常用单位还包括千米(km)、分米(dm)、厘米(cm)、毫米(mm)、微米(μm)、纳米(nm)等。长度测量的国家标准为 GBT1219-2000。

2. 测距方式
2.1 量尺测距
使用带刻度的尺直接测量距离。该方法操作简单,精度较高。

2.2 视距测距
某些测量仪器利用视距测量距离,其原理是通过光学和三角学原理测定两点间距离。常见的视距测量仪器有经纬仪、平板仪、水准仪等。这些仪器利用望远镜内部的视距丝,视距丝在标尺上的间隔称为视距读数,仪器到标尺间的距离是尺间隔的函数,大多数视距测量仪器的测量精度可达 1 400 \dfrac{1}{400} 4001。

2.3 超声波测距
部分设备利用超声波测量距离。其原理是:超声波发射器发射超声波,同时开始计时;超声波在空气中传播,碰到障碍物后立即返回;超声波接收器收到反射波后立即停止计时。超声波在空气中的传播速度为 340 m/s,根据计时器记录的时间
t
t
t(秒),可计算出发射点距障碍物的距离
s
s
s:
s
=
340
×
t
2
s = \dfrac{340 \times t}{2}
s=2340×t。

2.4 激光测距
激光测距仪是利用激光实现对目标的距离测量的仪器,按照测距方法大致分为脉冲法、相位法和三角反射法三种。脉冲式激光测距仪工作原理相对简单,其工作原理是向目标射出一束短暂的脉冲激光束,激光照射到目标后产生反射,激光测距仪的光电元件接收反射的激光束,计时器测定激光束从发射到接收的时间,计算出从观测者到目标的距离。激光以速度 c c c 在空气中传播,激光在 A、B 两点往返一次所需时间为 t t t,则 A、B 两点间距离 D D D 可用下式表示:
D = c Δ t 2 D = \frac{{c\Delta t}}{2} D=2cΔt
式中: D D D 为测站点 A、B 两点间距离; c c c 为光在大气中传播的速度; t t t 为光往返 A、B 一次所需的时间。

除上述测距方式之外,还有一种近年来比较热门的测距方式,即 UWB 测距。

3. UWB 技术及应用
UWB 技术是使用 1 GHz 以上频率的无线通信技术。UWB 不使用正弦载波,而是使用纳秒级的窄脉冲传输数据。UWB 所占的频谱范围很大,其数据传输速率可达每秒几百兆比特以上。UWB 技术使用超宽基带脉冲进行通信,主要用于军用雷达、定位和低截获率的通信系统中。2002 年 2 月,美国联邦通信委员会发布了民用 UWB 设备使用频谱和功率的初步规定。该规定中,在 3.1~10.6 GHz 频段 中传输数据带宽大于 500 MHz 的通信系统称为 UWB 系统。

UWB 技术是以占空比很低的脉冲作为信息载体的无载波扩谱技术,它是通过对具有很陡上升和下降时间的冲击脉冲进行直接调制。冲击脉冲通常采用单周期高斯脉冲,一个信息比特可映射为数百个这样的脉冲。单周期脉冲的宽度在纳秒级,具有很宽的频谱。

UWB 技术解决了困扰传统无线通信技术多年的有关传播方面的重大难题,其特点如下:
- 系统结构的实现简单。
- 高速的数据传输。
- 功耗低。
- 安全性高。
- 定位精确。
- 系统成本低。
UWB 的实现
UWB 系统结构实现比较简单,UWB 发射器直接使用低成本的脉冲激励发射器。高速数据传输时,一般要求 UWB 信号的传输范围为 10 m 以内,其传输速率可达到 500 Mbit/s 以上。UWB 系统使用间隙的脉冲来发送数据,有很低的占空因数,系统耗电可以做到很低。在高速通信时,系统的耗电量仅为几百 μW~几十 mW。

UWB 应用
- 通信应用:基于 UWB 技术的通信速度可达到 1 Gb/s。当传输距离很近时,UWB 通信的速度优势更加明显,非常适合 VR、手机文件传输、无线组网等领域。
- 测距应用:基于 UWB 技术可以实现高精度距离测量,并解决了范围、瞄准等问题,适用于社交距离追溯、物品防丢失等。
- 定位应用:基于 UWB 技术可以实现室内外高精度定位,这是 UWB 技术最有优势的应用,UWB 定位可以适用于各种复杂环境高精度定位。例如:监狱人员定位管理、活动轨迹追踪、高危作业场所人员定位管理等。
- 加密和认证应用:由于 UWB 通讯安全性高,适用于手机支付、认证、信用卡、身份证、刷卡等。
4. 测距媒介和算法
在讲解 UWB 测距原理之前,先来了解测距过程中的两个概念:
- 测距媒介:距离测量时依靠的媒介或工具。
- 测距算法:距离测量时使用的距离计算方法。
基于这两个概念,将第二章提到的几种距离测量方法分别使用的测距媒介和测距算法总结如下:
量尺测距
- 测距媒介:带刻度的量尺。
- 测距算法:最小差值法。找到被测物体与量尺刻度中差值最小的刻度,以此刻度值作为测量距离。
视距测距
- 测距媒介:光学成像。
- 测距算法:逼近法。调节光学焦距或者位置,使得光学镜头内的视距丝和目标接近,当视距丝与目标吻合时,根据光学参数确定距离。
超声波测距
- 测距媒介:超声波。
- 测距算法:飞行时间法(TOF)。通过记录超声波从发射到接收到超声波回波的时间差,根据声音传播速度乘以时间得出距离值。
激光测距
- 测距媒介:激光。
- 测距算法:飞行时间法(TOF)。通过记录激光从发射到接收到激光回波的时间差,使用光传播速度乘以时间得出距离值。
UWB 测距
- 测距媒介:UWB 电磁波。
- 测距算法:飞行时间法(TOF)。根据接收到的无线电信号中的时间戳信息计算时间差,利用无线电传播速度乘以时间得出距离值。
时间戳差值法
可以利用时间戳的方法来计算时间差。以一个例子来描述时间戳算法:假设有一个朋友给我们写了一封纸质的信,在信内容的最后朋友写下了寄信时的日期 2022 年 10 月 1 日,经过漫长的路程邮差将信送到家,打开信件读取日期(2022 年 10 月 1 日),然后根据收到信封的日期 2022 年 10 月 8 日,根据这两个时间推算出这封信从寄出到收到一共花了 8 天。这就是时间戳算法,在通讯过程中加上时间,接收者根据接收到信息那一刻的时间,就可以计算出信息发送和接收的时间差(假设接收者和发送者时间是同步的)。

假设邮差寄信的平均速度是 200 km 每天,因此得出,朋友家距我们家的路程大约为 1600 km,这就是时间戳差值法测量距离。
5. UWB 测距原理及算法
5.1 UWB 测距原理
UWB 测距原理是使用时间戳差值法计算电磁波飞行时间,从而计算距离。UWB 测距应用中有两种实体:
- 基站:固定安装在某处用于计算距离和输出数据。
- 标签:安装在被测目标物体上。

基站和标签采用 UWB 通讯,在通讯过程中带有时间戳,因此基站可以根据时间戳计算标签距离基站的距离。

标签发起通讯,在通讯数据中带有发送数据的时间信息 t 1 t_1 t1,基站收到数据时先记录下接收时间 t 2 t_2 t2,然后从接受信息中提取发送时间(假设基站和标签时间是同步的),根据发送时间戳和接收时间戳计算飞行时间 t = t 2 − t 1 t = t_2 - t_1 t=t2−t1,由此计算出标签到基站的距离 d = c × t 2 d = \dfrac{c \times t}{2} d=2c×t,其中 c c c 为光速。
上述描述只是简单介绍 UWB 通过使用时间戳的方法测量距离的基本原理,但在实际应用中 UWB 测距算法分为:双向测距(TWR)和双边双向测距(ADSTWR)。
5.2 UWB 测距算法
双向测距(TWR)
双向测距又称为 TWR(Two-Way-Ranging)。基站发起测距请求并记下时间 t 1 t_1 t1,标签收到请求之后记录接收时间 t 2 t_2 t2,然后标签再回复一个响应,回复的响应信息中包含 t 2 t_2 t2(接收请求时间)和 t 3 t_3 t3(响应请求时间)这两个时间,基站接收到响应时记录接收时间 t 4 t_4 t4,此时基站拥有 4 个时间: t 1 t_1 t1、 t 2 t_2 t2、 t 3 t_3 t3、 t 4 t_4 t4,因此飞行时间 T = ( t 4 − t 1 ) − ( t 3 − t 2 ) 2 T = \dfrac{(t_4 - t_1) - (t_3 - t_2)}{2} T=2(t4−t1)−(t3−t2),计算基站和标签之间的距离 D = T × c D = T \times c D=T×c。

问题 1:飞行时间为什么不直接用 t 2 − t 1 t_2 - t_1 t2−t1 或者 t 4 − t 3 t_4 - t_3 t4−t3?
因为基站和标签这两个设备的时间不同步,两个设备想要时间同步难度非常大!
问题 2:如何解决时间同步问题?
仔细观察 t 1 t_1 t1、 t 2 t_2 t2、 t 3 t_3 t3、 t 4 t_4 t4 这 4 个时间,不难发现 t 1 t_1 t1 和 t 4 t_4 t4 是基站记录的时间,这两个时间是同步的; t 2 t_2 t2 和 t 3 t_3 t3 是标签记录的时间,这两个时间是同步的。因此使用 ( t 4 − t 1 ) − ( t 3 − t 2 ) (t_4 - t_1) - (t_3 - t_2) (t4−t1)−(t3−t2) 得出飞行时间,这样就不要求基站和标签这两个设备时间同步。
TWR 算法完美解决问题?事实上不是这样。以基站记录的时间差 ( t 4 − t 1 ) (t_4 - t_1) (t4−t1) 为例,这个时间差存在误差吗?假设 MCU 的工作主频为 10 MHz,每个时钟周期计时器中的计数器都会加一,根据计数器来得知时间,例如计数器的值为 800,此时认为时间为 80 us。
但是 MCU 真正的工作主频绝对为 10 MHz 吗?想要每个 MCU 的工作主频都绝对为 10 MHz 是不可能的!每个 MCU 的工作主频都存在误差。假设 MCU 主频误差为 1%,那么计数器的值为 800 时对应的真实时间为 79.2 us(80 × 0.99),时间误差为 0.8 us,距离误差为 120 m!
d = ( 3 ∗ 10 8 ∗ 0.8 ∗ 10 − 6 ) 2 = 120 d = \frac{{\left( {3*{{10}^8}*0.8*{{10}^{ - 6}}} \right)}}{2} = 120 d=2(3∗108∗0.8∗10−6)=120
根据计算可知,当基站记录的时间差越大,时间误差就越大。 t = T × P t = T \times P t=T×P,其中 t t t 为误差时间, T T T 为记录的时间差, P P P 为时钟误差。
双边双向测距(ADSTWR)
ADSTWR(Asymetic Double Side Two Way Ranging)是 TWR 的升级改进版本(改善 TWR 算法误差较大问题),ADSTWR 在 TWR 的基础上增加了一次传输,同时改进了时间计算方法。

根据这 3 次通讯,可以计算出两个飞行时间:
T 1 = ( t 4 − t 1 ) − ( t 3 − t 2 ) 2 T 2 = ( t 6 − t 3 ) − ( t 5 − t 4 ) 2 T_1 = \dfrac{(t_4 - t_1) - (t_3 - t_2)}{2}\\[1em] T_2 = \dfrac{(t_6 - t_3) - (t_5 - t_4)}{2} T1=2(t4−t1)−(t3−t2)T2=2(t6−t3)−(t5−t4)
由于两次测量时时间非常短,可以认为距离没变,飞行时间也相等,因此有:
T 1 = T 2 T_1 = T_2 T1=T2
可以通过两次飞行时间,求出平均飞行时间:
T ~ = T 1 + T 2 2 = ( ( t 4 − t 1 ) − ( t 3 − t 2 ) ) + ( ( t 6 − t 3 ) − ( t 5 − t 4 ) ) 4 \tilde{T} = \dfrac{T_1 + T_2}{2} = \dfrac{((t_4 - t_1) - (t_3 - t_2)) + ((t_6 - t_3) - (t_5 - t_4))}{4} T~=2T1+T2=4((t4−t1)−(t3−t2))+((t6−t3)−(t5−t4))
将公式转换一下:
T a = t 4 − t 1 T b = t 3 − t 2 T c = t 6 − t 3 T d = t 5 − t 4 Ta = t_4 - t_1\\\\[1em] Tb = t_3 - t_2\\[1em] Tc = t_6 - t_3\\[1em] Td = t_5 - t_4 Ta=t4−t1Tb=t3−t2Tc=t6−t3Td=t5−t4
于是:
T 1 = T a − T b 2 T 2 = T c − T d 2 T ~ = ( T a − T b ) + ( T c − T d ) 4 T_1 = \dfrac{Ta - Tb}{2}\\[1em] T_2 = \dfrac{Tc - Td}{2}\\[1em] \tilde{T} = \dfrac{(Ta - Tb) + (Tc - Td)}{4} T1=2Ta−TbT2=2Tc−TdT~=4(Ta−Tb)+(Tc−Td)
这种算法和 TWR 算法一样,因此误差也是一样的!因此要改变算法!
已知:
T 1 = T a − T b 2 T 2 = T c − T d 2 T 1 = T 2 \begin{aligned} T_1 &= \dfrac{Ta - Tb}{2} \\ T_2 &= \dfrac{Tc - Td}{2} \\ T_1 &= T_2 \end{aligned} T1T2T1=2Ta−Tb=2Tc−Td=T2
转换:
T a = 2 × T 1 + T b T c = 2 × T 2 + T d \begin{aligned} Ta &= 2 \times T_1 + Tb \\ Tc &= 2 \times T_2 + Td \end{aligned} TaTc=2×T1+Tb=2×T2+Td
计算:
T a × T c = ( 2 × T 1 + T b ) × ( 2 × T 2 + T d ) = ( 2 × T 1 + T b ) × ( 2 × T 1 + T d ) = 4 × T 1 2 + 2 × T 1 × T d + 2 × T 1 × T b + T b × T d \begin{aligned} Ta \times Tc &= (2 \times T_1 + Tb) \times (2 \times T_2 + Td) \\ &= (2 \times T_1 + Tb) \times (2 \times T_1 + Td) \\ &= 4 \times T_1^2 + 2 \times T_1 \times Td + 2 \times T_1 \times Tb + Tb \times Td \end{aligned} Ta×Tc=(2×T1+Tb)×(2×T2+Td)=(2×T1+Tb)×(2×T1+Td)=4×T12+2×T1×Td+2×T1×Tb+Tb×Td
于是:
T a × T c − T b × T d = 4 × T 1 2 + 2 × T 1 × T d + 2 × T 1 × T b = T 1 × ( 4 × T 1 + 2 × T d + 2 × T b ) \begin{aligned} Ta \times Tc - Tb \times Td &= 4 \times T_1^2 + 2 \times T_1 \times Td + 2 \times T_1 \times Tb \\ &= T_1 \times (4 \times T_1 + 2 \times Td + 2 \times Tb) \end{aligned} Ta×Tc−Tb×Td=4×T12+2×T1×Td+2×T1×Tb=T1×(4×T1+2×Td+2×Tb)
其中:
4 × T 1 = ( 2 × T 1 ) + ( 2 × T 2 ) = ( T a − T b ) + ( T c − T d ) 4 \times T_1 = (2 \times T_1) + (2 \times T_2) = (Ta - Tb) + (Tc - Td) 4×T1=(2×T1)+(2×T2)=(Ta−Tb)+(Tc−Td)
于是:
T a × T c − T b × T d = T 1 × ( ( T a − T b ) + ( T c − T d ) + 2 × T d + 2 × T b ) = T 1 × ( T a + T c + T d + T b ) \begin{aligned} Ta \times Tc - Tb \times Td &= T_1 \times ((Ta - Tb) + (Tc - Td) + 2 \times Td + 2 \times Tb) \\ &= T_1 \times (Ta + Tc + Td + Tb) \end{aligned} Ta×Tc−Tb×Td=T1×((Ta−Tb)+(Tc−Td)+2×Td+2×Tb)=T1×(Ta+Tc+Td+Tb)
最终得到:
T 1 = T a × T c − T b × T d T a + T c + T d + T b T_1 = \dfrac{Ta \times Tc - Tb \times Td}{Ta + Tc + Td + Tb} T1=Ta+Tc+Td+TbTa×Tc−Tb×Td
这种算法产生的误差和收到帧之后再发出的反应处理时间关系不大,同样的时钟误差下,ADSTWR 比 TWR 测距精度更高(软件算法设计就是用的这个算法)。
6. UWB 测距嵌入式设计
介绍 UWB 基站的硬件和软件设计。基站电路的 MCU 使用的是 STM32F103,基站使用 DW1000 芯片进行 UWB 通信,基站使用锂电池供电。

6.1 硬件设计
基站的电路原理图如下:

UWB 定位电路基于 DecaWave 公司 DW1000 系列的 UWB 定位系统,DW1000 使用 SPI 接口,相关电路如下:

6.2 软件设计
6.2.1 软件架构
嵌入式软件整体架构如下图所示,主要分为驱动层、DW_API 层、应用层。

- 驱动层:主要实现 STM32 与 DWIC 的 SPI 通信,使用 HAL 库进行开发,完成 SPI 配置、中断配置、IIC 配置、串口配置、看门狗配置等,对接到 DW_API 层,完成驱动层搭建。
- DW_API 层:使用 DecaWave 官方 API 进行移植搭建,API 将常用功能进行函数封装。DWIC 的主要功能实现基本通过读写相应的寄存器实现,通过官方 API 内的简单 example 结合《DW1000_Software_API_Guide.pdf》可大概了解常用 API 功能。
- 应用层:是实现 TWR 测距主要功能的实现代码,完成系统的状态读取,参数配置,TWR 数据收发,TOF 计算,卡尔曼滤波,串口数据发送等功能。
6.2.2 主程序工作流程
主程序位于 Src/application/dw_main.c,主要完成设备参数初始化和按拨码开关状态进行基站或标签状态机运行,最后进行串口数据打包发送。基站工作过程由状态机实现,完成单周期 ADSTWR 全过程,主要工作流程如下图:

代码源码如下:
void anchor_app(void)
{
switch (state)
{
case STA_INIT_POLL_BLINK: // 初始化接收机,接收 poll 消息
dwt_setpreambledetecttimeout(0); // 清除前导码超时,一直接收
dwt_setrxtimeout(0); // 清除接收数据超时,一直接收
int ret = dwt_rxenable(DWT_START_RX_IMMEDIATE); // 打开接收机,等待接收数据
rx_status = RX_WAIT; // 清 rx 标志位,中断服务函数更改其状态
state = STA_WAIT_POLL_BLINK;
/* 省略代码 */
break;
case STA_WAIT_POLL_BLINK: // 等待 poll 消息,中断回调函数状态变更
if(rx_status == RX_OK) // 接收到数据
{
rx_status = RX_WAIT;
state = STA_RECV_POLL_BLINK;
}
else if((rx_status == RX_TIMEOUT) || (rx_status == RX_ERROR)) // 接收数据错误,重新开启接收
{
state = STA_INIT_POLL_BLINK;
}
/* 省略代码 */
break;
case STA_RECV_POLL_BLINK:// 接收处理 poll 消息
if(rx_buffer[FUNC_CODE_IDX] == FUNC_CODE_POLL) // 判断收到的数据是 POLL
{
range_nb = rx_buffer[RANGE_NB_IDX]; // 取 range_nb,resp 发送时发送相同的 range_nb
recv_tag_id = rx_buffer[SENDER_SHORT_ADD_IDX]; // 取发送标签的 ID
if(recv_tag_id >= inst_slot_number) // 标签 ID 如果大于标签总容量则退出
{
state = STA_INIT_POLL_BLINK;
break;
}
range_time = portGetTickCnt(); // 取得测距时间
poll_rx_ts = get_rx_timestamp_u64(); // 获得 poll_rx 时间戳
/* 省略代码 */
}
else // 非 POLL 数据重新开启接收 POLL
{
state = STA_INIT_POLL_BLINK;
}
/* 省略代码 */
break;
case STA_SORR_RESP:// 根据基站 ID 按顺序进行发送或接收 resp 消息
if(sr > 0)// sr > 0 处于 resp 阶段,按基站 ID 判断接收 resp 或发送 resp
{
if(rr & 0x01)// 当前该基站需发送 resp
{
rr = 0;
state = STA_SEND_RESP;
}
else// 当前该基站需接收 resp
{
dwt_setdelayedtrxtime(resp_rx_time); // 设置接收机开启延时时间
dwt_setrxtimeout(inst_resp_rx_timeout); // 设置接收数据超时时间
dwt_setpreambledetecttimeout(PRE_TIMEOUT); // 设置接收前导码超时时间
int ret = dwt_rxenable(DWT_START_RX_DELAYED); // 延时开启接收机
if(ret == DWT_ERROR)
{
state = STA_INIT_POLL_BLINK;
break;
}
rr = rr >> 1;
state = STA_WAIT_RESP;
}
sr = sr - 1;
/* 省略代码 */
}
else// 准备接收 final
{
/* 省略代码 */
dwt_setrxtimeout(inst_final_rx_timeout); // 设置接收数据超时时间
dwt_setpreambledetecttimeout(PRE_TIMEOUT); // 设置接收前导码超时时间
int ret = dwt_rxenable(DWT_START_RX_DELAYED); // 延时开启接收机
if(ret == DWT_ERROR)
{
state = STA_INIT_POLL_BLINK;
break;
}
state = STA_WAIT_FINAL;
}
break;
case STA_SEND_RESP: // 打包发送 resp 消息
{
/* resp 数据打包 */
tx_resp_msg[SEQ_NB_IDX] = frame_seq_nb++;
tx_resp_msg[RANGE_NB_IDX] = range_nb;
tx_resp_msg[SENDER_SHORT_ADD_IDX] = anc_id;
tx_resp_msg[RECEIVER_SHORT_ADD_IDX] = recv_tag_id;
tx_resp_msg[FUNC_CODE_IDX] = FUNC_CODE_RESP;
/* 省略代码 */
state = STA_SORR_RESP;
}
break;
case STA_WAIT_RESP: // 等待接收 resp 消息,在中断回调函数内 rx_status 状态变更
if(rx_status == RX_OK)
{
rx_status = RX_WAIT;
state = STA_RECV_RESP;
}
else if((rx_status == RX_TIMEOUT) || (rx_status == RX_ERROR))
{
rx_status = RX_WAIT;
state = STA_SORR_RESP;
}
break;
case STA_RECV_RESP: // 接收到其他基站的 resp 消息
{
if(rx_buffer[FUNC_CODE_IDX] == FUNC_CODE_RESP)// 正确接收到 resp 消息
{
if(rx_buffer[RANGE_NB_IDX] == range_nb)// 和当前测距具有相同的 range_nb
{
uint8_t recv_anc_id = rx_buffer[SENDER_SHORT_ADD_IDX]; // 取基站 ID
distance_report[recv_anc_id] = (int32_t)rx_buffer[RESP_MSG_PREV_DIS_IDX] << 24;
distance_report[recv_anc_id] += (int32_t)rx_buffer[RESP_MSG_PREV_DIS_IDX+1] << 16;
distance_report[recv_anc_id] += (int32_t)rx_buffer[RESP_MSG_PREV_DIS_IDX+2] << 8;
distance_report[recv_anc_id] += (int32_t)rx_buffer[RESP_MSG_PREV_DIS_IDX+3];
}
}
state = STA_SORR_RESP;
}
break;
case STA_WAIT_FINAL: // 等待接收 final 消息,在中断回调函数内 rx_status 状态变更
if(rx_status == RX_OK)
{
state = STA_RECV_FINAL;
}
else if((rx_status == RX_TIMEOUT) || (rx_status == RX_ERROR))
{
rx_status = RX_WAIT;
state = STA_INIT_POLL_BLINK;
range_status = RANGE_ERROR;
}
break;
case STA_RECV_FINAL: // 接收到 final 消息,数据处理
if ((rx_buffer[FUNC_CODE_IDX] == FUNC_CODE_FINAL) && (rx_buffer[RANGE_NB_IDX] == range_nb))
{
resp_valid = rx_buffer[FINAL_MSG_FINAL_VALID_IDX];
if((resp_valid >> anc_id) & 0x01) // final 消息中,本基站发送的 resp 消息是有效的,则进行距离计算
{
uint32_t poll_tx_ts, resp_rx_ts, final_tx_ts;
uint32_t poll_rx_ts_32, resp_tx_ts_32, final_rx_ts_32;
double Ra, Rb, Da, Db;
int64_t tof_dtu;
double tof;
resp_tx_ts = get_tx_timestamp_u64(); // 取得 resp_tx 时间戳
final_rx_ts = get_rx_timestamp_u64(); // 取得 final_rx 时间戳
/* 从 final 消息中,取得 poll_tx 时间戳,resp_rx 时间戳,final_tx 时间戳 */
final_msg_get_ts(&rx_buffer[FINAL_MSG_POLL_TX_TS_IDX], &poll_tx_ts);
final_msg_get_ts(&rx_buffer[FINAL_MSG_RESP1_RX_TS_IDX + anc_id * FINAL_MSG_TS_LEN], &resp_rx_ts);
final_msg_get_ts(&rx_buffer[FINAL_MSG_FINAL_TX_TS_IDX], &final_tx_ts);
/* 计算飞行时间 */
poll_rx_ts_32 = (uint32_t)poll_rx_ts;
resp_tx_ts_32 = (uint32_t)resp_tx_ts;
final_rx_ts_32 = (uint32_t)final_rx_ts;
Ra = (double)(resp_rx_ts - poll_tx_ts);
Rb = (double)(final_rx_ts_32 - resp_tx_ts_32);
Da = (double)(final_tx_ts - resp_rx_ts);
Db = (double)(resp_tx_ts_32 - poll_rx_ts_32);
tof_dtu = (int64_t)((Ra * Rb - Da * Db) / (Ra + Rb + Da + Db));
tof = (int32_t)tof_dtu;
if (tof > 0x7FFFFFFF)
{
tof -= 0x80000000;
}
tof = tof * DWT_TIME_UNITS;
distance_now_m = tof * SPEED_OF_LIGHT;
if(distance_now_m > 20000.000)
{
distance_now_m = -1;
}
distance_now_m = distance_now_m - (float)distance_offset_cm / 100.0f;
// 将上次的测距值写入 distance_report 用于串口输出
distance_report[anc_id] = prev_range[recv_tag_id].distance;
// 更新 prev_range 为本次测距值
prev_range[recv_tag_id].distance = distance_now_m * 1000; // 单位转换为 mm
prev_range[recv_tag_id].range_nb = range_nb;
valid_report = resp_valid;
/* 省略代码 */
}
}
dwt_forcetrxoff();
state = STA_INIT_POLL_BLINK;
break;
default:
break;
}
}
测距算法相关代码:
poll_rx_ts_32 = (uint32_t)poll_rx_ts;
resp_tx_ts_32 = (uint32_t)resp_tx_ts;
final_rx_ts_32 = (uint32_t)final_rx_ts;
Ra = (double)(resp_rx_ts - poll_tx_ts);
Rb = (double)(final_rx_ts_32 - resp_tx_ts_32);
Da = (double)(final_tx_ts - resp_rx_ts);
Db = (double)(resp_tx_ts_32 - poll_rx_ts_32);
tof_dtu = (int64_t)((Ra * Rb - Da * Db) / (Ra + Rb + Da + Db));
tof = (int32_t)tof_dtu;
tof = tof * DWT_TIME_UNITS;
distance_now_m = tof * SPEED_OF_LIGHT;
代码对应的公式:
T 1 = T a × T c − T b × T d T a + T c + T d + T b T_1 = \dfrac{Ta \times Tc - Tb \times Td}{Ta + Tc + Td + Tb} T1=Ta+Tc+Td+TbTa×Tc−Tb×Td
6.3 测距算法相关参数
在上述代码中,poll_rx_ts、resp_tx_ts、final_rx_ts 和 final_tx_ts 分别表示不同阶段的时间戳,这些时间戳用于计算飞行时间(TOF)。
poll_rx_ts:Poll 消息的接收时间戳。resp_tx_ts:Response 消息的发送时间戳。final_rx_ts:Final 消息的接收时间戳。final_tx_ts:Final 消息的发送时间戳。
通过这些时间戳,计算出各个时间差 R a Ra Ra、 R b Rb Rb、 D a Da Da 和 D b Db Db,进而利用公式计算出飞行时间 t o f tof tof,最终得到距离 d i s t a n c e _ n o w _ m distance\_now\_m distance_now_m。
变量及功能
distance_now_m:当前测距结果,单位为米。distance_offset_cm:距离补偿值,单位为厘米,用于校准测距结果。SPEED_OF_LIGHT:光速,单位为米/秒。DWT_TIME_UNITS:时间单位转换系数,用于将时间戳单位转换为秒。
状态机设计
状态机设计用于管理测距过程中的不同阶段,确保测距流程的有序进行。状态机的主要状态包括:
STA_INIT_POLL_BLINK:初始化接收机,准备接收 Poll 消息。STA_WAIT_POLL_BLINK:等待 Poll 消息。STA_RECV_POLL_BLINK:接收并处理 Poll 消息。STA_SORR_RESP:根据基站 ID 按顺序进行发送或接收 Response 消息。STA_SEND_RESP:发送 Response 消息。STA_WAIT_RESP:等待接收 Response 消息。STA_RECV_RESP:接收并处理其他基站的 Response 消息。STA_WAIT_FINAL:等待接收 Final 消息。STA_RECV_FINAL:接收并处理 Final 消息,计算最终测距结果。
函数及功能
dwt_setpreambledetecttimeout:设置前导码检测超时时间。dwt_setrxtimeout:设置接收数据超时时间。dwt_rxenable:启用接收机。dwt_setdelayedtrxtime:设置延时发送时间。get_rx_timestamp_u64:获取接收时间戳。get_tx_timestamp_u64:获取发送时间戳。final_msg_get_ts:从 Final 消息中提取时间戳。
数据结构
rx_buffer:接收缓冲区,用于存储接收到的数据。tx_resp_msg:发送的 Response 消息。distance_report:存储测距结果,用于串口输出。prev_range:存储上一次的测距结果,用于后续处理。
控制逻辑
- 时间戳处理:通过获取不同阶段的时间戳,计算飞行时间。
- 状态机转换:根据当前状态和接收的数据,决定下一步的操作。
- 错误处理:在接收数据超时或错误时,返回到初始状态,重新开始测距流程。
关键优化
- 时间戳精度:通过使用高精度的时间戳,提高测距精度。
- 状态机设计:通过状态机管理测距流程,确保流程的有序性和稳定性。
- 误差校正:通过补偿值
distance_offset_cm,校正测距结果,提高测距的准确性。
6.4 测试与验证
在完成硬件和软件设计后,需要对系统进行测试和验证,以确保其性能满足要求。测试内容包括:
- 测距精度测试:在不同距离下进行多次测距,计算平均值和标准差,评估测距精度。
- 稳定性测试:长时间运行系统,观察测距结果的稳定性。
- 抗干扰测试:在有干扰的环境下进行测距,评估系统的抗干扰能力。
小结
本文介绍了 UWB 基站的硬件和软件设计,包括电路原理图、软件架构、主程序工作流程、测距算法相关代码等。通过状态机设计和高精度时间戳处理,实现了高精度的 UWB 测距功能。
via:
- UWB 的主要作用与应用领域_uwb 的应用-CSDN 博客
https://blog.csdn.net/qq_49864684/article/details/115839602 - UWBMini3s 模块详解-CSDN 博客
https://blog.csdn.net/qq_49864684/article/details/115841350 - UWB 的定位算法(简单详细易懂)_uwb 定位基站在同一直线上,定位标签距离-CSDN 博客
https://blog.csdn.net/qq_49864684/article/details/115870377 - UWB 代码讲解注释-CSDN 博客
https://blog.csdn.net/qq_49864684/article/details/115966219 - UWB 测距原理及实现-CSDN博客_
https://blog.csdn.net/li_man_man_man/article/details/127709991
— - UWB 技术原理与应用详解_uwb技术-CSDN博客
https://blog.csdn.net/wutao22/article/details/115391392 - 超宽带 DW1000 API — dwt_configure (频道,脉冲重复频率,数据速率等)_dw1000 config-CSDN博客
https://blog.csdn.net/qq_41204464/article/details/90756581

3665

被折叠的 条评论
为什么被折叠?



