Hey everyone, long time no news, I know. I was VERY busy.
ArduDeck has evolved, and it is time to go into Beta. Beta 1 ships with a huge pile of new features, improvements, quality-of-life touches, a real physics engine, and more. There is also an easter egg waiting for anyone who can solve the puzzle (it is at the very bottom of this post).
Full write-up: ArduDeck Beta 1: Fly the Fleet - ArduDeck Blog
What’s new
Multi-vehicle flying.
One button starts a coordination engine in the background. Vehicles show up as their heartbeats arrive, over telemetry radio, IP, or a cellular modem, with no ports or routing to set up. Click a vehicle to command it, or send the fleet a formation. Raw UDP/TCP stay available under Advanced. Docs: Multi-Vehicle - Fly a Fleet from One Ground Station - ArduDeck GCS
RTK corrections over NTRIP.
A built-in NTRIP client pulls RTCM corrections from any caster (v1, v2, or auto) and forwards them to the vehicle, with sourcetable browsing and GGA position upload. In multi-vehicle mode the engine feeds the whole fleet from one caster login. Docs: RTK & NTRIP - Centimeter GPS Corrections - ArduDeck GCS
Rebuilt log analyzer.
Multiple charts with independent y-axes, min/avg/max that recompute over the visible window, an FFT spectrum, events and parameters panels, a cursor synced to the map, and a 3D flight path. Docs: ArduPilot Flight Log Analysis - DataFlash .bin Log Viewer with 3D Replay - ArduDeck GCS
OSD tool.
Edit the flight controller’s real Text OSD (ArduPilot OSDn and Betaflight MSP), build a custom ground-rendered HUD, or author a RubyFPV layout, all over a live video feed. A destination bar shows where each overlay actually ends up, so a ground HUD is never confused with something written to the FC. Docs: OSD Tool - FC OSD Editor, Custom HUD & RubyFPV Layouts - ArduDeck GCS
Link Doctor.
When a connection stays silent, ArduDeck reads the raw bytes and tells you what the port is actually speaking, with one-click fixes for ELRS radios.
Digital FPV and traffic.
A built-in wfb-ng receiver plays OpenIPC video from an RTL8812AU dongle. Live air traffic (ADS-B, gliders over OGN, Remote ID) shows on the map with proximity alerts. Docs: Map Overlays - Weather, Airspace & DIPUL Geozones - ArduDeck GCS
Simulate your own aircraft.
A built-in physics engine flies your actual build in ArduPilot SITL. It reads your custom frame, mass, arm geometry, motors, and props, and runs full 6DOF rigid-body dynamics for that vehicle, so a mission is tested against a realistic model of the copter it was planned for, not a generic default. The flight renders live in the 3D Sim World, with nothing to install. Docs: Simulator - ArduDeck Documentation
Imperial units.
Distance, altitude, speed, area, and weight follow your preference across planning, telemetry, logs, and survey estimates. Values sent to the vehicle stay metric. Contributed by the community.
Survey and mission planning
- Grid, crosshatch, circular, and corridor patterns, planned by GSD with live battery and data estimates.
- Terrain-following surveys that sample ground elevation per waypoint, multi-polygon areas with no-fly holes, and Shapefile/KML import.
- Missions grouped into named sections with per-group upload and per-group distance, time, and GSD.
- An altitude profile that reads MAVLink frames correctly: relative, terrain, and ASL waypoints plot against real terrain, with AGL labels, collision warnings you can trust, and scroll-to-zoom.
Docs: Mission Planning - Survey Grids, Corridor Surveys & Waypoints - ArduDeck GCS
A home for the community
Beta 1 also opens the ArduDeck community forum: https://forum.ardudeck.com.
Discord is great for quick back-and-forth, but answers scroll away; the forum keeps setups, tuning notes, and fixes searchable for the next person who hits the same issue. Introduce your aircraft, report what breaks, and show what you build.
Fixes worth knowing about
- Rover arming no longer lets the pre-arm RC override push aux channels to real values and yank the flight mode channel. Aux channels send “ignore” as they should.
- A silent arm failure is reported within three seconds, naming the system ID the command targeted.
- The live RC panel shows real incoming RC from the vehicle, with the override controls separated out.
- Pre-arm errors are polled until they clear, so the arming panel reflects reality.
- MAVLink v2 zero-trimmed payloads and several wrong checksum constants are handled correctly, backed by a new parser test suite.
- The map no longer pans endlessly between fleet vehicles.
- Parameter download recovers on slow or lossy links (SiK radios): the request is re-sent and dropped parameters are gap-filled instead of failing outright.
- Calibration restore now writes the verified sensor IDs, so a restored calibration is accepted after a firmware cross-flash.
- Battery failsafe voltages read in volts, the correct motor spins in the individual motor test, second GPS data flows, and large surveys (3000+ waypoints) are much faster.
Install
Download for your platform from https://ardudeck.com.
- macOS: binaries are unsigned for now. Right-click the app and choose Open, or run
xattr -cr /Applications/ArduDeck.app. Mac guide: https://ardudeck.com/blog/ground-control-station-mac/ - Windows: if SmartScreen appears, click More info, then Run anyway. Updates in-app.
- Linux: AppImage and .deb. Updates in-app.
The easter egg
There is a hidden corner of the site that only opens for people who earn it. Here is your way in save the code as .geojson, open ArduDeck, go to the Area Editor, and use Import. Look at what the polygons draw on the map, then go where it points you. The home coordinate might look familiar if you have ever booted SITL. Add the word to https://ardudeck.com/ ← the puzzle word here
{"type": "FeatureCollection", "features": [{"type": "Feature", "properties": {}, "geometry": {"type": "Polygon", "coordinates": [[[149.1652374, -35.3632621], [149.1652374, -35.361106153180025], [149.1658102048418, -35.361106153180025], [149.1658102048418, -35.3632621], [149.1652374, -35.3632621]]]}}, {"type": "Feature", "properties": {}, "geometry": {"type": "Polygon", "coordinates": [[[149.1655238024209, -35.361106153180025], [149.16688972165898, -35.361106153180025], [149.16688972165898, -35.36157327499102], [149.1655238024209, -35.36157327499102], [149.1655238024209, -35.361106153180025]]]}}, {"type": "Feature", "properties": {}, "geometry": {"type": "Polygon", "coordinates": [[[149.16717612407987, -35.36133971408552], [149.16717612407987, -35.36191463323751], [149.1666033192381, -35.36191463323751], [149.1666033192381, -35.36133971408552], [149.16717612407987, -35.36133971408552]]]}}, {"type": "Feature", "properties": {}, "geometry": {"type": "Polygon", "coordinates": [[[149.16688972165898, -35.36214819414301], [149.1655238024209, -35.36214819414301], [149.1655238024209, -35.36168107233202], [149.16688972165898, -35.36168107233202], [149.16688972165898, -35.36214819414301]]]}}, {"type": "Feature", "properties": {}, "geometry": {"type": "Polygon", "coordinates": [[[149.16755065032257, -35.3632621], [149.16755065032257, -35.361106153180025], [149.16812345516436, -35.361106153180025], [149.16812345516436, -35.3632621], [149.16755065032257, -35.3632621]]]}}, {"type": "Feature", "properties": {}, "geometry": {"type": "Polygon", "coordinates": [[[149.16783705274347, -35.36279497818901], [149.16920297198158, -35.36279497818901], [149.16920297198158, -35.3632621], [149.16783705274347, -35.3632621], [149.16783705274347, -35.36279497818901]]]}}, {"type": "Feature", "properties": {}, "geometry": {"type": "Polygon", "coordinates": [[[149.16970588847923, -35.36318009129104], [149.17069728147462, -35.36102414447106], [149.17123361536102, -35.36118816188898], [149.17024222236563, -35.36334410870896], [149.16970588847923, -35.36318009129104]]]}}, {"type": "Feature", "properties": {}, "geometry": {"type": "Polygon", "coordinates": [[[149.17168867447, -35.36334410870896], [149.17069728147462, -35.36118816188898], [149.17123361536102, -35.36102414447106], [149.17222500835643, -35.36318009129104], [149.17168867447, -35.36334410870896]]]}}, {"type": "Feature", "properties": {}, "geometry": {"type": "Polygon", "coordinates": [[[149.17046975192014, -35.362040396802016], [149.17146114491553, -35.362040396802016], [149.17146114491553, -35.36250751861301], [149.17046975192014, -35.36250751861301], [149.17046975192014, -35.362040396802016]]]}}, {"type": "Feature", "properties": {}, "geometry": {"type": "Polygon", "coordinates": [[[149.17306970360374, -35.360968779265725], [149.1739509418219, -35.36195692155822], [149.17348769387706, -35.36223166938681], [149.17260645565895, -35.36124352709432], [149.17306970360374, -35.360968779265725]]]}}, {"type": "Feature", "properties": {}, "geometry": {"type": "Polygon", "coordinates": [[[149.17483218004, -35.36124352709432], [149.1739509418219, -35.36223166938681], [149.17348769387706, -35.36195692155822], [149.1743689320952, -35.360968779265725], [149.17483218004, -35.36124352709432]]]}}, {"type": "Feature", "properties": {}, "geometry": {"type": "Polygon", "coordinates": [[[149.17400572027037, -35.36209429547251], [149.17400572027037, -35.3632621], [149.17343291542858, -35.3632621], [149.17343291542858, -35.36209429547251], [149.17400572027037, -35.36209429547251]]]}}]}
Notes
ArduDeck is in beta. It flies real operations, but expect rough edges and keep a backup configuration tool handy. Use the built-in bug reporting (bug icon in the sidebar) to send an encrypted report, or open an issue on GitHub.
Docs: Documentation - ArduDeck Ground Control Station · Forum: https://forum.ardudeck.com
