Blog Drone 8 min read

Drone and Quadcopter Control From a Gamepad via OSC

Use a PS5 DualSense as an OSC source for drone control. Sticks for roll/pitch/yaw/throttle, triggers for arm + flight mode. Bridge to MAVLink, ROS, or sim.

By Aidxn Design

Plot twist: most "MIDI bridges" can also emit OSC, and OSC is the universal language of robotics, drones, and simulator control. A PS5 DualSense is functionally a high-quality flight stick with two analog triggers and a clickable touchpad — for FPV sim flying, ROS-based drone research, and even hobbyist MAVLink rigs, that is more than enough input fidelity. Here is the gamepad to OSC drone control workflow, with the caveat upfront: do not fly a real $1,500 drone with this until you have tested every single axis in a simulator first.

TL;DR
  • What you do: bridge gamepad to OSC, OSC into a translator (MAVLink, ROS, sim), fly.
  • What you need: DualSense, OSC receiver (sim or robotics stack), Universal Controller MIDI v1.0+ with OSC output.
  • Time: 30 minutes for sim, half a day for a real MAVLink rig.
  • Cost: $89. A radio-grade FrSky controller is $200+.

Why this workflow works

Drone radios were once the only fast, low-latency way to get analog stick data into a flight controller. Now USB gamepads do exactly the same with sub-3ms latency over wired USB-C — well within the control loop budget for stable flight. For FPV simulators (where most pilots build their reflexes anyway) the gamepad is genuinely indistinguishable from a Taranis. For real flying, the bridge into MAVLink is mature enough that hobbyists use it weekly.

What you need

  • Universal Controller MIDI v1.0+ with OSC output enabled (download)
  • An OSC receiver:
    • Liftoff / DRL Sim / Velocidrone (most FPV sims accept OSC via a small plugin or virtual joystick)
    • QGroundControl + MAVLink for real Pixhawk/ArduPilot drones
    • ROS 2 with a custom OSC node for research drones
    • Betaflight Configurator's "joystick" mode (gamepad direct, OSC bridge optional)
  • PS5 DualSense — USB-C wired, always
  • A simulator for testing — non-negotiable

Setup steps

1. Bridge with OSC enabled

Install Universal Controller MIDI, plug the DualSense in. Go Settings → Output → OSC, set host 127.0.0.1 port 8000. Sticks now emit /gamepad/lx, /gamepad/ly, /gamepad/rx, /gamepad/ry as float values -1.0 to +1.0.

2. Hook into a simulator first

Liftoff and Velocidrone accept virtual joystick input. The simplest bridge is a small Python script that reads OSC and emits to a vJoy virtual gamepad on Windows or Enjoyable on macOS:

from pythonosc import dispatcher, osc_server
import vgamepad as vg

gamepad = vg.VX360Gamepad()

def lx(_, val): gamepad.left_joystick_float(x_value_float=val, y_value_float=0)
def ly(_, val): gamepad.left_joystick_float(x_value_float=0, y_value_float=val)

d = dispatcher.Dispatcher()
d.map("/gamepad/lx", lx)
d.map("/gamepad/ly", ly)

server = osc_server.ThreadingOSCUDPServer(("127.0.0.1", 8000), d)
server.serve_forever()

3. Map flight axes

Classic Mode 2 layout for FPV:

Left stick X  → Yaw     (-1 = left, +1 = right)
Left stick Y  → Throttle (-1 = idle, +1 = max)
Right stick X → Roll
Right stick Y → Pitch
L2 (long-press) → Arm / Disarm
R2 (toggle)   → Angle / Acro flight mode
L1            → Beeper / find drone
R1            → Camera tilt up
D-pad         → Trim adjustments

4. Calibrate

In the bridge, set stick deadzone to 0.05 and apply an exponential curve on roll/pitch. This gives you precise hover trim and aggressive top-end stick travel. Without this, real-flight handling is twitchy at low speeds and weak at high.

Real-world mapping recipe

InputOSC addressFlight role
Left stick X/gamepad/lxYaw (rotate)
Left stick Y/gamepad/lyThrottle
Right stick X/gamepad/rxRoll (lean left/right)
Right stick Y/gamepad/ryPitch (lean forward/back)
L2 trigger/gamepad/l2Arm (long-press 1.5s)
R2 trigger/gamepad/r2Acro/Angle mode toggle
L1/gamepad/l1Beeper / find drone
R1/gamepad/r1Camera tilt
X/gamepad/btn0Return-to-home
Square/gamepad/btn2Headless mode toggle
Triangle/gamepad/btn3Altitude hold
Circle/gamepad/btn1Emergency disarm (safety)
D-pad/gamepad/dpadTrim ±1 per press
Touchpad/gamepad/touchGimbal aim (camera drones)

Pitfalls

  • Bluetooth latency. Do not even consider it for flight. Wired USB-C only. 8–14 ms of jitter will crash a drone.
  • No failsafe on disconnect. If the USB cable pops loose, your drone has no stick input. Configure your flight controller to enter failsafe (hover or RTH) on a stick input timeout of 300ms.
  • OSC over WiFi. Same problem as Art-Net for lighting. UDP loses packets, drones do not like missing throttle frames. Wired ethernet from laptop to ground station only.
  • Linear stick curve. Low-speed handling will feel twitchy. Exponential curves are non-negotiable for any kind of precision flying.
  • Skipping the sim. Do not, under any circumstances, fly a real drone on this rig without 5+ hours of simulator time first. A radio with proper failsafe is still safer for new builds.

Wrap + CTA

Drones are not a music toy, and this is the one workflow where you need to read the safety section twice. But for sim flying, research drones, and ROS rigs, a DualSense + OSC is a legitimate, low-cost, low-latency input solution. Grab Universal Controller MIDI, enable OSC output, and start with the simulator.

Keep reading

More setup walkthroughs