def test_step_event(self): """ 测试运行事件. """ env = Environment() evt = MockEvent() env.step_events.append(evt) env.run() self.assertAlmostEqual(evt.time_records[0], 0.0) self.assertAlmostEqual(evt.time_records[-1], 10.0)
def test_access(self): env = Environment() obj1 = env.add(MockEntity()) obj2 = env.add(MockEntity()) env.run() self.assertAlmostEqual(obj1.value, 101.0 / 2) self.assertAlmostEqual(obj2.value, 101.0 / 2)
def test_scheduler_fix(self): env = Environment() counter = Counter() env.step_events.append(EventScheduler(evt=counter, dt=0.1)) env.run() self.assertTrue(counter.value == 101) counter2 = Counter() env.step_events.append(EventScheduler(evt=counter2, dt=0.2)) env.run() self.assertTrue(counter2.value == 51)
def print_uav_value(env: Environment, uav: Uav): t, _ = env.time_info if uav.is_alive(): print( f'{t:.2f} : Uav-{uav.id} - {uav.control.state} {uav.position} {uav.velocity}' ) def print_radar_value(env: Environment, radar: Radar): t, _ = env.time_info if radar.current_results: print(f'{t:.2f} : Radar-{radar.id} - {radar.current_results}') if __name__ == '__main__': env = Environment() env.step_events.append(print_time) uav = env.add(Uav(track=[[0, 100, 10], [100, 100, 10]], speed=2.5)) env.step_events.append(partial(print_uav_value, uav=uav)) # uav2 = env.add(Uav(track=[[0, 0, 10], [10, 10, 10]], speed=2.5)) # env.step_events.append(partial(print_uav_value, uav=uav2)) radar = env.add(Radar(pos=[0, 0, 0], out='ar', rate=2, r_range=[None, 150])) env.step_events.append(partial(print_radar_value, radar=radar)) env.run(stop=40)
G = 1.0e3 class GravityPolicy(MovePolicy): """ 引力策略. """ def access(self, others): assert self.parent f0 = vec([0, 0]) _, dt = self.parent.env.time_info for obj in others: r = dist(self.parent.pos, obj.pos) f = unit(obj.pos - self.parent.pos) * G * obj.m / (r ** 2) f0 = f0 + f self.parent.vel += f0 * dt if __name__ == '__main__': env = Environment() recorder = PropRecorder(prop_name='pos') env.step_events.append(recorder) earth = env.add(MoveEntity(props={'m': 2}, pos=[-100, 0], vel=[0, -1], policy=GravityPolicy())) moon = env.add(MoveEntity(props={'m': 1}, pos=[100, 0], vel=[0, 1], policy=GravityPolicy())) env.run(stop=2000.) plot.plot_xy_dict(recorder.records)
else: print(f'{t:.2f} :') def power_switch(env: Environment, jammer, on=None): t, _ = env.time_info if on is None: jammer.power_on = not jammer.power_on else: jammer.power_on = on print(f'{t:.2f} : jammer {jammer.power_on}') if __name__ == "__main__": env = Environment() uav = env.add(Uav(track=[[1, 1], [11, 1], [11, 11]], speed=2.5)) jammer1 = env.add(Jammer()) jammer2 = env.add(Jammer(kind='gps')) uav_print = partial(print_uav_value, uav=uav) env.step_events.append(uav_print) # jammer1_switch = partial(power_switch, jammer=jammer1, on=None) # env.step_events.append(EventScheduler(evt=jammer1_switch, times=[2, 4])) jammer2_switch = partial(power_switch, jammer=jammer2, on=None) env.step_events.append(EventScheduler(evt=jammer2_switch, times=[3, 5])) env.run(stop=20) pass
def test_scheduler_rand(self): env = Environment() counter = Counter() env.step_events.append(EventScheduler(evt=counter, rand=[0.1, 1])) env.run() self.assertTrue(counter.value > 10)
def test_scheduler_times(self): env = Environment() counter = Counter() env.step_events.append(EventScheduler(evt=counter, times=[1, 2, 5, 11])) env.run() self.assertTrue(counter.value == 3)
def test_run(self): """ 测试运行. """ env = Environment() env.run(stop=20.0) self.assertAlmostEqual(env.time_info[0], 20.0) env.run(stop=30.0) self.assertAlmostEqual(env.time_info[0], 30.0) env.run() self.assertAlmostEqual(env.time_info[0], 30.0) obj = env.add(MockEntity()) env.run(stop=10.0) self.assertTrue(obj.value == 101) env.run(stop=10.0, step=1.0) self.assertTrue(obj.value == 11) env.run(start=5.0, stop=10.0, step=0.1) self.assertTrue(obj.value == 51)
class TrackPolicy(MovePolicy): """ 跟踪策略. """ def __init__(self, target=None): super().__init__() self.target = target def access(self, others): assert self.parent for obj in others: if self.target == obj.id: speed = dist(self.parent.vel) self.parent.vel = unit(obj.pos - self.parent.pos) * speed break if __name__ == '__main__': env = Environment() recorder = PropRecorder(prop_name='pos', show=True) env.step_events.append(recorder) plane = env.add(MoveEntity(pos=[0, 0], vel=[1, 0])) missile = env.add( MoveEntity(pos=[0, -10], vel=[0, 2], policy=TrackPolicy(target=plane.id))) env.run() plot_xy_dict(recorder.records, '*')