Exemplo n.º 1
0
    def test_clamp_to(self, mock_conn):
        """Check that clamp_to() works."""
        transfer = HohmannTransfer()

        self.assertEqual(transfer.clamp_to(-10, 360), 350)
        self.assertEqual(transfer.clamp_to(20, 360), 20)
        self.assertEqual(transfer.clamp_to(390, 360), 30)
Exemplo n.º 2
0
    def test_sma_from_period(self, mock_conn):
        """Check that sma_from_period() works."""
        vessel = mock_conn().space_center.active_vessel
        vessel.orbit.body.gravitational_parameter = 1

        transfer = HohmannTransfer()

        self.assertAlmostEqual(transfer.sma_from_period(16 * pi), 4)
Exemplo n.º 3
0
    def test_target_altitude(self, mock_conn):
        """Check that target_altitude sets target_sma."""
        mock_conn().space_center.active_vessel.orbit.body.equatorial_radius = 1

        transfer = HohmannTransfer()
        transfer.target_altitude = 10

        self.assertEqual(transfer.target_altitude, 10)
        self.assertEqual(transfer.target_sma, 11)
Exemplo n.º 4
0
    def test_target_period(self, mock_conn):
        """Check that target_period sets target_sma."""
        vessel = mock_conn().space_center.active_vessel
        vessel.orbit.body.gravitational_parameter = 1

        transfer = HohmannTransfer()
        transfer.target_period = 16 * pi

        self.assertAlmostEqual(transfer.target_period, 16 * pi)
        self.assertAlmostEqual(transfer.target_sma, 4)
Exemplo n.º 5
0
    def test_transfer_to_synchronous_orbit(self, mock_conn):
        """Check transfer_to_synchronous_orbit sets target_sma."""
        vessel = mock_conn().space_center.active_vessel
        vessel.orbit.semi_major_axis = 4
        vessel.orbit.body.gravitational_parameter = 1
        vessel.orbit.body.rotational_period = 20

        transfer = HohmannTransfer()
        transfer.transfer_to_synchronous_orbit()

        self.assertAlmostEqual(transfer.target_period, 20)
Exemplo n.º 6
0
    def test_initial_phase(self, mock_conn):
        """Check that initial_phase is set from active vessel."""
        mock_conn().space_center.active_vessel.flight().longitude = 20

        transfer = HohmannTransfer()

        self.assertEqual(transfer.initial_phase, 20)
Exemplo n.º 7
0
    def test_transfer_sma(self, mock_conn):
        """Check that transfer_sma is the average of initial & target smas."""
        mock_conn().space_center.active_vessel.orbit.semi_major_axis = 10

        transfer = HohmannTransfer(target_sma=30)

        self.assertEqual(transfer.transfer_sma, 20)
Exemplo n.º 8
0
    def test_init_target_sma_no_karg(self, mock_conn):
        """Check that __init__ w/o karg sets target_sma to inital_sma."""
        mock_conn().space_center.active_vessel.orbit.semi_major_axis = 10

        transfer = HohmannTransfer()

        self.assertEqual(transfer.target_sma, 10)
Exemplo n.º 9
0
    def test_transfer_to_rendezvous(self, mock_conn):
        """Should set target_sma & delay with a target."""
        vessel = mock_conn().space_center.active_vessel
        vessel.orbit.semi_major_axis = 4
        vessel.orbit.body.gravitational_parameter = 1
        vessel.flight().longitude = 0

        target = mock_conn().space_center.target_vessel
        target.orbit.semi_major_axis = 9
        target.flight().longitude = 20

        transfer = HohmannTransfer()
        transfer.transfer_to_rendezvous()

        self.assertAlmostEqual(transfer.target_sma, 9)
        self.assertAlmostEqual(transfer.target_phase, 20)
Exemplo n.º 10
0
 def test_no_krpc_connection(self):
     """Server unreachable should raise ConnectionRefusedError."""
     try:
         HohmannTransfer()
     except Exception as e:
         self.assertIsInstance(e, ConnectionRefusedError)
     return
Exemplo n.º 11
0
    def test_initial_sma(self, mock_conn):
        """Check that inital_sma is set from active vessel."""
        mock_conn().space_center.active_vessel.orbit.semi_major_axis = 10

        transfer = HohmannTransfer()

        self.assertEqual(transfer.initial_sma, 10)
