Skip to content

Repository files navigation

SigAnchor

基于无线传感器网络多点定位的 Android 移动定位系统。

通过 RSSI 测距 + 三边定位/最小二乘定位,实现对蓝牙设备的相对定位。支持多台手机协作定位,手机越多精度越高。

功能

  • 信号仪表盘:实时显示周围 BLE/WiFi/基站信号强度
  • 单设备定位:画8字扫描 + 步行标记 + 三边定位解算
  • 批量定位:走一段路径,自动定位周围所有 BLE 设备
  • 协作定位:多台手机通过 WiFi Direct/WiFi Aware 组网,互相测量 RSSI 建立坐标系
  • 锚点管理:手动添加/删除已知位置的锚点

技术栈

技术
UI Jetpack Compose + 自定义 Canvas
语言 Kotlin
数学核心 纯 Kotlin(零 Android 依赖)
P2P 通信 WiFi Direct (TCP Socket) / WiFi Aware
序列化 kotlinx.serialization
测试 JUnit 5

项目结构

app/src/main/java/com/siganchor/
├── math/           纯 Kotlin 算法模块
│   ├── model/      Vec2, Point2D, SignalMeasurement
│   ├── linalg/     Matrix(2×2 求逆、最小二乘)
│   ├── propagation/ LogDistanceModel(RSSI↔距离)
│   ├── localization/ 三边定位、多点定位、加权最小二乘
│   ├── filter/     KalmanFilter1D
│   └── geometry/   Circle, IntersectionSolver
├── signal/         BLE/WiFi/Cell RSSI 采集
├── engine/         定位引擎、步行检测、协作定位会话
├── network/        WiFi Direct/Aware P2P 通信
└── ui/             Compose 界面 + Canvas 可视化

构建

# 需要 JDK 21 + Android SDK (API 34)
# 设置环境变量 JAVA_HOME, ANDROID_HOME
# local.properties 中配置 sdk.dir

gradlew.bat assembleDebug

APK 输出:app/build/outputs/apk/debug/SigAnchor-v{version}.apk

测试

gradlew.bat testDebugUnitTest

46 个单元测试覆盖数学模块(向量、矩阵、路径损耗模型、定位算法、卡尔曼滤波、圆交点)。

定位算法

RSSI 测距

使用对数距离路径损耗模型:

$$\text{RSSI}(d) = \text{RSSI}_0 - 10n \log_{10}\frac{d}{d_0}$$

三边定位(3 锚点)

将圆方程两两相减消去二次项,得到线性方程组 $\mathbf{A}\mathbf{x} = \mathbf{b}$,通过 $2\times2$ 矩阵求逆得到闭式解。

加权最小二乘(4+ 锚点)

$$\mathbf{x}_{\text{WLS}} = (\mathbf{A}^T\mathbf{W}\mathbf{A})^{-1}\mathbf{A}^T\mathbf{W}\mathbf{b}$$

权重由 RSSI 强度决定:信号越强的锚点权重越大。

协作定位

多台手机递增式建立坐标系:第一台设为原点,第二台放在 x 轴,后续手机通过三边/最小二乘定位。每台定位后的手机成为新锚点,精度随锚点数增加而提升。

权限

需要以下运行时权限:

  • ACCESS_FINE_LOCATION — GPS 定位
  • BLUETOOTH_SCAN — BLE 扫描
  • BLUETOOTH_CONNECT — BLE 连接
  • NEARBY_WIFI_DEVICES — WiFi Aware (Android 13+)

截图

License

MIT

About

RSSI-based multi-point localization system for Android

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages