diff --git a/src/bsk_rl/sim/dyn/relative_motion.py b/src/bsk_rl/sim/dyn/relative_motion.py index 482327ab..c845900c 100644 --- a/src/bsk_rl/sim/dyn/relative_motion.py +++ b/src/bsk_rl/sim/dyn/relative_motion.py @@ -1,6 +1,7 @@ """Dynamics models concerning the relative motion of spacecraft.""" import types +from typing import Optional import numpy as np from Basilisk.simulation import spacecraftLocation @@ -84,15 +85,23 @@ def conjunction_valid(self) -> bool: """Check if conjunction has not occured.""" return len(self.conjunctions) == 0 - @default_args(conjunction_radius=10) - def setup_conjunctions(self, conjunction_radius: float, **kwargs) -> None: + @default_args(conjunction_radius=10, conjunction_check_rate=None) + def setup_conjunctions( + self, + conjunction_radius: float, + conjunction_check_rate: Optional[float], + **kwargs, + ) -> None: """Set up conjunction checking between satellites. Args: conjunction_radius: [m] Minimum distance for a conjunction. + conjunction_check_rate: [s] Rate at which to check for conjunctions. Defaults to sim rate. kwargs: Passed to other setup functions. """ self.conjunction_radius = conjunction_radius + if conjunction_check_rate is None: + conjunction_check_rate = self.simulator.sim_rate for sat_dyn in self.simulator.dynamics_list.values(): if sat_dyn != self and isinstance(sat_dyn, ConjunctionDynModel): @@ -126,11 +135,12 @@ def side_effect(sim): valid_func_name( f"conjunction_{self.satellite.name}_{sat_dyn.satellite.name}" ), - macros.sec2nano(self.simulator.sim_rate), + macros.sec2nano(conjunction_check_rate), True, conditionFunction=condition, actionFunction=side_effect, terminal=True, + exactRateMatch=False, ) diff --git a/src/bsk_rl/sim/simulator.py b/src/bsk_rl/sim/simulator.py index e8d9a27c..d7ea4676 100644 --- a/src/bsk_rl/sim/simulator.py +++ b/src/bsk_rl/sim/simulator.py @@ -183,7 +183,9 @@ def run(self) -> None: actionFunction=lambda sim: sim.logger.info("Max step duration reached"), terminal=True, ) - self.ConfigureStopTime(mc.sec2nano(min(self.time_limit, 2**31))) + self.ConfigureStopTime( + mc.sec2nano(min(self.time_limit, 2**31)), StopCondition=">=" + ) self.ExecuteSimulation() def delete_event(self, event_name) -> None: diff --git a/tests/unittest/sim/test_simulator.py b/tests/unittest/sim/test_simulator.py index b26a721d..4b7017e8 100644 --- a/tests/unittest/sim/test_simulator.py +++ b/tests/unittest/sim/test_simulator.py @@ -65,4 +65,6 @@ def test_run(self, simbase_init, start_time, step_duration, time_limit, stop_tim sim = self.mock_sim(max_step_duration=step_duration, time_limit=time_limit) sim.TotalSim.CurrentNanos = start_time * 1000000000 sim.run() - sim.ConfigureStopTime.assert_called_with(time_limit * 1000000000) + sim.ConfigureStopTime.assert_called_with( + time_limit * 1000000000, StopCondition=">=" + )