Skip to content

Instantly share code, notes, and snippets.

@pbasov
Created August 2, 2017 15:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pbasov/c6e41234f64a7e8da65941f9622ab4ae to your computer and use it in GitHub Desktop.
Save pbasov/c6e41234f64a7e8da65941f9622ab4ae to your computer and use it in GitHub Desktop.
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()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment