我们做了一个 ESP32 UWB 室内定位测试,使用 2 个 UWB 锚点和 1 个 UWB 标签,当标签移动时,UWB 标签的实时位置可以图形显示在 PC 上。
● ESP32 超宽带 *3
● 移动电源
● 5v电源*2
DW1000 是世界上第一款基于超宽带技术的单芯片无线收发器。它为实时定位和室内定位系统、基于位置的服务、无线传感器网络提供了一种新方法。它能够开发具有成本效益的 RTLS 解决方案,其室内和室外定位精确到 10 厘米以内。
Makerfabs ESP32 UWB基于 ESP32 和 DW1000 解决方案,它就像一个连续扫描雷达,精确锁定另一个设备并与之通信,从而计算自己的位置,配合 ESP32 WiFi/蓝牙,它可能是无线解决方案室内定位。
超宽带是一种在宽带宽(>500 MHz)上传输信息的技术。这允许传输大量的信号能量,而不会干扰相同频带中的传统窄带和载波传输。许多国家/地区的监管限制允许有效使用无线电带宽,并实现高数据速率个人区域网络 (PAN) 无线连接、远程低数据速率应用以及雷达和成像系统,与现有的透明共存通讯系统。
传统无线电传输和 UWB 之间的显着区别在于,传统系统通过改变正弦波的功率水平、频率和/或相位来传输信息。UWB 传输通过在特定时间间隔产生无线电能量并占用大带宽来传输信息,从而实现脉冲位置或时间调制。通过编码脉冲的极性、其幅度和/或通过使用正交脉冲,也可以在 UWB 信号(脉冲)上调制信息。UWB 脉冲可以以相对较低的脉冲速率偶尔发送以支持时间或位置调制,但也可以以高达 UWB 脉冲带宽的倒数的速率发送。Pulse-UWB 系统已在超过 1 的通道脉冲速率下得到证明。
UWB 无线电系统可用于确定各种频率下传输的“飞行时间”。当然,“飞行”的速度与光速一样,所以核心问题是如何查看“飞行”的时间,从而计算出距离。
距离 = 光速 * Tprot
对于最基本的系统,至少有2项:Device_A(称为A)和Device_B(称为B), 主要有2种测量方式:
这是最基本的测量方法:
首先A发送消息(TX)并记录时间标记,B收到消息,记录时间标记,延迟(Treplay)后,B发送消息(TX)并记录时间标记时间标记,最后A收到消息,并有时间标记的记录。
然后是飞行时间:
由于 Tround 和 Treply 存储在同一个设备上,所以时间误差偏移;当然,A(eA) 和 B(eB) 之间存在误差,误差是:
也就是说,误差与 Treply 是线性的。所以这种方式并不普及,只适用于很短距离的测量。
“单面双向测距”后,如果 A 再次反馈给 B,则为:
这种测量我们称为 3 消息模式。
在“单边双向测距”之后,如果 B 再次发起另一条消息和 A 反馈,则为:
这种测量我们称为 4 消息模式。
在 3 条消息模式或 4 条消息模式下,飞行时间计算如下:
在这个应用中,我们使用了 3 个 Makerfabs ESP32 UWB 模块,2 个模块作为 UWB 锚点,1 个作为 UWB 标签,在房间内移动。当标签获得其位置时,它会将其位置传输到设备(PC 浏览器、手机应用程序),以显示实时位置。
假设所有三个 UWB 模块都处于相同的水平高度。UWB可以得到Tag和两个anchor的距离,再加上预先设置的两个anchor的距离,就可以得到一个三角形三边的长度。
两个点“AB”分别是两个锚点,“C”是标签点。“c”是两个anchor的距离,UWB会得到两个长度“a”和“b”。标签是“b”远离点“A”和“a”远离点“B”。
现在我们知道了三角形三边之间的距离,我们可以计算点“C”的坐标。
我使用余弦定律计算角度“A”的余弦:
我有勾股定理,它给了我角度“A”的正弦:
cos_a = (b * b + c * c - a * a) / (2 * b * c) sin_a = sqrt(1 - cos_a * cos_a)
如果我们将点“A”设置为坐标系的原点 (0, 0),那么我们得到点 C (bcosα, bsinα)。
我们使用 arduino-dw1000库。提供基本功能的库,可将 Decawave 的 DW1000 芯片/模块与 Arduino 一起使用(arduino-dw1000 库)
请注意根据 Github 修改 DW1000 库,否则无法编译为 ESP32。ESP32 UWB GitHub 上的指南
***此应用程序的完整代码位于: Makerfabs GitHub ***
由于系统中有 2 个锚点,我们需要为这两个锚点设置不同的锚点地址。
#define ANCHOR_ADD "83:17:5B:D5:A9:9A:E2:9C"// modify the address when multiple anchors, such as 83/82.
该库默认使用随机短地址,我们需要将其设置为使用我们设置的静态地址。所以我们需要将UWB模块设置为Anchor模式,LONGDATA_RANGE_LOWPOWER模式,并关闭随机短地址,通过以下代码:
DW1000Ranging.startAsAnchor(ANCHOR_ADD,
DW1000.MODE_LONGDATA_RANGE_LOWPOWER, false);
Anchor 代码位于: https ://github.com/Makerfabs/Makerfabs-ESP32-UWB/tree/main/example/anchor
标签需要读取两个锚点之间的距离,通过UDP协议发送给PC。
首先,设置 WiFi 和目标 IP 地址(PC)。
在 Windows cmd 中,使用“ipconfig”检查 PC 本地 IP。
并设置UWB工作在标签模式。
我使用了一个链表来存储检测到的锚点,它非常适合 UWB 的工作方式。链表的内容被转换成 JSON 格式。
得到的JSON字符串格式如下:
最后通过UDP协议每秒向PC发送一次数据。
标签代码位于: https ://github.com/Makerfabs/Makerfabs-ESP32-UWB/tree/main/example/IndoorPositioning/udp_uwb_tag
一个简单的演示,用于计算标签的位置并以图形方式显示它。使用海龟绘制。
一开始想用Matplotlib,但是有点复杂。Turtle 很简单,但提供的功能很简陋。我自己添加了一些绘图功能来快速绘制线条、圆形、矩形等。
这是我的位置计算功能。
其实一开始我是用海伦公式计算坐标的,但是分不清三角形是锐角还是钝角。
demo的功能是接收通过UDP协议传输的标签的数据,计算出标签的位置并绘制在屏幕上。
在所有 UWB 锚点和标签都编程 OK 后,首先我将两个 UWB 锚点放在桌子的两侧。
并在PC端运行Python程序。将 UWB 标签贴到移动电源上,等待它连接到房间里的 WiFi。Tag连接PC后,弹出图形界面。
移动UWB标签,在PC端可以实时监控标签位置:
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !