Полный набор инструментов, драйверов и документации для разработки бортового ПО малых космических аппаратов (МКА) формата CubeSat.
mka_embedded/
├── src/
│ ├── cpp/
│ │ ├── hal/
│ │ │ └── hal_full.hpp # Полные HAL интерфейсы
│ │ ├── drivers/
│ │ │ ├── sensors_drivers.hpp # Драйверы BMI160, LIS3MDL, GPS, BMP388, LSM6DSO
│ │ │ ├── eeprom_driver.hpp # Драйвер EEPROM 24LC256
│ │ │ ├── radio_driver.hpp # Драйвер радиомодуля SI4463
│ │ │ └── sun_sensor.hpp # Драйвер солнечного сенсора
│ │ ├── algorithms/
│ │ │ ├── adcs_algorithms.hpp # Алгоритмы ориентации (EKF, UKF, Madgwick)
│ │ │ ├── anomaly_detector.hpp # Детектор аномалий (Isolation Forest)
│ │ │ └── sgp4.hpp # SGP4 орбитальный пропагатор
│ │ ├── systems/
│ │ │ ├── fdir.hpp # Fault Detection, Isolation, Recovery
│ │ │ ├── state_machine.hpp # Машина состояний спутника
│ │ │ ├── log_system.hpp # Система логирования
│ │ │ ├── memory_pool.hpp # Пул памяти для RTOS
│ │ │ ├── telemetry.hpp # Генератор телеметрии и команд
│ │ │ ├── file_system.hpp # Файловая система LittleFS
│ │ │ ├── ota_updater.hpp # OTA обновление прошивки
│ │ │ ├── command_handler.hpp # Обработчик команд
│ │ │ ├── param_store.hpp # Хранилище параметров
│ │ │ ├── watchdog_manager.hpp # Менеджер сторожевых таймеров
│ │ │ ├── canopen.hpp # CANopen стек
│ │ │ ├── power_manager.hpp # Управление питанием (MPPT)
│ │ │ ├── task_scheduler.hpp # Планировщик задач
│ │ │ ├── health_monitor.hpp # Мониторинг здоровья
│ │ │ ├── moscow_time.hpp # Система Московского времени
│ │ │ └── auto_actualization.hpp # Автоматическая актуализация
│ │ ├── rtos/
│ │ │ └── freertos_wrapper.hpp # Обёртки FreeRTOS
│ │ └── utils/
│ │ ├── callback.hpp # Легковесные callback
│ │ ├── result.hpp # Result<T, E> тип
│ │ └── span.hpp # Span utility
│ └── python/
│ ├── utils/
│ │ ├── littlefs_sim.py # Симулятор файловой системы
│ │ ├── ota_update.py # OTA загрузчик
│ │ ├── orbit_simulator.py # Симулятор орбиты
│ │ ├── ax25_protocol.py # Протокол AX.25
│ │ ├── csp_protocol.py # CubeSat Space Protocol
│ │ └── ccsds_protocol.py # CCSDS протоколы
│ ├── visualization/
│ │ └── telemetry_visualizer.py # Визуализация телеметрии
│ └── hil/
│ └── hil_framework.py # HIL тестирование
├── tests/ # Юнит-тесты (40 файлов, 450+ тестов)
├── scripts/ # SDR скрипты и утилиты
│ ├── sdr_capture_enhanced.py # Улучшенный приём и анализ сигналов
│ ├── sdr_noaa.py # Приём метеоспутников NOAA (APT)
│ ├── sdr_ax25.py # Приём AX.25 пакетов (APRS)
│ ├── sdr_scanner.py # Сканер спектра
│ ├── sdr_antenna.py # Калькулятор антенн
│ ├── test_rtlsdr.py # Тест RTL-SDR устройства
│ ├── SDR_README.md # Документация по SDR скриптам
│ └── sdr_direwolf.conf # Конфигурация Dire Wolf
├── exercises/
│ └── labs.md # Практические задания
├── cheatsheets/
│ ├── stm32_quickref.md # Шпаргалка по STM32
│ └── freertos_quickref.md # Шпаргалка по FreeRTOS
├── CMakeLists.txt # Конфигурация CMake
└── README.md
Полный набор абстрактных интерфейсов:
- ISystemTime — системное время
- IWatchdog — сторожевой таймер
- IGPIO — цифровые входы/выходы
- IUART — последовательный порт
- ISPI — SPI интерфейс
- II2C — I2C интерфейс
- ICAN — CAN шина
- IADC — аналого-цифровой преобразователь
- IDAC — цифро-аналоговый преобразователь
- ITimer — таймеры
- IFlash — Flash память
- ISDCard — SD карта
- IPowerSystem — система электропитания
- ICRC — аппаратный CRC
- IRNG — генератор случайных чисел
- IDMA — DMA контроллер
| Датчик | Тип | Особенности |
|---|---|---|
| BMI160 | IMU (6 DOF) | Акселерометр ±2/4/8/16g, Гироскоп ±125-2000°/s, I2C/SPI |
| LIS3MDL | Магнитометр | ±4/8/12/16 Гаусс, 16-бит, I2C/SPI |
| u-blox NEO-M8 | GPS | GPS+GLONASS, UART, NMEA/UBX |
| Sun Sensor | Оптический | 4 фотодиода, АЦП |
- Quaternion — математика кватернионов
- Фильтры оценки ориентации:
- MadgwickFilter — фильтр слияния IMU
- Extended Kalman Filter (EKF) — оценка ориентации + смещения гироскопа
- Unscented Kalman Filter (UKF) — нелинейная оценка ориентации
- Complementary filter — альтернатива Madgwick
- Определение ориентации:
- TRIAD метод — построение DCM из двух векторов
- QUEST метод — оптимальный алгоритм Wahba
- Контроллеры ориентации:
- PIDController — регулятор с anti-windup
- BDotController — гашение вращения (detumbling)
- PD Controller — кватернионная ошибка, демпфирование
- SlidingModeController — робастный нелинейный контроллер
- AttitudeController — контроллер ориентации
Fault Detection, Isolation and Recovery:
- Мониторинг параметров с порогами
- Детектор аномалий (статистический)
- Журнал событий
- Автоматическое восстановление
- Детекторы: Frozen Value, Stuck Bit, Glitch
Управление режимами спутника:
- OFF → INIT → SAFE → STANDBY → NOMINAL → MISSION
- Валидация переходов
- Автономные переходы по условиям
- История переходов
Структурированное логирование:
- Уровни:
DEBUG,INFO,NOTICE,WARNING,ERROR,CRITICAL - Категории по подсистемам
- Форматирование с временными метками
- Кольцевой буфер
Безопасное управление памятью для RTOS:
Fixed Block Pool— O(1) выделениеMemory Pool Manager— пулы разных размеровRAIIобёртка
| Протокол | Файл | Описание |
|---|---|---|
| AX.25 | ax25_protocol.py |
Любительская пакетная радиосвязь |
| CSP | csp_protocol.py |
CubeSat Space Protocol |
| CCSDS | ccsds_protocol.py |
Space Packet, TM/TC Transfer Frames |
- LittleFS Simulator (
littlefs_sim.py) — симуляция файловой системы - OTA Update (
ota_update.py) — удалённое обновление ПО - Orbit Simulator (
orbit_simulator.py) — прогноз пролётов
Hardware-in-the-Loop тестирование:
- Симулятор
EPS(электропитание) - Симулятор
ADCS(ориентация) - Инъекция неисправностей
- Сценарии тестирования
Приём и анализ радиосигналов для CubeSat:
| Скрипт | Назначение |
|---|---|
sdr_capture_enhanced.py |
Универсальный приём с FFT, SNR, детекцией пиков |
sdr_noaa.py |
Приём APT изображений с NOAA спутников |
sdr_ax25.py |
Приём APRS пакетов (AX.25) |
sdr_scanner.py |
Сканирование спектра |
sdr_antenna.py |
Калькулятор антенн |
Примеры использования:
# Приём ISS (145.8 МГц)
python scripts\sdr_capture_enhanced.py --freq 145.8 --plot
# Приём NOAA 19
python scripts\sdr_noaa.py --sat noaa19
# Мониторинг APRS
python scripts\sdr_ax25.py --monitor --decode
# Сканирование VHF диапазона
python scripts\sdr_scanner.py --start 137 --stop 146
# Расчёт антенны для 145.8 МГц
python scripts\sdr_antenna.py --freq 145.8Подробнее: См. scripts/SDR_README.md
stm32_quickref.md— GPIO, UART, SPI, I2C, CAN, DMA, таймеры, ADCfreertos_quickref.md— Задачи, очереди, семафоры, таймеры
5 лабораторных работ:
- HAL и драйверы
- CAN шина
- Система ориентации
- RTOS задачи
- Телеметрия и команды
# Установка зависимостей
pip install pytest
# Запуск тестов
cd src/python
python -m pytest tests/ -v
# Демо скрипты
python utils/ax25_protocol.py
python utils/csp_protocol.py
python utils/ccsds_protocol.py
python hil/hil_framework.py# Сборка
mkdir build && cd build
cmake .. -G "MinGW Makefiles" # или make/ninja на Linux/Mac
make -j$(nproc)
# Запуск всех тестов
ctest --output-on-failure
# Запуск отдельного теста
./test_algorithms.exeСтатус тестов: ✅ 33/33 проходят (100%)
| Категория | Тестов | Статус |
|---|---|---|
| Алгоритмы | test_algorithms, test_sgp4, test_ukf, test_anomaly_detector, test_triad, test_quest, test_sliding_mode | ✅ |
| FDIR & State Machine | test_fdir, test_statemachine, test_health_monitor | ✅ |
| Системные модули | test_commands, test_param_store, test_watchdog, test_memory_pool, test_log_system, test_telemetry, test_file_system, test_littlefs | ✅ |
| Интеграция | test_driver_integration, test_actualization_integration, test_auto_actualization | ✅ |
| Драйверы | test_new_sensors, test_eeprom, test_canopen | ✅ |
| Утилиты | test_utils, test_span, test_callback, test_moscow_time, test_task_scheduler, test_power_manager | ✅ |
| Негативные тесты | test_sgp4_negative, test_memory_pool_stress, test_watchdog_manager | ✅ |
| Результат | test_result | ✅ 49/49 (ручной запуск, отключен в CTest на Windows из-за death test артефактов) |
#include "hal_full.hpp"
#include "sensors_drivers.hpp"
#include "adcs_algorithms.hpp"
#include "fdir.hpp"
#include "state_machine.hpp"
// Создание драйверов
BMI160Driver imu(i2c);
imu.init();
// Чтение данных
IMUData data;
imu.readData(data);
// Фильтр ориентации
MadgwickFilter filter(100.0f, 0.1f);
filter.updateIMU(data.gyro, data.accel, dt);
// FDIR мониторинг
mka::fdir::FDIRManager fdir;
auto paramId = fdir.registerParameter({
.nominalValue = 7.4f,
.warningLow = 6.5f,
.warningHigh = 8.5f,
.errorLow = 6.0f,
.errorHigh = 9.0f,
.criticalLow = 5.5f,
.criticalHigh = 10.0f
});
// State Machine
mka::statemachine::SatelliteStateMachine sm;
sm.forceTransition(mka::statemachine::SatelliteMode::INIT,
mka::statemachine::TransitionReason::COMMAND);┌─────────────────────────────────────────────────────────────────────┐
│ Application Layer │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────────────┐ │
│ │ Mission │ │ Payload │ │ Telemetry │ │ Command Processor │ │
│ │ Manager │ │ Control │ │ Generator │ │ │ │
│ └───────────┘ └───────────┘ └───────────┘ └───────────────────┘ │
├─────────────────────────────────────────────────────────────────────┤
│ Service Layer │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────────────┐ │
│ │ File │ │ Log │ │ Protocol │ │ FDIR Manager │ │
│ │ System │ │ Manager │ │ Stack │ │ State Machine │ │
│ └───────────┘ └───────────┘ └───────────┘ └───────────────────┘ │
├─────────────────────────────────────────────────────────────────────┤
│ Driver Layer │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────────────┐ │
│ │ IMU │ │ Magnetom. │ │ GPS │ │ Radio Module │ │
│ │ Driver │ │ Driver │ │ Driver │ │ Driver │ │
│ └───────────┘ └───────────┘ └───────────┘ └───────────────────┘ │
├─────────────────────────────────────────────────────────────────────┤
│ HAL (Hardware Abstraction) │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────────────┐ │
│ │ GPIO │ │ UART/SPI │ │ I2C/CAN │ │ ADC/DMA │ │
│ └───────────┘ └───────────┘ └───────────┘ └───────────────────┘ │
├─────────────────────────────────────────────────────────────────────┤
│ Hardware (STM32F4/F7/H7) │
└─────────────────────────────────────────────────────────────────────┘
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)| Опция | Описание | По умолчанию |
|---|---|---|
STM32F4 |
Сборка для STM32F4 | OFF |
STM32F7 |
Сборка для STM32F7 | OFF |
STM32H7 |
Сборка для STM32H7 | OFF |
HOST_BUILD |
Сборка для хоста | ON |
BUILD_TESTS |
Сборка тестов | ON |
BUILD_DOCS |
Генерация документации | OFF |
ENABLE_CPPCHECK |
Статический анализ | OFF |
# Для STM32F4
cmake .. -DSTM32F4=ON -DBUILD_TESTS=OFF
# Для STM32H7
cmake .. -DSTM32H7=ON -DBUILD_TESTS=OFF
# Для тестирования на хосте
cmake .. -DHOST_BUILD=ON -DBUILD_TESTS=ONПроект настроен для корректной работы с Git:
- .gitignore — исключает артефакты сборки, IDE-файлы, Python-виртуальные окружения, бинарные файлы
- .gitattributes — принудительное использование LF (Unix) окончаний строк для исходного кода; бинарные файлы не преобразуются
# Включение поддержки файлов >100MB (если нужно)
git lfs install
# Клонирование репозитория
git clone <url>
cd mka_embedded_complete- Компилятор C++17+
- STM32CubeIDE или IAR/Keil
- FreeRTOS 10.x (опционально)
- Python 3.8+
- pytest (для тестирования)
- CMake 3.20+
- Make или Ninja
Образовательный материал для подготовки Embedded-программистов космической отрасли.
Разработано для использования в образовательных целях и для реальных проектов CubeSat.