|
4 | 4 |
|
5 | 5 | from bsk_rl import act, obs, sats |
6 | 6 | from bsk_rl.sim import dyn, fsw |
| 7 | +from bsk_rl.utils.orbital import random_orbit |
7 | 8 |
|
8 | 9 |
|
9 | 10 | class TestImpulsiveThrust: |
@@ -34,3 +35,36 @@ def test_thrust(self): |
34 | 35 | self.env.step([0.0, 0.0, 0.0, 5.0]) |
35 | 36 | time_after = self.env.unwrapped.simulator.sim_time |
36 | 37 | assert time_after - time_before == approx(5.0) |
| 38 | + |
| 39 | + |
| 40 | +class TestHillImpulsiveThrust: |
| 41 | + class ThrustSat(sats.Satellite): |
| 42 | + dyn_type = dyn.BasicDynamicsModel |
| 43 | + fsw_type = fsw.MagicOrbitalManeuverFSWModel |
| 44 | + observation_spec = [obs.SatProperties(dict(prop="v_BN_N"))] |
| 45 | + action_spec = [act.ImpulsiveThrustHill(chief_name="ThrusterSat")] |
| 46 | + |
| 47 | + env = gym.make( |
| 48 | + "SatelliteTasking-v1", |
| 49 | + satellite=ThrustSat( |
| 50 | + "ThrusterSat", |
| 51 | + sat_args=dict( |
| 52 | + dv_available_init=1000.0, |
| 53 | + oe=random_orbit(i=0.0, e=0.0, Omega=0.0, omega=0.0, f=90.0), |
| 54 | + ), |
| 55 | + ), |
| 56 | + sim_rate=0.01, |
| 57 | + time_limit=10000.0, |
| 58 | + disable_env_checker=True, |
| 59 | + ) |
| 60 | + |
| 61 | + def test_thrust(self): |
| 62 | + observation_before, _ = self.env.reset() |
| 63 | + observation_after, _, _, _, _ = self.env.step([100.0, 0.0, 0.0, 0.02]) |
| 64 | + diff = observation_after - observation_before |
| 65 | + assert np.allclose(diff, np.array([0.0, 100.0, 0.0]), atol=0.5) |
| 66 | + |
| 67 | + time_before = self.env.unwrapped.simulator.sim_time |
| 68 | + self.env.step([0.0, 0.0, 0.0, 5.0]) |
| 69 | + time_after = self.env.unwrapped.simulator.sim_time |
| 70 | + assert time_after - time_before == approx(5.0) |
0 commit comments