Source code for roboskin.calibration.data_logger

import os
import time
import pickle
import numpy as np
from datetime import datetime
from roboskin.calibration import utils


[docs]class DataLogger(): def __init__(self, savedir, robot, method, overwrite=False): self.date = datetime.now().strftime('%Y%m%d_%H%M%S') filepath = robot + '_' + method + '.pickle' filepath = robot + '_' + method + '_jan16' + '.pickle' self.savepath = os.path.join(savedir, filepath) self.best_data = {} self.trials = {} self.average_euclidean_distance = 0.0 self.start_timers = {} self.elapsed_times = {} self.overwrite = overwrite
[docs] def start_timer(self, timer_name): if timer_name in self.start_timers.keys() and not self.overwrite: raise ValueError('Timer Name "{}" already exists'.format(timer_name)) self.start_timers[timer_name] = time.time()
[docs] def end_timer(self, timer_name): if timer_name not in self.start_timers.keys(): raise KeyError('Timer Name "{}" does not exist'.format(timer_name)) end_time = time.time() elapsed_time = end_time - self.start_timers[timer_name] self.elapsed_times[timer_name] = elapsed_time return elapsed_time
[docs] def add_best(self, i_su, **kwargs): for key, value in kwargs.items(): if isinstance(value, np.ndarray): value = value.tolist() if key not in self.best_data: self.best_data[key] = {} self.best_data[key][i_su] = value # Append value to np.array setattr(self, key, np.array(list(self.best_data[key].values()))) self.average_euclidean_distance = np.mean( list(self.best_data['euclidean_distance'].values()))
[docs] def add_trial(self, global_step, imu_num, **kwargs): if global_step not in self.best_data: self.trials[global_step] = {} self.trials[global_step]['imu_num'] = imu_num for key, value in kwargs.items(): if isinstance(value, np.ndarray): value = value.tolist() self.trials[global_step][key] = value
[docs] def save(self): data = { 'date': self.date, 'average_euclidean_distance': self.average_euclidean_distance, 'best_data': self.best_data, 'trials': self.trials} with open(self.savepath, 'wb') as f: pickle.dump(data, f, protocol=2)
def __call__(self): print('Estimated SU Positions') for i, values in self.best_data['position'].items(): print('SU{}: {}'.format(i, utils.n2s(np.array(values), 3))) print('Estimated SU Orientations') for i, values in self.best_data['orientation'].items(): print('SU{}: {}'.format(i, utils.n2s(np.array(values), 3))) print('average_euclidean_distance: ', self.average_euclidean_distance)