SS Vs DS TWR accuracy comparison

This is purely information from some tests for those who may be interested.
We have our own DW1000 based positioning system (not PANS or anything like the example code). We have always used a double sided two way ranging in order to get the best accuracy possible.

I recently added an option into the system to fall back to single sided ranging if packets are getting lost, since DS ranging requires more packets it’s more susceptible to jamming / packet loss issues. We’ve had issues where this has led to a significant performance hit and so being able to fall back to a more robust system has some big benefits.

Adding this allows me to make a comparison between DS Vs SS ranging accuracy for the exact same hardware at the same time and with all the same correction factors. The firmware alternates between the two methods, 1 single sided followed by 4 double sided and then a short pause before repeating.

The single sided reply period is around 1 ms. The only thing not completely standard is that the anchor also measures the clock difference and sends that value back in its reply, the tag then uses the average of it’s and the anchors clock difference measurements when calculating the clock rate correction to apply. No additional filtering / smoothing is used on this, I’m not tracking clock errors over time.

Since this was a quick bench test I don’t have a truth measurement but our average range is generally +/- 2cm from truth so that is the level of repeatability I was looking for…

The average SS range was 3 mm different from the average DS range (1.3405 m Vs 1.3433 m). The single sided range standard deviation was 2 cm as opposed to 1.5 cm for double sided.

So no meaningful change in average accuracy. A slight increase in measurement noise but not enough to bother most people.

I must say I was rather surprised that the single sided system worked quite that well.


Some further results with a larger data set (minimum of 600 measurements for each category) using 3 different anchors, two with line of sight, one obstructed by a wooden bookcase. All in a very cluttered office type environment at very short ranges so high signal levels.

LOS1 - 3 mm difference in mean, 22 mm increase in max - min, 4 mm increase in SD
LOS2 - 0 mm difference in mean, 24 mm increase in max - min, 10 mm increase in SD
NLOS - 3 mm difference in mean, 5 mm increase in max - min, 3 mm increase in SD

thank you for sharing your results.

You’ve got slightly better precision than me (i’m too using SS-TWR). May I ask you, how do you handle clock drift? I’m using carrier integration value for the compensation and I’ve noticed that the value kinda oscilates and is not stable. Do you somehow average the carrier integration value or just use it as it is? Or are you using some other ways of clock drift compensation?

Thank you.

Screenshot 2022-10-11 093035

It’s fairly basic.
The anchor reads the carrier integration value for the packet it received and includes that in the reply. The tag then calculates (it’s carrier integration value - the value from the anchor) / 2 and uses that as the value to use for correcting the time delay value.
So I’m averaging the two values from the packet exchange to try and remove some of the noise in the value but there is no long term averaging going on. If I had sufficient data to do a long term average then I’ve probably got enough data to be using double sided ranging.

Thank you for your quick reply, that’s really clever i will try. I want to perfect single sided measuring, than i might move on to the double sided.