Note
Go to the end to download the full example code.
Does a quantum accelerometer help a robot’s dead reckoning?#
Quantum sensing for robots, in simulation. A robot moves along a line with an unknown acceleration. A MEMS accelerometer is fast but its bias drifts; a cold-atom interferometer is slow but quantum-limited and almost drift-free. A multi-rate Kalman filter fuses them, with and without an occasional position fix. The sensor numbers are illustrative assumptions (the atom interferometer’s noise comes from the standard quantum limit); this is a simulation, not a navigation system.
from quantum_mind.sensing import (atom_interferometer_accelerometer, atom_interferometer_sensitivity, compare_sensor_suites,
mems_accelerometer)
mems, quantum = mems_accelerometer(), atom_interferometer_accelerometer()
print('quantum limit for 1e6 atoms, T = 0.1 s: %.2e m/s^2 per shot' % atom_interferometer_sensitivity(1e6, 0.1))
for s in (mems, quantum):
print('%-20s %6.2f Hz white noise %.2e m/s^2 bias walk %.1e' % (s.name, s.rate_hz, s.noise_std, s.bias_walk))
quantum limit for 1e6 atoms, T = 0.1 s: 1.24e-08 m/s^2 per shot
MEMS accelerometer 100.00 Hz white noise 9.81e-03 m/s^2 bias walk 2.0e-04
atom interferometer 1.00 Hz white noise 1.24e-08 m/s^2 bias walk 1.0e-08
Position error with and without fixes#
suites = {'MEMS only': [mems.name], 'quantum only': [quantum.name], 'fused': [mems.name, quantum.name]}
for fix in (None, 10.0):
print('\nposition fixes:', 'none' if fix is None else 'every %g s' % fix)
for r in compare_sensor_suites([mems, quantum], suites, duration=120, seeds=range(4), fix_period=fix):
print(' %-14s RMSE %.3f +- %.3f m' % ((r['suite'],) + r['rmse']))
position fixes: none
MEMS only RMSE 47.931 +- 28.706 m
quantum only RMSE 44.472 +- 34.336 m
fused RMSE 1.932 +- 1.097 m
position fixes: every 10 s
MEMS only RMSE 0.179 +- 0.037 m
quantum only RMSE 1.770 +- 0.305 m
fused RMSE 0.132 +- 0.011 m
Total running time of the script: (0 minutes 4.281 seconds)