【醍醐灌顶】我研究的WIFI定位技术,太实战了,我会把技术精华整理成笔记,有实际的项目。
应用背景
随着互联网的快速发展和智能设备的大量普及,人们对于基于位置服务的需求日益增长,尤其是在室内的复杂环境中。GPS是目前应用最广泛的定位技术,但是在室内,受到建筑物的影响,信号强度大大衰减、多径效应使得GPS无法在室内实现较为精确的定位。
目前WLAN技术普遍应用在了家庭、旅馆、机场等各类大型及小型建筑物内,相关的研究如雨后春笋,开发了许多能实现较高精度定位的算法,使得WI-FI室内定位成为了定位领域中最引人注目的定位技术之一。
而随着传感器技术的进步和发展,PDR航位推算(Pedestrian Dead Reckoning)的精确性不断提高,使得它也成为了室内定位的可用选项之一。
本项目尝试使用WI-FI位置指纹法、PDR航位推算法进行室内定位,并对位置定位的算法进行改进以获得更好的室内定位效果,主要包括以下几点:
- 利用Android手机采集实际环境中的WIFI接收信号强度数据,并根据设定Reference Point采集到的信号强度值(RSS)生成指纹库;
- 在Android手机上设计并实现了一个基于位置指纹的WI-FI室内定位系统,并在真实的WI-FI环境实现相关算法及其最优的参数选择;
- 分别使用K近邻、基于贝叶斯的概率估计算法完成基于RSS差值的定位并在学校内实测效果;
- 利用Android手机传感器采集加速度信息,利用PDR航位推算算法实现室内定位并实现地图的可视化。
使用源代码
你需要添加百度地图相关的so包才能使用此程序。相关的包添加到jniLibs文件夹下面即可。本程序依赖于地图包进行可视化绘制。
功能简介
本软件基于 Anrdoid 和 Android 手机集成传感器开发,进行了 WIFI 和 PDR 室内定位的实验。本手册用于简单说明软件使用方法和用户界面构成。
- 添加结束接入点和采样点之后,采样点会被绘制到地图上,随着wifi强度信息的积累,定位的位置会随着用户的走动不断变化。
- 使用WIFI 定位功能之前,用户可以选择使用的算法。系统实现了几种基本算法:KNN(Euclidean \ Cosine) \ Bayes。用户可以使用不同的算法进行试验。
- 使用WIFI 定位功能之前,用户需要采集当地的wifi指纹。
- 点击
+接入点
按钮,系统自动添加强度足够的SSID到数据库中,这些信号源参与定位比较。 - 点击
+参考点
按钮,进入添加参考点界面。用户可以拖动界面上的红色手柄调节参考点的地理位置。软件通过基站和GPS等自动给出估计的位置。 - 长按对应的参考点和接入点可以删除相对应的数据。
- 用户将手机对准正前方稳定握持,用户点击开始之后,算法自动开始记录手机加速度数据。
- 用户的轨迹会被一根线记录在地图上。
- 通过拖动手柄调节起始位置。
- 通过拖动滑动条调节传感器磁偏角初始误差。
- 通过调节下面的滑动条调节步长和实际距离之间的比例关系。
-
.类名和目录 功能说明
├── CoreAlgorithm.java 核心算法部分程序,用于WIFI定位
├── SharedConstants.java Android程序常数公共类
├── Utilities.java 工具函数类
├── WifiPositioningApplication.java Application顶层类
├── WifiService.java Wifi服务类
├── model 数据模型类集合
│ ├── AccessPoint.java AP数据存储
│ ├── LocationWithDistance.java 数据包类型,组合了距离和位置
│ ├── LocationWithNearbyPlaces.java 数据包类型,组合了最近位置和一串LWD
│ ├── Project.java 数据包类型,组合了所有的AP和RP信息
│ ├── ReferencePoint.java 数据包类型,组合了所有的RSSI信息和位置信息
│ ├── WifiNetwork.java 数据包类型,组合了某一个AP的强度和BSSID、SSID信息
│ └── WifiData.java 包含了一列WN类型的类
└── view
├── AddReferencePoint.java 添加参考点
├── AlgorithmDebugActivity.java 算法调试界面
├── PDRActivity.java PDR调试界面
├── PositioningActivity.java WIFI定位界面
├── PrefActivity.java 算法选择界面
├── ProjectDetailActivity.java 主界面,包括所有界面的入口和大多数功能
├── SearchWifiAPActivity.java 添加接入点
└── viewfrags 大量组成界面的工具类
├── APSection.java
├── NRAdapter.java
├── PointViewHolder.java
├── PrefsFragment.java
├── RPSection.java
├── RecyclerItemClickListener.java
├── ReferenceReadingsAdapter.java
├── SectionHeader.java
└── WifiResults.java算法简介
基于RSSI指纹的WI-FI室内定位技术
基于WI-FI的室内定位技术可以有多种实现方式,基本上分为:基于无线信号三边的三角定位、位置指纹定位和融合定位。三边信号定位由于其理论模型的不实际性,难以应对现实中的多路径效应及波动,使得实际定位效果难以达到室内定位的要求精度。融合定位算法则难以做到普适使用,不同地方的数据源、不同手机的差异性都会造成结果的巨大差距。本项目采用基于接收信号强度(RSS)的位置指纹法实现的WI-FI室内定位,能够考虑室内复杂环境下信号的时变性而定位成本低,方法实现灵活而精度能够达到预期目标。
信号的RSS或者接受功率取决于接收器的位置,是大多数无线通信设备正常运行中用以感知链路质量、实现切换、适应传输速率等功能的必需参数。RSS不受信号带宽的影响,假设有一个固定的信号发射源,在离它不同距离的位置上的平均RSS的衰减和距离的对数成正比。对于一个可以接收来自多个发射源信号的移动设备,我们可以通过使用来自多个发射源或者接收器的RSS组成的RSS向量,作为和位置相联系的指纹。 注意到RSS本身就是在一段时间内计算或测得的,因此只采集一个RSS样本是不合理的。在WIFI网络中,AP常常要发送一个beacon帧,约100ms发送一次,RSS通常使用这个beacon帧来测量的。它是未加密的,所以即使是一个封闭的网络,也能用来进行定位。
对于特定的位置,都有唯一的可测物理量映射,这种用于标识位置的可测物理量被称为位置指纹。在本系统中,采用WIFI接收信号强度(RSS)来作为位置指纹。一般来说,此定位方法一共分为两个阶段,离线数据采集和在线定位。离线数据采集阶段主要是在预先设定的参考点(RP)上采集多个无线接入点(AP)的接收信号强度样本,并存入位置指纹数据库中。 在线定位阶段,客户端实时采集AP信号强度信息,通过定位算法和指纹数据库中的数据进行匹配,估计用户所在的位置,后文的定位算法都基于此。
-
PDR方法
航位推算技术最早应用于航海,其基本原理为利用航向传感器和速度传感器获取单位时间内载体的转角和位移,从而对由前一时刻载体的位置和航向推算出当前时刻载体的位置和航向。此算法的定位精度,取决于初始位置和姿态信息的精确性和推算过程中速度和航向信息求解的精度。在本项目中,初始位置设置为手动调试,而航向信息、加速度等可以通过安卓手机的传感器获得。航位推算可以作为其他定位方法的辅助,比如在GPS信号丢失时参与位置估计。
我们通过加速度传感器峰值的个数进行了步频探测,在计算出相应的步频之后,利用论文中得出的步频和步长之间的特征训练模型得到了最终的步长结果。使用一个低通滤波器能够较好的实现内部对磁信号的滤波。通过融合磁传感器和加速度传感器最终确定当前航向角。我们利用可视化工具,使其能够精确地描绘出我们的行走路线,实现PDR算法的测试。
Android 提供的开发包给开发带来了很大便利,提供了包括自动的硬铁偏移校准,内置的动作识别算法,以及内置的传感器融合航向角方法。Android 没有开放传感器校准API,其内部的实现不断进行着传感器矫正工作。
传感器融合本身涉及到一套复杂的算法,在Android平台上可能已经通过软件甚至硬件实现。AHRS有很多种实现方法,其中比较著名的包括Madgwick方法。
-