Комплексная система для симуляции запуска ракет на орбиту Земли с возможностью координации нескольких ракет одновременно, предотвращения столкновений и 3D-визуализации полёта в реальном времени.
Проект состоит из 4 компонентов на разных языках программирования:
- Расчет физики полета ракеты
- Гравитация, сопротивление атмосферы, тяга двигателей
- Ориентация тяги: gravity turn (наклон от вертикали к горизонту по pitch-углу)
- Орбитальная механика
- Обнаружение столкновений с землей
- Библиотека:
librocket_physics.so
- Координация нескольких ракет
- Обнаружение возможных столкновений
- Broadcast телеметрии всем подписчикам (наблюдателям)
- WebSocket API для обмена данными
- HTTP endpoint для просмотра списка активных ракет
- Симуляция отдельной ракеты
- Использует физический движок через CGO
- Автоматический gravity turn: постепенный наклон тяги от вертикали к горизонту
- Отправляет телеметрию на сервер в реальном времени (10 Гц)
- Получает команды управления от сервера
- 3D-отображение Земли, космодромов и ракет
- Камера с орбитальным управлением (вращение, зум, панорамирование)
- Отслеживание ракет с автоматическим зумом
- Панель телеметрии в реальном времени:
- Высота, скорость, вертикальная скорость
- Ускорение (в G), масса, топливо с прогресс-баром
- Время полёта, сравнение с орбитальной скоростью
- Визуализация траекторий с градиентным затуханием
- Эффекты: пламя двигателей, индикатор орбиты, маркер крушения
- Запуск ракет из GUI с выбором космодрома
- Логи событий в реальном времени
- WebSocket подключение к серверу как наблюдатель
- GCC или Clang (для C и C++)
- Go 1.21+ (для Server и Client)
- CMake 3.16+ (для Graphic)
- Make
cd Physics
makeЭто создаст библиотеку librocket_physics.so и тестовую программу.
Для запуска тестов:
make testcd Server
go build -o cosmodrom-servercd Client
export CGO_LDFLAGS="-L../Physics -lrocket_physics"
export LD_LIBRARY_PATH="../Physics:$LD_LIBRARY_PATH"
go build -o cosmodrom-clientcd 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)
cd Server
./cosmodrom-server -port 8080Сервер будет доступен на:
- WebSocket:
ws://localhost:8080/ws - HTTP API:
http://localhost:8080/rockets - Главная страница:
http://localhost:8080/
cd Graphic/build
./cosmodrom-visualizerПараметры:
-w WIDTH- Ширина окна (по умолчанию 1920)-h HEIGHT- Высота окна (по умолчанию 1080)-s URL- WebSocket URL сервера (по умолчаниюws://localhost:8080/ws)
Управление камерой:
- ПКМ - Вращение камеры вокруг цели
- Колесо мыши - Зум
- СКМ - Панорамирование
- Space - Отменить отслеживание ракеты
- Esc - Выход
В отдельном терминале:
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).
Вы можете запустить несколько ракет одновременно в разных терминалах:
# Терминал 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.
{
"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
}
}
}{
"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
}
}
}{
"type": "broadcast",
"data": {
"rocket_id": "rocket-001",
"name": "Popa1",
"state": { ... }
}
}{
"type": "rocket_joined",
"data": {
"rocket_id": "rocket-001",
"name": "Popa1",
"config": { ... }
}
}{
"type": "rocket_left",
"data": {
"rocket_id": "rocket-001",
"reason": "Завершение полёта"
}
}{
"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 км
- Гравитация: F = G * M * m / r^2 (направлена к центру Земли)
- Сопротивление атмосферы: F_drag = 0.5 * rho * v^2 * Cd * A
- Плотность атмосферы: rho = 1.225 * exp(-h / 8500) кг/м3
- Действует только ниже 100 км
- Тяга двигателей: Управляется дросселями (0.0 - 1.0)
- Направление: определяется pitch-углом от локальной вертикали
- pitch = 0: вертикально вверх (радиально от Земли)
- pitch = 90: горизонтально (тангенциально)
Клиент автоматически выполняет 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 с
- Земля отображается как сфера радиусом 100 единиц
- Высота ракет преувеличена в 10x для видимости
- Камера автоматически отъезжает при отслеживании высотных ракет
4 космодрома с реальными координатами:
- Байконур (45.965N, 63.305E) - Россия
- Мыс Канаверал (28.573N, 80.649W) - США
- Куру (5.239N, 52.768W) - Французская Гвиана
- Восточный (51.884N, 128.333E) - Россия
- 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
Я крутой