RSSI定位算法
文章目录
- 一、定位算法简介
- 1.1. 定位技术原理
- 1.2. 定位算法
- 二、RSSI测距原理
- 2.1. 建模与测量终端到基站的距离
- 三、定位
- 3.1. 三边定位算法
- 3.2. 加权三边定位算法
- 3.3. 加权三角形质心定位算法
- 3.4. 程序定位算法的执行流程
一、定位算法简介
1.1. 定位技术原理
定位终端接收到iBeacon基站发来的信号强度,然后根据无线信号强度的渐变模型得出基站与被定位终端的直线距离,然后再根据高度补偿法,得出基站与终端的平面距离,当终端接收到三个以上不同基站的信号,即能得出与三个以上不同基站的水平距离,且这些基站的坐标坐标已知,就可以对这个终端进行定位。
1.2. 定位算法
定位算法有很多,像三角/三边质心算法、加权质心算法、最小二乘法、双曲线法、位置指纹算法、融合算法以及各种改进衍生算法等等。而依据定位策略的不同,BLE信标定位算法可分为基于距离和信号指纹定位两类。基于距离的定位算法是通过测量接收信号强度(RSSI)进行测距,但是由于室内环境对信号多径衰落的影响,基于距离的定位算法定位精度较低。相比之下,基于信号的指纹定位更适应于室内环境,国内外应用也较为普遍。指纹定位算法首先在室内固定位置点测量不同信标的RSSI值,再利用这些RSSI值以其对应的位置信息建立指纹地图(Fingerprints),再将在线测量的RSSI值与指纹地图匹配,进而估计用户的位置。
二、RSSI测距原理
2.1. 建模与测量终端到基站的距离
实际中通常用来测得基站与终端距离的简化无线信号渐变模型如下:
P L ( d ) = P L ( d 0 ) − 10 n l g d d 0 − N 0 PL(d) = PL(d_0) − 10nlg \frac {d}{d~0~} − N_0 PL(d)=PL(d0)−10nlgd 0 d−N0
| 符号 | 含义 |
|---|---|
| d | 节点之间的距离(即我们需要计算的距离) |
| n | 信号衰减指数,常取值为2~4,通常是由实际测量得到,障碍物越多,n值越大,从而接收到的平均能量下降的速度会随着距离的增加而变得越来越快 。 |
| d0 | 参考距离,为计算方便,通常选择一米处为参考距离 |
| PL(d) | 距离发送节点d处的信号强度,单位dBm |
| N0 | 均值为0,标准差为 σ 的高斯随机噪声变量 |
| PL(d0) | 距离发送节点 d0处的信号强度,一般从经验或硬件说明定义中得到, |
在实际应用中,通常需要实地测量得到基站在一米处接收到的功率值、环境衰减因子、高度补偿三个值,分别记为p0、n、h。其中,h根据终端一般使用时,与基站的垂直距离得到;
p0、n测量时,由于具体模型的建立与优化,对定位效果影响最大,为使模型能够最大程度符合当前室内环境中的无线信号传播特性,使RSSI测距能获得更高的精度,需要对参数A和n进行优化进而得到当前室内环境下的最优值。一般通过线性回归分析来估计参数和的值,因为RSSI值在超过14m以后基本趋于平缓,不再符合接收信号强度随着距离增大而衰减的规律。所以为保证测距精度,基站固定后,以20 cm为间隔,在距离基站14m的范围内设置70个测量点,即距离基站0.2 m,0.4 m,…,14m等位置。在每个测试点接收100个数据包后,对100个RSSI值求平均值,再以平均后的RSSI值作为终端在该位置收到的信号强度。最后记录RSSI和d的对应关系,这样就得到了70组测量数据(),= 1,2,3,…,100,其中表示距离为时终端接收到的功率值。对所采集的70组测量数据使用线性回归分析,带入以下公式,即可求出p0、n(式中A表示p0):