Exemplo n.º 12
0
    def test_transfer_to_rendezvous_no_target(self, mock_conn):
        """Should warn but not raise AttributeError w/o target."""
        mock_conn().space_center.target_vessel = None

        transfer = HohmannTransfer()

        with self.subTest('Does not raise AttributeError'):
            with patch('sys.stdout') as mock_stdout:
                try:
                    transfer.transfer_to_rendezvous()
                except AttributeError:
                    self.fail('Should have caught the AttributeError')

        calls = [call('No target found: transfer unchanged.')]
        with self.subTest('Writes warning to stdout'):
            mock_stdout.write.assert_has_calls(calls)
Exemplo n.º 13
0
    def test_repr(self, mock_conn):
        """Check that the __repr__() method works."""
        actual_str = repr(HohmannTransfer(target_sma=2000000.0, delay=100.0))

        expect_str = 'HohmannTransfer(target_sma=2000000.0, delay=100.0)'

        self.assertEqual(actual_str, expect_str)
Exemplo n.º 14
0
    def test_add_nodes(self, mock_conn):
        """Should call KRPC's add_node() twice with the correct kargs."""
        vessel = mock_conn().space_center.active_vessel
        vessel.orbit.semi_major_axis = 2
        vessel.orbit.body.gravitational_parameter = 1
        mock_conn().space_center.ut = 0

        transfer = HohmannTransfer(target_sma=3)
        transfer.add_nodes()

        expect_calls = [
            call(prograde=transfer.initial_dV, ut=0),
            call(prograde=transfer.final_dV, ut=transfer.transfer_time)
        ]

        control = mock_conn().space_center.active_vessel.control
        control.add_node.assert_has_calls(expect_calls)
Exemplo n.º 15
0
    def test_mu(self, mock_conn):
        """Check that gravitational parameter is set from active vessel."""
        vessel = mock_conn().space_center.active_vessel
        vessel.orbit.body.gravitational_parameter = 10

        transfer = HohmannTransfer()

        self.assertEqual(transfer.mu, 10)
Exemplo n.º 16
0
    def test_initial_altitude(self, mock_conn):
        """Check that initial_altitude is set from active vessel."""
        vessel = mock_conn().space_center.active_vessel
        vessel.orbit.semi_major_axis = 10
        vessel.orbit.body.equatorial_radius = 1

        transfer = HohmannTransfer()

        self.assertEqual(transfer.initial_altitude, 9)
Exemplo n.º 17
0
    def test_initial_period(self, mock_conn):
        """Check that initial_period is set from active vessel."""
        vessel = mock_conn().space_center.active_vessel
        vessel.orbit.semi_major_axis = 4
        vessel.orbit.body.gravitational_parameter = 1

        transfer = HohmannTransfer()

        self.assertAlmostEqual(transfer.initial_period, 16 * pi)
Exemplo n.º 18
0
    def test_transfer_time(self, mock_conn):
        """Should set transfer_time from active vessel & target_sma."""
        vessel = mock_conn().space_center.active_vessel
        vessel.orbit.semi_major_axis = 2
        vessel.orbit.body.gravitational_parameter = 1

        transfer = HohmannTransfer(target_sma=6)

        self.assertAlmostEqual(transfer.transfer_time, 8 * pi)
Exemplo n.º 19
0
    def test_phase_change(self, mock_conn):
        """Check that phase_change is set from active vessel & target_sma."""
        vessel = mock_conn().space_center.active_vessel
        vessel.orbit.semi_major_axis = 2
        vessel.orbit.body.gravitational_parameter = 1

        transfer = HohmannTransfer(target_sma=3)

        self.assertAlmostEqual(transfer.phase_change, 43.0693606237085)
Exemplo n.º 20
0
    def test_final_dV(self, mock_conn):
        """Check that final_dV is set from active vessel & target_sma."""
        vessel = mock_conn().space_center.active_vessel
        vessel.orbit.semi_major_axis = 16
        vessel.orbit.body.gravitational_parameter = 8

        transfer = HohmannTransfer(target_sma=2)

        self.assertAlmostEqual(transfer.final_dV, -2 / 3)
Exemplo n.º 21
0
    def test_relative_period(self, mock_conn):
        """Should set relative_period from active vessel & target_sma."""
        vessel = mock_conn().space_center.active_vessel
        vessel.orbit.semi_major_axis = 4
        vessel.orbit.body.gravitational_parameter = 1

        transfer = HohmannTransfer(target_sma=9)

        self.assertAlmostEqual(transfer.relative_period,
                               pi * 16 * 54 / (16 - 54))
