-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathtracklog.py
More file actions
137 lines (111 loc) · 3.72 KB
/
tracklog.py
File metadata and controls
137 lines (111 loc) · 3.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
"""
Create tracklog from Water Linked Underwater GPS
"""
import requests
import argparse
import time
import datetime
import gpxpy
import gpxpy.gpx
def get_data(url):
try:
r = requests.get(url)
except requests.exceptions.RequestException as exc:
print("Exception occured {}".format(exc))
return None
if r.status_code != requests.codes.ok:
print("Got error {}: {}".format(r.status_code, r.text))
return None
return r.json()
def get_acoustic_position(base_url):
return get_data("{}/api/v1/position/acoustic/filtered".format(base_url))
def get_global_position(base_url):
return get_data("{}/api/v1/position/global".format(base_url))
def get_master_position(base_url):
return get_data("{}/api/v1/position/master".format(base_url))
def _elevation(base_url):
acoustic_position = get_acoustic_position(base_url)
if not acoustic_position:
return None
depth = acoustic_position["z"]
return -depth
def create_master_tracklog(gpx, base_url):
gpx_track = gpxpy.gpx.GPXTrack()
gpx.tracks.append(gpx_track)
gpx_segment = gpxpy.gpx.GPXTrackSegment()
gpx_track.segments.append(gpx_segment)
while True:
position = get_master_position(base_url)
if not position:
log.warning("No master position")
continue
latitude = position["lat"]
longitude = position["lon"]
print("Master: Latitude: {} Longitude: {}".format(latitude, longitude))
gpx_segment.points.append(gpxpy.gpx.GPXTrackPoint(
latitude,
longitude,
time=datetime.datetime.utcnow()))
time.sleep(1)
def create_locator_tracklog(gpx, base_url):
gpx_track = gpxpy.gpx.GPXTrack()
gpx.tracks.append(gpx_track)
gpx_segment = gpxpy.gpx.GPXTrackSegment()
gpx_track.segments.append(gpx_segment)
while True:
global_position = get_global_position(base_url)
if not global_position:
print("No global position")
continue
latitude = global_position["lat"]
longitude = global_position["lon"]
elevation = _elevation(base_url)
print("Global: Latitude: {} Longitude: {} Elevation: {}".format(
latitude,
longitude,
elevation))
gpx_segment.points.append(gpxpy.gpx.GPXTrackPoint(
latitude,
longitude,
elevation=elevation,
time=datetime.datetime.utcnow()))
def main():
parser = argparse.ArgumentParser(description = (
"Output global locator GPS track or master GPS track. Default: " +
"global locator GPS track"))
parser.add_argument(
"-u",
"--url",
help="URL of UGPS master unit",
type=str,
default="https://demo.waterlinked.com")
parser.add_argument(
"-o",
"--output",
help="File path to use for tracklog output",
type=str,
default="tracklog.gpx")
parser.add_argument(
"-m",
"--master",
action = "store_true",
help="Output master GPS track instead of locator GPS track")
args = parser.parse_args()
base_url = args.url
output_filepath = args.output
print(
"Creating tracklog for UGPS system at {}. " +
"Press Ctrl-C to stop logging".format(base_url, output_filepath))
gpx = gpxpy.gpx.GPX()
try:
if args.master:
create_master_tracklog(gpx, base_url)
else:
create_locator_tracklog(gpx, base_url)
except KeyboardInterrupt:
pass
print("Saving data to: {}".format(output_filepath))
with open(output_filepath, "w") as output_file:
output_file.write(gpx.to_xml())
if __name__ == "__main__":
main()