三、定位
当接收到三个以上不同基站的信号时,由2.1得到终端与基站的距离之后,便可利用定位算法对基站进行定位。最广泛使用的是三边定位算法,在此基础之上,改进的算法有加权三边定位算法和加权质心定位算法。
3.1. 三边定位算法
在基于测距的定位算法中,三边测量法是比较简单的算法,算法原理为:平面上有三个不共线的基站 A,B,C,和一个未知终端 D,并已测出三个基站到终端D的距离分别为R1,R2,R3,则以三个基站坐标为圆心,三基站到未知终端距离为半径可以画出三个相交的圆,如图下图所示,未知节点坐标即为三圆相交点。

然而,在实际测量中,往往由于测量的误差,使三个圆并不交于一点,而相交于一块区域,如下图所示。在此种情况下,便需用其他算法进行求解,如极大似然估计法,最小二乘法进行估计,或者使用三角形质心算法。

这里,我们的算法采用最小二乘法求近似解,并针对n个基站(n≥3),已知n个基站的坐标分别为 (),(),…,() ,未知终端坐标为() ,由以下步骤求解:
①:建立信标节点与未知节点距离方程组
{ ( x − x 1 ) 2 + ( y − y 1 ) 2 = d 1 2 ⋮ ( x − x n ) 2 + ( y − y n ) 2 = d n 2 \begin{cases} (x-x_1)^2 + (y-y_1)^2 = d_1^2 \\ \quad \quad \vdots \\ (x-x_n)^2 + (y-y_n)^2 = d_n^2 \end{cases} ⎩ ⎨ ⎧(x−x
相关文章:
RSSI定位算法
文章目录 一、定位算法简介1.1. 定位技术原理1.2. 定位算法二、RSSI测距原理2.1. 建模与测量终端到基站的距离三、定位3.1. 三边定位算法3.2. 加权三边定位算法3.3. 加权三角形质心定位算法3.4. 程序定位算法的执行流程一、定位算法简介 1.1. 定位技术原理 定位终端接收到iBe…...
布局管理(Layouts)-Qt-思维导图-学习笔记
布局管理(Layouts) Qt 提供了非常丰富的布局类,主要包括以下基本布局管理类 QBoxLayout 提供了水平和垂直的布局管理,可以将子部件按行或列排列。根据排列方向的不同,QBoxLayout 分为 QHBoxLayout(水平布局)和 QVBox…...
《区块链赋能游戏业:破解虚拟资产交易与确权难题》
在当今数字化的时代,游戏行业正以前所未有的速度发展,虚拟资产在游戏中的重要性日益凸显。然而,虚拟资产的交易和确权问题一直困扰着游戏开发者和玩家。随着区块链技术的引入,为解决这些问题带来了新的曙光。 首先,我…...
机器学习第十一章-特征选择与稀疏学习
11.1子集收集与评价 属性称为"特征" ,对当前学习任务有用的属性称为"相关特征" 、没什么用的属性称为"无关特 征" . 从给定的特征集合中选择出相关特征于集的过程,称为"特征选择"。 特征选择是一个重要的"…...
C#中客户端直接引用服务端Proto文件
gRPC 客户端是从 .proto 文件生成的具体客户端类型。 具体 gRPC 客户端具有转换为 .proto 文件中 gRPC 服务的方法。 下一步打开【服务引用】 控制面板 选择grpc选项,然后继续 到此配置完成,然后就和服务共用一份protocol文件...
SiLM5932SHO系列SiLM5932SHOCG-DG 12A/12A强劲驱动电流能力 支持主动短路保护功能(ASC)单通道隔离门极驱动器
SiLM5932SHO系列是一款单通道隔离驱动器,提供12A源电流和12A灌电流。主动保护功能包括退饱和过流检测、UVLO、隔离故障报警和 4A 米勒钳位。输入侧电源的工作电压为3V至5.5V,输出侧电源的工作电压范围为13V至30V。所有电源电压引脚都有欠压锁定 (UVLO) 保…...
本地项目上传github
一、先在github(GitHub: Let’s build from here GitHub)上创建仓库 1,登录github后,点击右上角头像,点击 Your repositories 2,点击new 3,填写仓库名,假设命名 testhub࿰…...
使用zip包来安装mysql
下载 下载地址mysql,使用5.7.23 配置环境变量 添加到系统变量中 C:\Users\Admin\Downloads\mysql-5.7.23-win32\bin 添加my.ini配置文件 在C:\Users\Admin\Downloads\mysql-5.7.23-win32目录下添加my.ini [mysqld] # 设置3306端口 port3306# 自定义设置mysql的安装目录 b…...
嵌入式面经篇十——驱动开发
文章目录 前言一、驱动开发1、Linux 驱动程序的功能是什么?2、内核程序中申请内存使用什么函数?3、内核程序中申请内存和应用程序时申请内存有什么区别?4、自旋锁和信号量在互斥使用时需要注意什么?在中断服务程序里面的互斥是使用…...
MySQL(四)——常用函数
文章目录 函数字符串函数数值函数日期函数流程函数 函数 函数,是指一段可以直接被另一段程序调用的程序或代码。 MySQL中内置了许多函数,我们只需在合适的场景下调用它们即可,调用函数查询结果直接使用SELECT即可,并且可以嵌套使…...
C++ //练习 17.38 扩展上一题中你的程序,将读入的每个单词打印到它所在的行。
C Primer(第5版) 练习 17.38 练习 17.38 扩展上一题中你的程序,将读入的每个单词打印到它所在的行。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 #include<iostream> #include<…...
NC 丑数
系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 把只包含质因…...
Spring Boot 整合 Spring AI 实现项目接入ChatGPT(OpenAl的调用)
当前各种AI项目层出不穷,但绝大多数都是用python写的,现在Spring开源了Spring AI项目,让Java开发者也可以轻松给自己的springboot项目集成AI能力。目前spring AI正式版本为0.8.1,支持接入openAI、Ollama、Azure openAI、Huggingfa…...
react中 useContext 和useReducer的使用
在React中,useContext 和 useReducer 是两个非常有用的Hooks,它们分别用于管理跨组件的状态和复杂的状态逻辑。下面将分别介绍这两个Hooks的使用方式及其结合使用的场景。 1. useContext useContext 允许你订阅React的Context变化。Context提供了一种在…...
Android:动态更新app启动图标和应用名
一、需求背景 每逢重要佳节,很多应用启动图标会自动更新为对应佳节的图标,应用无需更新。 二、效果图 更新后的启动图标和应用名称 三、实现流程 Android app只能替换内置的icon,因此需要提前将logo图标放入App资源文件件里 实际项目App更新…...
深入探讨 ElementUI 动态渲染 el-table
在前端开发中,表格是不可或缺的一部分。无论是数据展示、数据录入,还是数据分析,表格都扮演着重要的角色。而在 Vue.js 生态系统中,ElementUI 提供了一个强大且灵活的表格组件——el-table。本文将带你深入了解如何使用 ElementUI…...
数据炼金术:用Python爬虫精炼信息
标题:数据炼金术:用Python爬虫精炼信息 在数据泛滥的互联网时代,Python爬虫不仅是搜集信息的利器,更是清洗和格式化数据的炼金术。本文将带你走进数据清洗和格式化的世界,展示如何使用Python爬虫从海量网络信息中提取…...
C++第三十八弹---一万六千字使用红黑树封装set和map
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、set/map基本结构 2、红黑树基本结构改造 3、红黑树的迭代器 4、set的模拟实现 5、map的模拟实现 6、完整代码 1、set/map基本结构 在封装…...
★ C++基础篇 ★ vector 类
Ciallo~(∠・ω< )⌒☆ ~ 今天,我将继续和大家一起学习C基础篇第六章----vector类 ~ 目录 一 vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.4 vecto…...
原生js用Export2Excel导出excel单级表头和多级表头数据方式实现
原生js用Export2Excel导出excel单级表头和多级表头数据方式实现 原生js用Export2Excel导出excel单级表头和多级表头数据方式实现HTML文件导入需要的文件HTML文件中实现导出函数HTML总代码实现汇总(直接复制代码,注意js引入路径) 原生js用Expo…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...
