104 lines
2.6 KiB
Python
104 lines
2.6 KiB
Python
import numpy as np
|
|
|
|
from utils import execute_node, magnitude
|
|
|
|
|
|
def align_orbit_planes(conn):
|
|
print("Aligning planes")
|
|
mj = conn.mech_jeb
|
|
mp = mj.maneuver_planner
|
|
oi = mp.operation_inclination
|
|
oi.time_selector.time_reference = mj.TimeReference.eq_nearest_ad
|
|
nodes = oi.make_nodes()
|
|
|
|
# kac = conn.kerbal_alarm_clock
|
|
# kac.create_alarm(
|
|
# kac.AlarmType.maneuver,
|
|
# "{}'s Orbital transfer".format(v.name),
|
|
# nodes[0].ut
|
|
# )
|
|
|
|
execute_node(conn)
|
|
|
|
print("Planes aligned!")
|
|
|
|
|
|
def intercepting_target_orbit(conn):
|
|
print("Intercepting target orbit")
|
|
sc = conn.space_center
|
|
v = sc.active_vessel
|
|
mj = conn.mech_jeb
|
|
mp = mj.maneuver_planner
|
|
ot = mp.operation_transfer
|
|
ot.time_selector.time_reference = mj.TimeReference.computed
|
|
nodes = ot.make_nodes()
|
|
nodes[0].ut = nodes[0].ut + 0.1
|
|
|
|
# kac = conn.kerbal_alarm_clock
|
|
# kac.create_alarm(
|
|
# kac.AlarmType.maneuver,
|
|
# "{}'s Orbital transfer".format(v.name),
|
|
# nodes[0].ut
|
|
# )
|
|
|
|
execute_node(conn)
|
|
|
|
print("Target orbit intercepted!")
|
|
|
|
|
|
def tune_closest_approach(conn):
|
|
print("Tuning closest approach")
|
|
sc = conn.space_center
|
|
v = sc.active_vessel
|
|
mj = conn.mech_jeb
|
|
mp = mj.maneuver_planner
|
|
occ = mp.operation_course_correction
|
|
nodes = occ.make_nodes()
|
|
|
|
# kac = conn.kerbal_alarm_clock
|
|
# kac.create_alarm(
|
|
# kac.AlarmType.maneuver,
|
|
# "{}'s Orbital transfer".format(v.name),
|
|
# nodes[0].ut
|
|
# )
|
|
|
|
execute_node(conn)
|
|
|
|
print("Closest approach tuned!")
|
|
|
|
|
|
def match_velocities(conn):
|
|
print("Matching velocities")
|
|
sc = conn.space_center
|
|
v = sc.active_vessel
|
|
mj = conn.mech_jeb
|
|
mp = mj.maneuver_planner
|
|
okrv = mp.operation_kill_rel_vel
|
|
nodes = okrv.make_nodes()
|
|
|
|
# kac = conn.kerbal_alarm_clock
|
|
# kac.create_alarm(
|
|
# kac.AlarmType.maneuver,
|
|
# "{}'s Orbital transfer".format(v.name),
|
|
# nodes[0].ut
|
|
# )
|
|
|
|
execute_node(conn)
|
|
|
|
print("Velocities matched!")
|
|
|
|
|
|
def maneuver_to_rendezvous(conn, vessel, target):
|
|
if vessel.orbit.distance_at_closest_approach(target.orbit) > 1000:
|
|
if vessel.orbit.relative_inclination(target.orbit) > 0.0001:
|
|
align_orbit_planes(conn)
|
|
|
|
if vessel.orbit.distance_at_closest_approach(target.orbit) > 10000:
|
|
intercepting_target_orbit(conn)
|
|
|
|
tune_closest_approach(conn)
|
|
|
|
if vessel.orbit.distance_at_closest_approach(target.orbit) <= 1000 < magnitude(
|
|
np.array(vessel.position(vessel.reference_frame)) - np.array(target.position(vessel.reference_frame))):
|
|
match_velocities(conn)
|