4 2D 定位
4.1 定位原理
使用 BLE AoA 寻向功能2可以计算目标到天线阵的来波方向对应的方位角、仰角。 假设目标在一个已知的二维平面(或者某些曲面,如半球面)上,根据来波方向可以推算出目标的 2D 坐标, 见图 4.1 。
4.3 系统搭建
4.3.1 资源需求及准备工作
要测试 2D 定位系统,至少需要准备以下软硬件资源:
PC 机 1 台,要求:
- Windows 10 及以上
- 支持 BLE,具备 IP 地址(后文假设其 IP 地址为
192.168.100.102
) - 新版 Edge 或者 Chrome 浏览器
- MQTT 消息代理,如 Eclipse Mosquitto
- MQTT 调试工具,如 MQTT-Explorer
- Python 开发环境(建议使用 Anaconda3),并按需要安装以下软件包
- Git
ING9188x 开发板 1 块
AoX 天线阵 1 块
准备工作:
4.3.2 标签
使用开发板模块代表待定位的标签,直接烧录 SDK 里的 Peripheral LED & CTE 示例即可。开发者也可以根据测试需要修改程序,比如使用固定蓝牙地址、更改广播名称等。
为开发板上电,保持运行状态。
4.3.4 MQTT 消息代理
需要使能消息代理的 websockets 接口。 以 Mosquitto 为例,找到安装目录下的 mosquitto.conf 文件, 定位到配置 listener 的地方,加入以下几行(IP 地址应当根据实际情况填写):
listener 9001 192.168.100.102
protocol websockets
socket_domain ipv4
listener 1883 192.168.100.102
socket_domain ipv4
通过命令 mosquitto -c mosquitto.conf -v
以调试方式启动 Mosquitto,确认
websockets 接口是否打开。如果打开了,会出现类似这样的输出:
Opening websockets listen socket on port 9001
杀掉 Mosquitto 进程,并重新通过命令 mosquitto -c mosquitto.conf
以正常方式启动。
尝试用 MQTT 调试工具连接到 Mosquitto,检查是否正常。
4.3.5 数据采集
用浏览器打开软件集里的 BLE2MQTT 工具(ble2mqtt/index.html)。如图 4.3 所示,在两个红色框里分别填写 MQTT 消息代理的 IP 地址和天线阵的蓝牙地址,然后点击 CONNECT TO SERVER 按钮。
点击 SELECT DEVICE 按钮,浏览器会列出可见的蓝牙设备(如图 4.4),从中找到名为 ING IQ Forwarder 的设备, 点击 配对 按钮(这个按钮上的文字随浏览器版本不同而不同,其真实含义为连接)。
BLE2MQTT 工具之后就会自动从天线阵收集 CTE 数据并转发到 MQTT 消息代理。界面上会实时显示转发的消息的总数。
这个工具需要一直保持运行。用 MQTT 调试工具可看到消息上报。
4.3.6 环境模型
假定将天线阵固定在天花板下方,定位标签在一个平面内(比如桌子上)移动,桌子在天线阵下方, 如图 4.6。
建立一个三维直角坐标系,定位标签在 \(xoy\) 平面内移动,\(z\) 轴竖直向上,\(x\) 轴方向与天线阵的 \(0 ^\circ\) 方向相同。至于原点的位置则可以随意选取。 确立了这样一个坐标系后,我们就可以表达天线阵的位置,并绘制场景平面图。
天线阵的位置
天线阵的位置由软件集里的 scripts/station_2d.json 文件定义。 下面的内容表示地址为 “D1:29:F6:BE:F3:26” 的天线阵的坐标为 \((0, 0, 1.5)\),即位于原点之上 \(1.5m\) 处。
min_elevation
为仰角的最小值,当计算出的仰角超过此范围时(即标签位置距离天线板在 \(xoy\) 平面上的投影太远时),忽略它。场景平面图
场景平面图由软件集里的 scripts/scene.json 文件定义。下面的内容表示整个场景宽度为 \(4m\),高度为 \(3m\), 这里的宽度为场景在 \(x\) 轴方向的跨度,被映射到屏幕的水平方面(即通常意义上的宽度), 高度为场景在 \(y\) 轴方向的跨度,被映射到屏幕的水平方面(即通常意义上的高度)。其它各个域的含义如下:
center
为屏幕中心对应的 \(xoy\) 平面上的坐标background
为场景的背景颜色entities
为一系列简单的图形实体,比如- rect:在场景里绘制一个矩形
- circle:在场景里绘制一个圆
- line:在场景里绘制一条线
每种实体的具体参数可参考
scene.json
及 scripts/vis_2d.py 里的draw_scene
函数。 颜色由红、绿、蓝、透明度等 4 个分量表示,每个分量都是属于区间 \([0,1]\) 的小数。
Application Note - Direction Finding Solution↩︎