刘贵学博客

Wifi 室内定位技术原理

1. 介绍

定位技术最常用的就是 GPS 或者北斗,通常在室外广泛使用。由于建筑物内GPS等信号的严重衰减和多径效应,所以无法有效得使用此类技术在室内定位。

室内定位也有很多方案,如:
* RFID标签锚记
* 蓝牙(iBeacons)标签锚记, 参考https://github.com/megagao/IndoorPos
* 基站定位
* UWB 定位
* 地磁
* 粒子滤波定位,常用与机器人
* Wifi 定位

由于WiFi 设备已经广泛部署在家庭、旅馆、咖啡馆、机场、商场等各类建筑物内,且个人终端(如手机)上WiFi也是标配,其大多数人都默认开启。

这使得WiFi成为室内定位领域中最容易实现的无线技术。

2. 信号强度与距离计算

Wi-Fi定位是不需要终端连接上 AP。
Wi-Fi设备芯片(终端与AP),都会发出一种Probe Request的帧,遍历空间所有信道,等待AP返回Probe Response帧。

根据 AP 到终端的信号强度 RSSI,可以计算出距离,公式如下:

d=10^((abs(RSSI)-A)/(10*n))
  • 其中d为距离,单位是m。
  • RSSI为rssi信号强度,为负数。
  • A为距离探测设备1m时的RSSI 值的绝对值,最佳范围在45-49之间。
  • n为环境衰减因子,需要测试矫正,最佳范围在3.25-4.5之间。

3 定位场景

3.1 一角定位

同一时刻,如果仅有一台 AP 可以侦测到 指定终端RSSI的情况时:

一角是无法定位的,终端的具体位置无法获取,但可以估算出位置范围:

以设备A为圆心,以R1为半径的圆内。

如图中绿色背景部分。

当然此情况下的定位准确度极差,误差通常在 30米(普通AP的信号的最大传输距离)。

3.2 二角定位

当仅有2台 AP 可以侦测到指定终端的时,每个AP都是一个圆圈,有三种情况:

  • 相交
  • 相切
  • 相离

如何判断是 相切,相交 还是 相离呢?

A, B两点的距离 d,如图:

计算公式如下:

比较 d 与 信号距离之和:

  • 相交 d < R1 + R2
  • 相切 d == R1 + R2
  • 相离 d > R1 + R2

3.2.1 相交【重点关注】

两圆相交的2个点都可能是终端的位置。
求 两圆相交的M与N的坐标需要用到 圆的标准方程 和参数圆的参数方程。

  • A 点参数方程

  • B点的标准方程

  • 将 A 点参数方程 带入 B点的标准方程,得到等式公式如下:

  • 展开上面的公式后,得出:

  • 为方便,令:

  • 其中 a, b, c 可解出来均为常数。

又知

可以解出 cosθ 和 sinθ 的值,带入参数方程后可获取到 M, N点的值。

两个点的位置计算成功后,可以通过轨迹或第三个AP来进一步提供向量因子,进一步挑出更准确的一个。

此方案也适用于简单的三角定位计算方式,只是可能误差较大。

3.2.2 相切

两圆相切于1个点,其实也是特殊的相交,这是两个点重合了而已。

简化的计算公式如下:

通过圆的标准方程,可以解出的 (X,Y)坐标就是终端的位置。

3.2.3 相离

理论上一个终端同时被2个AP发现,是不会出现相离的情况,但由于信号距离推算造成的误差,实际也会出现这种情况。

计算方法类似相切。但需要修正两个圆的半径,公式如下:

解出的 (X,Y)坐标就是终端的位置。

3.3 三角定位

3.3.1 方案1:相交点选更近

挑选 信号最强的 2个 AP 为 A和B,计算两个圆的交点M 与 N, 其中距C点的距离,与R3 更接近的值。

如上几图中红点的位置。

计算方法与【二角定位-相交】场景类似。

3.3.2 方案2:三点取中心定位

获取 A, B, C 三个点的中心位置。

三圆相离,取中心。

4. 问题与优化

4.1 需要解决的问题:

  1. 信号强度的波动因素很多,比如墙体遮挡,等,用强度推断出来的半径误差比较大;

  2. 三角定位的场景是平面2D定位,实际情况中,获取到的AP可能不在同一楼层,高度差异会使误差或干扰更大。

  3. AP的位置要提前采集,可以在 CAD上定位坐标,或通过专用的定位仪来采集。AP的坐标是整套解决方案的参考系,所以应尽量准确,而且还要考虑实的操作便捷度。

