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 |
|
---|
10 |
where glider_lat and glider_lon are the present glider |
---|
11 |
latitude and longitude in ISO format (+/-ddmm.mmmm). |
---|
12 |
""" |
---|
13 |
|
---|
14 |
import sys |
---|
15 |
import os |
---|
16 |
from datetime import datetime |
---|
17 |
|
---|
18 |
months = {1: 'Jan', |
---|
19 |
2: 'Feb', |
---|
20 |
3: 'Mar', |
---|
21 |
4: 'Apr', |
---|
22 |
5: 'May', |
---|
23 |
6: 'Jun', |
---|
24 |
7: 'Jul', |
---|
25 |
8: 'Aug', |
---|
26 |
9: 'Sep', |
---|
27 |
10: 'Oct', |
---|
28 |
11: 'Nov', |
---|
29 |
12: 'Dec'} |
---|
30 |
|
---|
31 |
LB1ADCP = [3310.172, -7820.007] |
---|
32 |
LB2ADCP = [3256.419, -7805.926] |
---|
33 |
LB3ADCP = [3251.142, -7800.793] |
---|
34 |
|
---|
35 |
glider_dir = '/var/opt/gmc/gliders' |
---|
36 |
|
---|
37 |
file_name = "goto_l20.ma" |
---|
38 |
glider_name = "pelagia" |
---|
39 |
glider_pos = [3313.310, -7810.844] |
---|
40 |
steps = 15 |
---|
41 |
|
---|
42 |
first_template = \ |
---|
43 |
"""# |
---|
44 |
# Filename: %s |
---|
45 |
# File creation time: %s |
---|
46 |
# Generated by: %s |
---|
47 |
# |
---|
48 |
|
---|
49 |
behavior_name=goto_list |
---|
50 |
|
---|
51 |
<start:b_arg> |
---|
52 |
b_arg: num_legs_to_run(nodim) -2 # -1 loop, -2 run once, > 0 = this m$ |
---|
53 |
b_arg: start_when(enum) 0 # 0 baw_immediately |
---|
54 |
b_arg: list_stop_when(enum) 7 # BAW_WHEN_WPT_DIST |
---|
55 |
|
---|
56 |
# SATISFYING RADIUS |
---|
57 |
b_arg: list_when_wpt_dist(m) 100 |
---|
58 |
|
---|
59 |
# LIST PARAMETERS |
---|
60 |
b_arg: initial_wpt(enum) 0 # 0 to n-1, -1 first after last, -2 c$ |
---|
61 |
b_arg: num_waypoints(nodim) %u |
---|
62 |
<end:b_arg> |
---|
63 |
|
---|
64 |
<start:waypoints> |
---|
65 |
""" |
---|
66 |
|
---|
67 |
last_template = \ |
---|
68 |
"""<end:waypoints> |
---|
69 |
""" |
---|
70 |
|
---|
71 |
def ddmm2decdeg(ddmm): |
---|
72 |
sign = ddmm < 0 |
---|
73 |
ddmm = abs(ddmm) |
---|
74 |
dd = (ddmm // 100) |
---|
75 |
mm = ddmm - (dd * 100) |
---|
76 |
dm = mm / 60 |
---|
77 |
if sign: |
---|
78 |
decdeg = -(dd + dm) |
---|
79 |
else: |
---|
80 |
decdeg = dd + dm |
---|
81 |
return decdeg |
---|
82 |
|
---|
83 |
def decdeg2ddmm(decdeg): |
---|
84 |
dd = int(decdeg) |
---|
85 |
dm = decdeg - dd |
---|
86 |
mm = dm * 60 |
---|
87 |
ddmm = (dd * 100) + mm |
---|
88 |
return ddmm |
---|
89 |
|
---|
90 |
def latlondict(latlonlist): |
---|
91 |
return {'lat': latlonlist[0], |
---|
92 |
'lon': latlonlist[1]} |
---|
93 |
|
---|
94 |
def latlonlist(latlondict): |
---|
95 |
return [latlondict['lat'], latlondict['lon']] |
---|
96 |
|
---|
97 |
def line(origin, target, steps=steps): |
---|
98 |
vector = {'lat': target['lat'] - origin['lat'], |
---|
99 |
'lon': target['lon'] - origin['lon']} |
---|
100 |
divs = {'lat': vector['lat'] / steps, |
---|
101 |
'lon': vector['lon'] / steps} |
---|
102 |
return [{'lat': origin['lat'] + (x * divs['lat']), |
---|
103 |
'lon': origin['lon'] + (x * divs['lon'])} |
---|
104 |
for x in range(1, steps + 1)] |
---|
105 |
|
---|
106 |
def swap(seq): |
---|
107 |
return [seq[1], seq[0]] |
---|
108 |
|
---|
109 |
if __name__ == "__main__": |
---|
110 |
num_args = len(sys.argv) - 1 |
---|
111 |
if not (num_args == 0 or num_args == 2): |
---|
112 |
sys.exit(__doc__) |
---|
113 |
|
---|
114 |
if num_args > 0: |
---|
115 |
try: |
---|
116 |
glider_pos[0] = float(sys.argv[1]) |
---|
117 |
glider_pos[1] = float(sys.argv[2]) |
---|
118 |
except: |
---|
119 |
sys.exit(__doc__) |
---|
120 |
|
---|
121 |
target = LB2ADCP |
---|
122 |
|
---|
123 |
glider_pos = map(ddmm2decdeg, glider_pos) |
---|
124 |
target = map(ddmm2decdeg, target) |
---|
125 |
|
---|
126 |
glider_pos = latlondict(glider_pos) |
---|
127 |
target = latlondict(target) |
---|
128 |
|
---|
129 |
points = line(glider_pos, target) |
---|
130 |
points = [latlonlist(point) for point in points] |
---|
131 |
points = [map(decdeg2ddmm, point) for point in points] |
---|
132 |
|
---|
133 |
points = [swap(point) for point in points] |
---|
134 |
|
---|
135 |
now = datetime.now() |
---|
136 |
now = "%02d-%s-%04d %02d:%02d:%02d UTC" % (now.day, |
---|
137 |
months[now.month], |
---|
138 |
now.year, |
---|
139 |
now.hour, |
---|
140 |
now.minute, |
---|
141 |
now.second, |
---|
142 |
) |
---|
143 |
|
---|
144 |
handle = open(os.path.join(glider_dir, |
---|
145 |
glider_name, |
---|
146 |
"to-glider", |
---|
147 |
file_name), |
---|
148 |
"w") |
---|
149 |
handle.write(first_template % (file_name, now, __file__, steps)) |
---|
150 |
handle.writelines(["\t%.3f\t%.3f\n" % tuple(point) for point in points]) |
---|
151 |
handle.write(last_template) |
---|
152 |
handle.close() |
---|