-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy pathtxt2csv.py
More file actions
127 lines (99 loc) · 4.4 KB
/
txt2csv.py
File metadata and controls
127 lines (99 loc) · 4.4 KB
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
import decoder
import os
import sys
import googlemaps
import private # This file must contain maps_api_key
# Replace the API key below with a valid API key.
gmaps = googlemaps.Client(key=private.maps_api_key)
class Bunch:
def __init__(self, **kwdict):
self.__dict__.update(kwdict)
def frames_to_lines(frames):
last_frames = {
"SmartBatteryFrame": decoder.EmptyFrame(),
"BatteryFrame": decoder.EmptyFrame(voltages = [""]*6),
"MessageFrame": decoder.EmptyFrame()
}
lines = [
",".join(["latitude", "longitude", "altitude(metres)", "ascent(metres)",
"speed(m/s)", "distance(metres)", "time(millisecond)", "datetime(utc)",
"satellites",
"voltage(v)",
"max_altitude(metres)", "max_ascent(metres)", "max_speed(m/s)", "max_distance(metres)",
"compass_heading(degrees)",
"isPhoto", "isVideo", "rc_elevator", "rc_aileron", "rc_throttle", "rc_rudder",
"gimbal_heading(degrees)", "gimbal_pitch(degrees)",
"battery_percent", "voltageCell1", "voltageCell2", "voltageCell3", "voltageCell4", "voltageCell5", "voltageCell6",
"message"])
]
start_time = None
max_altitude = None
max_ascent = None
max_speed = None
max_distance = None
start_altitude = None
for f in frames:
last_frames[type(f).__name__] = f
if isinstance(f, decoder.PositionFrame):
max_altitude = max(max_altitude,f.ascent)
max_ascent = max(max_altitude,f.ascent)
if start_altitude is None:
e = gmaps.elevation((f.latitude, f.longitude))
start_altitude = e[0]["elevation"]
if isinstance(f, decoder.TimeFrame):
if start_time is None:
start_time = f.ts
max_speed = max(max_speed, f.speed)
max_distance = max(max_distance, f.distance)
vals = [ last_frames["PositionFrame"].latitude,
last_frames["PositionFrame"].longitude,
start_altitude + last_frames["PositionFrame"].ascent,
last_frames["PositionFrame"].ascent,
f.speed,
f.distance,
f.ts - start_time,
f.timestamp.strftime("%d-%m-%Y %H:%M:%S"),
last_frames["PositionFrame"].satellites,
last_frames["SmartBatteryFrame"].voltage,
max_altitude,
max_ascent,
max_speed,
max_distance,
last_frames["PositionFrame"].yaw,
"FALSE",
"FALSE",
last_frames["ControllerFrame"].elevator,
last_frames["ControllerFrame"].aileron,
last_frames["ControllerFrame"].throttle,
last_frames["ControllerFrame"].rudder,
last_frames["GimbalFrame"].yaw,
last_frames["GimbalFrame"].pitch,
last_frames["BatteryFrame"].percent,
last_frames["BatteryFrame"].voltages[0],
last_frames["BatteryFrame"].voltages[1],
last_frames["BatteryFrame"].voltages[2],
last_frames["BatteryFrame"].voltages[3],
last_frames["BatteryFrame"].voltages[4],
last_frames["BatteryFrame"].voltages[5],
last_frames["MessageFrame"].message,
]
lines.append(",".join([str(v) for v in vals]))
return lines
if __name__ == "__main__":
print sys.argv[1]
if len(sys.argv) >= 2:
path = sys.argv[1]
else:
print "Please supply the path of the DJI Flight Log .txt file to convert"
if len(sys.argv) >= 3:
outpath = sys.argv[3]
else:
outpath = os.path.dirname(path) + os.sep + os.path.basename(path) + ".csv"
print "Loading %s" % path
frames = decoder.decode_file(path)
print "Decoding file"
lines = frames_to_lines(frames)
print "Writing %d lines to %s" % (len(lines), outpath)
with open(outpath, "w") as csv:
csv.writelines([line + "\n" for line in lines])
print "Done"