**
1.前期有关Android和Apache服务器的知识储备
**
本人做Android 室内定位导航APP从头到尾认真研读的书籍有下面两本书:
《第一行代码 Android 》 郭霖著 人民邮电出版社
《Android开发艺术探索》 任玉刚著 电子工业出版社
涉猎的书籍有《Android群英传》 徐宜生编著 电子工业出版社 重点看了本书第六章的内容。
首先可以查询Android官网文档资料网址: https://developer.android.google.cn/samples/index.html,
若打不开该网址,需翻墙。本人重点研究了有关传感器方面的官方资料[路径:API指南->Sensors]。
其次,可以学习全球最大的开源社区github,该网站上代码对自己后期做的部分内容给予很大的帮助。
后期将Android单客户端的室内定位系统改写为客户端服务器室内定位导航系统的构架时,看过的书籍有:
《PHP、MySQL和Apache入门经典(D15版)》 (美) Julie C. Meloni著李军译 人民邮电出版社
《从零开始学PHP》 何俊斌, 王彩编著 电子工业出版社
后面发现PHP官方文档是非常不错的资料,其网址是: https://secure.php.net/manual/zh/index.php
学习MySQL数据库的资料的网址是: http://www.w3school.com.cn/sql/index.asp
以上的资料就是本人做基于Android平台和Apache服务器实现室内定位导航系统时,所打下编程基础。
2.中期开发简易的单客户端Android的室内定位APP
本人开发Android APP所用的开发工具是JDK1.8+Android Studio ,可以在网上搜索到开发Android APP如何搭建环境,本文不再赘述。
接下来讲述,本人在前期完成了基于Android单客户端的室内定位系统的雏形。
下面是单客户端的室内定位系统的效果图
第一幅图是室内定位系统总体的模块共有3个部分离线测量,在线定位和室内地图,第二幅图是离线测量阶段的采集指纹构建指纹数据库的页面,第三幅图是用到的采样器的页面,第四幅图是在线定位阶段完成待定位点定位的页面,最后一幅图是一幅简单的室内地图点击TRAIN按钮就可以在该房间内显示指纹数据库中全部点的位置,点击LOCATION可以展示出待定位在房间内的位置,RESET就是清空房间内的全部点,文中的定位算法采用的经典的WKNN算法。
**
3后期开发客户端服务器模式的室内定位导航系统
**
接下来开始描述本人花大力气写的基于Android平台和Apache服务器的室内定位导航系统。
室内定位部分的描述
1.如何搭建Apache服务器
我选择XAMPP集成软件包来部署Apache服务器,在其官网上下载该软件,将该软件安装完毕之后,找到XAMPP的控制面板,启动Apache服务器和MySQL数据库即可,就可在安装路径下的htdocs文件夹下写php脚本文件。
2.Android客户端与Apache服务器如何通信
这是自己写的有关Android客户端与Apache服务器通信的一篇博文,其网址是:https://blog.csdn.net/u012811078/article/details/53367139
自行参考。
3.自己设计的Android APP和搭建的后台服务器
下面我将要讲述自己设计的系统,本系统的设计是基于特定的场景,不具有普适性,该场景是某一栋楼宇的走廊区域。
a.首先展示一下该系统室内定位部分Android客户端的软件效果图 。
先说一下第一幅用红色方框标记出来的两个模块,这两个模块是室内定位部分的两个阶段:离线训练阶段和在线定位阶段,与之前的单客户端的页面类似。中间这幅图是室内地图的绘制也是本APP的一个难点,研究了很长的一段时间,最后这幅图是误差分析的页面也就是经典的WKNN算法在两种不同距离下的对比分析。
b. 接下来说说部署后台服务器
首先需要将MySQL数据库文件 下的表导入到数据库indoorposdb中,如下五张数据表:
vfrefaptb.sql 该表是离线训练阶段采集的五个AP的信号强度表,选择五个的原因是整个走廊区域稳定存在的AP只有五个。
coordinatetb.sql 该表是离线训练阶段采集室内区域的坐标表。
vflocaptb.sql 该表是点击在线定位阶段中的方差滤波按钮后,更新待定位点位置的信号强度向量的数据表。
chipostb.sql 该表是点击在线定位阶段中的基于卡方距离的WKNN算法按钮后,计算得到的待定位点的位置坐标。
eucpostb.sql该表是点击在线定位阶段中的基于欧式距离的WKNN算法按钮后,计算得到的待定位点的位置坐标。
下面讲述如何将上面的五张表导入数据库中。
首先启动 XAMPP Control Panel,启动后的结果如下所示:
然后接下来在浏览器中输入这个网址:http://localhost/phpmyadmin/,打开的网页页面如下:
点击左侧导航栏旁边的新建按钮,新建数据库,数据库名称为indoorposdb,必须是这个数据库名称,不能更改,其结果如下:
将上面所说的五张表依次导入到indoorposdb数据库中,其导入过程是先选中数据库indoorposdb,然后选择导入选项,示意图如下:
导入结束后,该数据库会变成类似如下的这种效果。
让Android手机与Apache服务器处于同一个局域网,这时修改Android客户端代码里的IP地址,重新在真机上安装,使其与Apache服务器进行通讯。如果通信成功,点击地图模块的选项,进入室内地图内,会出现如下图所示的效果。若未成功,则重新核查一下上面的过程,也可以认真看看我自己写的上面的那个小例子。
c.如何绘制室内地图
本文结合具体的场景绘制了室内平面图,本人的做法是通过数地板砖的方式来计算整个平面图的大小,本文假定 1块地板砖=20个像素。走廊长度:1082像素,走廊宽度:50像素,走廊从东向西开始采集参考点,起始点 [最东边的点] 为(0,265),(0,305)。再每隔2块地板砖 [40像素] 采集数据。
将绘制好的svg格式的室内地图文件放在Android 的assets目录下,本系统采用了SAX解析XML文件的方式对室内地图进行了解析,将解析完的地图数据放置在一个自定义的View控件中,并且为室内地图控件添加了一些操作地图的基本功能,比如地图的缩放平移、图层的添加等。
室内导航部分的描述
先简单说说室内导航部分涉及的算法主要有最短路径算法、行人航迹推算方法以及粒子滤波。
首先需要在MySQL数据库中导入两张表,是为寻找用户当前位置到目的地的最短路径设计的两张表。
roomcoordtb.sql 该表是房间门口坐标信息表
roomnumbertb.sql 该表是房间信息表
将上面的两张表依次导入到数据库indoorposdb中。下面的这幅图是房间门口的信息具体编号信息。
首先需要使用迪杰斯特拉算法找到最短路径 比如以图中的A为源点寻找其他端点的最短路径。
下面说一篇迪杰斯特拉算法比较通俗易懂的博客,其网址是:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html
Android客户端使用最短路径算法寻找最短路径的软件效果图
下面讲述使用行人航迹推算方法以及粒子滤波来实时跟踪用户轨迹
行人航迹推算方法中航向角估计是一个难点,涉及坐标系的定义及变换,步长的处理以及航向角的估计,可以参看这本书《Android传感器开发与智能设备案例实战》P67-P70有源码可以参考,粒子滤波也需要花时间深入的理解。
用粒子滤波来实时跟踪用户轨迹的Android效果图如下
上面就把该室内定位导航系统如何使用以及各个模块的功能进行了简单介绍。
回顾与展望
自己前期做室内定位导航系统并没有现在这么有质量的参考资料,以至于后面反思才找到比较理想的参考文献及代码,可是时间已不允许我从头来写代码,做研究的过程中最大的教训就是当时没有寻找优质的资料进行深入的钻研导致后期对自己成果的不满,现将后期我看到的出色的文章和代码推荐给大家,让大家在室内定位导航的路上,尽可能的避免很多的坑,能够在有限的时间里达到预期的目标。
目前唯一写有关室内定位博客
https://www.cnblogs.com/lesliexong/
目前室内定位导航系统做的最好的国内外的团队:
国外的:https://github.com/dmsl/anyplace
国内的 : 吴陈沭 清华大学 论文题目《基于群智感知的无线室内定位》
目前写室内定位有关很不错的综述类文章是:
《Modern WLAN Fingerprinting Indoor Positioning Methods and Deployment Challenges》
如果想很深入的研究室内定位可以认真看看下面这本书是讲有关机器学习的
《统计学习方法》 李航著 清华大学出版社
如遇问题可与我交流 QQ:1923341056