Thanks to visit codestin.com
Credit goes to github.com

Skip to content

My vision of the spaceport taking into account basic parameters

Notifications You must be signed in to change notification settings

Andezion/StarTrek

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

67 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Cosmodrom - Система симуляции запуска ракет

Комплексная система для симуляции запуска ракет на орбиту Земли с возможностью координации нескольких ракет одновременно, предотвращения столкновений и 3D-визуализации полёта в реальном времени.

Архитектура

Проект состоит из 4 компонентов на разных языках программирования:

1. Physics (C) - Физический движок

  • Расчет физики полета ракеты
  • Гравитация, сопротивление атмосферы, тяга двигателей
  • Ориентация тяги: gravity turn (наклон от вертикали к горизонту по pitch-углу)
  • Орбитальная механика
  • Обнаружение столкновений с землей
  • Библиотека: librocket_physics.so

2. Server (Go) - Сервер координации

  • Координация нескольких ракет
  • Обнаружение возможных столкновений
  • Broadcast телеметрии всем подписчикам (наблюдателям)
  • WebSocket API для обмена данными
  • HTTP endpoint для просмотра списка активных ракет

3. Client (Go + CGO) - Клиент-ракета

  • Симуляция отдельной ракеты
  • Использует физический движок через CGO
  • Автоматический gravity turn: постепенный наклон тяги от вертикали к горизонту
  • Отправляет телеметрию на сервер в реальном времени (10 Гц)
  • Получает команды управления от сервера

4. Graphic (C++ + raylib) - 3D Визуализация

  • 3D-отображение Земли, космодромов и ракет
  • Камера с орбитальным управлением (вращение, зум, панорамирование)
  • Отслеживание ракет с автоматическим зумом
  • Панель телеметрии в реальном времени:
    • Высота, скорость, вертикальная скорость
    • Ускорение (в G), масса, топливо с прогресс-баром
    • Время полёта, сравнение с орбитальной скоростью
  • Визуализация траекторий с градиентным затуханием
  • Эффекты: пламя двигателей, индикатор орбиты, маркер крушения
  • Запуск ракет из GUI с выбором космодрома
  • Логи событий в реальном времени
  • WebSocket подключение к серверу как наблюдатель

Установка и сборка

Требования

  • GCC или Clang (для C и C++)
  • Go 1.21+ (для Server и Client)
  • CMake 3.16+ (для Graphic)
  • Make

Сборка

1. Физический движок

cd Physics
make

Это создаст библиотеку librocket_physics.so и тестовую программу.

Для запуска тестов:

make test

2. Сервер

cd Server
go build -o cosmodrom-server

3. Клиент

cd Client
export CGO_LDFLAGS="-L../Physics -lrocket_physics"
export LD_LIBRARY_PATH="../Physics:$LD_LIBRARY_PATH"
go build -o cosmodrom-client

4. Визуализация

cd Graphic
mkdir -p build && cd build
cmake ..
make -j$(nproc)

Зависимости (скачиваются автоматически через CMake FetchContent):

  • raylib 5.0 (рендеринг)
  • ixwebsocket v11.4.5 (WebSocket)
  • nlohmann_json 3.11.3 (JSON)
  • raygui.h (GUI)

Запуск

1. Запуск сервера

cd Server
./cosmodrom-server -port 8080

Сервер будет доступен на:

  • WebSocket: ws://localhost:8080/ws
  • HTTP API: http://localhost:8080/rockets
  • Главная страница: http://localhost:8080/

2. Запуск визуализации

cd Graphic/build
./cosmodrom-visualizer

