Advertisement
Guest User

LaunchToOrbit with event.wait()

a guest
Jan 23rd, 2018
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.83 KB | None | 0 0
  1. import math
  2. import time
  3. import krpc
  4.  
  5. turn_start_altitude = 250
  6. turn_end_altitude = 45000
  7. target_altitude = 150000
  8.  
  9. conn = krpc.connect(name='Launch into orbit')
  10. vessel = conn.space_center.active_vessel
  11.  
  12. # Set up streams for telemetry
  13. ut = conn.add_stream(getattr, conn.space_center, 'ut')
  14. altitude = conn.add_stream(getattr, vessel.flight(), 'mean_altitude')
  15. apoapsis = conn.add_stream(getattr, vessel.orbit, 'apoapsis_altitude')
  16. stage_2_resources = vessel.resources_in_decouple_stage(stage=2, cumulative=False)
  17. srb_fuel = conn.add_stream(stage_2_resources.amount, 'SolidFuel')
  18.  
  19. # Pre-launch setup
  20. vessel.control.sas = False
  21. vessel.control.rcs = False
  22. vessel.control.throttle = 1.0
  23.  
  24. # Countdown...
  25. print('3...')
  26. time.sleep(1)
  27. print('2...')
  28. time.sleep(1)
  29. print('1...')
  30. time.sleep(1)
  31. print('Launch!')
  32.  
  33. # Activate the first stage
  34. vessel.control.activate_next_stage()
  35. vessel.auto_pilot.engage()
  36. vessel.auto_pilot.target_pitch_and_heading(90, 90)
  37. conn.krpc.Expression
  38. # Main ascent loop
  39. srbs_separated = False
  40. turn_angle = 0
  41. while True:
  42.  
  43.     # Gravity turn
  44.     if altitude() > turn_start_altitude and altitude() < turn_end_altitude:
  45.         frac = ((altitude() - turn_start_altitude) /
  46.                 (turn_end_altitude - turn_start_altitude))
  47.         new_turn_angle = frac * 90
  48.         if abs(new_turn_angle - turn_angle) > 0.5:
  49.             turn_angle = new_turn_angle
  50.             vessel.auto_pilot.target_pitch_and_heading(90-turn_angle, 90)
  51.  
  52.     # Separate SRBs when finished
  53.     if not srbs_separated:
  54.         if srb_fuel() < 0.1:
  55.             vessel.control.activate_next_stage()
  56.             srbs_separated = True
  57.             print('SRBs separated')
  58.  
  59.     # Decrease throttle when approaching target apoapsis
  60.     if apoapsis() > target_altitude*0.9:
  61.         print('Approaching target apoapsis')
  62.         break
  63.  
  64. # Disable engines when target apoapsis is reached
  65. vessel.control.throttle = 0.25
  66. while apoapsis() < target_altitude:
  67.     pass
  68.  
  69. print('Target apoapsis reached')
  70. vessel.control.throttle = 0.0
  71.  
  72. # Wait until out of atmosphere
  73. print('Coasting out of atmosphere')
  74. while altitude() < 70500:
  75.     pass
  76.  
  77. # Plan circularization burn (using vis-viva equation)
  78. print('Planning circularization burn')
  79. mu = vessel.orbit.body.gravitational_parameter
  80. r = vessel.orbit.apoapsis
  81. a1 = vessel.orbit.semi_major_axis
  82. a2 = r
  83. v1 = math.sqrt(mu * ((2. / r) - (1. / a1)))
  84. v2 = math.sqrt(mu * ((2. / r) - (1. / a2)))
  85. delta_v = v2 - v1
  86. node = vessel.control.add_node(
  87.     ut() + vessel.orbit.time_to_apoapsis, prograde=delta_v)
  88.  
  89. # Calculate burn time (using rocket equation)
  90. F = vessel.available_thrust
  91. Isp = vessel.specific_impulse * 9.82
  92. m0 = vessel.mass
  93. m1 = m0 / math.exp(delta_v / Isp)
  94. flow_rate = F / Isp
  95. burn_time = (m0 - m1) / flow_rate
  96.  
  97. # Orientate ship
  98. print('Orientating ship for circularization burn')
  99. vessel.auto_pilot.reference_frame = node.reference_frame
  100. vessel.auto_pilot.target_direction = (0, 1, 0)
  101. vessel.auto_pilot.wait()
  102.  
  103. # Wait until burn
  104. print('Waiting until circularization burn')
  105. burn_ut = ut() + vessel.orbit.time_to_apoapsis - (burn_time / 2.)
  106. lead_time = 5
  107. conn.space_center.warp_to(burn_ut - lead_time)
  108.  
  109. # Execute burn
  110. print('Ready to execute burn')
  111. time_to_apoapsis = conn.add_stream(getattr, vessel.orbit, 'time_to_apoapsis')
  112. while time_to_apoapsis() - (burn_time / 2.) > 0:
  113.     pass
  114. print('Executing burn')
  115. vessel.control.throttle = 1.0
  116. time.sleep(burn_time - 0.1)
  117. print('Fine tuning')
  118. vessel.control.throttle = 0.05
  119. burn_complete = conn.get_call(getattr, node, 'remaining_delta_v')
  120.  
  121. expr = conn.krpc.Expression.less_than(
  122.     conn.krpc.Expression.call(burn_complete),
  123.     conn.krpc.Expression.constant_double(0.1)
  124.     )
  125.  
  126. event = conn.krpc.add_event(expr)
  127.  
  128. with event.condition:
  129.     event.wait()
  130.     vessel.control.throttle = 0.0
  131.     node.remove()
  132.  
  133. print('Launch complete')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement