/
telemetry.py
99 lines (79 loc) · 2.43 KB
/
telemetry.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
#
# Copyright (c) 2018, Manfred Constapel
# This file is licensed under the terms of the MIT license.
#
#
# Pythonic DJI Ryze Tello Workbench: Example
#
# A simple telemetry script for gathering of data
# from several sensors (and filters), e.g.
#
# - acclerometer and gyroscope (aka IMU)
# - magnetometer (in conjunction with IMU aka AHRS)
# - barometer
# - temperature sensors for overheat protection
# - battery level
#
import socket
import sys
import signal
import time
from tinydb import TinyDB, Query
BUFFER_SIZE = 1024
STATE = ('mid', 'x', 'y', 'z', 'mpry',
'pitch', 'roll', 'yaw',
'vgx', 'vgy', 'vgz',
'templ', 'temph',
'tof', 'h', 'bat', 'baro', 'time',
'agx', 'agy', 'agz')
def collect_state(state):
dic = {k: v for k, v in zip(STATE, ['' for _ in STATE])}
items = state.split(';')
pairs = tuple(item.split(':') for item in items)
values = tuple((pair[0].strip(), pair[-1].strip()) for pair in pairs)
for i in range(len(values)):
k, v = values[i][0], values[i][1]
try:
dic[k] = int(v)
except:
try:
dic[k] = float(v)
except:
pass
return dic
if __name__ == '__main__':
print("telemetry...")
local = ('', 8890)
remote = ('192.168.10.1', 8889)
signal.signal(signal.SIGINT, signal.SIG_DFL)
socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket.bind(local)
socket.setblocking(1)
out = None
attempts = 3
for i in range(attempts):
socket.sendto('command'.encode('latin-1'), remote)
buffer = socket.recv(BUFFER_SIZE)
out = buffer.decode('latin-1')
if out == 'ok':
print('accepted')
break
else:
print('rejected')
time.sleep(0.5)
out = None
db = TinyDB('data/drone_db.json')
telemetry = db.table("Telemetry")
while out:
buffer = socket.recv(BUFFER_SIZE)
out = buffer.decode('latin-1')
out = out.replace('\n', '')
print("out ===>> " + out)
dic = collect_state(out)
t = time.time()
#print(''.join(str(dic).split(' ')), file=sys.stdout, flush=True)
print('time:{:4d}\tnick:{:>4}\troll:{:>4}\tyaw:{:>4}'.format(
int((t - int(t)) * 1000), dic['pitch'], dic['roll'], dic['yaw']),
file=sys.stdout, flush=True)
telemetry.insert(dic)
print('exit')