Files
kttd/maneuvers/rendezvous.py
2023-08-29 01:01:24 +02:00

88 lines
2.7 KiB
Python

import numpy as np
from .utils import magnitude
from maneuver_scheduler import ManeuverScheduler
from . import MechJebManeuver
class RendezvousManeuver(MechJebManeuver):
def start(self):
self.plan_next_maneuver()
def plan_next_maneuver(self):
sc = self.conn.space_center
vessel = sc.active_vessel
target = sc.target_vessel
if vessel.orbit.distance_at_closest_approach(target.orbit) > 1000:
if vessel.orbit.relative_inclination(target.orbit) > 0.0001:
AlignOrbitPlaneWithTarget(self.conn, vessel).prepare_maneuver()
elif vessel.orbit.distance_at_closest_approach(target.orbit) > 10000:
InterceptTargetOrbit(self.conn, vessel).prepare_maneuver()
else:
TuneClosestApproach(self.conn, vessel).prepare_maneuver()
return False
elif vessel.orbit.distance_at_closest_approach(target.orbit) <= 1000 < magnitude(
np.array(vessel.position(vessel.reference_frame)) - np.array(target.position(vessel.reference_frame))):
MatchVelocityWithTarget(self.conn, vessel).prepare_maneuver()
return False
else:
return True
class AlignOrbitPlaneWithTarget(RendezvousManeuver):
name = "Align orbit plane with target's"
def prepare_maneuver(self):
oi = self.maneuver_planner.operation_inclination
oi.time_selector.time_reference = self.mech_jeb.TimeReference.eq_nearest_ad
nodes = oi.make_nodes()
node = nodes[0]
ManeuverScheduler.book_timeslot_for_node(self.vessel, node, self)
class InterceptTargetOrbit(RendezvousManeuver):
name = "Intercept target's orbit"
def prepare_maneuver(self):
ot = self.maneuver_planner.operation_transfer
ot.time_selector.time_reference = self.mech_jeb.TimeReference.computed
nodes = ot.make_nodes()
node = nodes[0]
node.ut = node.ut + 1
ManeuverScheduler.book_timeslot_for_node(self.vessel, node, self)
class TuneClosestApproach(RendezvousManeuver):
name = "Tune closest approach with target"
def prepare_maneuver(self):
occ = self.maneuver_planner.operation_course_correction
nodes = occ.make_nodes()
node = nodes[0]
ManeuverScheduler.book_timeslot_for_node(self.vessel, node, self)
class MatchVelocityWithTarget(RendezvousManeuver):
name = "Math velocity with target's"
duration = 10 * 60
def prepare_maneuver(self):
okrv = self.maneuver_planner.operation_kill_rel_vel
nodes = okrv.make_nodes()
node = nodes[0]
ManeuverScheduler.book_timeslot_for_node(self.vessel, node, self, duration=self.duration)