Instead of simulations we can collect real world data by moving a emitter around in 2D space while keeping our receiver in a fixed location.
The measured phase difference by a fixed emitter at the base of the middle of the stairs. This was generated from real data using this notebook link
Building a 2D apparatus like this can be difficult because each axis would require some kind of long lead screw. These can get diffcult to manage and costly if we exceed 1m. Instead of constructing the apparatus orthogonal to gravity we can leverage gravity to keep a suspended system taut.
We construct an appartus with our emitter attach by two arms (ArmA, ArmB) to motors on the wall (MotorA, MotorB). By operating MotorA/B we can change the length of the arms that exactly define the position of the emmitter on the wall (see code).
Thanks to great work by @dammitcoetzee , we have 3D printable motor mounts designed on OnShape and STL files available.
- 2 x 27:1 Planetary Gearbox Nema 17 Stepper Motor link
- 1 x ARM 32-bit 4 Axis GRBL 1.1f link
- ? x Timing Belt 2GT 10mm Widthlink
- 2 x GT2 Pulley 20 Teeth 5mm Bore Fit 10mm Belt Widthlink
- 1 x GT2 Idler Pulley 20 Teeth 5mm Bore 10mm Widthlink
- 3 x 2.5lb weight link
- M3 screws
- 2 x 3D printed motor mounts
- Pulley holder
- 2 x PlutoPlus SDR
- ? x 18/4 Awg cabling (for steppers) link
- 4 x bingfu 2.4ghz antenna link
- ? x SMA terminals link
- ? x 12inch SMA Female -> Male link
Ontop of this data several models were trained using TrajectoryNet. Sample command lines can be found towards the end of the file here.
127486 minibatch updates were perfomed to simultaneously train 4 versions of TrajectoryNet with varying number of layers (1,2,4,8).
There were two loss objectives being optimized for
- Single snapshot prediction: Using a single radio measurement in time , predict the position of the emitter
- Trajectory prediction: Using multiple radio measurements over time , predict the full (including future) trajectory of the emitter
Left: Single snapshot loss. Center: Trajectory prediciton loss.
Left: Ground truth, receiver is stationary, emitter is moving. Center: Single snapshot predictions. Right: Trajectory prediction
Left: Single snapshot loss. Center: Trajectory prediciton loss.
Left: Ground truth, receiver is stationary, emitter is moving. Center: Single snapshot predictions. Right: Trajectory prediction
To see how well simulations perform relative to the above real data , equivalent experiments were performed.
Left: Single snapshot loss. Center: Trajectory prediciton loss.
Left: Ground truth, receiver is stationary, emitter is moving. Center: Single snapshot predictions. Right: Trajectory prediction
Left: Single snapshot loss. Center: Trajectory prediciton loss.
Left: Ground truth, receiver is stationary, emitter is moving. Center: Single snapshot predictions. Right: Trajectory prediction
The data was collected using this code. The fulldata set has a couple hundred hours of recordings.
An example for how to use this data is shown here.
The format is a flat file shaped as (N,5+65) float32 values. It is formatted this way to allow for quick loading via memmap.
The values in each row are as follows,
- time_stamp
- x position
- y position
- average phase difference
- average phase difference with trimmed mean
- index 5~69 contains the signal strengths for each of 65 directions [-pi,+pi] computed using the beamformer
An example data loader can be found here
The complete dataset can be downloaded here
A small subset of the data above can be downloaded here


