Files
kttd/maneuvers/rendezvous.py
2023-08-25 00:44:19 +02:00

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)