forked from librepilot/LibrePilot
-
Notifications
You must be signed in to change notification settings - Fork 1
/
fix_vehicle_templates.py
62 lines (55 loc) · 2.25 KB
/
fix_vehicle_templates.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
#!/usr/bin/python
###############################################################################
#
# The LibrePilot Project, http://www.librepilot.org Copyright (C) 2015.
# Script to update vehicle templates files to match current UAVO structure
# and data.
#
###############################################################################
import json
import re
import collections
import fnmatch
import os
class DecimalEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Decimal):
return float(obj)
return json.JSONEncoder.default(self, obj)
json.encoder.FLOAT_REPR = lambda o: format(o, '.17g')
files = []
for root, dirnames, filenames in os.walk('ground/gcs/src/share/vehicletemplates/'):
for filename in fnmatch.filter(filenames, '*.optmpl'):
files.append(os.path.join(root, filename))
for f in files:
data = json.load(open(f, 'r'), object_pairs_hook=collections.OrderedDict)
for item in data['objects']:
fieldsToRemove = []
for i in item['fields']:
name = i['name']
values = i['values']
if re.compile('ThrustPIDScaleCurve').match(name):
i['type'] = "int8"
for j in values:
j['value'] = int(j['value'] * 100)
elif re.compile('AcroInsanityFactor').match(name):
i['type'] = "int8"
value = 0
for j in values:
value = int(j['value'] * 100)
values.pop()
values.append({'name': 'roll', 'value': value})
values.append({'name': 'pitch', 'value': value})
values.append({'name': 'yaw', 'value': value})
elif re.compile('FeedForward').match(name):
fieldsToRemove.append(i)
elif re.compile('MaxAccel').match(name):
fieldsToRemove.append(i)
elif re.compile('AccelTime').match(name):
fieldsToRemove.append(i)
elif re.compile('DecelTime').match(name):
fieldsToRemove.append(i)
for field in fieldsToRemove:
item['fields'].remove(field)
with open(f, 'w') as outfile:
json.dump(data, outfile, indent=4, separators=(',', ': '), cls=DecimalEncoder)