Simsim.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. from target import Target
  4. from tracker import Tracker
  5. import logging
  6. from collections import deque
  7. class Simsim:
  8. class Topics:
  9. def __init__(self) -> None:
  10. self.topics = dict()
  11. def add_topic(self, topic_name):
  12. self.topics[topic_name] = deque(maxlen=20)
  13. def del_topic(self, topic_name):
  14. try:
  15. del self.topics[topic_name]
  16. except:
  17. pass
  18. def publish(self, topic_name, msg):
  19. self.topics[topic_name].append(msg)
  20. def subs(self, topic_name):
  21. return self.topics[topic_name]
  22. def __init__(self) -> None:
  23. self.trackers = []
  24. self.edges = []
  25. self.targets = []
  26. self.map_size = [1000, 1000]
  27. self.rate = 30
  28. self.topics = self.Topics()
  29. plt.ion()
  30. plt.axis('equal')
  31. self.fig, (self.plt_sim, self.plt_pm) = plt.subplots(
  32. 1, 2, figsize=(10, 5),dpi=160)
  33. def add_tracker(self, name, position, sensor_rad):
  34. tracker = Tracker(self, name, len(self.trackers),
  35. position, sensor_rad, self.rate)
  36. self.trackers.append(tracker)
  37. def add_edges(self, edges):
  38. self.edges.extend(edges)
  39. for e in edges:
  40. self.trackers[e[0]].neighbor.add(e[1])
  41. self.trackers[e[1]].neighbor.add(e[0])
  42. def add_target(self, name, position):
  43. target = Target(self, name, len(self.targets), position, self.rate)
  44. self.targets.append(target)
  45. def _update_all(self):
  46. """Simulate once, update all trackers and targets
  47. """
  48. for tracker in self.trackers:
  49. tracker.job()
  50. for target in self.targets:
  51. target.job()
  52. pass
  53. def run(self, log_lvl=logging.WARN, ground_truth=False):
  54. logging.basicConfig(format='%(asctime)s.%(msecs)03d %(levelname)s: %(message)s',
  55. datefmt='%m/%d/%Y %H:%M:%S', level=log_lvl)
  56. while 1:
  57. self._update_all()
  58. self.plt_sim.cla()
  59. self.plt_pm.cla()
  60. self.plt_sim.set_xlim(0, self.map_size[0])
  61. self.plt_sim.set_ylim(0, self.map_size[1])
  62. self.plt_pm.set_xlim(0, self.map_size[0])
  63. self.plt_pm.set_ylim(0, self.map_size[1])
  64. if ground_truth:
  65. for target in self.targets:
  66. self.plt_sim.scatter(
  67. target.position[0], target.position[1], marker='x', s=2, color='r')
  68. for e in self.edges:
  69. t0 = self.trackers[e[0]]
  70. t1 = self.trackers[e[1]]
  71. self.plt_sim.plot([t0.position[0], t1.position[0]],
  72. [t0.position[1], t1.position[1]],
  73. linewidth=1, color='g', alpha=0.5)
  74. for t in self.trackers:
  75. # draw the trackers
  76. self.plt_sim.scatter(t.position[0], t.position[1],
  77. marker='s', s=20, c='b')
  78. self.plt_sim.annotate(t.id, (t.position[0], t.position[1]+10))
  79. # draw the camera coverage
  80. circle = plt.Circle(
  81. (t.position), t.sensor.coverage_radius, fill=False, color='grey', alpha=0.3)
  82. self.plt_sim.add_patch(circle)
  83. for est in t.target_estimates:
  84. det_pos = est[0:2]
  85. det_abs_pos = det_pos+t.position
  86. self.plt_sim.scatter(det_abs_pos[0], det_abs_pos[1],
  87. marker='^', s=2)
  88. for ind in t.prob_map.prob_map:
  89. new_ind = np.array(ind) - self.map_size + t.position
  90. self.plt_pm.scatter(
  91. new_ind[0], new_ind[1], marker='s', s=1, c='r', alpha=t.prob_map.prob_map[ind])
  92. plt.pause(1/self.rate)