Skip to main content
The Ground Agent uses the same installer as the Drone Agent. The --profile ground_station flag is what makes the node a ground station.
Mission Control’s Flash Tool shows this install command for a companion board. See Choose what to install for the recommended flow per board class.

Prerequisites

  • A supported board with a fresh 64-bit Linux image. See Ground Agent supported hardware.
  • An RTL8812EU (or RTL8812AU) USB Wi-Fi adapter plugged in for the drone link.
  • Internet access during installation (Ethernet or Wi-Fi).
  • A storage card of at least 16 GB (32 GB recommended).
  • A USB-C power source that can sustain the board under radio load. See Power and runtime.
After the install finishes, the ground station works without internet.

Install

SSH into the board and run:
Run without --profile and with a terminal attached, the installer opens an interactive wizard that asks what the node is for. Pick “This receives on the ground (Ground station)”. With no flag and no wizard, the installer keeps the profile already recorded in /etc/ados/profile.conf, and falls back to drone on a fresh board. It does not guess the profile from attached hardware. Useful flags for a ground station: Every installer flag is listed on Install the Drone Agent.

What the installer does

1

Preflight and packages

Resolves the profile, then installs the system packages. A ground station also gets hostapd, dnsmasq, bluetooth, bluez, cage, wlr-randr, batctl and wpasupplicant, plus a Chromium package for the HDMI kiosk. avahi-daemon comes with the common set on every profile.
2

Agent and native services

Clones the agent into its own Python virtual environment and downloads the prebuilt native service binaries for the board.
3

Radio driver

Builds the RTL8812EU kernel module with DKMS. If the kernel headers are missing, this step reports the failure and the install continues without the driver.
4

Identity and configuration

Writes the device identity, /etc/ados/config.yaml and /etc/ados/profile.conf.
5

Board provisioning

On a Raspberry Pi ground station, enables the I2C bus so an optional status OLED is found. With a supported LCD attached, provisions the display overlay.
6

Services

Installs and enables the systemd units for the resolved profile, starts them and runs a health check. The node advertises itself once as _ados._tcp on every interface, the access point included, from the native control service. An install removes the older static record /etc/avahi/services/ados-gs-ap.service if an earlier version left one, so the node is not listed twice.
7

Reboot when needed

When a step staged a change that needs a reboot (an I2C or display overlay), the installer reboots once after its summary. --no-reboot skips it and reports what is still staged.
The unit list per profile is on Systemd services.

First boot

After the install (and the reboot, if one was needed):
  1. The optional OLED shows the hostname, the LAN IP and link: idle until a drone is paired.
  2. The Wi-Fi access point broadcasts ADOS-GS-<id>. The installer prints its passphrase in the completion summary, so write it down there. See The AP passphrase.
  3. The dashboard answers at http://192.168.4.1:8080 from a device on the access point.

Verify the install

SSH back into the board and run:
The first line reads ADOS <device> · <profile> followed by the version. Below it are the setup progress and pairing state, the addresses that reach this node, and rows for the MAVLink flight controller, Video, Cloud relay and Cloudflare, ending with a Next: hint. On a ground station with no flight controller attached, MAVLink FC reads not connected. To see the running services:
Run bare ados on a terminal for the full-screen status view.

Upgrade

The upgrade keeps the configuration, pairing keys and recorded profile, and restarts the services when it finishes. Because an upgrade restarts the MAVLink, radio and video services, the installer refuses it unless the agent reports a fresh armed: false vehicle state. A ground station with no flight controller attached has no vehicle state, so its upgrade (or a reinstall over an existing install) is refused with refusing to upgrade: the vehicle is armed or its arm state is unknown. Confirm the drone is on the ground and disarmed, then add --force-armed:
To install from a development branch, add --branch <branch-name> with the name of a branch that exists in the repository.

Change the profile

If the node was installed with the wrong profile:
The command sets profile in /etc/ados/profile.conf (keeping its other keys, such as the install channel and version) and agent.profile in /etc/ados/config.yaml, then restarts ados-wfb, ados-wfb-rx and ados-supervisor itself; no reboot is needed. --no-restart skips the restarts. --role (direct, relay or receiver, default direct) records the starting mesh role only when the config does not already hold one, and it skips the mesh checks. To change the role of a running node, use the role switch. To check what the node resolved, run ados profile show. Editing /etc/ados/config.yaml also works:

Mesh support

Every ground-station install already carries the mesh dependencies (batctl and wpasupplicant), so there is no flag to set. The three role units, ados-batman, ados-wfb-relay and ados-wfb-receiver, stay inactive until the node changes role. A node can take the relay or receiver role only while it carries two or more WFB-class radios (RTL8812EU or RTL8812AU). The agent checks the attached radios live each time, so plugging in the second adapter is enough. See Build a mesh.

Install problems

Next steps

Set up a ground station

Reach the node, pick a role, run the wizard and pair.

Wi-Fi access point

Connect a laptop or phone.
Last modified on October 11, 2026