| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- import matplotlib.pyplot as plt
- import numpy as np
- from target import Target
- from tracker import Tracker
- import logging
- class Simsim:
- def __init__(self) -> None:
- self.trackers = []
- self.edges = []
- self.targets = []
- self.map_size = [1000, 1000]
- self.rate = 30
- plt.figure(figsize=(8, 8))
- plt.ion()
- plt.axis('equal')
- def add_tracker(self, name, position, sensor_rad):
- tracker = Tracker(name, len(self.trackers),
- position, sensor_rad, self.rate)
- self.trackers.append(tracker)
- def add_edges(self, edges):
- self.edges.extend(edges)
- for e in edges:
- self.trackers[e[0]].neighbor.add(e[1])
- self.trackers[e[1]].neighbor.add(e[0])
- def add_target(self, name, position):
- target = Target(name, len(self.targets), position, self.rate)
- self.targets.append(target)
- def _update_all(self):
- """Simulate once, update all trackers and targets
- """
- for tracker in self.trackers:
- tracker.job()
- for target in self.targets:
- target.job()
- pass
- def run(self, log_lvl=logging.WARN, ground_truth=False):
- logging.basicConfig(format='%(asctime)s.%(msecs)03d %(levelname)s: %(message)s',
- datefmt='%m/%d/%Y %H:%M:%S', level=log_lvl)
- logging.warning("The lvl is WARN")
- while 1:
- self._update_all()
- plt.cla()
- plt.xlim(0, self.map_size[0])
- plt.ylim(0, self.map_size[1])
- if ground_truth:
- for target in self.targets:
- plt.scatter(
- target.position[0], target.position[1], marker='d', s=10, color='r')
- for e in self.edges:
- t0 = self.trackers[e[0]]
- t1 = self.trackers[e[1]]
- plt.plot([t0.position[0], t1.position[0]],
- [t0.position[1], t1.position[1]],
- linewidth=1, color='g', alpha=0.5)
- for t in self.trackers:
- # draw the trackers
- plt.scatter(t.position[0], t.position[1],
- marker='s', s=20, c='b')
- plt.annotate(t.id, (t.position[0], t.position[1]+10))
- # draw the camera coverage
- circle = plt.Circle(
- (t.position), t.sensor.coverage_radius, fill=False, color='grey', alpha=0.3)
- plt.gcf().gca().add_artist(circle)
- # draw the detections
- dets_relative = t.sensor.get_detection(self.targets)
- for det in dets_relative:
- det_abs = det+t.position
- plt.scatter(det_abs[0], det_abs[1],
- marker='^', s=8) # , alpha=det[2]
- plt.draw()
- plt.pause(1/self.rate)
- s = Simsim()
- s.add_tracker('tracker', np.array([120.0, 180.0]), sensor_rad=100)
- # s.trackers[0].speed = np.array([10, 10])
- s.add_tracker('tracker', np.array([220, 380]), sensor_rad=150)
- # s.trackers[1].speed = np.array([5, 10])
- s.add_tracker('tracker', np.array([500, 380]), sensor_rad=200)
- s.add_tracker('tracker', np.array([700, 580]), sensor_rad=120)
- # s.trackers[2].speed = np.array([-22, 10])
- s.add_target('tgt', np.array([200, 300]))
- s.add_target('tgt', np.array([100, 300]))
- s.add_target('tgt', np.array([500, 300]))
- s.add_target('tgt', np.array([300, 500]))
- s.add_edges([[0, 1], [0, 2], [1,2], [0,3]])
- s.run(logging.INFO, True)
|