蓝牙AOA高精度定位

2023-11-01

01

蓝牙AOA定位技术原理

2019 年初,蓝牙技大联盟宣布蓝牙 5.1 引入了新的“寻向”功能,这个功能可检测蓝牙信号的方向,将大幅提高蓝牙定位的精确度,提供更好的位置服务, 结束了以往通过 RSSI 信号强度的方式做低精度指纹定位的历史,为蓝牙技大解决物联网精确定位与导航问题奠定了基础。

依据被定位终端的上下行模式的不同,蓝牙高精度定位可以分为两种技大原理,分别是:AoA 到达角度法(Angle of Arrival)和 AoD 出发角度法(Angle of Departure)。其技大原理如下所示:

到达角度法(AOA)是利用单一天线发射寻向讯号,而接收端的装置内建天线阵列,当信号通过时,会因阵列中接收到的不同距离,产生相位差异,进而计算出相对的信号方向;出发角度法(AOD)则与前者相反,由巳经固定位置具备天线阵列的设备来发送信号,传给单一天线终端,终端可以透过接收的信号计算出来波方向,进而定位。

 

类型

发射端

接收端

AOA

定位终端,单天线,处理简单

定位基站,IQ 采样,处理复杂

AOD

定位基站,天线阵列,处理简单

定位终端,IQ 采样,处理复杂

无论是 AOA 还是 AOD,其角度检测的基本原理是通过天线阵列获取信号在不同阵元上的相位差,然后通过信号角度估计算法获得来波方向信息。蓝牙 5.1 标准协议为了更好地支持 AOA/AOD, 专门制定了信号 IQ 采样及 CTE(Const Tone Extension)的相关技术要求。下面将详细介绍基于 CTE 的来波方向检测原理。

1) 信号的相位差及 IQ 采样

以两天线为例,如图 所示,当定频信号从发射端发出时,电磁波会到达天线 1 和天线 2,由于天线 1 和天线 2 的空间位置不同,信号到达两个天线的波程不一样,进而相位也会产生差异。不同的来波方向会产生不同的相位差异。射频芯片可以通过对每个天线上的信号进行 IQ 采样获得相位信息,对比 2 个天线上的相位信息可以获得相位差。

2) 基于相位差的来波方向检测

当两个天线足够近时(小于半波长),可消除相位差的整周期模糊,能够唯一的确定来波的方向。如图所示,其中λ为发送信号波长、Δφ 为天线 1 和2 接收到同一信号的相位差,θ为待求的信号到达角度(AoA),d 为两个天线间的距离,由图示关系可得:

                                θ = arcsin(λΔφ/2πd)

3) CTE 标准规范

蓝牙信号是调制信号,其调制特性本身就会带来相位的变化,不利于直接采样计算相位差,故蓝牙 5.1 规范规定了 CTE 标准,目的是使得相位差检测更加方便。

CTE 是定频(250kHz)无调制的信号,可非常方便地用于相位差检测。它的时长 16us 到 160us,无 CRC 校验,支持厂播模式和连接模式两种类型。如图所示,CTE 信号是附加在 CRC 校验之后的信号,不影响原来的数据内容。是否具有 CTE,在 PDU 的 header 中可以指定,包含对CTE 类型的设定(AOA,AOD 1us,AOD 2us)以及 CTE 的时长设定。

蓝牙 5.1 协议规定了 CTE 的切换/采样时隙,如图所示。CTE 的处理过程可以分为初始的 4us 的守卫时间(用于和前面的信号分开,保证不于扰), 8us 的参考时间(对第一个天线进行 8 个 IQ 采样)以及后续一系列的采样和切换时间片。天线切换仅在 Switch slot 完成,采样仅在 Sample slot 完成。天线的切换模式可以通过 HCI 命令设置。

                                                CTE 的切换时隙

4) 天线阵列角度估计方法

实际应用中,一般常用线阵、矩形阵、圆阵等不同的天线阵列进行信号检测。线阵是一维的,所有天线位于一条直线上,可以获取方位角。矩形阵和圆阵可以获取二维角度(方位角和俯仰角)。天线阵列波达方向处理方法巳有大量的研究, 常用的有多重信号分类(MUSIC)算法、最大似然算法、ESPRIT 算法、压缩感知算法等。

基于 CTE 的方式要求定位终端支持 BLE 5.1,对于大量存量的 BLE 4.2 的设备,也可以通过类 CTE 方式,发送特殊的厂播包来实现高精度定位。

02

蓝牙AOA定位系统架构

获取信号的波达方向后,据此可以进行定位解算,下面阐述基础定位原理。

单基站定位:如果被定位终端的高度变化较小,可以采用固定高度的单基站。

