Decawave官方双边测距(一对一)原理介绍及代码实现

article/2025/10/16 22:58:46

Decawave官方双边测距(一对一)原理介绍及代码实现

一、运行平台
运行软件平台:Keil5
运行硬件平台:STM32
开发板型号:UWB-S1学习板
开发板淘宝链接:https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-23565193320.10.6e6c3f96tF7wds&id=572212584700

二、TOF/单边测距/双边测距概念介绍
Uwb常用测距方法有两种:飞行时间测量(TOF)和到达时间差(TDoA),我们这里将详细介绍飞行时间测量(TOF)的方法。

2.1 TOF
飞行时间测量法(Time of Flight,TOF)是一种双向测距技术,它通过测量两个设备间UWB信号的飞行时间来计算距离(注:所有的双向测距算法并不由DW1000来完成,DW1000仅负责记录下发送/接受数据包的时间戳)。根据UWB数据交互数量可分为:
①单边双向测距
②双边双向测距

2.2 单边双向测距
<单边测距Single-sided Two-WAY Ranging>具体流程:设备A首先向设备B发出一个数据包,并记录下发包时刻Ta1,设备B收到数据包后,记下收包时刻Tb1。之后设备B等待Treply时刻,在Tb2(Tb2 = Tb1 + Treply)时刻,向设备A发送一个数据包,设备A收到数据包后记下Ta2.然后可以算出电磁波在空中的飞行时间Tprop,飞行时间乘以光速即为两个设备间的距离。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

因为设备A和设备B使用各自独立的时钟源,时钟都会有一定的偏差,假设设备A和设备B时钟的实际频率是预期频率的eA和eB倍,那么因为时钟偏差引入的误差error为:
在这里插入图片描述

设备A和B的时钟偏差都会对Tprop值造成影响,并且直接影响我们的测量精度,因为光速是30cm/ns,所以很小的时钟偏差也会对测量结果造成很大影响,而且这种影响是SS测距方式无法避免的。也因此SS测距很少被采用,大部分情况下我们都使用DS测距的方式。
在这里插入图片描述

2.3双边双向测距
<双边测距Double-sided Two-WAY Ranging>具体流程:DS测距在SS测距的基础上增加一次通讯,两次通讯的时间可以互相弥补(因为时间偏移引入的误差)。
在这里插入图片描述
在这里插入图片描述

使用DS测距方式时钟引入的误差为
在这里插入图片描述

假设设备A和设备B的时钟精度是20ppm(很差),1ppm为百万分之一,那么Ka和Kb分别是0.99998或者1.00002,ka和kb分别是设备A、B时钟的实际频率和预期频率的比值。设备A、B相距100m,电磁波的飞行时间是333ns。则因为时钟引入的误差为2033310-9秒,导致测距误差为2.2mm,可以忽略不计了。因此双边测距是最常采用的测距方式(Decawave官方也提供了双边测距的例程)。

三、官方测距代码实现
UWB-S1测距源码(官改)即使用了Decawave官方提供Double-sided two-way代码做基础,下面我们将对源码做详细介绍。

标签/基站模式切换方法如下
①基站模式:node_task(),注释tag_task()
②标签模式:tag_task(),注释node_task()

int main(void)
{init();	//	tag_task();	//标签任务node_task();	//基站任务for(;;){	}
}

3.1 基站/标签统一配置

初始化DW1000设备
dwt_initialise(DWT_LOADUCODE)配置DW1000标签/基站通信信道的参数
dwt_configure(&config)设置DW1000天线的延迟
dwt_setrxantennadelay(RX_ANT_DLY);
dwt_settxantennadelay(TX_ANT_DLY);设置DW1000 LED指示灯与发送接受同步
dwt_setleds(3);

3.2 基站/标签流程
基站/标签流程图如下(图片版权并非作者)
在这里插入图片描述

3.2.1标签发送Poll

dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS);//设置标签发送Poll包后延迟打开接受时间
dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS);//设置接受超时时间
dwt_setpreambledetecttimeout(PRE_TIMEOUT);//设置前导码接受超时时间dwt_writetxdata(sizeof(tx_poll_msg), tx_poll_msg, 0);//将Poll发送数据写入DW1000准备发送 
dwt_writetxfctrl(sizeof(tx_poll_msg), 0, 1);//设置发送Poll数据长度 dwt_starttx(DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED);//立即打开发送

3.2.2 基站接受Poll

dwt_setpreambledetecttimeout(PRE_TIMEOUT);//设置前导码接受超时时间
dwt_setrxtimeout(0);//清除接受超时
dwt_rxenable(DWT_START_RX_IMMEDIATE);//立即开始接受dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_TO | SYS_STATUS_ALL_RX_ERR)))
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG);//清除DW1000接受成功寄存器dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;//读取DW1000接受数据长度
dwt_readrxdata(rx_buffer, frame_len, 0);//读取DW1000接受数据

3.2.3 基站发送Resp

poll_rx_ts = get_rx_timestamp_u64();//读取接受Poll时间戳值
resp_tx_time = (poll_rx_ts + (POLL_RX_TO_RESP_TX_DLY_UUS * UUS_TO_DWT_TIME)) >> 8;//计算Resp数据包发送时间dwt_setdelayedtrxtime(resp_tx_time);//设置Resp数据包发送时间
dwt_setrxaftertxdelay(RESP_TX_TO_FINAL_RX_DLY_UUS);//设置基站发送Resp包后延迟打开接受时间
dwt_setrxtimeout(FINAL_RX_TIMEOUT_UUS);//设置接受超时时间dwt_writetxdata(sizeof(tx_resp_msg), tx_resp_msg, 0);//将Resp发送数据写入DW1000准备发送 
dwt_writetxfctrl(sizeof(tx_resp_msg), 0, 1); //设置发送Resp数据长度
dwt_starttx(DWT_START_TX_DELAYED | DWT_RESPONSE_EXPECTED);//设置延迟发送,

3.2.4 标签接受Resp

dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_TO | SYS_STATUS_ALL_RX_ERR)))
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS);//清除DW1000接受成功寄存器dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK;//读取DW1000接受数据长度
dwt_readrxdata(rx_buffer, frame_len, 0);//读取DW1000接受数据

3.2.5 标签发送Final

poll_tx_ts = get_tx_timestamp_u64();//读取发送Poll时间戳值
resp_rx_ts = get_rx_timestamp_u64();//读取接受Resp时间戳值final_tx_time = (resp_rx_ts + (RESP_RX_TO_FINAL_TX_DLY_UUS * UUS_TO_DWT_TIME)) >> 8;//计算Final数据包发送时间
dwt_setdelayedtrxtime(final_tx_time);//设置Final数据包发送时间dwt_writetxdata(sizeof(tx_final_msg), tx_final_msg, 0);//将Final发送数据写入DW1000准备发送 
dwt_writetxfctrl(sizeof(tx_final_msg), 0, 1);//设置发送Final数据长度
ret = dwt_starttx(DWT_START_TX_DELAYED);//设置延迟发送,延迟发送时间为final_tx_time

3.2.6 基站接受Final

dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_TO | SYS_STATUS_ALL_RX_ERR)))
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS);//清除DW1000接受成功寄存器dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK;//读取DW1000接受数据长度
dwt_readrxdata(rx_buffer, frame_len, 0);//读取DW1000接受数据//开始3.2.7(基站-标签计算距离)

3.2.7 基站计算测距数据

