Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import math
- import time
- import krpc
- turn_start_altitude = 250
- turn_end_altitude = 45000
- target_altitude = 150000
- conn = krpc.connect(name='Launch into orbit')
- vessel = conn.space_center.active_vessel
- # Set up streams for telemetry
- ut = conn.add_stream(getattr, conn.space_center, 'ut')
- altitude = conn.add_stream(getattr, vessel.flight(), 'mean_altitude')
- apoapsis = conn.add_stream(getattr, vessel.orbit, 'apoapsis_altitude')
- stage_2_resources = vessel.resources_in_decouple_stage(stage=2, cumulative=False)
- srb_fuel = conn.add_stream(stage_2_resources.amount, 'SolidFuel')
- # Pre-launch setup
- vessel.control.sas = False
- vessel.control.rcs = False
- vessel.control.throttle = 1.0
- # Countdown...
- print('3...')
- time.sleep(1)
- print('2...')
- time.sleep(1)
- print('1...')
- time.sleep(1)
- print('Launch!')
- # Activate the first stage
- vessel.control.activate_next_stage()
- vessel.auto_pilot.engage()
- vessel.auto_pilot.target_pitch_and_heading(90, 90)
- conn.krpc.Expression
- # Main ascent loop
- srbs_separated = False
- turn_angle = 0
- while True:
- # Gravity turn
- if altitude() > turn_start_altitude and altitude() < turn_end_altitude:
- frac = ((altitude() - turn_start_altitude) /
- (turn_end_altitude - turn_start_altitude))
- new_turn_angle = frac * 90
- if abs(new_turn_angle - turn_angle) > 0.5:
- turn_angle = new_turn_angle
- vessel.auto_pilot.target_pitch_and_heading(90-turn_angle, 90)
- # Separate SRBs when finished
- if not srbs_separated:
- if srb_fuel() < 0.1:
- vessel.control.activate_next_stage()
- srbs_separated = True
- print('SRBs separated')
- # Decrease throttle when approaching target apoapsis
- if apoapsis() > target_altitude*0.9:
- print('Approaching target apoapsis')
- break
- # Disable engines when target apoapsis is reached
- vessel.control.throttle = 0.25
- while apoapsis() < target_altitude:
- pass
- print('Target apoapsis reached')
- vessel.control.throttle = 0.0
- # Wait until out of atmosphere
- print('Coasting out of atmosphere')
- while altitude() < 70500:
- pass
- # Plan circularization burn (using vis-viva equation)
- print('Planning circularization burn')
- mu = vessel.orbit.body.gravitational_parameter
- r = vessel.orbit.apoapsis
- a1 = vessel.orbit.semi_major_axis
- a2 = r
- v1 = math.sqrt(mu * ((2. / r) - (1. / a1)))
- v2 = math.sqrt(mu * ((2. / r) - (1. / a2)))
- delta_v = v2 - v1
- node = vessel.control.add_node(
- ut() + vessel.orbit.time_to_apoapsis, prograde=delta_v)
- # Calculate burn time (using rocket equation)
- F = vessel.available_thrust
- Isp = vessel.specific_impulse * 9.82
- m0 = vessel.mass
- m1 = m0 / math.exp(delta_v / Isp)
- flow_rate = F / Isp
- burn_time = (m0 - m1) / flow_rate
- # Orientate ship
- print('Orientating ship for circularization burn')
- vessel.auto_pilot.reference_frame = node.reference_frame
- vessel.auto_pilot.target_direction = (0, 1, 0)
- vessel.auto_pilot.wait()
- # Wait until burn
- print('Waiting until circularization burn')
- burn_ut = ut() + vessel.orbit.time_to_apoapsis - (burn_time / 2.)
- lead_time = 5
- conn.space_center.warp_to(burn_ut - lead_time)
- # Execute burn
- print('Ready to execute burn')
- time_to_apoapsis = conn.add_stream(getattr, vessel.orbit, 'time_to_apoapsis')
- while time_to_apoapsis() - (burn_time / 2.) > 0:
- pass
- print('Executing burn')
- vessel.control.throttle = 1.0
- time.sleep(burn_time - 0.1)
- print('Fine tuning')
- vessel.control.throttle = 0.05
- burn_complete = conn.get_call(getattr, node, 'remaining_delta_v')
- expr = conn.krpc.Expression.less_than(
- conn.krpc.Expression.call(burn_complete),
- conn.krpc.Expression.constant_double(0.1)
- )
- event = conn.krpc.add_event(expr)
- with event.condition:
- event.wait()
- vessel.control.throttle = 0.0
- node.remove()
- print('Launch complete')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement