Back to Projects

Ulysses Ground Control Station

Role C++ Backend Engineer
Team UBC Rocket
Platform Qt 6 / QML
Source GitHub ↗

Overview

The Ulysses Ground Control Station is a cross-platform telemetry and control application built with Qt 6 for UBC Rocket's sounding-rocket development and mission operations. It provides real-time serial communication with RFD900x radio modems, live sensor telemetry decoding, 3D orientation visualization, system alerts, and modular UI panels tuned for engineering workflows.

I wrote the full C++ backend — the serial/radio interface, command sender, alarm processing, and telemetry model — along with the settings and configuration UI.

Ulysses Ground Control Station dashboard
The Ulysses GCS dashboard — serial control, telemetry panels, and 3D rocket visualization

Serial & Radio Interface

The SerialBridge backend handles all radio I/O and supports two operating modes:

  • Single-port mode — one COM port handles both RX and TX, with automatic RX pause during transmit to prevent echo/loopback on a single modem.
  • Dual-port mode — dedicated RX and TX ports, each with independent baud settings, connect/disconnect, manual send, and a periodic command sender (1–200 Hz).

RFD900x modems are discovered by scanning COM ports with FTDI + CP210x adapter detection and AT-mode probing (the +++ guard sequence). The UI surfaces OS-level port errors and prevents the same port from being assigned to both ports at once.


Sensor Telemetry

Incoming telemetry arrives as a 14-field CSV frame, parsed by SensorDataModel and decoded into QML-bound properties updated at 10 Hz:

  • IMU — linear acceleration (x, y, z) and gyro (roll, pitch, yaw)
  • Barometer — pressure and altitude
  • Kalman filter — raw and filtered angle
  • Status — velocity, temperature, signal, battery

A Qt Quick 3D panel drives a live rocket model from the IMU stream (Euler rotation mapped to Qt's Y-up coordinate system, with axis helpers and WASD camera movement). The AlarmReceiver classifies incoming text into ERROR, WARNING, and SUCCESS chips in the System Alert panel.


Architecture

A clean split between a C++ backend and a QML frontend keeps the I/O and parsing logic testable and the UI declarative.

  • SerialBridge — serial I/O, port scanning, RX/TX, modem detection
  • CommandSender — manual and periodic command transmission
  • AlarmReceiver — classifies incoming text messages
  • SensorDataModel — parses CSV telemetry and exposes it to QML

The frontend is composed of modular QML panels — serial control, IMU data, barometer/telemetry, 3D visualization, and system alerts — built from a shared library of reusable UI components.


Tech Stack

C++ QML Qt 6 Qt Quick 3D Serial Communication RFD900x Radio Telemetry Decoding Kalman Filtering