88 lines
2.7 KiB
Python
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)
|