Beispiel #1
0
    def find_orbit(self, p, plane_change_flag):

        r = self.vessel.position(self.ref_frame)
        v = self.vessel.velocity(self.ref_frame)

        rt = self.conn.space_center.target_vessel.position(self.ref_frame)
        vt = self.conn.space_center.target_vessel.velocity(self.ref_frame)

        rt2, vt2 = um.cse_rv(rt, vt, p, self.moon.gravitational_parameter)

        if plane_change_flag:
            v1 = np.sqrt(self.moon.gravitational_parameter *
                         (2 / um.magnitude(r) - 2 /
                          (um.magnitude(r) + um.magnitude(rt))))

            v1 *= um.normalize(np.cross(np.cross(r, v), r))
        else:
            v1, v2 = um.cse_rr(r, rt2, p, -1,
                               self.moon.gravitational_parameter)

        delta_velocity = v1 - v

        uk.burn(self.conn,
                self.ui,
                self.ref_frame,
                delta_velocity,
                stopping_time=(0.1, 0.5, 0.1))
Beispiel #2
0
    def descent_orbit(self):
        target_time = self.calculate_descent_orbit_time()
        self.conn.space_center.warp_to(self.conn.space_center.ut +
                                       target_time - 15)

        position = np.array(self.vessel.position(self.ref_frame))
        velocity = np.array(self.vessel.velocity(self.ref_frame))

        speed = np.sqrt(self.moon.gravitational_parameter *
                        (2 / np.linalg.norm(position) - 2 /
                         (np.linalg.norm(position) +
                          self.moon.equatorial_radius + self.periapsis)))
        direction = um.normalize(
            np.cross(
                np.cross(np.array(self.vessel.position(self.ref_frame)),
                         np.array(self.vessel.velocity(self.ref_frame))),
                np.array(self.vessel.position(self.ref_frame))))

        delta_velocity = speed * direction - velocity

        uk.burn(self.conn,
                self.ui,
                self.ref_frame,
                delta_velocity,
                stopping_time=(0.1, 0.5, 0.1))
Beispiel #3
0
    def execute(self):
        current_phase_time = int(self.time_start + self.time_launch)

        while current_phase_time > self.conn.space_center.ut:
            self.ui.update_phase_current_time(
                int(current_phase_time - self.conn.space_center.ut))

        current_phase_time = int(self.conn.space_center.ut +
                                 self.launch_time_offset)

        while self.vessel.control.throttle > 0.0:
            self.ui.update_phase_current_time(
                int(current_phase_time - self.conn.space_center.ut))

        self.ui.update_phase_current('Low Kerbin Orbit')
        self.ui.update_phase_next('TLI Burn')

        self.ui.update_message('')
        self.ui.update_phase_current_time(0)

        self.conn.space_center.physics_warp_factor = 0

        self.conn.space_center.warp_to(self.time_start + self.time_start_burn -
                                       60)

        self.ui.update_phase_current('TLI Burn')
        self.ui.update_phase_next('Extract MEM')

        attitude, time_wait = self.burn_wait(self.angle_burn)

        uk.burn(self.conn,
                self.ui,
                self.ref_frame,
                self.burn_delta_velocity * attitude,
                delay=time_wait,
                delta_velocity_offset=-4,
                stopping_time=(10.0, 0.5, 10.0),
                change_ui_phases=True,
                phase_current='TLI Burn',
                phase_next='Extract MEM')

        self.ui.update_phase_current('Extract MEM')
        self.ui.update_phase_next('MCC')
        self.ui.update_next_action('Extract MEM')
        self.ui.update_phase_current_time(0)
        time.sleep(4)
        self.conn.space_center.warp_to(self.conn.space_center.ut + 300)

        while True:
            if self.ui.button.clicked:
                self.extract_lem()
                self.ui.button.clicked = False
                break
Beispiel #4
0
    def match_speed(self, d, v):
        while um.magnitude(self.target.position(
                self.vessel.reference_frame)) > d:
            pass

        cv = np.array(self.vessel.velocity(self.ref_frame)) - np.array(
            self.target.velocity(self.ref_frame))
        cp = np.array(self.vessel.position(self.ref_frame)) - np.array(
            self.target.position(self.ref_frame))
        desv = um.normalize(-cp) * v

        delta_velocity = desv - cv

        uk.burn(self.conn,
                self.ui,
                self.ref_frame,
                delta_velocity,
                stopping_time=(0.25, 0.5, 0.25))
