MotionEase

Vehicle Motion Cues for Windows — transparent overlay with animated reference dots to reduce motion sickness in vehicles. Built by KeepSimple.io

2
0
2
Python
public

MotionEase

Vehicle Motion Cues for Windows | Built by KeepSimple.io

MotionEase draws subtle, animated reference dots around your screen edges to help reduce motion sickness when using a laptop in a moving vehicle. Inspired by Apple’s Vehicle Motion Cues, reimagined as a lightweight, portable Windows desktop app.


How It Works

Motion sickness occurs when your eyes and inner ear disagree about movement. MotionEase places peripheral visual anchors around your screen that sway at 0.2 Hz – the exact frequency band where motion sickness peaks (Diels & Howarth, 2013). These dots give your visual system a stable reference frame, reducing the sensory conflict without interrupting your work.

The overlay is fully transparent and click-through – you work normally while the dots do their job in your peripheral vision.


Download

MotionEase.exe – single portable file, no installation required.

Double-click and go. No Python, no dependencies, no setup.


System Requirements

Requirement Details
OS Windows 10 (1809+) / Windows 11
Architecture x86-64
Display Single monitor (primary)
Permissions No admin rights required
Size ~16 MB

Modes

Mode Key Description
Drift (default) Ctrl+Alt+3 Dots sway automatically at scientifically-relevant frequencies, simulating vehicle motion cues
Static Ctrl+Alt+1 Dots stay fixed with a gentle breathing animation – simple peripheral anchors
Keyboard Ctrl+Alt+2 Arrow keys manually control dot movement – useful for testing or fine-tuning
Sensor Ctrl+Alt+4 Real motion from a USB IMU drives the dots — optional, requires a ~$27 IMU sensor — see Sensor Mode below

Keyboard Shortcuts

Shortcut Action
Ctrl+Alt+1 / Ctrl+Alt+2 / Ctrl+Alt+3 / Ctrl+Alt+4 Switch mode (static / keyboard / drift / sensor)
Ctrl+Alt+4 (in sensor mode) Recalibrate gravity reference
Ctrl+~ Toggle dot color (light / dark)
Ctrl+H Hide / show dots
Ctrl+Up/Down Increase / decrease dot size
Ctrl+Left/Right Increase / decrease motion sensitivity
Arrow keys Simulate motion (keyboard mode only)
Ctrl+Esc Quit

You can also right-click the system tray icon for Instructions or Quit.


Running from Source

If you prefer to run from source or want to modify the code:

# Install dependencies
pip install pygame-ce pywin32

# Optional: only needed for Sensor mode (Ctrl+Alt+4)
pip install pyserial

# Run
python motionease.py

Requires Python 3.10+.

To run the unit tests for the sensor parser (no hardware required):

python -m unittest test_sensor_reader.py -v

Building the .exe

pip install pyinstaller pyserial
pyinstaller --onefile --noconsole --name MotionEase ^
  --hidden-import=serial --hidden-import=serial.tools.list_ports ^
  motionease.py

Output: dist/MotionEase.exe

(--hidden-import flags are needed because pyserial is loaded lazily inside
sensor_reader.start(). Omit them only if you want a build that intentionally
disables sensor mode.)


The Science

MotionEase is grounded in motion sickness research:

  • Sensory Conflict Theory – motion sickness arises from mismatch between visual and vestibular inputs. Peripheral visual anchors reduce this conflict.
  • Rest Frame Hypothesis (Prothero, 1999) – the brain needs to identify what is truly stationary. Providing clear rest-frame cues resolves ambiguity.
  • 0.2 Hz peak frequency (Diels & Howarth, 2013) – motion sickness peaks at one cycle per 5 seconds. MotionEase’s drift mode targets this band.
  • Acceleration-based cues outperform velocity-based cues with less distraction (Applied Ergonomics, 2026).
  • Peripheral vision drives spatial orientation – the University of Michigan’s patented approach also targets peripheral light stimuli (US Patent US9862312B2).

Sensor Mode

Sensor mode (Ctrl+Alt+4) drives the dots from real vehicle motion using a USB IMU — the same kind of acceleration/turn-rate data Apple’s iOS implementation uses.

Hardware

Optional — MotionEase works great without any hardware (drift mode). Sensor mode adds real-time vehicle tracking for a more precise experience.

Currently supported: UeeKKoo RP2350 Development Board (~$27 on Amazon) — a compact IMU (Inertial Measurement Unit) combining an accelerometer and gyroscope on a single board. The factory firmware streams 6-axis IMU data over USB CDC at ~5 Hz; no flashing required. Just plug it in with a USB-C data cable (charge-only cables won’t work).

How it works

  1. Press Ctrl+Alt+4. MotionEase auto-detects the device by USB VID/PID (2E8A:0009), opens the COM port, and asserts DTR — the firmware only streams once a real terminal is listening.
  2. First launch: hold the device still for ~1 second in its mounted position while gravity and gyro bias are calibrated (5 samples averaged). The result is saved to motionease_sensor_calibration.json next to the exe.
  3. Subsequent launches: the saved calibration loads instantly — no wait. The device IS the rest reference until you say otherwise.
  4. Live motion mirrors Apple’s iOS Vehicle Motion Cues: dots flow opposite the felt acceleration (so the world appears to pass by like scenery out the window), and the gyroscope’s yaw rate is the primary turn signal — it leads centripetal G during turn entry by ~200 ms, giving snappy response to wheel input.
  5. To recalibrate after re-mounting the device, press Ctrl+Alt+4 again. Fresh calibration overwrites the saved file.

Sensitivity

Sensor mode shares the global sensitivity slider — Ctrl+Left / Ctrl+Right adjusts in 0.2 steps from 0.2 to 3.0 (default 1.0). At the default, ~0.2 g of sustained acceleration saturates the dot displacement; gentle road motion produces visible response, hard turns/brakes hit the cue clamp. The current sensitivity is logged to console on every entry into sensor mode.

Fallbacks

  • Hardware not connected / cable is charge-only / pyserial not installed: pressing Ctrl+Alt+4 shows a tray balloon with the cause and stays in your previous mode. Modes 1/2/3 keep working exactly as before — sensor support is purely additive.
  • Device unplugged mid-session: auto-falls back to drift mode with a tray balloon.
  • Saved calibration looks corrupt (gravity magnitude outside 500–1500 mg): MotionEase ignores the file and falls back to fresh runtime calibration; the offending file is logged to motionease_error.log.

Adding other devices

sensor_reader.py is self-contained. To support a different IMU board, change DEVICE_VID/DEVICE_PID and adjust the regexes in _RE_ACC / _RE_GYRO to match its serial output format. The unit tests in test_sensor_reader.py cover the parser and orientation math without hardware.


License

MIT License. See LICENSE.


Built with care by the KeepSimple.io team.

v0.3.3[beta]