4.2 优化方案

  • 多传感器(加速度计,陀螺仪,方向传感器等)与WiFi相结合的方法,参考 《位置计算:无线网络定位与可定位性》
  • 结合Wifi 位置指纹来确认位置;
  • 定位完成后的要绘制轨迹,可考虑评估每个坐标的准确权重,按权重拟合出更平滑的轨迹,也可以通过拟合的轨迹将权重低的坐标点进行修正。

参考资料

Go get 无法获取 golang.org 里的资源

因为要翻墙,很麻烦。有比较简单的办法

在 GOPATH 下新建 golang.org/x 目录,cd $GOPATH/golang.org/x


git clone https://github.com/golang/crypto.git
git clone https://github.com/golang/exp.git
git clone https://github.com/golang/image.git
git clone https://github.com/golang/lint.git
git clone https://github.com/golang/net.git
git clone https://github.com/golang/sys.git
git clone https://github.com/golang/text.git
git clone https://github.com/golang/tools.git

Grom 注意事项

## 类型

  • 所有的 ID 都是 uint 类型

make, new 不同

环境

vs code 中 go test -v

可以输出 fmt的信息

单元测试

1、文件名必须以xx_test.go命名
2、函数必须是TestXXX开头
3、函数参数必须 t *testing.T

单元测试中:
* t.Error 输出log,但会继续
* t.Fail 不输出log,但会继续
* t.Fatal 标记错误,输出log,不会继续

树莓派开发系列1: 入手尝鲜

1. 板子

从淘宝上购买了 2018新款树莓派Raspberry Pi 3B+,先上照片

配置详情:
* CPU: Broadcom BCM 2837B0, Cotex-A53 64-bit Soc 1.4GHz
* RAM: 1GB LPDDR2 SDRAM
* WIFI: 2.4G + 5G IEEE 802.11b/g/n/ac wireless LAN
* Bluetooth: 4.2 BLE
* Ethernet: 300Mbps
* USB: USB2.0 x 4
* GPIO: Extended 40pin Header
* Video: HDMI x 1, MIPI DSI display Port, MIPI CSI camera port, 4 pole stereo output and composite video port
* Multimedia: H.264, MPEG-4 decode(1080p30); H.264 encode(1080p30); OpenGL ES 1.1, 2.0 graphics
* SD Card: Micro SD card. include OS
* Power: 5V/2.5 A DC micro USB; 5V DC GPIO PoE

2. 组装

买的套餐里赠品如下:
* 三个散热片
* 一个风扇
* 塑料外壳
* 16G SanDisk 存储卡
* 电源

2.1 组装散热片

三个散热片

红色是CPU散热片, 蓝色是网卡散热片,剩余的那个的内存散热片在卡片背部。

2.2 组装外壳

外壳有六片,我嫌来回拆装太碍事,只安装了底部外壳防止短路。

风扇在固定顶部外壳上,有散热片,风扇意义不太大。

3. 制作镜像

环境准备:

  • 一张空白的 SD 卡, 我用的是SanDisk 16G
  • 读卡器

我试用的PC 是 Mac OS, Linux 与此类似, Windows请找类似工具。

3.1 下载镜像

先到树莓派的官方网站去下载一个镜像,推荐下载Raspbian,最新版 2018-4-18,格式为 zip,解压得到 img 文件。

ls -hl
-rw-r--r--@  1 liuguixue  staff   4.6G  4 18 02:24 2018-04-18-raspbian-stretch.img

用df命令查看当前存储空间:

Filesystem     Size   Used  Avail Capacity iused               ifree %iused  Mounted on
/dev/disk2s1   15Gi  2.4Mi   15Gi     1%       0                   0  100%   /Volumes/sdcard

3.2 制作镜像卡

使用 diskutil 确认设备信息:

diskutil list
/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.9 GB    disk2
   1:             Windows_FAT_32 NO NAME                 15.9 GB    disk2s1

使用 dd 命令来讲img文件 写入(类似烧录)到 U 盘中:

sudo dd bs=4m if=2018-04-18-raspbian-stretch.img of=/dev/disk2

千万注意,of 后面的disk 数据不要搞错!!

注意: 如果遇到 dd: /dev/disk2: Resource busy 的错误,

则需要将 disk2s1 的分区先从系统中卸载掉:

sudo diskutil umount /dev/disk2s1

先后在使用 dd 写入即可。

整个SD镜像卡的写入过程,大概需要 5分钟(img有4.6G)。 提示以下信息说明写入完成。

4. 启动系统

把SD 卡装入树莓派板子,接显示器后,插上电源,启动效果如下:

我没有买屏幕用了一个 24寸的显示器,效果还是非常酷的: