-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgui.py
executable file
·127 lines (110 loc) · 3.19 KB
/
gui.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
################################################################################
# File name: gui.py
#
# Function: Display three data from stm32f4 using Python (matplotlib)
# The three data is roll, pith, yall angle of quadcopter attitude.
#
# Reference:http://electronut.in/plotting-real-time-data-from-arduino-using-python/
#
################################################################################
import sys, serial
import numpy as np
from time import sleep
from collections import deque
from matplotlib import pyplot as plt
# class that holds analog data for N samples
class AnalogData:
# constr
def __init__(self, maxLen):
self.ax = deque([0.0]*maxLen)
self.ay = deque([0.0]*maxLen)
self.m1 = deque([0.0]*maxLen)
self.m2 = deque([0.0]*maxLen)
self.m3 = deque([0.0]*maxLen)
self.m4 = deque([0.0]*maxLen)
self.maxLen = maxLen
# ring buffer
def addToBuf(self, buf, val):
if len(buf) < self.maxLen:
buf.append(val)
else:
buf.pop()
buf.appendleft(val)
#Add new data
def add(self, data):
assert(len(data) == 6)
self.addToBuf(self.ax, data[0])
self.addToBuf(self.ay, data[1])
self.addToBuf(self.m1, data[2])
self.addToBuf(self.m2, data[3])
self.addToBuf(self.m3, data[4])
self.addToBuf(self.m4, data[5])
# self.addToBuf(self.ay, data[1])
# plot class
class AnalogPlot:
# constr
def __init__(self, analogData):
# set plot to animated
plt.ion()
plt.figure(figsize=(9,8))
plt.subplot(211)
self.axline, = plt.plot(analogData.ax,label="Pitch",color="red")
self.ayline, = plt.plot(analogData.ay,label="Roll",color="blue")
plt.xlabel("Time")
plt.ylabel("Angle(-90~+90)")
plt.title("Quadcopter attitude")
plt.legend() #Show label figure.
plt.ylim([-90, 90]) # Vertical axis scale.
plt.grid()
plt.subplot(212)
self.m1line, = plt.plot(analogData.m1,label="motor1",color="red")
self.m2line, = plt.plot(analogData.m2,label="motor2",color="orange")
self.m3line, = plt.plot(analogData.m3,label="motor3",color="green")
self.m4line, = plt.plot(analogData.m4,label="motor4",color="blue")
plt.xlabel("Time")
plt.ylabel("PWM")
plt.legend()
plt.ylim([800, 1200])
plt.grid()
# update plot
def update(self, analogData):
self.axline.set_ydata(analogData.ax)
self.ayline.set_ydata(analogData.ay)
plt.draw()
self.m1line.set_ydata(analogData.m1)
self.m2line.set_ydata(analogData.m2)
self.m3line.set_ydata(analogData.m3)
self.m4line.set_ydata(analogData.m4)
#plt.draw()
def main():
# expects 1 arg - serial port string
if(len(sys.argv) != 2):
print "Type:"
print "sudo chmod 777 /dev/ttyUSB0"
print "python gui.py '/dev/ttyUSB0'"
exit(1)
#strPort = '/dev/tty.usbserial-A7006Yqh'
strPort = sys.argv[1];
# plot parameters
analogData = AnalogData(200) # Horizontal axis scale.
analogPlot = AnalogPlot(analogData)
print "plotting data..."
# open serial port
ser = serial.Serial(strPort, 9600)
while True:
try:
line = ser.readline()
data = [float(val) for val in line.split()]
print data
if(len(data) == 6):
analogData.add(data)
analogPlot.update(analogData)
except KeyboardInterrupt:
print "exiting"
break
# close serial
ser.flush()
ser.close()
# call main
if __name__ == '__main__':
main()