Run ArduPilot SITL on your computer and connect Mission Control to it through the bundled WebSocket bridge with its per-run token.
SITL (software in the loop) runs the real ArduPilot autopilot on your computer with simulated physics. The SITL tool in the Mission Control repo launches ArduPilot SITL and bridges its TCP MAVLink stream to a WebSocket the browser can open. Unlike demo mode, which uses mock telemetry, SITL runs actual autopilot code: missions, parameters, modes, failsafes and calibrations behave as they do on hardware.
SITL is the place to rehearse arming, takeoff and missions, but behaviour on a real aircraft can differ. Read Safety before flying hardware.
The setup script clones ArduPilot to ~/.ardupilot (or $ARDUPILOT_HOME) and builds ArduCopter for the SITL board:
cd ADOSMissionControl/tools/sitlbash scripts/setup-ardupilot.sh
To build by hand, follow the ArduPilot build instructions, then run ./waf configure --board sitl and ./waf copter (or plane, rover) in the ArduPilot tree.
It launches ArduCopter SITL and prints a URL such as ws://[::1]:5760/?token=<token>. The token is random and changes on every run.
2
Open the Connect dialog
Run Mission Control on the same machine (http://localhost:4000). Click + at the top of the Fleet sidebar.
3
Paste the URL
Choose the WebSocket method and paste the full URL, ?token= included. The SITL #1 to SITL #5 chips fill in the port for each drone; you still paste the token. Click Connect. The simulated copter appears with live telemetry.
Connect to Drone with the WebSocket method and a pasted SITL URL (placeholder token).
The bridge refuses any connection without the token. It accepts browser pages served from localhost, 127.0.0.1 or [::1]; add another exact origin with --allow-origin. It binds the IPv6 loopback ::1 because each drone’s WebSocket shares its SITL TCP port number and SITL listens on IPv4.
WebSocket bind address (this machine only by default)
--allow-origin <origin>
none
Also accept a Mission Control page from this exact origin. Repeatable
--lat <degrees>
12.9716
Home latitude
--lon <degrees>
77.5946
Home longitude
--speedup <N>
1
Simulation speed multiplier
--wind <speed,dir>
none
Wind speed (m/s) and direction (degrees), for example 5,180
--ardupilot <path>
~/.ardupilot
Path to the ArduPilot source tree
--vehicle <type>
ArduCopter
ArduCopter, ArduPlane or ArduRover
--preset <id>
none
Build preset: names the simulated vehicle (frame, parameters, vehicle type)
--list-presets
List the build presets and exit
--scenario <id>
none
Named test scenario (sets drones, preset, location, wind and speed-up)
--list-scenarios
List the scenarios and exit
--with-gazebo
off
Run with Gazebo physics
--gazebo-world <name>
multi-copter
Gazebo world
--gazebo-headless
off
Run Gazebo without its GUI
--no-dashboard
off
Log to stdout instead of the terminal dashboard
# A planenpx tsx src/index.ts --vehicle ArduPlane# A different home locationnpx tsx src/index.ts --lat -33.8568 --lon 151.2153# Wind from the south at 5 m/s, running at 2xnpx tsx src/index.ts --wind 5,180 --speedup 2# A 7-inch long-range build presetnpx tsx src/index.ts --preset 7in-long-range
--drones N starts N instances, each with its own system ID and its own port: 5760 for the first drone, then 5770, 5780 and so on (10 apart). The bridge runs one WebSocket per drone on that drone’s port and prints one URL per drone; all share the run’s token.
npx tsx src/index.ts --drones 3
Connect Mission Control once per printed URL. Each drone appears in the Fleet sidebar.
The tool looks for ArduPilot in ~/.ardupilot. Point it elsewhere with --ardupilot, and make sure you built the vehicle you asked for (./waf copter, ./waf plane).
WebSocket connection refused
Paste the whole printed URL, including ?token=. The token changes every run, so copy it again after a restart. Use ws://[::1]:..., not ws://localhost:..., and open Mission Control from localhost or add its origin with --allow-origin.
No telemetry after connecting
SITL takes a few seconds to start. Wait until the tool reports that ArduPilot is ready, then reconnect.
The drone does not take off
Wait for the simulated GPS fix, then arm in a manual mode first and switch to Loiter or AUTO after takeoff.