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来构建.通过学习,我已经掌握了基本的搭建过程,写下基础文章为而后的深入学习奠定基础. 首先说一下这篇文章的主要 ...
随机推荐
- [HTTPS] - 请求API失败(Could not create SSL/TLS secure channel)之解决
背景 在单元测试中请求 HTTPS API 失败. 异常 Result StackTrace: at System.Web.Services.Protocols.WebClientProtocol. ...
- C++_对象数组与对象指针
对象数组与对象指针 1. 对象数组 所谓对象数组是指每一数组元素都是对象的数组, 也就是说,若一个类有若干个对象,则把这一系列的对象用一个数组来存放. 对象数组的元素是对象, 不仅具有数据成员,而且还 ...
- 刷新ip地址 windows linux系统
linux:使用dhcp去更新ip与释放ip 释放ip: dhclient -r eth0 (释放eth0的ip) 更新ip : dhclient eth0 (针对eth0,请求新的ip) windo ...
- 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)
原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...
- 2..net core 和.net framework 版本
同一台机器上可以安装多个版本的.net core runtime.比如: 每个.net core项目都可以指定自己所用的版本,所以改变某个项目的target version不会影响到其他的.安装新的r ...
- 用.net4中的DynamicObject实现简单AOP
public class DynamicWrapper : DynamicObject { private readonly object source; public DynamicWrapper( ...
- 数据多的时候为什么要使用redis而不用mysql?
2018-06-28 136465569... 转自 庆亮trj21bc... 修改 微信 分享: Redis和MySQL的应用场景是不同的. 通常来说,没有说用Redis就不用MySQL的这 ...
- Http 和 Socket 之间的恩爱情仇
前言 一些刚入门的小伙伴可能会用 Socket,也会用 OkHttp 或者 HttpUrlConnection 等一些 HTTP 客户端工具,这两个东西看着有点像可是又不太一样,到底是哪里不一样呢? ...
- js时间格式化和相互转换
1. Thu Mar 07 2019 12:00:00 GMT+0800 (中国标准时间) 转换为 2019-03-07 12:00:00 const d = new Date(Thu Mar 07 ...
- 打印html页面
// 打印类属性.方法定义 const Print = function (dom, options) { if (!(this instanceof Print)) return new Print ...
当接收端接收到信息,解析messageData 就可以知道这个信息准确的发送时间。