A C++/Qt satellite telemetry project where fake satellites send live data, a receiver stores it, and the operator UI shows what is going on in real time.
SOUL is a college-style space systems project built in C++.
The idea is pretty simple:
- satellites generate telemetry
- the sender pushes that telemetry over framed TCP
- the receiver stores it in SQLite
- the Qt operator dashboard reads the database and shows the current status
- the OpenGL orbit scene gives a visual view of the Earth and the satellites moving around it
So instead of being just a backend app or just a UI app, SOUL tries to connect the whole little pipeline together in one place.
Right now the project simulates three satellites:
SAT_1acts mostly normalSAT_2drains battery fasterSAT_3heats up and can go quiet for short signal-loss windows
Each satellite sends telemetry frames using the same framed TCP protocol.
The receiver stores the packets in SQLite, and the UI shows:
- a satellite selection table
- live link status based on how fresh the last packet is
- recent telemetry history for the selected satellite
- an Earth scene with satellites orbiting around it
When nothing is selected, the scene can still show the satellites so the operator is not just staring into the void, which is honestly a bit nicer.
- The sender makes telemetry frames for
SAT_1,SAT_2, andSAT_3. - Frames are sent over TCP with the existing length-prefixed packet format.
- The receiver reads the frame, stores the telemetry row in SQLite, and sends an ACK back.
- The Qt UI reads the newest rows from the database and updates the tables, labels, and orbit view.
That is basically the full loop. Nothing too magical, just a lot of moving parts cooperating hopefully.
- Multi-satellite telemetry simulation with simple behavior states
- Framed TCP messaging with ACK handling
- SQLite-backed telemetry storage
- Qt Widgets operator dashboard
- Satellite list plus detailed telemetry table
- OpenGL orbit scene with Earth, satellites, orbit trails, glow markers, and camera controls
- Small reusable rendering helpers like
TexturedMesh
- GIF preview: docs/SOUL.gif
- Video: docs/SOUL.mp4
- Kanban board: docs/KanbanBoard.png
- Timeline view: docs/TimeLineview.png
SOUL/
|-- Common/ Shared telemetry frame + framing helpers
|-- simulation/ Fake satellite state and behavior logic
|-- SatelliteSender/ TCP sender/client side
|-- ReceiverServer/ TCP receiver/server side
|-- Database/ SQLite database setup and inserts
|-- ui/ Qt Widgets operator dashboard
|-- OrbitalRendering/ OpenGL Earth/satellite rendering code
|-- docs/ Project writeups, media, and planning boards
|-- scratchTests/ Small local checks and experiments
`-- external/sqlite/ Bundled SQLite source
-
SOUL
Receiver/server side of the telemetry system -
Client
Sender/client side that simulates multiple satellites -
UserInterface
Qt dashboard with the telemetry tables and orbit scene -
Test
Scratch validation target for small checks
- C++20
- Qt Widgets
- OpenGL
- Boost.Asio
- Boost.JSON
- SQLite
- CMake
- Requirements: docs/01_requirement.md
- Protocol notes: docs/02_protocol.md
- Architecture notes: docs/03_architecture.md
At a high level, the normal flow is:
- build the project
- start the receiver/server
- start the Qt UI
- start the sender/client
- watch telemetry appear in the UI and select a satellite to inspect it
If the database is receiving rows, the UI should pick them up and show link state changes based on how old the latest packet is.
- The UI hides the detailed telemetry panel until a satellite is selected
- The renderer reuses one satellite mesh for multiple satellites
- Some status fields in the UI are computed from stored data, like link freshness and latency
- The project is still growing, so a few rough edges are still there, but the core loop is working pretty nice now
The docs in this repo are written to be readable first.
The goal is not to sound ultra-corporate. The goal is to explain what the project is doing without making it feel scary for the next person reading it.