Параметры:

  • -w WIDTH - Ширина окна (по умолчанию 1920)
  • -h HEIGHT - Высота окна (по умолчанию 1080)
  • -s URL - WebSocket URL сервера (по умолчанию ws://localhost:8080/ws)

Управление камерой:

  • ПКМ - Вращение камеры вокруг цели
  • Колесо мыши - Зум
  • СКМ - Панорамирование
  • Space - Отменить отслеживание ракеты
  • Esc - Выход

3. Запуск клиента (ракеты)

В отдельном терминале:

cd Client
export LD_LIBRARY_PATH="../Physics:$LD_LIBRARY_PATH"
./cosmodrom-client \
  -server ws://localhost:8080/ws \
  -id rocket-001 \
  -name "Falcon Heavy" \
  -lat 45.0 \
  -lon 63.0 \
  -alt 100.0

Параметры:

  • -server - URL сервера (по умолчанию ws://localhost:8080/ws)
  • -id - Уникальный ID ракеты (по умолчанию генерируется случайно)
  • -name - Название ракеты (по умолчанию "Test Rocket")
  • -lat - Широта запуска в градусах (по умолчанию 45.0)
  • -lon - Долгота запуска в градусах (по умолчанию 63.0)
  • -alt - Высота над уровнем моря в метрах (по умолчанию 100.0)

Ракеты также можно запускать прямо из GUI визуализации (кнопка LAUNCH ROCKET).

4. Запуск нескольких ракет

Вы можете запустить несколько ракет одновременно в разных терминалах:

# Терминал 2 - Ракета 1
./cosmodrom-client -id rocket-001 -name "Popa1" -lat 45.0 -lon 63.0

# Терминал 3 - Ракета 2
./cosmodrom-client -id rocket-002 -name "Popa2" -lat 45.1 -lon 63.1

# Терминал 4 - Ракета 3
./cosmodrom-client -id rocket-003 -name "Popa3" -lat 44.9 -lon 62.9

Сервер будет отслеживать все ракеты и предупреждать о возможных столкновениях.

Протокол обмена данными

Система использует WebSocket для обмена данными в формате JSON.

Сообщения от клиента к серверу:

Register - Регистрация ракеты

{
  "type": "register",
  "timestamp": "2024-01-20T10:00:00Z",
  "data": {
    "rocket_id": "rocket-001",
    "config": {
      "name": "Popa1",
      "mass_empty": 20000.0,
      "mass_fuel": 400000.0,
      "engines": [{"thrust": 7600000, "fuel_consumption": 2500, "is_active": true}],
      "drag_coefficient": 0.3,
      "cross_section": 12.0
    }
  }
}

Telemetry - Телеметрия

{
  "type": "telemetry",
  "timestamp": "2024-01-20T10:00:01Z",
  "data": {
    "rocket_id": "rocket-001",
    "state": {
      "position": {"x": 0, "y": 0, "z": 6371100},
      "velocity": {"x": 0, "y": 0, "z": 100},
      "acceleration": {"x": 0, "y": 0, "z": 8.3},
      "altitude": 1000.0,
      "speed": 100.0,
      "mass_current": 418000.0,
      "fuel_remaining": 398000.0,
      "in_orbit": false,
      "landed": false,
      "crashed": false,
      "time": 1.0
    }
  }
}

Сообщения от сервера:

Broadcast - Трансляция телеметрии наблюдателям

{
  "type": "broadcast",
  "data": {
    "rocket_id": "rocket-001",
    "name": "Popa1",
    "state": { ... }
  }
}

RocketJoined - Новая ракета подключилась

{
  "type": "rocket_joined",
  "data": {
    "rocket_id": "rocket-001",
    "name": "Popa1",
    "config": { ... }
  }
}

RocketLeft - Ракета отключилась

{
  "type": "rocket_left",
  "data": {
    "rocket_id": "rocket-001",
    "reason": "Завершение полёта"
  }
}

Warning - Предупреждение о столкновении

{
  "type": "warning",
  "data": {
    "rocket_id": "rocket-001",
    "warning": "Опасное сближение с ракетой rocket-002!",
    "severity": "high"
  }
}

Физическая модель

Константы

  • Радиус Земли: 6371 км
  • Масса Земли: 5.972 * 10^24 кг
  • Гравитационная постоянная: 6.674 * 10^-11 м3/(кг*с2)
  • Первая космическая скорость: ~7900 м/с
  • Граница атмосферы (линия Кармана): 100 км

Силы

  1. Гравитация: F = G * M * m / r^2 (направлена к центру Земли)
  2. Сопротивление атмосферы: F_drag = 0.5 * rho * v^2 * Cd * A
    • Плотность атмосферы: rho = 1.225 * exp(-h / 8500) кг/м3
    • Действует только ниже 100 км
  3. Тяга двигателей: Управляется дросселями (0.0 - 1.0)
    • Направление: определяется pitch-углом от локальной вертикали
    • pitch = 0: вертикально вверх (радиально от Земли)
    • pitch = 90: горизонтально (тангенциально)

Gravity Turn (автоматический маневр)

Клиент автоматически выполняет gravity turn для выхода на орбиту:

  • 0-1 км: вертикальный взлёт (pitch = 0)
  • 1-10 км: начало наклона (pitch 0 -> 20)
  • 10-50 км: основной наклон (pitch 20 -> 70)
  • 50-100 км: выход на горизонт (pitch 70 -> 85)
  • 100 км: почти горизонтальный полёт (pitch = 85)

Орбитальная механика

Ракета считается на стабильной орбите, если:

  • Высота > 100 км (выше атмосферы)
  • Скорость близка к орбитальной для данной высоты: v = sqrt(G*M/r) (±10%)

Состояния ракеты

  • FLIGHT - активный полёт с работающими двигателями
  • ORBIT - стабильная орбита достигнута
  • LANDED - мягкая посадка (скорость < 5 м/с при касании)
  • CRASHED - крушение (скорость >= 5 м/с при касании)

Конфигурация ракеты по умолчанию

  • Масса пустой: 20 000 кг
  • Топливо: 400 000 кг
  • Двигатель: 7 600 кН тяги, расход 2 500 кг/с
  • Аэродинамика: Cd = 0.3, сечение 12 м2
  • Время работы двигателя: ~160 с

Визуализация (3D)

Масштабирование

  • Земля отображается как сфера радиусом 100 единиц
  • Высота ракет преувеличена в 10x для видимости
  • Камера автоматически отъезжает при отслеживании высотных ракет

Космодромы

4 космодрома с реальными координатами:

  1. Байконур (45.965N, 63.305E) - Россия
  2. Мыс Канаверал (28.573N, 80.649W) - США
  3. Куру (5.239N, 52.768W) - Французская Гвиана
  4. Восточный (51.884N, 128.333E) - Россия

Панель управления (UI)

  • CREATE ROCKET - создание и запуск ракет с выбором космодрома
  • ACTIVE ROCKETS - список ракет со статусами [F]/[O]/[L]/[X]
  • TELEMETRY - подробная телеметрия выбранной ракеты:
    • Высота, скорость, вертикальная скорость
    • Ускорение (G), масса, топливо
    • Время полёта, сравнение с орбитальной скоростью
    • Кнопки TRACK/CENTER для камеры
  • LOGS - цветные логи событий в реальном времени

Примеры использования

Быстрый старт

# 1. Собрать всё
cd Physics && make && cd ..
cd Server && go build -o cosmodrom-server && cd ..
cd Client && CGO_LDFLAGS="-L../Physics -lrocket_physics" go build -o cosmodrom-client && cd ..
cd Graphic && mkdir -p build && cd build && cmake .. && make -j$(nproc) && cd ../..

# 2. Запустить сервер
cd Server && ./cosmodrom-server &

# 3. Запустить визуализацию
cd Graphic/build && ./cosmodrom-visualizer &

# 4. Запустить ракету 
cd Client && LD_LIBRARY_PATH=../Physics ./cosmodrom-client -name "Falcon"

Просмотр активных ракет

curl http://localhost:8080/rockets | jq

Запуск с разных космодромов

# Байконур
./cosmodrom-client -lat 45.965 -lon 63.305 -name "Soyuz"

# Мыс Канаверал
./cosmodrom-client -lat 28.573 -lon -80.649 -name "Falcon"

# Куру
./cosmodrom-client -lat 5.239 -lon -52.768 -name "Ariane"

# Восточный
./cosmodrom-client -lat 51.884 -lon 128.333 -name "Angara"

Разработка

Структура проекта

Cosmodrom/
├── Physics/                  # Физический движок (C)
│   ├── rocket_physics.h
│   ├── rocket_physics.c
│   ├── test_physics.c
│   └── Makefile
├── Server/                   # Сервер координации (Go)
│   ├── main.go
│   ├── protocol/
│   │   └── protocol.go
│   └── go.mod
├── Client/                   # Клиент-ракета (Go + CGO)
│   ├── main.go
│   ├── physics/
│   │   └── physics_wrapper.go
│   ├── protocol/
│   │   └── protocol.go
│   └── go.mod
├── Graphic/                  # 3D Визуализация (C++17 + raylib)
│   ├── CMakeLists.txt
│   ├── src/
│   │   ├── main.cpp
│   │   ├── app.cpp
│   │   ├── scene/
│   │   │   ├── scene.cpp
│   │   │   └── camera.cpp
│   │   ├── ui/
│   │   │   └── ui_manager.cpp
│   │   ├── network/
│   │   │   ├── ws_client.cpp
│   │   │   └── protocol.cpp
│   │   └── data/
│   │       ├── rocket_data.cpp
│   │       └── simulation_state.cpp
│   └── include/
│       ├── app.hpp
│       ├── scene/
│       │   ├── scene.hpp
│       │   └── camera.hpp
│       ├── ui/
│       │   └── ui_manager.hpp
│       ├── network/
│       │   ├── ws_client.hpp
│       │   └── protocol.hpp
│       └── data/
│           ├── rocket_data.hpp
│           └── simulation_state.hpp
└── README.md

Будущие улучшения

  • Графическая визуализация 3D с raylib
  • Ориентация тяги (gravity turn)
  • Панель телеметрии в реальном времени
  • Веб-интерфейс для создания и настройки ракет
  • Более реалистичная модель атмосферы
  • Многоступенчатые ракеты
  • Полная ориентация ракеты (Эйлеровы углы: pitch + yaw + roll)
  • Посадка с использованием обратной тяги
  • Сохранение истории полетов
  • Replay функция
  • Текстуры планеты и ракет

Лицензия

MIT

Авторы

Я крутой

About

My vision of the spaceport taking into account basic parameters

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published