107 lines
2.5 KiB
Python
107 lines
2.5 KiB
Python
#
|
|
# BSD 3-Clause License
|
|
#
|
|
# This file is part of the Basalt project.
|
|
# https://gitlab.com/VladyslavUsenko/basalt.git
|
|
#
|
|
# Copyright (c) 2019-2021, Vladyslav Usenko and Nikolaus Demmel.
|
|
# All rights reserved.
|
|
#
|
|
import ubjson
|
|
import json
|
|
import os
|
|
|
|
import numpy as np
|
|
|
|
from collections import Mapping
|
|
from munch import Munch
|
|
from munch import munchify
|
|
|
|
|
|
class ExecutionStats(Munch):
|
|
|
|
def __init__(self, path):
|
|
data = self._load(path)
|
|
if data is None:
|
|
Munch.__init__(self)
|
|
else:
|
|
Munch.__init__(self, data)
|
|
|
|
def _load(self, path):
|
|
|
|
if path.endswith("ubjson"):
|
|
with open(path, 'rb') as f:
|
|
data = ubjson.load(f)
|
|
else:
|
|
with open(path, 'r') as f:
|
|
data = json.load(f)
|
|
|
|
if isinstance(data, Mapping):
|
|
data = self._convert(data)
|
|
|
|
return munchify(data)
|
|
|
|
def _convert(self, data):
|
|
|
|
data_new = dict()
|
|
|
|
for k, v in data.items():
|
|
if k.endswith("__values"):
|
|
continue # skip; processed together with __index
|
|
elif k.endswith("__index"):
|
|
idx = v
|
|
values = np.array(data[k.replace("__index", "__values")])
|
|
# convert to list of arrays according to start indices
|
|
res = np.split(values, idx[1:])
|
|
if all(len(res[0]) == len(x) for x in res):
|
|
res = np.array(res)
|
|
data_new[k.replace("__index", "")] = res
|
|
else:
|
|
data_new[k] = np.array(v)
|
|
|
|
return data_new
|
|
|
|
def _is_imu(self):
|
|
return len(self.marg_ev[0]) == 15
|
|
|
|
|
|
def detect_log_path(dir, basename):
|
|
|
|
for ext in ["ubjson", "json"]:
|
|
path = os.path.join(dir, basename + "." + ext)
|
|
if os.path.isfile(path):
|
|
return path
|
|
|
|
return None
|
|
|
|
|
|
def load_execution_stats(dir, basename):
|
|
|
|
path = detect_log_path(dir, basename)
|
|
|
|
if path is not None:
|
|
return ExecutionStats(path)
|
|
else:
|
|
return None
|
|
|
|
|
|
class Log(Munch):
|
|
|
|
@staticmethod
|
|
def load(dir):
|
|
|
|
log = Log(all=load_execution_stats(dir, "stats_all"),
|
|
sums=load_execution_stats(dir, "stats_sums"),
|
|
vio=load_execution_stats(dir, "stats_vio"))
|
|
|
|
if all([v is None for v in log.values()]):
|
|
return None
|
|
else:
|
|
return log
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
Munch.__init__(self, *args, **kwargs)
|
|
|
|
def duration(self):
|
|
return (self.sums.frame_id[-1] - self.sums.frame_id[0]) * 1e-9
|