You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

live_demo.py 9.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. from matplotlib.patches import Ellipse
  4. from matplotlib.patches import Circle
  5. import matplotlib.pyplot as plt
  6. from mpl_toolkits.axes_grid1.anchored_artists import AnchoredDrawingArea
  7. import matplotlib.animation as anm
  8. import random
  9. import time
  10. import queue
  11. from threading import Thread
  12. import socket
  13. FRAME_RATE = 0.05
  14. def generate_results_thread():
  15. UDP_IP = "localhost"
  16. UDP_PORT = 5678
  17. sock = socket.socket(socket.AF_INET, # Internet
  18. socket.SOCK_DGRAM) # UDP
  19. #sock.bind((UDP_IP, UDP_PORT))
  20. startTime = time.time()
  21. originalTime = time.time()
  22. while True:
  23. if time.time() - startTime > FRAME_RATE:
  24. x = random.uniform(0, 1.5)
  25. y = random.uniform(0, 1.20)
  26. z = random.uniform(-0.2, 0.2)
  27. #np.save('result', np.array([x, y, theta]))
  28. #outputQueue.put(([x,y,z]))
  29. sock.sendto(("%f; %f; %f" %(x, y, z)).encode('utf-8'), ('localhost', 5678))
  30. startTime = time.time()
  31. def recieving_thread(outputQueue):
  32. UDP_IP = "localhost"
  33. UDP_PORT = 4589
  34. sock = socket.socket(socket.AF_INET, # Internet
  35. socket.SOCK_DGRAM) # UDP
  36. sock.bind((UDP_IP, UDP_PORT))
  37. originalTime = time.time()
  38. counter = 0
  39. while True:
  40. counter += 1
  41. if time.time() - originalTime > 1:
  42. print('recivingThread counter = ' +str(counter))
  43. counter = 0
  44. originalTime = time.time()
  45. data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
  46. data = data.decode().split(';')
  47. data = [float(data[0]), float(data[1]), float(data[2])]#, float(data[3]), float(data[4]), float(data[5])]
  48. outputQueue.put(data)
  49. class LiveDemo:
  50. def __init__(self, setupDimensions=[0.65,0.65], antennaLength=0.2, antennaWidth=0.2,
  51. figureTitle='test', showAntennas=False, showCompartments=False):
  52. self.antennas_pos = [[0, 0.59, 0], [0, 1.28, 0],[0, 1.97, 0]
  53. ,[0.7, 2.57, 0],[1.5, 2.57, 0],[2.3, 2.57, 0], [3.1, 2.57, 0]
  54. , [3.9, 2.57, 0],[4.7, 2.57, 0], [5.4, 1.97, 0], [5.4, 1.28, 0],[5.4, 0.59, 0]
  55. , [4.7, 0, 0], [3.9, 0, 0],[3.1, 0, 0],[2.3, 0, 0]
  56. ,[1.5, 0, 0],[0.7, 0, 0]]
  57. self.setupDimensions = setupDimensions
  58. self.antennaLength = antennaLength
  59. self.antennaWidth = antennaWidth
  60. self.figureTitle = figureTitle
  61. self.showAntennas = showAntennas
  62. self.showCompartments = showCompartments
  63. xyTitle = 16
  64. xyTicksSize = 12
  65. legendSize = 14
  66. self.titleFontSize = 40
  67. self.figure = plt.figure(num=1, figsize=(16,9), dpi=70, facecolor='w', edgecolor='k')
  68. self.figure.suptitle(self.figureTitle, size=self.titleFontSize)
  69. # fig, (ax1, ax2) = plt.subplots(1, 2)
  70. self.ax = plt.subplot2grid((1, 3), (0, 0), colspan=3)
  71. #self.ax1 = plt.subplot2grid((1, 3), (0, 2), colspan=1, sharey=self.ax)
  72. self.x1 = 0.5
  73. self.x2 = 0.56
  74. self.x3 = 0.9
  75. self.x4 = 1
  76. self.y1 = 0.4
  77. self.y2 = 0.5
  78. # Dimensions of the measurements setup [Width, hight] in meters
  79. # Setup borders dashed line:
  80. x = [0, 0, self.setupDimensions[0], self.setupDimensions[0], 0]
  81. y = [0, self.setupDimensions[1], self.setupDimensions[1], 0, 0]
  82. self.ax.plot(x, y, linestyle='dashed', color='grey', label='Shelf borders', linewidth=6)
  83. if self.showCompartments:
  84. ### Compartment1 #######
  85. x = [0, 0, self.x1, self.x1, 0]
  86. y = [self.y2, self.setupDimensions[1], self.setupDimensions[1], self.y2, self.y2]
  87. self.ax.plot(x, y, color='blue', label='Comps. 1-6', linewidth=4)
  88. ### Compartment2 #######
  89. x = [self.x2, self.x2, self.x3, self.x3, self.x2]
  90. y = [self.y2, self.setupDimensions[1], self.setupDimensions[1], self.y2, self.y2]
  91. self.ax.plot(x, y, color='blue', linewidth=4)
  92. ### Compartment3 #######
  93. x = [self.x4, self.x4, self.setupDimensions[0], self.setupDimensions[0], self.x4]
  94. y = [self.y2, self.setupDimensions[1], self.setupDimensions[1], self.y2, self.y2]
  95. self.ax.plot(x, y, color='blue', linewidth=4)
  96. ### Compartment4 #######
  97. x = [0, 0, self.x1, self.x1, 0]
  98. y = [0.0, self.y1, self.y1, 0.0, 0.0]
  99. self.ax.plot(x, y, color='blue', linewidth=4)
  100. ### Compartment5 #######
  101. x = [self.x2, self.x2, self.x3, self.x3, self.x2]
  102. y = [0.0, self.y1, self.y1, 0.0, 0.0]
  103. self.ax.plot(x, y, color='blue', linewidth=4)
  104. ### Compartment6 #######
  105. x = [self.x4, self.x4, self.setupDimensions[0], self.setupDimensions[0], self.x4]
  106. y = [0.0, self.y1, self.y1, 0.0, 0.0]
  107. self.ax.plot(x, y, color='blue', linewidth=4)
  108. if self.showAntennas:
  109. for pos in self.antennas_pos:
  110. x = [pos[0]-(self.antennaLength/2), pos[0]+(self.antennaLength/2),
  111. pos[0] + (self.antennaLength / 2), pos[0]-(self.antennaLength/2), pos[0]-(self.antennaLength/2)]
  112. y = [pos[1]-(self.antennaLength/2), pos[1]-(self.antennaLength/2),
  113. pos[1] + (self.antennaLength / 2), pos[1]+(self.antennaLength/2), pos[1]-(self.antennaLength/2)]
  114. self.ax.plot(x, y, color='blue', linewidth=4)
  115. self.ax.set_xlim(-0.2, self.setupDimensions[0] + 0.2)
  116. self.ax.set_ylim(-0.2, self.setupDimensions[1] + 0.2)
  117. self.ax.set_xlabel('X (m)', fontsize=xyTitle+6)
  118. self.ax.set_ylabel('Y (m)', fontsize=xyTitle+6)
  119. self.ax.tick_params(labelsize=xyTicksSize+10)
  120. z = [-0.2, -0.2, 0.2, 0.2, -0.2]
  121. y1 = [0, self.setupDimensions[1], self.setupDimensions[1], 0, 0]
  122. #self.ax1.plot(z, y1, linestyle='dashed', color='grey', linewidth=2)
  123. #self.ax1.axvline(linewidth=1, color='r')
  124. # self.plot_points()
  125. #self.ax1.set_xlim(-0.4, 0.4)
  126. #self.ax1.set_ylim(-0.5, self.setupDimensions[1] + 0.5)
  127. #self.ax1.set_xlabel('Z (m)', fontsize=xyTitle)
  128. #self.ax1.tick_params(labelsize=xyTicksSize)
  129. #self.ax1.grid()
  130. self.ax.grid()
  131. self.ax.axvline(x=0, linestyle='-', color='black', linewidth=8, label='z = 0 cm')
  132. # self.ax1.legend(prop={'size': legendSize - 3})
  133. self.scatterArtist = self.ax.scatter(0, 0, c='y', s=500, marker='o',
  134. label='object (x,y)')
  135. self.scatterArtist1 = self.ax.scatter(0, 0, c='y', s=500, marker='o',
  136. label='object (z,y)')
  137. self.scatterArtist2 = self.ax.scatter(0, 0, c='b', s=500, marker='o',
  138. label='object (x,y)')
  139. self.scatterArtist3 = self.ax.scatter(0, 0, c='b', s=500, marker='o',
  140. label='object (z,y)')
  141. #self.scatterArtist1 = self.ax1.scatter(0, 0, c='r', s=200, marker='o',
  142. # label='Estimated position')
  143. self.result = [2.5, 2.5, 45]
  144. self.outputQueue = queue.Queue()
  145. self.ax.legend(prop={'size': legendSize - 3})
  146. #self.create_setup()
  147. self.plottedSamples = 0
  148. self.startTime = time.time()
  149. def create_setup(self):
  150. self.scatterArtist.set_offsets(np.array([-1, -1]))
  151. self.scatterArtist1.set_offsets(np.array([-1, -1]))
  152. self.scatterArtist2.set_offsets(np.array([-1, -1]))
  153. self.scatterArtist3.set_offsets(np.array([-1, -1]))
  154. # self.scatterArtist1.set_offsets(np.array([0, 0]))
  155. return self.scatterArtist, self.scatterArtist1,
  156. def plot_results(self, i):
  157. try:
  158. if not self.outputQueue.empty():
  159. self.result = self.outputQueue.get()
  160. if self.result[0] != -1:
  161. self.scatterArtist.set_offsets(np.array([self.result[0], self.result[1]]))
  162. self.scatterArtist1.set_offsets(np.array([self.result[2], self.result[1]]))
  163. # if self.result[3] != -1:
  164. # self.scatterArtist2.set_offsets(np.array([self.result[3], self.result[4]]))
  165. # self.scatterArtist3.set_offsets(np.array([-self.result[5], self.result[4]]))
  166. self.plottedSamples += 1
  167. self.outputQueue.queue.clear()
  168. #self.plottedSamples += 1
  169. except:
  170. pass
  171. if time.time() - self.startTime > 1:
  172. print('Frame rate = ' + str(self.plottedSamples) + ' Frames/sec')
  173. self.plottedSamples = 0
  174. self.startTime = time.time()
  175. return self.scatterArtist, self.scatterArtist1,self.scatterArtist2, self.scatterArtist3,
  176. if __name__ == "__main__":
  177. l = LiveDemo(showAntennas=False, figureTitle='Loocalization')
  178. resultsThread = Thread(target=recieving_thread, args=(l.outputQueue,)).start()
  179. ani = anm.FuncAnimation(l.figure, l.plot_results, init_func=l.create_setup, frames=60, interval=10, blit=True)
  180. #ani = anm.FuncAnimation(l.figure, l.plot_results, init_func=l.create_setup, frames=,interval=10, blit=True)
  181. plt.show()