🧠 The Idea — Indoor Positioning Without GPS
Indoor positioning is one of those problems that looks easy until you actually try to solve it, because the moment GPS drops out, you’re forced to rely on indirect measurements that are often noisy, inconsistent, and heavily dependent on the environment.
Instead of going for high-end solutions like UWB or vision tracking, I decided to start with something minimal:
BLE RSSI (Received Signal Strength Indicator)
At a high level, the idea is simple:
- Strong signal → closer
- Weak signal → farther
But in practice, signal strength is affected by:
- Walls
- Objects
- Interference
- Reflections
Which means you’re not measuring distance… you’re estimating it.

🧩 System Architecture — Keeping It Simple, but Complete
Rather than building a quick demo, I wanted a system that actually felt usable, so I split it into three main components that communicate in real time and each handle a specific part of the pipeline.
📡 Tag (ESP32)
This is the device being tracked, and its only job is to continuously broadcast a BLE signal so that other devices can detect it.
📍 Anchors (ESP32)
These are fixed nodes placed around the environment, and they constantly scan for the tag, measure RSSI, and send that data over Wi-Fi to a central server.
- Fixed positions
- Continuous scanning
- Real-time data transmission
🖥️ Server + Web Interface
On the backend, a Python server collects RSSI values from all anchors and processes them to estimate position, while a web interface visualizes everything in real time.
- Data collection
- Signal processing
- Live visualization
📐 Why Three Anchors?
To estimate a position in 2D space, you need at least three reference points, because each anchor gives you a rough distance estimate, and combining those estimates allows you to approximate where the tag is located.
- 1 anchor → no position
- 2 anchors → ambiguous
- 3 anchors → usable estimate
More anchors = better accuracy.

🧪 Testing — When It Starts Feeling Real
Once everything is configured, with all anchors connected to the same network and the server running, the system becomes interactive in a way that’s hard to appreciate until you see it working.
You place anchors on the map, define their positions, and after a few seconds:
A green dot appears.
Then you move the tag.
- The dot follows
- It jitters
- It corrects itself
Not perfect.
But alive.
⚠️ RSSI Reality — Noise Everywhere
This is where things get interesting, because RSSI is not a clean measurement, and the more you rely on it, the more you realize how unpredictable RF environments really are.
- Sudden jumps in position
- Drift when stationary
- Inconsistent readings
To reduce this, I added calibration:
- Measure known distances
- Capture multiple samples
- Fit a signal model
It helps.
But it doesn’t eliminate noise.
🤯 The Turning Point
At this stage, the system was working, but it still felt like a controlled demo rather than something dynamic, and that’s when a simple idea completely changed the direction of the project.
What if the thing I’m tracking isn’t in my hand… but moving on its own?
Something faster.
Less predictable.
So I decided to attach the tag to something mobile.
And that’s where things escalated.

🔧 Hardware — Minimal Design, Real Constraints
ESP32 — Main Controller
- Control logic
- Communication
- Sensor processing
MPU6050 — Stabilization
- Gyroscope data
- Acceleration data
SI2302 MOSFETs — Motor Driving
- High current switching
- PWM control
Power System
- TP4056 → battery charging
- LF33 → voltage regulation
CP2102 — Communication
- Programming
- Debugging
🎮 Control System — From Pain to Usable
❌ Version 1 — Serial Control
Typing values to control motors. It worked… but it wasn’t usable....
Read more »
CiferTech