描述
<p>注:*为必填项。</p>
<p>【请在报名阶段填写 ↓】</p>
<h1>* 简要介绍作品:</h1>
<p>超宽带(Ultra Wide-Band,UWB)是一种新型的无线通信技术,根据美国联邦通信委员会的规范,UWB的工作频带为3.1~10.6GHz,系统-10dB带宽与系统中心频率之比大于20%或系统带宽至少为500MHz。UWB信号的发生可通过发射时间极短(如2ns)的窄脉冲(如二次高斯脉冲)通过微分或混频等上变频方式调制到UWB工作频段实现。 超宽带的主要优势有,低功耗、对信道衰落(如多径、非视距等信道)不敏感、抗干扰能力强、不会对同一环境下的其他设备产生干扰、穿透性较强(能在穿透一堵砖墙的环境进行定位),具有很高的定位准确度和定位精度。
本演示系统基于UWB技术开发,借助UWB基站和<strong>TDOA(到达时间差)</strong>定位算法,可对UWB标签实现室内分米级的高精度定位。****</p>
<p><strong><strong>【请在竞赛阶段填写 ↓】</strong></strong></p>
<h2>***** 一、作品详情;****</h2>
<p>****本室内定位演示系统主要由三个部分构成,<strong>中央定位系统</strong>(上位机,CLE),<strong>定位基站</strong>(同步基站和从基站,Anchor),<strong>定位标签</strong>(Tag)和<strong>Wi-Fi模块</strong>四个部分构成。鉴于后面的论述中会多次提到这几个部分的专有词汇,所以后面统一以CLE,Anchor和Tag来进行表述。系统结构示意图如下所示:
<img src="//image.lceda.cn/pullimage/Gz61SACg1EGlZ6xCxR9bWJhEhYo9YoZiSjP1fKZy.png" alt="image.png"></p>
<h5><strong>(1)CLE</strong></h5>
<p>CLE为计算服务器(一台普通的PC机即可,能够正常运行用于开发的IDE),对各个anchor发送过来的报文信息进行解析,然后利用解析出来的报文数据进行各个基站的时钟同步,再利用同步之后得到的时间数据和TDOA算法进行标签位置的计算,最后以(x, y, z)坐标的形式输出计算结果。其中本定位演示系统主要的工作是做二维定位,所以z坐标值设置默认值为0。</p>
<h5><strong>(2)Anchor</strong></h5>
<p>Anchor为基站,包括用于发送同步包的同步基站(Sync Anchor)和用于接收定位包的从基站(Salve Anchor);Sync Anchor以一定频率(通常10Hz)的广播形式向各个Salve Anchor发送同步包(Clock sync frame),并将已发送的每一条报文的帧序列号和发送时间以TCP同步发送报文的形式发送给CLE;Salve Anchor处于常接收状态,首先需要接收来自Sync Anchor的同步包,记录下每条报文的帧序列号和接收时间,组织成一条完整的TCP同步接收报文,同时Salve Anchor还需要接收来自Tag的同步包,同样的方式记录下每条报文的帧序列号和接收时间,组织成一条完整的TCP定位接收报文,然后不断的将报文发送给CLE。(Sync Anchor可以通过软件设置成收发兼容的模式,要视具体情况而定,如果改为此模式,接收模式下与Salve Anchor的工作方式一致。)</p>
<h5><strong>(3)Tag</strong></h5>
<p>Tag为定位标签,处于常发射状态,以一定的频率(通常1Hz)向各个Salve Anchor发送定位包(Blink frame),Tag不需要记录任何信息,处于被动定位的状态,Tag本身不需要计算自己的位置,由CLE计算Tag的位置,并以坐标的形式输出结果。</p>
<h5><strong>(4)Wi-Fi模块</strong></h5>
<p>在本项目中Wi-Fi模块用来向CLE转发TCP报文,每一个Anchor上都会接入一个Wi-Fi模块,并将Wi-Fi模块设置成一个用于转发TCP报文的Client,而与之对应的就是CLE需要设置成用于接收TCP报文的Server;通过这样的设置之后,就可以将每一个Anchor输出到串口的报文数据通过Wi-Fi模块转发给CLE。</p>
<h2>* 二、描述作品所面临的挑战及所解决的问题;</h2>
<h3><strong>1. 面临的挑战:</strong></h3>
<p>(1)合适的部署环境不容易确定;
(2)UWB模块内置的晶振,由于不是TXCO,所以造成时钟漂移较大,这部分的误差难以避免。</p>
<h3><strong>2. 所解决的问题:</strong></h3>
<p>(1)针对部署环境的问题,本人在进行项目的过程中尽可能的架高了基站的高度,尽可能基站与基站之间是信号的视距传输,标签与基站进行通信的时候减少阻隔。
(2)针对硬件本身的精度问题,本项目在进行的过程中查阅了多篇相关技术领域的文档,采用了无线时钟同步的算法对各个基站进行时钟同步,采用TDOA算法和EKF(扩展卡尔曼滤波器)进行标签位置的计算。</p>
<h2>* 三、描述作品硬件、软件部分涉及到的关键点;</h2>
<h3><strong>1. 硬件部分关键点:</strong></h3>
<p>整个项目的关注点是如何利用UWB技术对标签进行准确的分米级定位,所以在硬件设计的过程中力求简单明了,针对项目需求没有做过多的冗余设计。硬件部分主要由以下几个部分构成:
<strong>主控MCU</strong>:STM32F103;
<strong>UWB模块</strong>:DWM1000;
<strong>无线通信模块</strong>:Wi-Fi模块;
<strong>电源模块</strong>:3.3V-LDO电源模块;
<strong>调试与烧录端口</strong>:SWDIO与SWCLK下载调试端口和TX与RX串口打印端口;</p>
<p>硬件部分设计过程中最需要注意的点是DWM1000模块的天线的设计与选型,因为UWB信号是高频电磁波,对遮挡较为敏感,所以为了最大程度的减少信号的传播误差,一定要确保信号的视距传播。</p>
<h3><strong>2. 软件部分关键点</strong></h3>
<h4><strong>基站的时钟同步(Clock Synchronization):</strong></h4>
<p>相信每一个做过UWB室内定位的人都知道,在用TDOA算法进行室内定位的时候遇到的最大的难题就是时钟的同步,如何确保各个定位基站之间的时钟保持同步,是影响最终定位结果的重中之重,毕竟1ns的时间误差带来的就是30cm的定位误差。
因为每个基站,无论是发射同步信号的主基站,还是接收同步信号和定位信号的从基站都有自己的独立时钟,因此我们用TDOA算法计算位置的时候,必须将所有接收到定位信号的基站的时间戳统一到一个共同的参考时钟上面,而每一个基站受制于自己独立的硬件时钟系统,所以每个基站本身的时钟在不同时刻也存在着偏差,这个偏差的大小主要看晶振的精度(在不那么计较成本,并且想要更高的定位精度的情况下,那有源低频偏的晶振是不可或缺的)。
在讲同步之前,我先对时钟误差做下说明。UWB的误差主要来自于两个方面:
1). 每个基站本身晶振引起的时钟偏差(drift);
2). 每个独立基站各自的时钟系统(offset)。
所以,在清楚了偏差的来源之后,我们就可以针对性的进行时钟的校准,在对每一个anchor接收时间戳的数据进行分析和统计之后,可以发现,每一个anchor自己独立的时钟漂移是以一定的时间单位在持续增长的。</p>
<h5>(1) 同步报文和定位报文</h5>
<p>接下来我将通过本次项目,由浅入深的对各个基站的时钟同步进行分析。首先我们考虑相对简单的情况,也就是我们项目所实现的演示系统,那就是在定位系统中,存在4个基站(Anchor)和1个被定位标签(Tag),其中Tag以一定的频率发送定位包(posPacket),其中一个作为主基站(master anchor),master anchor用来发送同步包(syncPacket)和接收定位包(posPacket),分别记录下同步报文的发送时间 syncPacket sending time 和 定位报文的接收时间 posPacket receiving time,另外3个作为从基站(slave anchor),slave anchor要同时接收同步包和定位包,并分别记录下同步报文接收时间 syncPacket receiving time 和 定位报文接收时间 PosPacket receiving time。下面我们就来分析在这种情况下,时钟是如何进行同步的。</p>
<h5>(2) 报文的序列号</h5>
<p>在我们上面介绍的定位系统里面,主基站以150ms的时间间隔发送同步包,而标签以1s的时间间隔发送定位包,并且对于每一个含有时间戳的报文来讲,同时还有一个依次递增的序列号,这个序列号从0开始记到255,往复循环,这个依次循环递增的序列号对我们的同步非常重要,下面内容会详细叙述。</p>
<h5>(3) 报文的时间戳</h5>
<p>上一小节的内容讲述了报文中的序列号,这一节中将讲述报文中另一个关键的信息,那就是时间戳,作为一个非万年历的时钟系统,时间一定不会无限制的增长下去的,这是当然了,UWB芯片的时钟系统是以一个固定周期进行计数的,系统中用40-bit的2进制整数来表示时间戳,其中系统时间的最小计数单位大约是:
<img src="//image.lceda.cn/pullimage/LKYRQbvF0GGjp38iJ16lLTdefRlRa9mTqnUfUTp7.png" alt="image.png">
所以时钟系统的固定周期大约是:
<img src="//image.lceda.cn/pullimage/R3OiXqnMYkGG63WOcEbZXVbJXZwewEQilGATilz1.png" alt="image.png">
所以本地时钟每经过17.21s就会产生溢出,因此在进行时间同步的时候需要做相应的边界处理。</p>
<h5>(4) 序列号和时间戳的边界处理</h5>
<p>当系统中任意一个salve anchor 无论是收到来自master anchor 的syncPacket还是收到来自Tag的 posPacket 帧数据,每一帧数据上都会记录下该帧数据的序列号和接收到该帧数据的时间戳,如果该帧数据上所记录的序列号或者时间戳小于前一帧数据的数值,那就代表该anchor的计数器已经产生溢出,需要进行相应的校正,按照各自的周期进行矫正即可。</p>
<h5>(5) 时钟同步详解</h5>
<p>时钟同步的整体示意图如下所示:
<img src="//image.lceda.cn/pullimage/iN5AdRbtCJS4DIHy5Fcnp1vgslDBDF4DteT6TPhN.png" alt="image.png">
上图是当前定位系统在时间轴上接收和发送定位和同步报文的情况,<strong>T</strong> 表示Tag向各个anchor发送定位报文,为上图中的蓝色标线,每1s钟发送一条定位报文;<strong>A0-A3</strong> 为anchor,其中 <strong>A0</strong> 为master anchor,<strong>A1-A3</strong> 为salve anchor, 红色标线为同步报文,每隔150ms发送一条。为了更加详细的去描述整个系统时钟的同步过程,我们把一个salve 收到报文并进行同步的过程拿来并进行说明,如下图所示:
<img src="//image.lceda.cn/pullimage/7B91xQbJ1oX5WIptmpXN6kZyQJkjM2yzna7BC61M.png" alt="image.png">
上图中,<strong>T</strong> 为发送定位报文的Tag,<strong>MA</strong> 代表master anchor,<strong>SA</strong> 代表salve anchor,每当 <strong>T</strong> 发送一条定位报文,<strong>MA</strong> 和 <strong>SA</strong> 在收到该条报文之后,记录下当前接收到定位报文的时间 <strong>RX</strong> 和 当前帧的序列号 SeqNum;<strong>MA</strong> 每发送一条 同步报文则记录下该条报文的发送时间 <strong>TS</strong> 和 序列号 SeqNum,同样 <strong>SA</strong> 在收到同步包之后,记录下接收时间 <strong>RS</strong> 和 序列号 SeqNum。对于任意一个 <strong>SA</strong> 当其收到定位报文时,其之前时刻必定会接收到来自 <strong>MA</strong> 的同步报文,根据我们在前面的分析可知,由晶振带来的系统时钟漂移是有规律的进行增长的,所以我们根据当前的同步帧再向前寻找前一帧的同步报文,此时我们利用与定位报文最近的之前的两帧同步报文就可以将 <strong>SA</strong> 时钟的同步到 <strong>MA</strong> 的时钟上去,同样的道理推广到每一个 <strong>SA</strong> 上面,就可以得到每个 <strong>SA</strong> 与 <strong>MA</strong> 同步的时间。 依据这个理论,可以对每个anchor进行时钟建模。
上面的描述是本项目上所采用的时钟同步方案。</p>
<h4><strong>标签的位置计算(Location Calculation):</strong></h4>
<p>想要进行标签位置的计算,首先需要给定基站的坐标信息,而且是相对准确的位置信息,我们的项目中采用的是二维定位的方案,所以只需要在部署基站的时候确定每一个基站的(x,y)坐标即可。目前项目在实验室中的部署情况如下:</p>
<pre><code>'Sync_Anchor':{'x':68.811,'y':20.981}
'Salve_Anchor1':{'x':62.981,'y':22.321}
'Salve_Anchor2':{'x':62.931,'y':27.056}
'Salve_Anchor3':{'x':68.846,'y':28.352}
</code></pre>
<h5>(1) TDOA算法</h5>
<p>理论上利用TDOA算法计算目标位置很简单,用到的就是高中的知识,TDOA (Time Difference Of Arrival) 的中文解释就是,标签发送的定位包到达各个基站的时间差,为什么利用这个差值就可以计算位置呢?这时候就不得不提到双曲线,双曲线有什么性质呢?其中有一条就是,双曲向上的点到两个焦点的距离差是常数,如果把焦点看作是基站的位置,那么标签的位置是不是就是双曲线之间的交点呢?所以,TDOA算法的本质就是求二维空间中多条双曲线的交点。接下来我将会结合示意图来概述TDOA算法。
<img src="//image.lceda.cn/pullimage/ztxYib99Juj0N2UK0yhT8Lu0vOG2FJYT1ayJaS0S.jpeg" alt="in_convex_hull.jpeg">
假设这样一个示例,存在三个基站A0, A1和A2,在这个例子中表示的是二维定位(原理描述起来比较简单),不过这种方式同样适用于三维定位。
假设存在一个被定位的Tag,此例中的CF位于坐标(0.0, -0.5)这个位置,图中红色的连线为各个基站之间的直线距离,在数学上可以看作是双曲线的各个焦距,由基站A0和A1构成了一条蓝色的双曲线的一条分支,同理由A0和A2构成了一条黄色的双曲线的另一条分支,由A1和A2构成了绿色的双曲线的最后一条分支,而这三条曲线的交点也就是被定位Tag的位置。在焦点位置已知,焦距已知和TDOA已知的情况下,利用双曲线的方程就可以求解出Tag的位置,每次Tag移动的时候,相应的TDOA就会发生变化,所以重新求解出的结果也会发生变化,这样就能够实时的得到Tag的位置了。</p>
<h5>(2) EKF (扩展卡尔曼滤波器)</h5>
<p>既然利用TDOA算法就可以求解被定位目标的位置,为什么还要利用扩展卡尔曼滤波器呢?
这是因为,上述的求解过程是理论上计算得到的几何解,但是在实际的应用场景中,由于测量误差的存在,信号传输过程的干扰,环境噪声,硬件误差等一系列的原因,使得测量得到的TDOA并不是准确的,这就会造成可能在被定位的目标区域中并不存在理论上的几何交点,那就无法得到Tag的位置,所以我们需要利用扩展卡尔曼滤波器,根据被定位目标之前的位置和实际计算得到的位置来预测当前Tag所处的实际位置。另外在计算的时候也不再是去计算理论的几何解,二是用逼近的方式来得到近似解。
具体的扩展卡尔曼滤波器的知识我就不在本文档中详述了,我会在开源文档中上传本项目中所参考的扩展卡尔曼滤波器的精讲文档。</p>
<h2>* 四、作品材料清单;</h2>
<p><strong>(1)基站与标签的原理图</strong>(为简单起见,本次项目的基站与标签采用了完全一致的硬件设计,通过程序去设置每个硬件的工作模式)<strong>;</strong>
<strong>(2)**</strong>基站与标签的PCB图<strong>**;</strong>
<strong>(3)**</strong>基站与标签的bom单<strong>**;</strong>
<strong>(4)**</strong>可配置的Wi-Fi模块<strong>**;</strong>
<strong>(5)**</strong>嵌入式软件代码(Testing Only)<strong>**;</strong></p>
<p>**Notes:**利用上述提供的资料可以构建整个项目的硬件部分和仅用于测试的嵌入式软件部分。</p>
<h2>* 五、作品图片上传;</h2>
<p>(PCB上须有大赛logo标识并拍照上传,若无视为放弃参赛)
<img src="//image.lceda.cn/pullimage/SogDHc5wdn8Oly1PHSBQWa28rdOrkxG3LptKR3E6.jpeg" alt="LC-SC.jpg"></p>
<h2>* 六、演示您的作品并录制成视频上传;</h2>
<p>(视频内容须包含:作品介绍;功能演示;性能测试;PCB上大赛logo标识特写镜头,若无视为放弃参赛)</p>
<h2>七、开源文档。</h2>
<p>references
(1) 项目板原理图;
(2)项目板PCB图;
(3)项目嵌入式测试代码;
(4)项目完整介绍资料;
(5)现目算法参考文档;
(6)项目板静态图像;
(7)项目演示视频。</p>
评论(22)