diff --git a/.gitignore b/.gitignore index 9711a7a..fae818a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ __pycache__/ -gpslog.csv +log/* .vscode/ -config/local/ \ No newline at end of file +config/local/ diff --git a/Driver.py b/Driver.py index 9b4af51..78365a4 100644 --- a/Driver.py +++ b/Driver.py @@ -9,6 +9,7 @@ # import math +import pathlib import sys import time @@ -37,15 +38,18 @@ class Driver: - def __init__(self, filename): + def __init__(self, filename, write_waypoint=False): self.log_time = time.time() self._logger = Logger() - self._logger.open() + self._logger.open_gps_log() # load config print("loading", filename) - with open(filename, "r") as f: + + path = pathlib.Path(filename) + with open(path, "r") as f: params = yaml.safe_load(f) + self._logger.save_params(params, path) # setup time manager self._time_manager = TimeManager() @@ -66,7 +70,9 @@ def __init__(self, filename): lat = wp["lat"] lon = wp["lon"] print(name, lat, lon) - self._status.waypoint.add_point(lat, lon) + self._status.waypoint.add_point(lat, lon, name) + if write_waypoint: + self._logger.save_waypoints_fig(self._statuswaypoint, path) # setup pwm read/write self._pwm_read = PwmRead( @@ -256,11 +262,11 @@ def _print_log(self): voltage, power, ] - self._logger.write(log_list) + self._logger.write_gps_log(log_list) return def end(self): - self._logger.close() + self._logger.close_gps_log() self._pwm_read.end() self._pwm_out.end() return diff --git a/Logger.py b/Logger.py index 5b1b99c..85e89f6 100644 --- a/Logger.py +++ b/Logger.py @@ -1,15 +1,25 @@ +import argparse import csv -from datetime import datetime +import pathlib +from datetime import datetime, timedelta, timezone +import matplotlib.pyplot as plt +import yaml + +from Waypoint import Waypoint -class Logger: - present = datetime.now() - now = present.strftime("%Y-%m-%d-%H-%M-%S") - filename = now + "_gpslog.csv" - def open(self): +class Logger: + def __init__(self): + jst = timezone(timedelta(hours=+9), "JST") + present = datetime.now(jst) + now = present.strftime("%Y-%m-%d-%H-%M-%S") + self.filename = f"gpslog_{now}.csv" + self.log_dir = pathlib.Path("log") / now + self.log_dir.mkdir(exist_ok=True) - self.f = open(Logger.filename, "a") + def open_gps_log(self): + self.f = open(self.log_dir / self.filename, "a") self.writer = csv.writer(self.f, lineterminator="\n") log_list = [ "TIME_STAMP", @@ -32,17 +42,62 @@ def open(self): ] self.writer.writerow(log_list) - def write(self, log_list): + def write_gps_log(self, log_list): self.writer.writerow(log_list) - def close(self): + def close_gps_log(self): self.f.write("END\n") self.f.close() + def save_waypoints_fig(self, waypoint, path): + fig, ax = plt.subplots() + for name, lat, lon in zip(waypoint.name, waypoint.latitude, waypoint.longitude): + ax.scatter(lat, lon, label=name) + ax.axis("equal") + ax.legend() + fig.savefig(self.log_dir / path.with_suffix(".png")) + + def save_params(self, params, path): + with open(self.log_dir / path, "w") as f: + yaml.dump(params, f) + + +def _load_waypoints(filename): + path = pathlib.Path(filename) + with open(path, "r") as f: + params = yaml.safe_load(f) + waypoint = Waypoint() + for wp in params["waypoints"]: + name = wp["name"] + lat = wp["lat"] + lon = wp["lon"] + waypoint.add_point(lat, lon, name) + return waypoint, path + + +def _parse_args(): + """ + input_file_path: input fileのpath + """ + parser = argparse.ArgumentParser() + parser.add_argument("input_file_path") + parser.add_argument("-ww", "--write_waypoints_fig", action="store_true") + parser.add_argument("-wl", "--write_log", action="store_true") + args = parser.parse_args() + return args + # test code if __name__ == "__main__": + args = _parse_args() logger = Logger() - logger.open() - logger.write([1, 1, 1]) - logger.close() + if args.write_log: + logger.open_gps_log() + logger.write_gps_log([1, 1, 1]) + logger.close_gps_log() + if args.write_waypoints_fig: + waypoint, path = _load_waypoints(args.input_file_path) + logger.save_waypoints_fig(waypoint, path) + with open(args.input_file_path, "r") as f: + params = yaml.safe_load(f) + logger.save_params(params, args.input_file_path) diff --git a/Waypoint.py b/Waypoint.py index c9dc41a..0eea155 100644 --- a/Waypoint.py +++ b/Waypoint.py @@ -10,19 +10,23 @@ class Waypoint: - def __init__(self, latitude=None, longitude=None): + def __init__(self, latitude=None, longitude=None, name=None): if longitude is None: longitude = [] if latitude is None: latitude = [] + if name is None: + name = [] self.latitude = latitude self.longitude = longitude + self.name = name self._index = 0 self._num = 0 - def add_point(self, latitude, longitude): + def add_point(self, latitude, longitude, name): self.latitude.append(latitude) self.longitude.append(longitude) + self.name.append(name) self._num += 1 return diff --git a/main.py b/main.py index c41afda..17ef225 100644 --- a/main.py +++ b/main.py @@ -8,8 +8,8 @@ # Author: Tetsuro Ninomiya # +import argparse import sys -import time def main(): @@ -21,16 +21,12 @@ def main(): return # Command line arguments - args = sys.argv - if len(args) < 2: - print("[ERROR] NO ARGUMENTS") - print("Usage: python3 main.py [parameter_file]") - return + args = _parse_args() # Initialize from Driver import Driver - driver = Driver(args[1]) + driver = Driver(args.input_file_path, args.write_waypoints_fig) try: # Confirming initial mode @@ -47,5 +43,16 @@ def main(): print("finish") +def _parse_args(): + """ + input_file_path: input fileのpath + """ + parser = argparse.ArgumentParser() + parser.add_argument("input_file_path") + parser.add_argument("-ww", "--write_waypoints_fig", action="store_true") + args = parser.parse_args() + return args + + if __name__ == "__main__": main() diff --git a/visualization.py b/visualization.py deleted file mode 100644 index 0f464f7..0000000 --- a/visualization.py +++ /dev/null @@ -1,33 +0,0 @@ -import argparse - -import matplotlib.pyplot as plt -import yaml - - -def parse_args(): - """ - input_file_path: input fileのpath - """ - parser = argparse.ArgumentParser() - parser.add_argument("input_file_path") - args = parser.parse_args() - return args - - -def visualize_waypoints(filename): - with open(filename, "r") as f: - params = yaml.safe_load(f) - - for wp in params["waypoints"]: - name = wp["name"] - lat = wp["lat"] - lon = wp["lon"] - plt.scatter(lat, lon, label=name) - plt.axis("equal") - plt.legend() - plt.show() - - -if __name__ == "__main__": - args = parse_args() - visualize_waypoints(args.input_file_path)