root/points/trunk/points.py

Revision 39 (checked in by cbc, 12 years ago)

Added extra linefeed to end to goto list because it made the glider happy.

Line 
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 LB1MOOR = [3310.353, -7819.800]
41 LB1ADCP = [3310.172, -7820.007]
42 LB2MOOR = [3256.491, -7805.667]
43 LB2ADCP = [3256.419, -7805.926]
44 LB3MOOR = [3251.142, -7800.793]
45 LB3ADCP = [3251.142, -7800.793]
46
47 glider_dir = '/var/opt/gmc/gliders'
48
49 goto_name = "goto_l10.ma"
50 glider_name = "ramses"
51 glider_pos = [3240.576, -7821.149]
52 target = [3240.576, -7751.149]
53 steps = 10
54
55 first_template = \
56 """#
57 # Filename: %s
58 # File creation time: %s
59 # Generated by: %s
60 #
61
62 behavior_name=goto_list
63
64 <start:b_arg>
65         b_arg: num_legs_to_run(nodim) -2 # -1 loop, -2 run once, > 0 = this m$
66         b_arg: start_when(enum) 0       # 0 baw_immediately
67         b_arg: list_stop_when(enum) 7   # BAW_WHEN_WPT_DIST
68
69         # SATISFYING RADIUS
70         b_arg: list_when_wpt_dist(m) 100
71
72         # LIST PARAMETERS
73         b_arg: initial_wpt(enum) 0      # 0 to n-1, -1 first after last, -2 c$
74         b_arg: num_waypoints(nodim) %u
75 <end:b_arg>
76
77 <start:waypoints>
78 """
79
80 last_template = \
81 """<end:waypoints>
82
83 """
84
85 def ddmm2decdeg(ddmm):
86     sign = ddmm < 0
87     ddmm = abs(ddmm)
88     dd = (ddmm // 100)
89     mm = ddmm - (dd * 100)
90     dm = mm / 60
91     if sign:
92         decdeg = -(dd + dm)
93     else:
94         decdeg = dd + dm
95     return decdeg
96
97 def decdeg2ddmm(decdeg):
98     dd = int(decdeg)
99     dm = decdeg - dd
100     mm = dm * 60
101     ddmm = (dd * 100) + mm
102     return ddmm
103
104 def latlondict(latlonlist):
105     return {'lat': latlonlist[0],
106             'lon': latlonlist[1]}
107
108 def latlonlist(latlondict):
109     return [latlondict['lat'], latlondict['lon']]
110
111 def line(origin, target, steps=steps):
112     vector = {'lat': target['lat'] - origin['lat'],
113               'lon': target['lon'] - origin['lon']}
114     divs = {'lat': vector['lat'] / steps,
115             'lon': vector['lon'] / steps}
116     points = [{'lat': origin['lat'] + (x * divs['lat']),
117                'lon': origin['lon'] + (x * divs['lon'])}
118               for x in range(1, steps + 1)]
119     return points
120
121 def swap(seq):
122     return [seq[1], seq[0]]
123
124 if __name__ == "__main__":
125     num_args = len(sys.argv) - 1
126     if not (num_args == 0 or
127             num_args == 2 or
128             num_args == 4 or
129             num_args == 5):
130         sys.exit(__doc__)
131
132     if num_args > 0:
133         try:
134             glider_pos[0] = float(sys.argv[1])
135             glider_pos[1] = float(sys.argv[2])
136         except:
137             sys.exit(__doc__)
138
139     if num_args > 2:
140         try:
141             target[0] = float(sys.argv[3])
142             target[1] = float(sys.argv[4])
143         except:
144             sys.exit(__doc__)
145
146     if num_args > 4:
147         try:
148             steps = int(sys.argv[5])
149         except:
150             sys.exit(__doc__)
151
152     glider_pos = map(ddmm2decdeg, glider_pos)
153     target = map(ddmm2decdeg, target)
154
155     glider_pos = latlondict(glider_pos)
156     target = latlondict(target)
157
158     points = line(glider_pos, target, steps)
159     points = [latlonlist(point) for point in points]
160     points = [map(decdeg2ddmm, point) for point in points]
161
162     points = [swap(point) for point in points]
163
164     now = datetime.now()
165     now_string = "%02d-%s-%04d %02d:%02d:%02d UTC" % (now.day,
166                                                       months[now.month],
167                                                       now.year,
168                                                       now.hour,
169                                                       now.minute,
170                                                       now.second,
171                                                      )
172     now_stamp = "%04d%02d%02dT%02d%02d%02d" % (now.year,
173                                                now.month,
174                                                now.day,
175                                                now.hour,
176                                                now.minute,
177                                                now.second)
178
179     backup_dir = os.path.join(os.path.dirname(
180                                   os.path.abspath(__file__)),
181                               "archive",
182                               glider_name)
183     backup_name = "%s_%s_%s" % (glider_name,
184                                 goto_name,
185                                 now_stamp)
186     goto_path = os.path.join(glider_dir,
187                              glider_name,
188                              "to-glider",
189                              goto_name)
190     try:
191         os.makedirs(backup_dir)
192     except:
193         pass
194     backup_path = os.path.join(backup_dir,
195                                backup_name)
196
197     handle = open(backup_path, "w")
198     handle.write(first_template % (goto_name, now_string, __file__, steps))
199     handle.writelines(["\t%.3f\t%.3f\n" % tuple(point) for point in points])
200     handle.write(last_template)
201     handle.close()
202     shutil.copy2(backup_path, goto_path)
203    
Note: See TracBrowser for help on using the browser.