二维定位方法:如图所示。通过 AOA 角度估计可以获得从基站出发的一根射线,该射线和定位终端的高度平面相交便可获得平面坐标。从图中可以看出,单基站的定位覆盖是以基站为中心的锥形区域,距离基站越远,相同角度误差带来的平面坐标的变化越大,位置误差也就越大,越靠近基站定位精度越好。可以通过适当提高终端到基站的高度差 H,来提高高精度定位区域的覆盖范图。

图 单基站定位

多基站定位:在单基站二维定位的基础上,进行各定位基站的大规模组网, 多基站航向角联合解算,实现更大范图的高精度定位的全覆盖。

                                               图 多基站定位

定位系统架构:常见的定位系统架构如图所示。分为定位感知、定位计算、定位应用三个部分。定位感知包含蓝牙定位终端和定位基站,按定位要求的不同,可以分为多片区空间的二维部署,走廊型空间的一维部署和房间型空间的零位部署。定位基站通过有线网络同定位引擎进行交互。定位引擎对各定位基站接收到的信号进行角度估计、定位解算(AOA 方式),或者控制定位基站进行位置播发(AOD 方式)。定位应用从定位引擎获取数据,结合具体业务,构建行业解决方案

03

蓝牙AOA定位技术挑战

蓝牙 AOA 定位技术若要稳定可靠地在应用场景中实现高精度定位,仍面临以下几个方面的挑战:

(1) 信号反射于扰

实际环境中,有很多金属、玻璃等光滑的反射面,AOA 基站除了可以接收到直达波之外,还会接收到反射波,如图所示。由于直达波和反射波是同颜的相于信号,AOA 基站接收的是它们信号叠加,很容易判断成来自另外一个错误方向的信号。

(2) 天线阵列误差

一方面,为了节省成本,商用的天线阵列常用的是采用射频开关切换的方式,切换过程本身会带来一些测量误差;另一方面,存在阵元的互耦、相位中心误差、取向误差等,所以用于测向的天线阵列设计是一项较为复杂的任务。

(3) 复杂楼层/区域环境

实际使用中,存在各种复杂的定位环境,如中空楼层情况下需要准确定位到楼层,多房间情况下需要准确地判断在哪个房间,被物理建筑隔开的各个区域间要顺畅地定位切换,都给高精度定位带来了不少挑战。

(4) 天线方向性扰动

各移动端设备随着放置位置的不同会呈现不同的天线方向性进而影响角度检测结果,需要能够适应不同的设备摆放状态。以上四点挑战的克服,需要在微波射频以及算法部分做较多的工作,考验AOA 定位解算平台提供商的技大实力。

 

听说关注公众号的都是大牛

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蓝牙AOA高精度定位 的相关文章

  • Java 中如何验证字符串的格式是否正确

    我目前正在用 Java 编写一个验证方法来检查字符串是否是要更改为日期的几种不同格式之一 我希望它接受的格式如下 MM DD YY M DD YY MM D YY 和 M D YY 我正在测试第一种格式 每次它都告诉我它无效 即使我输入了有
  • 如何在Netbeans中设置JList的ListModel?

    我在 Netbeans IDE 的帮助下设计了一个 Swing GUI 该 GUI 包含一个 JList 默认情况下 它使用 QAbstractListModel 将其作为 JList 构造函数中的参数传递以创建该 JList 我想在 Ne
  • 如何在 Eclipse 中获得完全限定的类名?

    有没有一种快速方法可以在 Eclipse 中单击 Java 类并获取其完全限定名称 或将其复制到剪贴板 2016年6月29日编辑 正如 Jeff 所指出的 您只需要执行以下第二步 1 Double click on the class na
  • 从 CLI 部署 Maven 项目?

    在 IDE 中构建并运行良好 cd home thufir NetBeansProjects HelloMaven JAVA HOME usr lib jvm java 8 openjdk amd64 home thufir local s
  • 在Java中如何将字节数组转换为十六进制?

    我有一个字节数组 我希望该数组的每个字节字符串转换为其相应的十六进制值 Java中有没有将字节数组转换为十六进制的函数 byte bytes 1 0 1 2 3 StringBuilder sb new StringBuilder for
  • django-admin.py makemessages 不起作用

    我正在尝试翻译一个字符串 load i18n trans Well Hello there how are you to Hola amigo que tal 我的 settings py 文件有这样的内容 LOCALE PATHS os
  • 如何使用 sys.path.append 在 Python 中导入文件?

    我的桌面上有两个目录 DIR1 and DIR2其中包含以下文件 DIR1 file1 py DIR2 file2 py myfile txt 这些文件包含以下内容 file1 py import sys sys path append s
  • ActiveMQ JNDI 查找问题

    尝试使用 JNDI 运行以下 ActiveMQ http activemq apache org jndi support html http ActiveMQ 20JNDI 并且我的 jboss server node lib 文件夹中有
  • 具有屏蔽无效值的 pcolormesh

    我试图将一维数组绘制为 pcolormesh 因此颜色沿 x 轴变化 但每个 x 的 y 轴保持不变 但我的数据有一些错误值 因此我使用屏蔽数组和自定义颜色图 其中屏蔽值设置为蓝色 import numpy as np import mat
  • Pandas style.bar 颜色基于条件?

    如何渲染其中一列的 Pandas dfstyle bar color属性是根据某些条件计算的 Example df style bar subset before after color ff781c vmin 0 0 vmax 1 0 而
  • JPA Web 应用程序管理策略

    我们目前正在开发一个 J2EE Web 应用程序 使用 JPA 作为我们的数据访问层 我们目前正在研究几种不同的策略来在我们的应用程序中利用缓存 Create an EntityManager per request 在请求范围内获取缓存
  • Janusgraph 0.3.2 + HBase 1.4.9 - 无法设置 graph.timestamps

    我在 Docker 容器中运行 Janusgraph 0 3 2 并尝试使用运行 HBase 1 4 9 的 AWS EMR 集群作为存储后端 我可以运行 gremlin server sh 但如果我尝试保存某些内容 我会得到粘贴在下面的堆
  • Java 8 方法签名不一致

    Java 8 为我们提供了具有很长签名的新方法 如下所示 static
  • 由于 json 字符串化 dict 键导致数据丢失

    考虑下面的例子 gt gt gt import json gt gt gt d 0 potato 0 spud gt gt gt json dumps d 0 potato 0 spud gt gt gt json loads json d
  • 如何使用 matplotlib 为圆柱体的每个单独面添加颜色

    我正在尝试为圆柱体的每个面着色 但是我不确定如何进行 我尝试了以下方法 for i in range 10 col append for i in range 10 for j in range 20 col i append plt cm
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • Python 通过从现有 csv 文件中过滤选定的行来写入新的 csv 文件

    只是一个问题 我试图将 csv 文件中的选定行写入新的 csv 文件 但出现错误 我试图读取的 test csv 文件是这样的 两列 2013 9 1 2013 10 2 2013 11 3 2013 12 4 2014 1 5 2014
  • 如何在J2ME中获取数字的幂[重复]

    这个问题在这里已经有答案了 可能的重复 J2ME power double double 数学函数实现 https stackoverflow com questions 2076913 j2me powerdouble double ma
  • 如何获取所有mysql元组结果并转换为json

    我能够从表中获取单个数据 但是当我试图获取表上的所有数据时 我只得到一行 cnn execute sql rows cnn fetchall column t 0 for t in cnn description for row in ro
  • 缓存 Flask-登录 user_loader

    我有这个 login manager user loader def load user id None return User query get id 在我引入 Flask Principal 之前它运行得很好 identity loa

随机推荐

  • Cef经典N大问题

    1 cef启动 退出的时候怎么崩溃了 答 如果是启动时崩溃 请看资源目录是否文件都齐全 退出的话见https github com fanfeilong cefutil blob master doc CEF Close md 如果是cen
  • mysql和m_MySQL-----(M-S,和,M-M)

    实验项目 一主多备 双主双备 一 一主多备 1 需要至少两台MySQL 一台主 一台备 在主备上创建数据库 mysql uroot p123 create databse HA use HA create table T1 id int n
  • 详解:字符转换函数(大写转小写,小写转大写)

    对于我们在刚刚学习C语言的时候的练习题 不知道大家还能记得多少 多组输入 输入一个英文字符 判断 如果是大写 则输出小写 如果是小写 则输出大写 这个题目 其实在刚刚开始学习的时候 为难了笔者老久都没有攻克 主要还是在于 回车键没有抵消 所
  • 使用OpenAPIKey来调用ChatGPT并解决生成回答控制台显示不全的问题

    使用OpenAPIKey来调用ChatGPT并解决生成回答控制台显示不全的问题 Code import os import openai import re def get ai response prompt engine text da
  • react-lazyload懒加载控件源码解析

    简介 本篇文章主要介绍一个优秀的基于react实现的懒加载控件 github com twobin reac 优点 易于使用 比如
  • 基于机器学习的心脏成像诊断

    心脏成像在心血管疾病 CVD 的诊断中起着重要作用 但到目前为止 它的作用仅限于对心脏结构和功能的观察和定量评估 然而 随着大数据和机器学习的出现 人工智能方法的出现将直接帮助临床医生诊断CVD 本文全面回顾了这一领域的最新研究成果 并为读
  • js数组去重常用方法

    js数组去重是面试中经常会碰到的问题 无论是前端还是node js数组常见的有两种形式 一种是数组各元素均为基本数据类型 常见的为数组字符串格式 形如 a b c 一种是数组各元素不定 元素中既有基本数据类型 也有引用数据类型 形式如 na
  • 某书最新版X-s(2023/5/23更新)

    前不久刚写过xhs的x s 前几天听一些小伙伴说又更新了 我二话不说还按原先的逆向思路 直接搜function sign 开始施展补环境大法 一顿无用的折腾 补完后 测试发现死活不成功 这真是离了大谱了 对比了一下 通过补环境 sign生成
  • 【linux】【tar】tar命令详解之czvf,xzvf

    Linux tar 英文全拼 tape archive 命令主要用于文件的打包压缩及解压 命令最初的设计目的是为了将文件备份到磁带上 tapearchive 因而得名tar 1 常用tar命令实例 打包命令 tar czvf xxx 说明
  • 代码布局优化

    代码布局优化是编译技术中的一种策略 其目的是调整程序中函数和数据的物理布局 以提高程序的执行速度 更好的代码布局能够有效利用现代处理器的特性 例如指令缓存和分支预测 从而提高性能 以下是代码布局优化的几个关键方面 指令缓存效率 当处理器执行
  • linux系统支持ntfs吗,Linux支持NTFS格式文件的方法

    一般情况下Linux系统是不支持NTFS文件系统的 所以我们不能在Linux系统中挂载NTFS文件系统类型的硬盘或移动硬盘 那么我们如何才能让Linux系统支持NTFS文件系统呢 现在我们去看看Linux支持NTFS格式文件的方法介绍 Li
  • VS 2022(Visual Studio 2022)菜单栏中增加文件-高级保存选项

    背景 最近想使用VS工具来开发Qt项目 但运行后发现程序运行中文会显示乱码 在网上找了相关资料后需要使用高级保存选项来更改文件编码为UTF 8类型 但VS2022貌似没有高级保存选项 摸索一番后发现添加该选项的方法 故而分享一下 参考连接
  • iwebsec靶场 文件包含漏洞通关笔记8-php://input伪协议利用

    目录 前言 1 php input伪协议原理 2 php input伪协议使用条件 第08关 php input伪协议利用 1 打开靶场 2 源码分析 3 伪协议渗透获取php信息 1 构造post信息 2 渗透 4 伪协议获取目录信息 1
  • 基础指针【指针的基本使用方法和注意事项】

    基础指针目录 前言 指针 指针是什么 指针的大小 指针的定义和赋值 指针的使用 传值调用和传址调用 传值调用 传址调用 指针的弊端 野指针 使用指针的注意事项 前言 指针 是我们在学习C语言中的一个重难点 关乎到我们学习C语言的深度和理解
  • module.exports、exports、export default、export、require、import

    在es5中 用 module exports 和 exports 导出模块 用 require 导入模块 在es6中 新增 export default 和 export 导出模块 用 import 导入模块 一般的 module expo
  • java 设置不缓存,java – 禁用通过外部属性的spring方法缓存

    我使用ehcache和注释驱动配置配置了 spring方法缓存 但是 我希望能够从我们在应用程序中使用的配置文件中禁用它 我的第一个想法是如果禁用方法缓存 则调用net sf ehcache CacheManager CacheManage
  • Vue3中的hook

    一 hook的基本使用 Vue3中的hook通常被称为Composition API 是Vue js框架中的一个重要特性 它们的本质是一些可以在组件内部使用的函数 这些函数能够让你在不影响组件逻辑的情况下 增强和扩展组件的功能 Hook的主
  • VS2015:当前不会命中断点,显示当前不会命中断点 没有与此行关联的可执行代码

    使用VS在Release模式下打断点进行调试 有时候不会命中断点 显示信息如下 当前不会命中断点 显示当前不会命中断点 没有与此行关联的可执行代码 这是因为Release模式下 编译器进行编译优化时 忽略掉了这个断点 为此需要 releas
  • ERROR: You must give at least one requirement to install (see "pip help install")

    使用pip install 命令时遇到You must give at least one requirement to install see pip help install 原因是install 后面没有参数 也就是说没有给想要安装的
  • 蓝牙AOA高精度定位

    01 蓝牙AOA定位技术原理 2019 年初 蓝牙技大联盟宣布蓝牙 5 1 引入了新的 寻向 功能 这个功能可检测蓝牙信号的方向 将大幅提高蓝牙定位的精确度 提供更好的位置服务 结束了以往通过 RSSI 信号强度的方式做低精度指纹定位的历史