uint32 poll_tx_ts, resp_rx_ts, final_tx_ts;
uint32 poll_rx_ts_32, resp_tx_ts_32, final_rx_ts_32;
double Ra, Rb, Da, Db;
int64 tof_dtu;resp_tx_ts = get_tx_timestamp_u64();//读取发送Resp时间戳值
final_rx_ts = get_rx_timestamp_u64();//读取接受Final时间戳值final_msg_get_ts(&rx_buffer[FINAL_MSG_POLL_TX_TS_IDX], &poll_tx_ts);//从标签发来数据中获取Poll发送时间戳
final_msg_get_ts(&rx_buffer[FINAL_MSG_RESP_RX_TS_IDX], &resp_rx_ts);//从标签发来数据中获取Resp接受时间戳
final_msg_get_ts(&rx_buffer[FINAL_MSG_FINAL_TX_TS_IDX], &final_tx_ts);//从标签发来数据中获取Final发送时间戳poll_rx_ts_32 = (uint32)poll_rx_ts;
resp_tx_ts_32 = (uint32)resp_tx_ts;
final_rx_ts_32 = (uint32)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)((Ra * Rb - Da * Db) / (Ra + Rb + Da + Db));tof = tof_dtu * DWT_TIME_UNITS;
distance = tof * SPEED_OF_LIGHT;//计算标签与基站距离值memset(dist_str, 0, sizeof(dist_str));
sprintf(dist_str, "DIST: %3.2f m\n", distance);
port_tx_msg(dist_str,strlen(dist_str));//打印距离参数

http://chatgpt.dhexx.cn/article/rvAPFfOC.shtml

相关文章

Python列表与字典的推导式

推导式的示例&#xff1a; 如果&#xff1a;list [10, 20, 30] 推导式&#xff1a;half [int(x*0.5) for x in list] 推导式结果half&#xff1a;[5, 10, 15] 选择题 以下python代码的输出结果是什么&#xff1f; list [10, 20, 30] half [int(x*0.5) for x in list] dict…

不容错过!Python列表推导式简明教程

点击 机器学习算法与Python学习 &#xff0c;选择加星标 精彩内容不迷路 选自towardsdatascience&#xff0c;作者&#xff1a;Benedikt Droste 机器之心编译 列表解析式&#xff08;List comprehension&#xff09;或者称为列表推导式&#xff0c;是 Python 中非常强大和优雅的…

各种列表推导式

推导式的套路 之前我们已经学习了最简单的列表推导式和生成器表达式。但是除此之外&#xff0c;其实还有字典推导式、集合推导式等等。 下面是一个以列表推导式为例的推导式详细格式&#xff0c;同样适用于其他推导式。 variable [out_exp_res for out_exp in input_list if o…

HTMLCSS仿京东详情页静态页面制作总结

目录 1.页面效果 2.页面分析 3.页面制作 &#xff08;1&#xff09;产品介绍模块​编辑 &#xff08;2&#xff09;产品细节模块​编辑 1.页面效果 接上面 2.页面分析 头部导航栏和底部栏跟前面的大相径庭&#xff0c;这里就不再总结了。 详情页的制作大致分为两个部分&…

php静态页面制作,ps制作静态的html页面

这篇教程是分享ps如何制作静态的html页面方法&#xff0c;教程制作出来的效果还是挺不错的&#xff0c;难度不是很大&#xff0c;喜欢的朋友快快来学习吧 ps是一个强大的修图软件&#xff0c;那你知道其实ps也可以制作html页面吗。小编将告诉你ps如何制作html页面&#xff0c;不…

静态网页制作html语言入门

编辑一个文本文件&#xff0c;代码如下&#xff1b; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title> html test1 </title> </head> <body><h1>DDDD</h1><p>PPPPPPPPPPP...</p…

Java Web HTML基础 静态网页制作

文章目录 1.HTML简介2 HTML文档的基本结构3 HTML中的常用标签3.1 文字布局及字体标签3.2 文字设计标签3.3 列表标签4 表格标签4.1 表格基本设计4.2 合并单元格5 链接和图片标签6 表单标签 1.HTML简介 HTML&#xff08;超文本语言&#xff09;是构成网页文档的主要语言&#xf…

静态页面制作—Magnet

利用htmlcss进行制作静态网页制作&#xff0c;熟悉项目制作流程&#xff0c;建立起编写代码习惯。 一、项目分析 1.以下为静态网页的效果图&#xff0c;此文章目的利用htmlcss完成效果图&#xff1b; 2.此页面为三栏式结构&#xff0c;divcss直接进行三栏式布局&#xff1…

一个简单的网页制作期末作业,学生个人html静态网页制作成品代码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

怎么制作html静态页面,如何做静态网页

怎样制作简单的静态的网页设计 欢迎来到CSS布局HTML。首先下载Dreamweaver.exe并打开,选择你使用的编辑语言,本案例用html 打开页面后,选着设计窗口,如图所示。设计窗口可以快速布局网页,不需要自己编辑代码。 打开你要设计的网页的设计图,本经验是百度经验首页为例。 我…

静态网页制作(html+css)、css浮动,练习(网页布局),清除浮动

静态网页代码&#xff08;htmlcss&#xff09; html代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><link rel"stylesheet" href"css/整体网页案例.css" />&l…

静态网页制作

记录一下制作网页的过程和其中遇到的问题和解决方法 一、网页样式 二、制作过程 轮播图 实现方法更改图片的src&#xff0c;实现把图片命名为p1.png,p2.png <script>var index1;function lunbo(){index;if(index>2){index1;}var imgdocument.getElementById("…

Javaweb实验:静态网页制作

Javaweb实验&#xff1a; 1.静态网页制作 目录 Javaweb实验&#xff1a; 前言 一、实验目的 二、实验原理 三、实验内容 四、实验步骤 五、实验结果 六、实验内容 七、实验步骤 八、实验结果 九、思考 1、frameset和frame标签的作用是什么&#xff1f; 2、个人主…

前端学习——静态网页制作

前端学习——静态网页制作 1学习内容2. 成果展示 1学习内容 综合运用HTML、CSS知识制作静态网页。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>京吃食府</title><link rel"styles…

HTML标签img的alt和title属性

在html5 中&#xff0c;title可以在任意HTML标签中使用&#xff0c;厌憎任意元素&#xff0c;但是不一定有效

HTML的img标签的 alt 属性

如果无法显示图像&#xff0c;浏览器将显示替代文本&#xff0c;就像这样&#xff1a; 此外&#xff0c;当用户把鼠标移到图像上方&#xff0c;最新的浏览器会在一个文本框中显示描述性文本。 alt 属性是一个必需的属性&#xff0c;它规定在图像无法显示时的替代文本。 假设由…

CSS的alt:图片无法显示时候显示alt内容

<img src"/i/eg_tulip.jpg" alt"上海鲜花港 - 郁金香" />如果无法显示图像&#xff0c;浏览器将显示替代文本&#xff0c;就像这样&#xff1a;

HTML里img标签里的alt属性解释

我们在写HTML的时候&#xff0c;总会和图像进行交互&#xff0c;所以我们总会看到<img>标签里的alt属性。 很多的解释是&#xff1a;alt 用来在非图形化浏览器中替代图像 感觉很模棱两可&#xff0c;所以总结如下&#xff1a; 如果无法显示图像&#xff0c;浏览器将显…

用div模拟ALT的提示效果

在网页设计过程中经常会用到标签的alt&#xff0c;title提示效果&#xff0c;但往往满足不了要求。昨天一个同事在设计页面时刚好需要用到这种提示效果&#xff0c;我就帮他用div做了一个。 <html><SCRIPT> var innerhtm <div id"showtip" style&quo…

img标签的alt属性和title属性的区别

img的title和alt有什么区别 1.title&#xff1a;通常当鼠标滑动到元素上的时候显示 2.alt&#xff1a;alt是img标签的特有属性&#xff0c;是图片内容的等价描述&#xff0c;用于图片无法正常加载时显示 <div><img src"https://ss1.bdstatic.com/70cFvXSh_Q1Ynx…