Exemplo n.º 22
0
    def test_target_phase(self, mock_conn):
        """Check that target_phase sets itself (clamped) as well as delay."""
        vessel = mock_conn().space_center.active_vessel
        vessel.orbit.semi_major_axis = 2
        vessel.orbit.body.gravitational_parameter = 1
        vessel.flight().longitude = 10

        transfer = HohmannTransfer(target_sma=3)

        target_phase_baseline = transfer.initial_phase + transfer.phase_change
        with self.subTest('Target already in position.'):
            transfer.target_phase = target_phase_baseline
            self.assertAlmostEqual(transfer.target_phase,
                                   target_phase_baseline)
            self.assertAlmostEqual(transfer.delay, 0)
        with self.subTest('Target 90 degrees ahead.'):
            transfer.target_phase = 90 + target_phase_baseline
            self.assertAlmostEqual(transfer.target_phase,
                                   90 + target_phase_baseline)
            self.assertAlmostEqual(transfer.delay,
                                   0.25 * abs(transfer.relative_period))
        with self.subTest('Target 90 degrees behind.'):
            transfer.target_phase = -90 + target_phase_baseline
            self.assertAlmostEqual(transfer.target_phase,
                                   270 + target_phase_baseline)
            self.assertAlmostEqual(transfer.delay,
                                   0.75 * abs(transfer.relative_period))
        with self.subTest('Target a full turn & a third degrees ahead.'):
            transfer.target_phase = 480 + target_phase_baseline
            self.assertAlmostEqual(transfer.target_phase,
                                   120 + target_phase_baseline)
            self.assertAlmostEqual(transfer.delay,
                                   1 / 3 * abs(transfer.relative_period))
Exemplo n.º 23
0
    def test_str(self, mock_conn):
        """Check that the __str__() method works."""
        vessel = mock_conn().space_center.active_vessel
        vessel.orbit.semi_major_axis = 10**6
        vessel.orbit.body.gravitational_parameter = 10**12
        vessel.orbit.body.equatorial_radius = 1

        actual_str = str(HohmannTransfer(target_sma=2 * 10**6))

        expect_str = 'Hohmann transfer from  1000 km altitude to '
        expect_str += '2000 km altitude:\n'
        expect_str += '    1. Wait:       0 seconds to burn: '
        expect_str += '154.7 m/s prograde.\n'
        expect_str += '    2. Wait:    5771 seconds to burn: '
        expect_str += '129.8 m/s prograde.\n'

        self.assertEqual(actual_str, expect_str)
Exemplo n.º 24
0
    def test_init_delay(self, mock_conn):
        """Check that __init__ with delay karg sets it."""
        transfer = HohmannTransfer(delay=10)

        self.assertEqual(transfer.delay, 10)
Exemplo n.º 25
0
    def test_init_delay_no_karg(self, mock_conn):
        """Check that __init__ w/o karg sets delay to zero."""
        transfer = HohmannTransfer()

        self.assertEqual(transfer.delay, 0)
Exemplo n.º 26
0
    def test_init_target_sma(self, mock_conn):
        """Check that __init__ with target_sma karg sets it."""
        transfer = HohmannTransfer(target_sma=10)

        self.assertEqual(transfer.target_sma, 10)
Exemplo n.º 27
0
    def test_krpc_connection(self, mock_conn):
        """Check that __init__ connects to KRPC server."""
        HohmannTransfer()

        mock_conn.assert_called_once_with(name='HohmannTransfer')
Exemplo n.º 28
0
    def test_delay(self, mock_conn):
        """Check that target_sma can be set."""
        transfer = HohmannTransfer()
        transfer.delay = 10

        self.assertEqual(transfer.delay, 10)
Exemplo n.º 29
0
"""
Adds two nodes for a Hohmann transfer to a given altitude.

Currently checks that the initial orbit is reasonably circular.
"""

from HohmannTransfer import HohmannTransfer

DELAY = 180  # in seconds
transfer = HohmannTransfer(delay=DELAY)

TARGET_ALTITUDE = 100 * 1000  # in meters
transfer.target_altitude = TARGET_ALTITUDE

print(transfer)

transfer.add_nodes()
Exemplo n.º 30
0
"""
Adds two nodes for a Hohmann transfer to synchronous orbit around current body.

Currently checks that the initial orbit is reasonably circular.
"""

from HohmannTransfer import HohmannTransfer

transfer = HohmannTransfer()

transfer.transfer_to_synchronous_orbit()

KSC_LONGITUDE = 285.425
transfer.target_phase = KSC_LONGITUDE

print(transfer)

transfer.add_nodes()