Project Overview
A BLE 5.1 indoor positioning system developed for a logistics and warehousing company. Utilizing the Nordic nRF52840 chip with AoA (Angle of Arrival) direction-finding technology, the system achieves sub-meter positioning accuracy. It can track over 5,000+ cargo tags and 200+ employees in real time within the warehouse, improving picking efficiency and warehouse management.
After deployment, picking efficiency increased by 35%, and cargo loss rate decreased by 90%.
Core Technologies
1. BLE 5.1 AoA Direction Finding
Leveraging BLE 5.1 Direction Finding capabilities, the system calculates signal angle of arrival through antenna arrays:
// nRF52840 AoA reception processing (Rust implementation)
use nrf52840_hal as hal;
use embedded_hal::digital::v2::OutputPin;
pub struct AoAReceiver {
radio: hal::Radio,
antenna_array: [hal::gpio::Pin; 12],
iq_samples: [Complex<i8>; 128],
}
impl AoAReceiver {
pub fn measure_angle(&mut self) -> Result<(f32, f32), Error> {
// Enable CTE reception mode
self.radio.configure_cte_rx(CteMode::AoA);
// Configure antenna switching pattern
self.configure_antenna_switching();
// Wait for packet reception
let packet = self.radio.receive_with_cte()?;
// Extract IQ samples
self.extract_iq_samples(&packet);
// MUSIC algorithm for angle calculation
let (azimuth, elevation) = self.music_algorithm()?;
Ok((azimuth, elevation))
}
fn music_algorithm(&self) -> Result<(f32, f32), Error> {
// Compute covariance matrix
let cov_matrix = self.compute_covariance_matrix();
// Eigenvalue decomposition
let (eigenvalues, eigenvectors) = cov_matrix.eig();
// Scan spatial spectrum
let spectrum = self.scan_spatial_spectrum(&eigenvectors);
// Find peak angles
let (azimuth, elevation) = spectrum.find_peaks();
Ok((azimuth, elevation))
}
}
2. Multi-Point Positioning Fusion
Combining AoA measurements from multiple anchors, the system uses least squares method to calculate precise positions:
- Anchor deployment: One anchor per 10m x 10m on the ceiling
- Redundancy design: At least 3 anchors visible from each position
- Kalman filtering: Smooths trajectories and predicts movement direction
3. Low-Power Tag Design
Cargo tags use CR2032 coin-cell batteries and can operate for over 2 years:
- Broadcast interval: Once per 10 seconds when stationary, once per second when moving
- Motion detection: Built-in accelerometer detects movement state
- Ultra-low power: Average current < 20uA
System Architecture
+----------------------------------------------------------+
| Warehouse Ceiling |
| +--------+ +--------+ +--------+ +--------+ |
| |Anchor 1| |Anchor 2| |Anchor 3| |Anchor 4| |
| |nRF52840| |nRF52840| |nRF52840| |nRF52840| |
| +----+---+ +----+---+ +----+---+ +----+---+ |
| | | | | |
| +-----------+-----+-----+-----------+ |
| | PoE Network |
| v |
| +-----------------+ |
| | Positioning | |
| | Engine Server | |
| | (Node.js) | |
| +--------+--------+ |
| | |
| +--------------+--------------+ |
| v v v |
| +----------+ +----------+ +----------+ |
| |PostgreSQL| | Real-time| | API | |
| | Location| | Map | | Service | |
| | History | | (React) | | | |
| +----------+ +----------+ +----------+ |
+----------------------------------------------------------+
BLE Tags (Cargo) Employee Badges
^ Broadcast ^ Broadcast
Project Results
- Positioning accuracy: 95% error < 50cm
- Update frequency: 1Hz for moving objects, 0.1Hz for stationary objects
- Coverage area: 10,000 square meter warehouse
- Simultaneous tracking: 5,000+ tags
Client Testimonial
"It used to take 10 minutes to find a single item. Now we just open our phones and see the exact location — the efficiency improvement is remarkable." — Warehouse Manager