/
Sharpk19
/
Vostok-1_109
Обзор
Документация
Войти
/
Sharpk19
/
Vostok-1_109
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Code.py
303 строки
15 KB
Ксения Келембет
create Code.py
24 дек 2025, 12:28
24 дек 2025, 12:28
5cb9e1d
Код
Авторство
О чём код?
import krpc import time # ================================== Подключаемся к серверу kRPC ========================== conn = krpc.connect(name='ВОСТОК-1') vessel = conn.space_center.active_vessel space_center = conn.space_center # ======================================= Настройки ==================================== target_apoapsis = 100_000 # целевой апоцентр 100 км target_periapsis = 80_000 # целевой перицентр 80 км turn_start_alt = 20_000 # начинаем крен раньше turn_end_alt = 80_000 # заканчиваем крен в 80 км target_40km_pitch = 5 # целевой угол на 40 км # ================================= Вспомогательные функции ========================== # Функция отделения ступени def stage_separation(): print("Отделение ступени!") vessel.control.activate_next_stage() time.sleep(1) # Активация стадии с проверкой def stage_with_check(): print("Активация стадии") vessel.control.activate_next_stage() time.sleep(0.5) if vessel.control.current_stage > 0: print(f"Стадия {vessel.control.current_stage} активирована") else: print("Нет больше стадий") # Функция для получения орбитальных параметров def get_orbit_info(): flight = vessel.flight() orbit = vessel.orbit return { 'altitude': flight.mean_altitude, 'apoapsis': orbit.apoapsis_altitude, 'periapsis': orbit.periapsis_altitude, 'speed': flight.speed, 'horizontal_speed': flight.horizontal_speed } # Проверить топливо и отделить ступень если нужно def check_fuel_and_separate(): try: liquid_fuel = vessel.resources.amount('LiquidFuel') oxidizer = vessel.resources.amount('Oxidizer') print(f"[ТОПЛИВО] Жидкое: {liquid_fuel:.1f}, Окислитель: {oxidizer:.1f}") if liquid_fuel < 10 or oxidizer < 10: print("[СТУПЕНЬ] Топливо на исходе! Отделяем ступень...") vessel.control.activate_next_stage() time.sleep(1) return True return False except Exception as e: print(f"[ОШИБКА] Не удалось проверить топливо: {e}") return False # Функция для получения информации о топливе def get_fuel_info(): info = {} info['liquid_fuel'] = vessel.resources.amount('LiquidFuel') info['oxidizer'] = vessel.resources.amount('Oxidizer') return info # Рассчитать целевой тангаж для достижения 15° на 40 км def calculate_pitch_for_40km(current_alt, turn_start_alt, turn_end_alt, target_40km_alt=40_000): if current_alt <= turn_start_alt: return 90.0 elif current_alt >= turn_end_alt: return 0.0 elif current_alt <= target_40km_alt: # от 20 км до 40 км: от 90° до 15° progress = (current_alt - turn_start_alt) / (target_40km_alt - turn_start_alt) pitch = 90.0 - (progress * 75.0) # 90° -> 15° return max(15.0, pitch) # не меньше 15° else: # от 40 км до 80 км: от 15° до 0° progress = (current_alt - target_40km_alt) / (turn_end_alt - target_40km_alt) pitch = 15.0 - (progress * 15.0) # 15° -> 0° return max(0.0, pitch) # Функция для плавного изменения угла def smooth_pitch_change(current_pitch, target_pitch, smoothing=0.3): return current_pitch * (1 - smoothing) + target_pitch * smoothing # Функция для расчета разницы долгот def calculate_longitude_diff(current, start): diff = current - start if diff < 0: diff += 360 return diff # =================================== 1. ЗАПУСК =========================================== print("Запуск!") print(f"Топливо: {vessel.resources.amount('LiquidFuel')} жид.топлива") vessel.control.sas = False vessel.control.rcs = False time.sleep(1) vessel.control.throttle = 1.0 time.sleep(1) vessel.auto_pilot.engage() time.sleep(0.5) stage_separation() time.sleep(0.5) # ============================= 2. ВЕРТИКАЛЬНЫЙ ПОДЪЕМ =================================== print("Вертикальный подъем до 20 км") vessel.auto_pilot.target_pitch_and_heading(90, 90) altitude_stream = conn.add_stream(getattr, vessel.flight(), 'mean_altitude') current_pitch = 90.0 while altitude_stream() < turn_start_alt: current_alt = altitude_stream() print(f"Высота: {current_alt:.0f} м | Тангаж: 90° | Вертикальный подъем") time.sleep(0.5) # ============================ 3. ГРАВИТАЦИОННЫЙ ПОВОРОТ ================================= print("Начинаем гравитационный поворот") k = 0 while altitude_stream() < turn_end_alt: k += 1 current_alt = altitude_stream() # рассчитываем целевой угол для текущей высоты target_pitch = calculate_pitch_for_40km(current_alt, turn_start_alt, turn_end_alt) # плавно меняем угол current_pitch = smooth_pitch_change(current_pitch, target_pitch, smoothing=0.4) # устанавливаем новый угол vessel.auto_pilot.target_pitch_and_heading(current_pitch, 90) # выводим информацию каждые 2 км высоты if k % 5 == 0: print(f"Высота: {current_alt / 1000:.1f} км | Тангаж: {current_pitch:.1f}° | Цель: {target_pitch:.1f}°") try: fuel_info = get_fuel_info() if 'liquid_fuel' in fuel_info: liquid_fuel = fuel_info['liquid_fuel'] if liquid_fuel < 20: print(f"Мало топлива: {liquid_fuel:.1f}, проверяем ступени...") check_fuel_and_separate() else: print("Не удалось получить данные о топливе") except Exception as e: print(f"Ошибка при проверке топлива: {e}") time.sleep(0.1) print(f"Завершили гравитационный поворот на высоте {turn_end_alt / 1000:.0f} км") # ============== 4. ГОРИЗОНТАЛЬНЫЙ РАЗГОН ДО ВЫХОДА НА СУБОРБИТАЛЬНУЮ ТРАЕКТОРИЮ =========== print("ГОРИЗОНТАЛЬНЫЙ РАЗГОН ДО ВЫХОДА НА СУБОРБИТАЛЬНУЮ ТРАЕКТОРИЮ") vessel.auto_pilot.target_pitch_and_heading(0, 90) # полностью горизонтально time.sleep(2) actual_pitch = vessel.flight().pitch print(f"Текущий угол тангажа: {actual_pitch:.1f}°") print("\nОтделение отработанных ступеней") for _ in range(2): # пробуем отделить до 2 ступеней try: stage_with_check() except: break # ждем, пока апоцентр не поднимется выше 70 км orbit = vessel.orbit apoapsis_stream = conn.add_stream(getattr, orbit, 'apoapsis_altitude') periapsis_stream = conn.add_stream(getattr, orbit, 'periapsis_altitude') print("\nНабираем горизонтальную скорость для выхода на орбиту...") while apoapsis_stream() < 70000: info = get_orbit_info() print( f"Апоцентр: {info['apoapsis']:.0f} м | Гориз. скорость: {info['horizontal_speed']:.0f} м/с | Тангаж: {vessel.flight().pitch:.1f}°") time.sleep(1) # ======================== 5. ВЫКЛЮЧАЕМ ДВИГАТЕЛЬ И ЖДЕМ АПОЦЕНТРА ============================ print(f"\nДостигли суборбитальной траектории, апоцентр: {apoapsis_stream():.0f} м") vessel.control.throttle = 0 print("Ожидаем апоцентр для выведения на орбиту...") vessel.auto_pilot.disengage() time.sleep(0.5) vessel.control.sas = True time.sleep(2) vessel.control.sas_mode = space_center.SASMode.prograde # ========================= 6. ФИНАЛЬНЫЙ РАЗГОН В АПОЦЕНТРЕ ============================= print("ФИНАЛЬНЫЙ РАЗГОН В АПОЦЕНТРЕ") time_to_apo = vessel.orbit.time_to_apoapsis while time_to_apo > 60: # ждем, пока до апоцентра не останется 60 секунд time_to_apo = vessel.orbit.time_to_apoapsis info = get_orbit_info() print(f"Ждем апоцентр... {time_to_apo:.0f} сек | Перицентр: {info['periapsis']:.0f} м") time.sleep(2) vessel.auto_pilot.engage() time.sleep(1) print("Приближаемся к апоцентру, начинаем разгон!") vessel.control.throttle = 1.0 # разгоняемся, пока перицентр не станет положительным и не достигнет цели orbit_achieved = False while not orbit_achieved: info = get_orbit_info() current_peri = info['periapsis'] current_apo = info['apoapsis'] print(f"Апоцентр: {current_apo:.0f} м | Перицентр: {current_peri:.0f} м") # если перицентр стал положительным и больше 70 км if current_peri > 0 and current_peri >= target_periapsis and current_apo >= target_apoapsis: print(f"ОРБИТА ДОСТИГНУТА! Перицентр: {current_peri:.0f} м") orbit_achieved = True break time.sleep(0.5) # ====================================== 7. ЗАВЕРШЕНИЕ ====================================== vessel.control.throttle = 0 time.sleep(1) print("\nОрбитальный маневр завершен!") if vessel.control.current_stage > 1: # если есть еще ступени print("Проверяем, нужно ли отделять ступени...") fuel_info = get_fuel_info() # отделяем только если в текущей ступени нет топлива if fuel_info.get('liquid_fuel', 1) < 5 or fuel_info.get('oxidizer', 1) < 5: print("Топливо кончилось, отделяем ступень...") check_fuel_and_separate() else: print("Топливо есть, оставляем ступень") info = get_orbit_info() print("ФИНАЛЬНАЯ ОРБИТА:") print(f"Апоцентр: {info['apoapsis']:.0f} м ({info['apoapsis'] / 1000:.1f} км)") print(f"Перицентр: {info['periapsis']:.0f} м ({info['periapsis'] / 1000:.1f} км)") print(f"Скорость: {info['speed']:.0f} м/с") print(f"Высота: {info['altitude']:.0f} м") print(f"Горизонтальная скорость: {info['horizontal_speed']:.0f} м/с") print("\nКорабль на стабильной орбите!") print("остановимся за 1300 км до старта") # =========================== 8. Рассчитываем параметры для витка ======================== ksc_lon = -74.57 shortfall_km = 122 shortfall_deg = 75 target_progress_deg = 360 - shortfall_deg # для недолёта 122 км нужно пролететь orbit_percent = (target_progress_deg / 360) * 100 # ============================== 9. Ждём пока не пролетим 330° ================================ vessel.control.sas = True time.sleep(2) vessel.control.sas_mode = conn.space_center.SASMode.prograde time.sleep(3) start_longitude = vessel.flight().longitude # запоминаем начальную точку print("Ожидание точки торможения...") while True: current_lon = vessel.flight().longitude progress_deg = calculate_longitude_diff(current_lon, start_longitude) # сколько пролетели от старта current_percent = (progress_deg / 360) * 100 # процент витка if int(time.time()) % 5 == 0: # выводим каждые 5 секунд print(f"Прогресс: {progress_deg:.1f}° / {target_progress_deg:.0f}° | " f"{current_percent:.1f}% витка | " f"Долгота: {current_lon:.1f}°", end='\r') # если пролетели достаточно для недолёта - останавливаемся if progress_deg >= target_progress_deg: print(f"\nДОСТИГНУТА ТОЧКА ДЛЯ ТОРМОЖЕНИЯ!") print(f"Пролетели: {progress_deg:.1f}° из 360°") print(f"Текущая долгота: {current_lon:.1f}°") print(f"До KSC осталось: ~{shortfall_km} км") break time.sleep(0.1) try: conn.space_center.rails_warp_factor = 0 conn.space_center.physics_warp_factor = 0 print("Варп выключен") except: pass # ================================ 10. СХОД С ОРБИТЫ =================================== print("СПУСК С ОРБИТЫ") print("1. Ориентация retrograde") vessel.auto_pilot.disengage() time.sleep(0.5) vessel.control.sas = True time.sleep(1) vessel.control.sas_mode = space_center.SASMode.retrograde time.sleep(7) print("2. Торможение 30 секунд") vessel.control.throttle = 1.0 for i in range(30, 0, -1): peri = vessel.orbit.periapsis_altitude print(f"[{i:2d}с] Перицентр: {peri:,.0f} м", end='\r') time.sleep(1) vessel.control.throttle = 0.0 print("\nТорможение завершено") # 3. проверяем и ждем peri = vessel.orbit.periapsis_altitude print(f"Перицентр после торможения: {peri:,.0f} м") if peri > 0: print("Нужно еще торможение...") vessel.control.throttle = 1.0 time.sleep(10) vessel.control.throttle = 0.0 # 4. ждем посадки print("Ожидаем автоматической посадки...") while vessel.flight().surface_altitude > 0: alt = vessel.flight().surface_altitude print(f"Высота: {alt:,.0f} м", end='\r') if alt < 5_000: # парашюты на 5000 м vessel.control.activate_next_stage() time.sleep(0.1) if alt < 200: # шасси на 200 м vessel.control.gear = True time.sleep(0.1) print("\nПосадка выполнена!")