root/points/trunk/points.py

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

Change waypoint precision.

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