server2D_airpressure.py
unknown
python
2 years ago
4.8 kB
1
Indexable
Never
from cProfile import label from operator import ge import socket import math from turtle import color # For plot real-time import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation from matplotlib.lines import Line2D import numpy as np import matplotlib.animation as animation from multiprocessing import Process from collections import deque import time import re, sys from scipy import linalg # How many sensor samples we want to store HISTORY_SIZE = 10000 # Pause re-sampling the sensor and drawing for INTERVAL seconds INTERVAL = 0.0001 # msg = bytearray() msg = b'' init = True ######################### Initialize socket server and ploter ######################### # Define host and port which server listen host = '192.168.1.1' port = 8888 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # server.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) server.bind((host, port)) server.listen(1) # Only have 1 connection print("Server listening on port: ", port) client, addr = server.accept() print("Connect from ", str(addr)) # Turn off this axis when not calib gyro and mag # fig, ax = plt.subplots(1, 1) # ax.set_aspect(1) # remove animation anim = None aniRealtime = None ######################### End of Initialize socket server and ploter ################################# def get_imu_data(): msg = client.recv(1024) global msg2string msg2string = msg.decode("utf-8") # print(msg2string) # print(type(msg2string)) return msg2string # Create mag_x_arr is queue data mag_x_arr = deque() mag_y_arr = deque() mag_z_arr = deque() def emitterData(): """Return ax, ay, az, roll, pitch, yaw, gra_x, gra_y, gra_z, geo_x, geo_y, geo_z""" while True: data = [] ret = get_imu_data() if (isinstance(ret, str)): # parseLine = msg2string.split(",") parseLine = re.split(",|\n",msg2string) print("len(parseLine): ", len(parseLine)) print(parseLine) else: continue if (len(parseLine) >= 3): # geo_x, geo_y, geo_z data.append(float(parseLine[0])) data.append(float(parseLine[1])) data.append(float(parseLine[2])) mag_x_arr.append(float(parseLine[0])) mag_y_arr.append(float(parseLine[1])) mag_z_arr.append(float(parseLine[2])) yield data, class Scope: # 0.02 second is 50Hz, maxt is window max time def __init__(self, ax, maxt=10, dt=0.02, lim_left = -50., lim_right = 50.): self.ax = ax self.dt = dt self.maxt = maxt self.tdata = [0] self.lim_left = lim_left self.lim_right = lim_right self.xdata = [0] self.ydata = [0] self.zdata = [0] self.line_x = Line2D(self.tdata, self.xdata, color='r', label="x") self.line_y = Line2D(self.tdata, self.ydata, color='g', label="y") self.line_z = Line2D(self.tdata, self.zdata, color='b', label="z") self.ax.add_line(self.line_x) self.ax.add_line(self.line_y) self.ax.add_line(self.line_z) self.ax.set_ylim(self.lim_left, self.lim_right) self.ax.set_xlim(0, self.maxt) self.preData = [0] * 4 def update_xyz(self, data): lastt = self.tdata[-1] if lastt > self.tdata[0] + self.maxt: # reset the arrays median = np.median(self.xdata) self.tdata = [self.tdata[-1]] self.xdata = [self.xdata[-1]] self.ydata = [self.ydata[-1]] self.zdata = [self.zdata[-1]] self.ax.set_ylim(median - 10, median + 10) self.ax.set_xlim(self.tdata[0], self.tdata[0] + self.maxt) self.ax.figure.canvas.draw() t = self.tdata[-1] + self.dt self.tdata.append(t) data = np.squeeze(data) print("Data Update: ", data) if len(data) >= 3: self.xdata.append(data[0]) self.ydata.append(data[1]) self.zdata.append(data[2]) self.line_x.set_data(self.tdata, self.xdata) self.line_y.set_data(self.tdata, self.ydata) self.line_z.set_data(self.tdata, self.zdata) return self.line_x, self.line_y, self.line_z, # return self.line_x, def visualRealtimeData(): global aniRealtime fig_xyz, ax_xyz = plt.subplots(1, 1) scope_xyz = Scope(ax_xyz, lim_left = 102605-20, lim_right = 102605 + 20) ax_xyz.legend() # pass a generator in "emitter" to produce data for the update func aniRealtime = animation.FuncAnimation(fig_xyz, scope_xyz.update_xyz, emitterData, interval=0, blit=True) print("============= Blocking in plt.show() ===============") plt.show() visualRealtimeData()