Beispiel #5
0
    def change_inclination(self):
        sma_1 = (self.vessel.orbit.semi_major_axis + self.apoapsis +
                 self.moon.equatorial_radius) / 2
        sma_2 = self.apoapsis + self.moon.equatorial_radius
        sma_3 = (self.apoapsis +
                 self.periapsis) / 2 + self.moon.equatorial_radius
        period_1 = 2 * np.pi * (sma_1**3 /
                                self.moon.gravitational_parameter)**0.5
        period_2 = 2 * np.pi * (sma_2**3 /
                                self.moon.gravitational_parameter)**0.5
        period_3 = 2 * np.pi * (sma_3**3 /
                                self.moon.gravitational_parameter)**0.5

        self.lan = self.longitude + (
            period_1 / 2 + period_2 +
            period_3 / 2) / self.moon.orbit.period * 360 + np.degrees(
                self.moon.rotation_angle)

        delta_longitude = um.safe_asin(
            np.tan(np.radians(self.latitude)) / np.tan(self.inclination))

        closest_normal = self.calculate_landing_normal(np.radians(self.lan),
                                                       delta_longitude)

        angle_to_maneuver = self.calculate_angle_to_maneuver(closest_normal)

        self.conn.space_center.warp_to(self.conn.space_center.ut +
                                       angle_to_maneuver /
                                       (2 * np.pi) * self.vessel.orbit.period -
                                       15)

        attitude = um.normalize(
            np.cross(closest_normal,
                     np.array(self.vessel.position(self.ref_frame))))
        delta_velocity = attitude * np.sqrt(
            self.moon.gravitational_parameter *
            (2 / np.linalg.norm(self.vessel.position(self.ref_frame)) -
             1 / sma_1)) - self.vessel.velocity(self.ref_frame)

        uk.burn(self.conn,
                self.ui,
                self.ref_frame,
                delta_velocity,
                stopping_time=(1.0, 0.5, 1.0))
Beispiel #6
0
    def circularize(self):
        self.conn.space_center.warp_to(self.conn.space_center.ut +
                                       self.vessel.orbit.time_to_periapsis -
                                       15)

        circular_speed = np.sqrt(
            self.moon.gravitational_parameter /
            np.linalg.norm(np.array(self.vessel.position(self.ref_frame))))
        circular_direction = um.normalize(
            np.cross(
                np.cross(np.array(self.vessel.position(self.ref_frame)),
                         np.array(self.vessel.velocity(self.ref_frame))),
                np.array(self.vessel.position(self.ref_frame))))
        delta_velocity = circular_speed * circular_direction - np.array(
            self.vessel.velocity(self.ref_frame))

        uk.burn(self.conn,
                self.ui,
                self.ref_frame,
                delta_velocity,
                stopping_time=(1.0, 0.5, 1.0))
Beispiel #7
0
    def match_speed_mono(self, d, v):
        while um.magnitude(self.target.position(
                self.vessel.reference_frame)) > d:
            pass

        cv = np.array(self.vessel.velocity(self.ref_frame)) - np.array(
            self.target.velocity(self.ref_frame))
        cp = np.array(self.vessel.position(self.ref_frame)) - np.array(
            self.target.position(self.ref_frame))
        desv = um.normalize(-cp) * v

        delta_velocity = desv - cv

        uk.burn(self.conn,
                self.ui,
                self.ref_frame,
                delta_velocity,
                stopping_time=(0.25, 0.5, 0.25),
                main_engine=False,
                specified_thrust=4000,
                specified_isp=240,
                facing=-1)
        self.vessel_attitude()
Beispiel #8
0
 def execute_correction(self):
     self.conn.space_center.warp_to(self.maneuver_time - 15)
     delta_v = self.maneuver_velocity - np.array(self.vessel.velocity(self.ref_frame))
     uk.burn(self.conn, self.ui, self.ref_frame, delta_v, stopping_time=(1.0, 0.5, 1.0))
Beispiel #9
0
 def execute_correction_rcs(self):
     uk.burn(self.conn, self.ui, self.ref_frame, self.delta_v, stopping_time=(1.0, 0.5, 1.0), main_engine=False, specified_thrust=4000, specified_isp=240)
Beispiel #10
0
 def execute_correction(self):
     uk.burn(self.conn, self.ui, self.ref_frame, self.delta_v, stopping_time=(1.0, 0.5, 1.0))