1 |
#!/usr/bin/env python |
---|
2 |
|
---|
3 |
""" |
---|
4 |
Generate glider goto list. |
---|
5 |
|
---|
6 |
Usage: |
---|
7 |
|
---|
8 |
python points.py [glider_lat glider_lon |
---|
9 |
[ target_lat target_lon |
---|
10 |
[ steps ]]] |
---|
11 |
|
---|
12 |
where glider_lat and glider_lon are the present glider |
---|
13 |
latitude and longitude in ISO format (+/-ddmm.mmmm), |
---|
14 |
|
---|
15 |
where target_lat and target_lon are the desired glider |
---|
16 |
latitude and longitude in ISO format (+/-ddmm.mmmm), |
---|
17 |
|
---|
18 |
and where steps are the number of steps to take between |
---|
19 |
present and desired glider positions. |
---|
20 |
""" |
---|
21 |
|
---|
22 |
import sys |
---|
23 |
import os |
---|
24 |
import shutil |
---|
25 |
from datetime import datetime |
---|
26 |
|
---|
27 |
months = {1: 'Jan', |
---|
28 |
2: 'Feb', |
---|
29 |
3: 'Mar', |
---|
30 |
4: 'Apr', |
---|
31 |
5: 'May', |
---|
32 |
6: 'Jun', |
---|
33 |
7: 'Jul', |
---|
34 |
8: 'Aug', |
---|
35 |
9: 'Sep', |
---|
36 |
10: 'Oct', |
---|
37 |
11: 'Nov', |
---|
38 |
12: 'Dec'} |
---|
39 |
|
---|
40 |
LB1ADCP = [3310.172, -7820.007] |
---|
41 |
LB2ADCP = [3256.419, -7805.926] |
---|
42 |
LB3ADCP = [3251.142, -7800.793] |
---|
43 |
|
---|
44 |
glider_dir = '/var/opt/gmc/gliders' |
---|
45 |
|
---|
46 |
goto_name = "goto_l10.ma" |
---|
47 |
glider_name = "ramses" |
---|
48 |
glider_pos = [3240.576, -7821.149] |
---|
49 |
target = [3240.576, -7751.149] |
---|
50 |
steps = 10 |
---|
51 |
|
---|
52 |
first_template = \ |
---|
53 |
"""# |
---|
54 |
# Filename: %s |
---|
55 |
# File creation time: %s |
---|
56 |
# Generated by: %s |
---|
57 |
# |
---|
58 |
|
---|
59 |
behavior_name=goto_list |
---|
60 |
|
---|
61 |
<start:b_arg> |
---|
62 |
b_arg: num_legs_to_run(nodim) -2 # -1 loop, -2 run once, > 0 = this m$ |
---|
63 |
b_arg: start_when(enum) 0 # 0 baw_immediately |
---|
64 |
b_arg: list_stop_when(enum) 7 # BAW_WHEN_WPT_DIST |
---|
65 |
|
---|
66 |
# SATISFYING RADIUS |
---|
67 |
b_arg: list_when_wpt_dist(m) 100 |
---|
68 |
|
---|
69 |
# LIST PARAMETERS |
---|
70 |
b_arg: initial_wpt(enum) 0 # 0 to n-1, -1 first after last, -2 c$ |
---|
71 |
b_arg: num_waypoints(nodim) %u |
---|
72 |
<end:b_arg> |
---|
73 |
|
---|
74 |
<start:waypoints> |
---|
75 |
""" |
---|
76 |
|
---|
77 |
last_template = \ |
---|
78 |
"""<end:waypoints> |
---|
79 |
""" |
---|
80 |
|
---|
81 |
def ddmm2decdeg(ddmm): |
---|
82 |
sign = ddmm < 0 |
---|
83 |
ddmm = abs(ddmm) |
---|
84 |
dd = (ddmm // 100) |
---|
85 |
mm = ddmm - (dd * 100) |
---|
86 |
dm = mm / 60 |
---|
87 |
if sign: |
---|
88 |
decdeg = -(dd + dm) |
---|
89 |
else: |
---|
90 |
decdeg = dd + dm |
---|
91 |
return decdeg |
---|
92 |
|
---|
93 |
def decdeg2ddmm(decdeg): |
---|
94 |
dd = int(decdeg) |
---|
95 |
dm = decdeg - dd |
---|
96 |
mm = dm * 60 |
---|
97 |
ddmm = (dd * 100) + mm |
---|
98 |
return ddmm |
---|
99 |
|
---|
100 |
def latlondict(latlonlist): |
---|
101 |
return {'lat': latlonlist[0], |
---|
102 |
'lon': latlonlist[1]} |
---|
103 |
|
---|
104 |
def latlonlist(latlondict): |
---|
105 |
return [latlondict['lat'], latlondict['lon']] |
---|
106 |
|
---|
107 |
def line(origin, target, steps=steps): |
---|
108 |
vector = {'lat': target['lat'] - origin['lat'], |
---|
109 |
'lon': target['lon'] - origin['lon']} |
---|
110 |
divs = {'lat': vector['lat'] / steps, |
---|
111 |
'lon': vector['lon'] / steps} |
---|
112 |
points = [{'lat': origin['lat'] + (x * divs['lat']), |
---|
113 |
'lon': origin['lon'] + (x * divs['lon'])} |
---|
114 |
for x in range(1, steps + 1)] |
---|
115 |
return points |
---|
116 |
|
---|
117 |
def swap(seq): |
---|
118 |
return [seq[1], seq[0]] |
---|
119 |
|
---|
120 |
if __name__ == "__main__": |
---|
121 |
num_args = len(sys.argv) - 1 |
---|
122 |
if not (num_args == 0 or |
---|
123 |
num_args == 2 or |
---|
124 |
num_args == 4 or |
---|
125 |
num_args == 5): |
---|
126 |
sys.exit(__doc__) |
---|
127 |
|
---|
128 |
if num_args > 0: |
---|
129 |
try: |
---|
130 |
glider_pos[0] = float(sys.argv[1]) |
---|
131 |
glider_pos[1] = float(sys.argv[2]) |
---|
132 |
except: |
---|
133 |
sys.exit(__doc__) |
---|
134 |
|
---|
135 |
if num_args > 2: |
---|
136 |
try: |
---|
137 |
target[0] = float(sys.argv[3]) |
---|
138 |
target[1] = float(sys.argv[4]) |
---|
139 |
except: |
---|
140 |
sys.exit(__doc__) |
---|
141 |
|
---|
142 |
if num_args > 4: |
---|
143 |
try: |
---|
144 |
steps = int(sys.argv[5]) |
---|
145 |
except: |
---|
146 |
sys.exit(__doc__) |
---|
147 |
|
---|
148 |
glider_pos = map(ddmm2decdeg, glider_pos) |
---|
149 |
target = map(ddmm2decdeg, target) |
---|
150 |
|
---|
151 |
glider_pos = latlondict(glider_pos) |
---|
152 |
target = latlondict(target) |
---|
153 |
|
---|
154 |
points = line(glider_pos, target, steps) |
---|
155 |
points = [latlonlist(point) for point in points] |
---|
156 |
points = [map(decdeg2ddmm, point) for point in points] |
---|
157 |
|
---|
158 |
points = [swap(point) for point in points] |
---|
159 |
|
---|
160 |
now = datetime.now() |
---|
161 |
now_string = "%02d-%s-%04d %02d:%02d:%02d UTC" % (now.day, |
---|
162 |
months[now.month], |
---|
163 |
now.year, |
---|
164 |
now.hour, |
---|
165 |
now.minute, |
---|
166 |
now.second, |
---|
167 |
) |
---|
168 |
now_stamp = "%04d%02d%02dT%02d%02d%02d" % (now.year, |
---|
169 |
now.month, |
---|
170 |
now.day, |
---|
171 |
now.hour, |
---|
172 |
now.minute, |
---|
173 |
now.second) |
---|
174 |
|
---|
175 |
backup_dir = os.path.join(os.path.dirname( |
---|
176 |
os.path.abspath(__file__)), |
---|
177 |
"archive", |
---|
178 |
glider_name) |
---|
179 |
backup_name = "%s_%s_%s" % (glider_name, |
---|
180 |
goto_name, |
---|
181 |
now_stamp) |
---|
182 |
goto_path = os.path.join(glider_dir, |
---|
183 |
glider_name, |
---|
184 |
"to-glider", |
---|
185 |
goto_name) |
---|
186 |
try: |
---|
187 |
os.makedirs(backup_dir) |
---|
188 |
except: |
---|
189 |
pass |
---|
190 |
backup_path = os.path.join(backup_dir, |
---|
191 |
backup_name) |
---|
192 |
|
---|
193 |
handle = open(backup_path, "w") |
---|
194 |
handle.write(first_template % (goto_name, now_string, __file__, steps)) |
---|
195 |
handle.writelines(["\t%.3f\t%.3f\n" % tuple(point) for point in points]) |
---|
196 |
handle.write(last_template) |
---|
197 |
handle.close() |
---|
198 |
shutil.copy2(backup_path, goto_path) |
---|
199 |
|
---|