KRPC basics import readline import rlcompleter if 'libedit' in readline.__doc__: readline.parse_and_bind("bind ^I rl_complete") else: readline.parse_and_bind("tab: complete") import krpc, time, math conn = krpc.connect(address='localhost', name='Launch into orbit') vessel = conn.space_center.active_vessel 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') periapsis = conn.add_stream(getattr, vessel.orbit, 'periapsis_altitude') eccentricity = conn.add_stream(getattr, vessel.orbit, 'eccentricity') srb_fuel = conn.add_stream(vessel.resources.amount, 'SolidFuel'), stage=3) launcher_fuel = conn.add_stream(vessel.resources.amount, 'LiquidFuel', stage=2) time_to_apoapsis = conn.add_stream(getattr, vessel.orbit, 'time_to_apoapsis') time_to_periapsis = conn.add_stream(getattr, vessel.orbit, 'time_to_periapsis') def BurnProgradeToApo(target_altitude): vessel.auto_pilot.set_direction((0,1,0), reference_frame=vessel.orbital_reference_frame, wait=True) vessel.control.throttle = 1.0 while apoapsis() < target_altitude: pass print 'Target apoapsis reached' vessel.control.throttle = 0 def BurnRetroToPeri(target_altitude): time_to_apoapsis = conn.add_stream(getattr, vessel.orbit, 'time_to_apoapsis') sleep_time = ut() + time_to_periapsis() - 20 conn.space_center.warp_to(sleep_time) vessel.auto_pilot.set_direction((0,-1,0), reference_frame=vessel.orbital_reference_frame, wait=True) vessel.control.throttle = 0.25 while periapsis() > target_altitude: pass print 'Target periapsis reached' vessel.control.throttle = 0 def Braking(target_apo): vessel.auto_pilot.set_direction((0,-1,0), reference_frame=vessel.orbital_reference_frame, wait=True) vessel.control.throttle = 0.25 while vessel.orbit.apoapsis_altitude > target_apo: pass print 'Target apoapsis reached' vessel.control.throttle = 0 def HohCircilarizeUp(): 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) Burn(node) def HohCircilarizedDown(): mu = vessel.orbit.body.gravitational_parameter r1 = vessel.orbit.periapsis r2 = r1 a1 = vessel.orbit.semi_major_axis a2 = vessel.orbit.periapsis v1 = math.sqrt(mu*((2./r1)-(1./a1))) v2 = math.sqrt(mu*((2./r2)-(1./a2))) delta_v = v2 - v1 node = vessel.control.add_node(ut() + vessel.orbit.time_to_periapsis, prograde=delta_v) Burn(node) def Burn(node): F = vessel.thrust Isp = vessel.specific_impulse * 9.82 m0 = vessel.mass m1 = m0 / math.exp(node.delta_v/Isp) flow_rate = F / Isp burn_time = (m0 - m1) / flow_rate # vessel.auto_pilot.set_direction((0,1,0), reference_frame=node.reference_frame, wait=True) # burn_ut = node.ut - (burn_time/2.) lead_time = 5 conn.space_center.warp_to(burn_ut - lead_time) # print 'Ready to execute burn' while node.time_to - (burn_time/2.) > 0: pass print 'Executing burn' vessel.control.throttle = 0.25 time.sleep(burn_time - 0.1) print 'Fine tuning' vessel.control.throttle = 0.05 remaining_burn = conn.add_stream(node.remaining_burn_vector, node.reference_frame) while remaining_burn()[1] > 0: pass vessel.control.throttle = 0 node.remove()