CanSat Ground Station
Code for a CanSat or OBCs GUI ground station where different sensor data are displayed in real time. No sensors needed to try it.
Install / Use
npx skills add darods/CanSat-Ground-stationInstalls into whichever agent you are using.
README
Ground Station GUI for CanSat & OBCs 🚀
Real-time telemetry monitoring interface for CanSats and On-Board Computers (OBCs). Displays altitude, 3-axis acceleration, 3-axis gyroscope, pressure, temperature, speed, battery, and free-fall status in real-time.
Modernized to support Linux, macOS, and Windows 11 using modern Python tooling (uv), Python 3.10+, and PyQt6 / PyQt5.

⚡ Quick Start with uv
The recommended way to run this application across Linux, macOS, and Windows 11 is using uv.
Prerequisites
Install uv (if not already installed):
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows (PowerShell)
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
Installation & Execution
-
Clone the repository and navigate into the project directory:
git clone https://github.com/darods/CanSat-Ground-station.git cd CanSat-Ground-station -
Run in Simulated / Dummy Mode (no sensors or serial connection required):
uv run main.py --dummy -
Run with a Real Serial Hardware Port:
# Linux (e.g. /dev/ttyUSB0 or /dev/ttyACM0) uv run main.py --port /dev/ttyUSB0 --baud 9600 # macOS (e.g. /dev/tty.usbmodem14101) uv run main.py --port /dev/tty.usbmodem14101 # Windows 11 (e.g. COM3) uv run main.py --port COM3
🛠 Command-Line Options
options:
-h, --help Show help message and exit
--port PORT Serial port device name (e.g. /dev/ttyUSB0, COM3, /dev/tty.usbmodem14101)
--baud BAUD Serial baud rate (default: 9600)
--dummy Force simulated telemetry data mode
--interval INTERVAL Telemetry polling rate in ms (default: 50)
📊 Telemetry Data Frame Format
The station reads comma-separated CSV frames from serial hardware (or generates them in dummy mode):
| Index | Field | Description |
|---|---|---|
| 0 | Timestamp | Elapsed flight time (ms) |
| 1 | Altitude | Relative altitude (meters) |
| 2 | Free Fall | Free fall indicator (0 = No, 1 = Yes) |
| 3 | Temperature | Temperature (°C) |
| 4 | Pressure | Barometric pressure (hPa) |
| 5 | Gyro Pitch | Angular pitch rate (°/s) |
| 6 | Gyro Roll | Angular roll rate (°/s) |
| 7 | Gyro Yaw | Angular yaw rate (°/s) |
| 8 | Accel X | X-axis acceleration (m/s²) |
| 9 | Accel Y | Y-axis acceleration (m/s²) |
| 10 | Accel Z | Z-axis acceleration (m/s²) |
| 11 | Battery | Battery charge % (dummy mode only, optional on hardware) |
Dummy mode runs a realistic sub-orbital flight simulator: motor burn, ballistic coast to apogee (weightlessness / free fall), terminal-velocity descent, parachute recovery and a slowly draining battery. The elapsed-time clock advances 1:1 with real wall-clock time. While you hold a plot panel with the mouse to pan/zoom, the trace is paused and snaps back to the live position when you release the button.
Data can be saved to flight_data.csv in real-time by clicking Start storage on the GUI.
🧪 Testing
This is a development tool that keeps evolving, so the telemetry pipeline is covered by unit tests. Run the full suite (headless, no display needed):
uv run pytest
Run a single area:
uv run pytest tests/test_communication.py
uv run pytest -k "battery or free_fall"
Every run prints a coverage report for communication, dataBase,
graphs and main. See docs/TESTING.md for the test
layout, conventions, and a guide on adding new tests.
⚙️ CI/CD
Everything runs on GitHub Actions and is free — no paid tier needed:
ci.yml— on every push/PR:rufflint + format, the fullpytestsuite headless on Ubuntu / macOS / Windows, an import smoke check,pip-audit(dependency CVEs) andbandit(source-level security scan).codeql.yml— weekly + on PR: GitHub CodeQL semantic analysis. Free for public repos; requires the paid GHAS add-on on private repos.dependabot.yml— weekly PRs for outdated pip/uv.lockand GitHub Actions dependencies, plus automatic PRs for known vulnerabilities (free for public and private repos).
📦 Stack & Compatibility
- Package Manager:
uv - Python:
>=3.10 - UI Framework: PyQt6 / PyQt5 (
pyqtgraph) - Hardware Interface:
pyserial - Math & Data:
numpy
📜 License
Developed by Daniel Alejandro Rodríguez Suárez, Leader of the ATL Research Seedbed, linked to the LIDER Research Group at Universidad Distrital Francisco José de Caldas.
Related Skills
node-connect
385.5kDiagnose OpenClaw Android, iOS, or macOS node pairing, QR/setup code, route, auth, and connection failures.
blender-python-addon
40.5kBlender Python add-on rules for operators, panels, properties, registration, testing, and API-safe scripting
flutter-development-guidelines-cursorrules-prompt-file
40.5kCursor rules for Flutter development with MVVM architecture, Riverpod state management, Material widgets, and Dart style guidelines.
commit-push-pr
140.6kCommit, push, and open a PR
