root/points/trunk/points.py

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

Added target and steps to command line arguments.

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_name = "%s_%s_%s" % (glider_name,
176                                 goto_name,
177                                 now_stamp)
178     goto_path = os.path.join(glider_dir,
179                              glider_name,
180                              "to-glider",
181                              goto_name)
182     backup_path = os.path.join(os.path.dirname(
183                                    os.path.abspath(__file__)),
184                                "archive",
185                                glider_name,
186                                backup_name)
187
188     handle = open(backup_path, "w")
189     handle.write(first_template % (goto_name, now_string, __file__, steps))
190     handle.writelines(["\t%.3f\t%.3f\n" % tuple(point) for point in points])
191     handle.write(last_template)
192     handle.close()
193     shutil.copy2(backup_path, goto_path)
194    
Note: See TracBrowser for help on using the browser.