Indoor & Outdoor Positioning System
PositionMe is a mobile Android application for real-time indoor/outdoor positioning. It fuses WiFi, GNSS, and IMU (PDR) data to provide accurate, robust user localization within university buildings like The Nucleus and The Noreen and Kenneth Murray Library.
- 🔄 Real-Time Sensor Fusion: Combines PDR, GNSS, and WiFi using Kalman and Particle filters.
- 🧭 Interactive Map Interface: Live visualization of position, tagging, and sensor info.
- 📱 Sensor Dashboard: View all IMU, GNSS, and WiFi specs.
- 🧪 Manual Tagging System: Add calibrated anchor points for ML training.
- 📼 Replay Mode: Revisit recorded sessions with map visualization.
- 🧠 AI-based WiFi Prediction: Predicts location using a TFLite ML model (offline-trained).
- 🧰 Developer-Friendly Architecture: Modular components, extensible map utilities, and offline training pipelines.
- Install APK on Android (Android 9+ recommended).
- Enable location, Wi-Fi, and sensor access.
- Use bottom nav bar to switch between Explore, Replay, Device, Settings.
| Tool | Version |
|---|---|
| Android Studio | Arctic Fox (2020.3.1) or newer |
| Android SDK | API Level 34 |
| Gradle | 8.0+ |
| Java JDK | 17+ |
| Git | Latest stable |
Device Requirements:
- Physical Android device with GNSS, WiFi, and IMU sensors.
- Developer mode enabled.
- Internet connection for OpenPositioning API.
-
Clone Repository
git clone https://github.com/Bol-C14/PositionMe_EWireless cd PositionMe -
Open Project
- Launch Android Studio → "Open existing project"
- Select project root → wait for Gradle sync
-
API Key Setup Create
secrets.propertiesin project root:MAPS_API_KEY=your_google_maps_key OPENPOSITIONING_API_KEY=your_openpositioning_key OPENPOSITIONING_MASTER_KEY=your_openpositioning_master_key⚠️ Addsecrets.propertiesto.gitignoreto avoid leaking keys. -
Build and Run
- Connect Android device via USB
- Enable USB Debugging
- Click
Run > Run 'app'in Android Studio - Grant permissions when prompted
com.openpositioning.PositionMe/
├── data/ # File handling & API comms
├── domain/ # Core algorithm logic
├── presentation/ # UI components
├── sensors/ # Sensor reading & fusion
├── utils/ # Utilities
└── Traj.java # Trajectory data structure
- Live fused positioning using GNSS, WiFi, and IMU
- Toggle modes: GNSS / PDR / WiFi / Fused
- Tagging support for indoor calibration
- Fragment:
RecordingFragment.java
- Manually anchor ground truth positions
- Saved for ML training or evaluation
- Fragment:
CalibrationFragment.java
Implemented in SensorFusion.java using:
EKF.java– Extended Kalman FilterParticleFilter.java– Sampling-based estimator- Fallback ML model:
SensorDataPredictor.java(TensorFlow Lite)
- Visualize past paths with interactive playback
- Reposition start point manually
- Fragment:
ReplayFragment.java
- Central controller for EKF, PF, and fallback models.
- Tracks state
[x, y, z, θ]. - Updates from PDR, GNSS, WiFi, and optional barometer.
- Monte Carlo sampling-based backup.
- Used to control drift when EKF fails.
- TFLite fallback ML model using top-20 BSSID+RSSI fingerprints.
| File | Purpose |
|---|---|
TrajectoryPlotter.java |
Draw real-time paths (raw, fusion, etc.) |
TrajectoryMapWall.java |
Render wall outlines |
BuildingPolygonPlotter |
Draw building boundaries |
TrajectoryMapMaker |
Add markers (e.g., toilet, lifts) |
Tip: Add new building or floor support by editing coordinate lists.
All scripts located in:
/projectSourceFolder/machine_learning/
- Uses piecewise Procrustes alignment between anchor points
- Corrects PDR drift using user-tagged positions
- Parse
.jsonlogs (recorded via app) - Align PDR segments
- Extract WiFi top-20 BSSID-RSSI features
- Use aligned positions as labels
- Train and visualize prediction performance
- Switch between GNSS / WiFi / PDR / Fused modes
- Live sensor panel (accelerometer, gyroscope, etc.)
- Tagging panel for collecting ground truth
- Save and upload trajectories automatically
- Download and view previous routes
- Manual replay with adjustable start points
- List all sensors (type, vendor, resolution, power)
- Manual stride length
- Floor height setting
- Data sync over WiFi/mobile
- Edit advanced constants
| Issue | Fix |
|---|---|
| App crashes on launch | Check permissions, enable location services |
| API keys not working | Confirm secrets.properties setup |
| GNSS/WiFi data missing | Use a physical device and allow all permissions |
| Old WiFi data | Disable WiFi scan throttling in Developer Options |