1 Star 0 Fork 3

liuhuanming / beacon

forked from lan / beacon 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

一、理论基础 1、定位算法简介 采用的是蓝牙4.0 iBeacon定位技术,其原理是定位终端接收到iBeacon基站发来的信号强度,然后根据无线信号强度的渐变模型得出基站与被定位终端的直线距离,然后再根据高度补偿法,得出基站与终端的平面距离,当终端接收到三个以上不同基站的信号,即能得出与三个以上不同基站的水平距离,且这些基站的坐标坐标已知,就可以对这个终端进行定位。 1.1 建模与测量终端到基站的距离 实际中通常用来测得基站与终端距离的简化无线信号渐变模型如下: 式中,P(d )表示距离基站直线距离为d时终端接收到的信号强度,即RSSI值;P (d)表示距离基站为d时终端接收到的信号功率;为参考距离,为计算方便,通常选择一米处为参考距离;n是路径损耗(Pass Loss)指数,通常是由实际测量得到,障碍物越多,n值越大,从而接收到的平均能量下降的速度会随着距离的增加而变得越来越快 。 在实际应用中,通常需要实地测量得到基站在一米处接收到的功率值、环境衰减因子、高度补偿三个值,分别记为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): 1.2 定位 当接收到三个以上不同基站的信号时,由2.1得到终端与基站的距离之后,便可利用定位算法对基站进行定位。最广泛使用的是三边定位算法,在此基础之上,改进的算法有加权三边定位算法和加权质心定位算法。 1.2.1 三边定位算法 在基于测距的定位算法中,三边测量法是比较简单的算法,算法原理为:平面上有三个不共线的基站 A,B,C,和一个未知终端 D,并已测出三个基站到终端D的距离分别为R1,R2,R3,则以三个基站坐标为圆心,三基站到未知终端距离为半径可以画出三个相交的圆,如图下图所示,未知节点坐标即为三圆相交点。 然而,在实际测量中,往往由于测量的误差,使三个圆并不交于一点,而相交于一块区域,如下图所示。在此种情况下,便需用其他算法进行求解,如极大似然估计法,最小二乘法进行估计,或者使用三角形质心算法。 这里,我们的算法采用最小二乘法求近似解,并针对n个基站(n≥3),已知n个基站的坐标分别为 (),(),…,() ,未知终端坐标为() ,由以下步骤求解: ①:建立信标节点与未知节点距离方程组 ②:上边方程组为非线性方程组,用方程组中前n-1个方程减去第n个方程后,得到线性化的方程: 其中: ③:用最小二乘法求解上边方程得: X 便是未知终端的坐标计算值。 1.2.2 加权三边定位算法 由无线信号强度渐变模型可以发现,当定位终端离基站距离越远时,接收到的RSSI值变化会越来越小,这就会导致距离越远,基站与定位终端的距离误差越大,相应的造成定位误差变大,由此,我们可以采取加权的思想,将距离小的(精确度高)赋予较大的权值,距离大的(精确度低)的赋予较小的权值。 首先将基站分组。对收集到的所有基站,经由id分为组n后,求组合数C(n,3),并对每组分别进行三边定位;接着根据距离越大定位误差越大的原则,赋以权值(为每个基站到定位终端测得的距离)。最后,由每个组合得到的结果加权得到最终的定位结果。 1.2.3 加权三角形质心定位算法 该算法的思想是对收集到的所有基站,经由id分为组n后,求组合数C(n,3),然后对每一个组合的三个基站,以每个基站坐标为圆心,测得的基站到定位终端距离为半径画圆,然后根据交点组成的三角形,求其质心,即为测得的终端坐标。大体如下: 然后,根据距离越大定位误差越大的原则,赋以权值(为每个基站到定位终端测得的距离)。最后,由每个组合得到的结果加权得到最终的定位结果。 然而,由于误差的存在,且测量时位置并不在每个组合所构成的三角形中间位置,因此,当误差大时,往往所构成的圆是没有交点的(三个圆必须两两存在交点,否则不能用该方法)。 以上三个算法为了使接收到的基站RSSI更为准确,根据正态分布,去掉了RSSI值排序后两边的极端值,即对接收到的同一基站的所有RSSI值,排序,然后首尾各去掉一部分,然后求其均值,作为接收到的RSSI值测算距离。 本章参考:https://github.com/megagao/IndoorPos 二、示例工程 1、服务端示例 1.1 技术栈 • 基础框架:SpringBoot • 中间件:Redis • 其他:Redis客户端使用的时Redisson,提升开发效率Lombok,TCP/UDP Server Netty 1.2 工程结构 com.rexense.beacon alg 算法实现 weighted 加权算法实现 config 配置 controller 控制器 entity 实体类 service 服务 BaseDataService 基础数据服务,提供信标坐标查询 LabelService 标签服务,提供标签坐标的修改与查询 LocationService 定位服务 MsgService 消息处理服务 NettyServer TCP-Server 1.3 定位策略 1.3.1 定义 msgId:蓝牙设备每次向外发送信号消息时都应当携带的id,msgId应对与时间正相关 labelId:蓝牙设备的唯一编码,发送消息时都应当携带 消息包:某一信标发出的数据包 消息:可能经过多个信标转发,但msgId相同、labelId相同的消息包的总称 1.3.2 策略 定时处理策略:对于同一个【消息】,当服务端接收到第一个【消息包】后,开始计时,其余【消息包】仅做接收处理,当计时达到一定的时长(时长可配置),则将该时间段内接受到的所有【消息包】作为定位算法的输入,处理本次定位,后续如果再收到这个【消息】的【消息包】,则不做处理。 1.4 详细实现 定时处理策略的实现,主要包括以下几个部分:

  1. 消息包的接受
  2. 消息包的处理(接收/计时)
  3. 计时结束后定位
  4. 更新位置信息 1.4.1 消息包的接收 本示例中定义了两个方式:
  5. 通过HTTP协议提交消息包,详见BeanController#putMsg
  6. 使用netty构建的TCP Server,详见NettyServer 接收到消息包后会提交给MsgService#receive处理 1.4.2 消息包的处理 • 消息的唯一标志msgKey 因为来自于不同标蓝牙设备的消息,可能msgId是相同的,所以msgKey是由labelId和msgId组合而成的 msgKey = labelId + "#" + msgId • 任务队列 任务队列是以msgKey为单位的一个优先级队列,通过消息的接收时间排序,并且会保证同一msgKey最多只存在于该队列一次。 该任务队列的实现是使用Redisson提供的RSet保证唯一性,使用RPriorityQueue实现优先级队列 对于同一个消息,同一个信标可能会重发消息包;对于同一消息,可能接收到多个信标的消息包。但取出时,通常会根据rssi值进行筛选取出,并不是全部取出。考虑到这些情况,采用了Redisson提供的RSortedSet,利用该数据结构,通过对rssi值排序,和同一信标的消息去重,解决了上面的两个问题。 1.4.3 定时处理 • 定时器 定时是通过轮训实现的,并不是真正意义的定时器。 服务端通过开启一个轮训线程,不断地轮训任务队列,判断队列中第一个消息的等待时长是否达到配置的定时时长,如果达到了则出队列,将该消息对应的所有数据包取出,作为后续定位的输入。 • 执行定位算法 在LocationService中,根据输入的参数,调用对应的定位算法执行定位。 定位算法中,经过改造,增加了多点(超过三点)定位,是基于三点定位实现的,原理和三点定位一致。 1.4.4 位置的更新 计算出定位结果后,会将结果更新。 客户端课通过LabelController中提供的HTTP接口查询。 2、前端示例 2.1 技术栈 HTML、Javascript、图聚云 Javascript SDK 2.2 图聚云的使用 2.2.1 准备
  7. 登陆图聚云账户
  8. 创建应用
  9. 获取SDK KEY
  10. 在控制台-地图集市购买地图
  11. 在控制台-我的地图查看地图,获取地图的建筑ID 2.2.2 快速开始 参考官方开发指南 const map = new NGR.Map({ appKey: 'AppKey', buildingId: 'buildingId' }); map.init('app', './style.json'); AppKey即为2.2.1-3中的SDK KEY buildingId即为2.2.1-5中的建筑ID 2.3 执行逻辑 • 模拟数据源:页面刷新后,使用图聚云提供的导航功能模拟行人从起点出发至终点结果的行程,过程中会每隔一定的时间,模拟蓝牙设备向周围的信标发送信号,信标接收到信号后,会按照随机的顺序向服端转发消息包。 • 获取定位结果:开启一个定时查询,每隔一定的时间会向服务端查询蓝牙标签的位置信息,得到查询结果后,通过图聚云提供的标记功能在地图上标记出定位的点,然后再将相邻的点绘制成线,与导航模拟的路线行程对比。 2.4 示例详细 • 启动时: • 开始导航: • 导航中: • 边行进边定位: • 位置连线:

空文件

简介

室内定位解决方案,三边定位,多边定位,加权定位 展开 收起
Java
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/liuhuanming/beacon.git
git@gitee.com:liuhuanming/beacon.git
liuhuanming
beacon
beacon
master

搜索帮助