root/points/trunk/points.py

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

Refactor.

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 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    
Note: See TracBrowser for help on using the browser.