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, self.mission_control).prepare_maneuver() elif vessel.orbit.distance_at_closest_approach(target.orbit) > 10000: InterceptTargetOrbit(self.conn, self.mission_control).prepare_maneuver() else: TuneClosestApproach(self.conn, self.mission_control).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, self.mission_control).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)