TDOA基础之 delayed tx 实现说明
不论是在TWR 还是TDOA定位算法中,delayed tx 都会用到,这篇博文主要解析delayed tx 实现。
何为delayed tx? delayed tx 是延时发送,为何要延时?因为这个延时可以控制,设定好延时后,可以把延时信息放到数据包中,接收者收到信息后,除了知道接收时间还能知道发送时间。具体作用参考TWR或者TDOA算法代码。
首先说几个dwm1000中用到的time
1 最重要的是dwm1000 内部时钟

从上面描述中可以得知时钟频率为63.8976GHz,这个Counter 每增加一个step,对应的时间是1/63.8976G=15.56ps ,这个时间再乘以光速,大概距离是0.0047m.
但是根据标黄的地方知道,低9bit 一直是0.
2 delayed counter

与系统时间counter对应,低9bit 也是0.
Delayed Tx 代码分析
final_tx_time = dwt_readsystimestamphi32() +0x100000;
dwt_setdelayedtrxtime(final_tx_time);
1 首先使用dwt_readsystimestamphi32() 读取系统时间counter的高32位(最低位是0,另外8bit 也是0,没有去读),然后再这个基础上加了0x100000
2 使用API 设定delayed tx时间dwt_setdelayedtrxtime(txdelay),同样,这里设置的是高32位,而不是全部40bit。
整个delay时间为0x100000 00 *15.5ps = 4160749568 ps =0.416s
这个计算方法是错的,因为用dwt_readsystimestamphi32() 读取的是高32位,低8bit虽然为0,但是实际时间可能不为0,虽然看不到,但实际存在。
例如连续两次dwt_readsystimestamphi32(),可能返回一样的值,但是低9bit 0是有差异的。所以不能用上述公式计算delay,哪如何算? 没法算,其实也没有太大用,或者实际上没用!
如何理解?
我们设定了delaytx 时间,高32bit,低8bit是0后,系统counter 增加,等到某一个时间系统counter与 delaytx counter 相等,这个时候低9bit 的0 是真实的0!
理解了上面部分再往下看代码
final_tx_ts = (((uint64)(final_tx_time & 0xFFFFFFFE)) << ) + TX_ANT_DLY;
final_msg_set_ts(&msg_f_send.messageData[FIRST_TX], final_tx_ts);
这个代码final_tx_time & 0xFFFFFFFE,是因为高32bit 的counter其实最低一位也是0,把它清楚掉。
然后右移8位,完整的时间,产生40bit 时间,后面加上tx 天线延时,就是发送端真实的发送时间。 那tx_ant_dly 低8位可以是非零吗? 可以! 因为rx tx timestamp 40bit 都是有效的,没有说低9bit为0.当接收端接收到信息,解析messageData 就可以知道这个信息准确的发送时间。
更多内容参考蓝点无限论坛bphero.com.cn
TDOA基础之 delayed tx 实现说明的更多相关文章
- TDOA Delayed Tx 实现以及验证
在博文:https://www.cnblogs.com/tuzhuke/p/11638221.html 中描述了delayed tx实现方法,这里贴出全部delayed tx 代码以及对应验证代码 1 ...
- TDOA 基础之 双曲线
TDOA 的算法基础就是时间差,根据时间差换算出距离差,后面的数学理论知识就是双曲线交点问题. 双曲线方程是2次方程,解算曲线交点也就是两个2次方程求解. 首先看双曲线定义(百度百科): 双曲线(Hy ...
- TDOA基站 之 时间同步
TDOA 和 TWR相比,标签可以用最少的信息来定位,但是对于基站要求很高,需要“时间同步”. 这也是TDOA算法的核心部分,很多套件对此讳莫如深,希望能沟通过本文使读者能对TODA同步有一定初步了解 ...
- TDOA 之 基站逻辑代码实现
在前一篇博文里描述了基站的逻辑部分,这里贴出来具体代码实现.https://www.cnblogs.com/tuzhuke/p/11689881.html 1 Sync 信息部分 case 'S': ...
- TDOA 之 基站接收数据
基站主要 接收同步节点发来的同步信号,代码里定义为S信息. 以及标签节点发来的定位信号,代码中定义为T信号. 代码中使用中断以及帧过滤功能,对模块只接收自己关心设定好的信息,通过中断告知上层,而不是长 ...
- 【DWM1000】 code 解密2一 工程初始化代码分析
instance_init 函数追下去,绝大多数的代码都在初始化如下结构体 typedef struct { INST_MODE mode; instance_init -ANCHOR //insta ...
- 【DWM1000】 code 解密1一 去掉Main 函数多余内容
蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 正文: 室内定位兴起,DWM1000 作为超宽带UWB的代表,在国内用的越来越多,但是可见资料非常少. 一方面 ...
- [Spring+SpringMVC+Mybatis]框架学习笔记(六):事务
第7讲 事务 7.1 事务的概念 事务是一系列作为一个逻辑单元来执行的操作集合. 它是数据库维护数据一致性的单位,它讲数据库从一个一致状态,转变为新的另外一个一致状态.说的简单一点就是:如果一组处理步 ...
- Maven多模块,Dubbo分布式服务框架,SpringMVC,前后端分离项目,基础搭建,搭建过程出现的问题
现互联网公司后端架构常用到Spring+SpringMVC+MyBatis,通过Maven来构建.通过学习,我已经掌握了基本的搭建过程,写下基础文章为而后的深入学习奠定基础. 首先说一下这篇文章的主要 ...
随机推荐
- kafka 集群环境搭建 java
简单记录下kafka集群环境搭建过程, 用来做备忘录 安装 第一步: 点击官网下载地址 http://kafka.apache.org/downloads.html 下载最新安装包 第二步: 解压 t ...
- django使用pyecharts(1)----django加入echarts
Django 中使用 pyecharts.一.普通django加入echarts Django 模板渲染 Step 0: 新建一个 Django 项目 $ django-admin startproj ...
- OpenCV学习笔记5
OpenCV学习笔记5 图像变换 傅里叶变换 这里可以先学习一下卷积分,了解清除卷积的过程和实际意义,在看这一章节的内容. 原理: 傅里叶变换经常被用来分析不同滤波器的频率特性.我们可以使用 2D 离 ...
- spring的事务解决方案之@Transactional注解
首先此注解位于 org.springframework.transaction.annotation 这个包路径下面, 事务有两种类别,一种是编程式事务,另一种是声明式事务,显然此注解是声明式事务,这 ...
- MySql五大引擎的区别以及优劣之分
五大引擎 一: MyISAM:在创建MyISAM的时候会出来三个默认的文件 1.tb_demo.frm,存储表定义:2.tb_demo.MYD,存储数据:3.tb_demo.MYI,存储索引. 因为M ...
- redis有序集合数据类型---sortedset
一.概述 redis有序集合和集合一样,也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数. redis正式通过分数来为集合中的重圆进行从小到大的 ...
- Yii2 redis 使用方法
/** * 基于 yii2.0 redis使用方法 *///项目根目录命令行执行 composer require --prefer-dist yiisoft/yii2-redis; //在配置文件中 ...
- Spring Cloud 基于Consul 实现配置服务
Spring Cloud体系中提供了Config组件来进行配置服务管理.而Consul除了提供服务注册与发现功能外,同时也提供配置管理功能.本位将介绍如何结合Spring Cloud + Consul ...
- 如何做好PPT
为什么要做ppt 全图型PPT,一张大图做背景,少量的文字---PPT大师Garr Renolds极力推崇的风格 半图型PPT PTT是为了和你的"客户"有效的沟通 好的PPT G ...
- solr的命令
Start the Server If you didn’t start Solr after installing it, you can start it by running bin/solr ...
当接收端接收到信息,解析messageData 就可以知道这个信息准确的发送时间。