You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							84 lines
						
					
					
						
							2.1 KiB
						
					
					
				
			
		
		
	
	
							84 lines
						
					
					
						
							2.1 KiB
						
					
					
				import numpy as np
 | 
						|
 | 
						|
 | 
						|
def flatten_type_dict(d, sep="/", prefix=None):
 | 
						|
  res = {}
 | 
						|
  if isinstance(d, dict):
 | 
						|
    for key, val in d.items():
 | 
						|
      if prefix is None:
 | 
						|
        res.update(flatten_type_dict(val, prefix=key))
 | 
						|
      else:
 | 
						|
        res.update(flatten_type_dict(val, prefix=prefix + sep + key))
 | 
						|
    return res
 | 
						|
  elif isinstance(d, list):
 | 
						|
    return {prefix: np.array(d)}
 | 
						|
  else:
 | 
						|
    return {prefix: d}
 | 
						|
 | 
						|
 | 
						|
def get_message_dict(message, typ):
 | 
						|
  valid = message.valid
 | 
						|
  message = message._get(typ)
 | 
						|
  if not hasattr(message, 'to_dict') or typ in ('qcomGnss', 'ubloxGnss'):
 | 
						|
    # TODO: support these
 | 
						|
    #print("skipping", typ)
 | 
						|
    return
 | 
						|
 | 
						|
  msg_dict = message.to_dict(verbose=True)
 | 
						|
  msg_dict = flatten_type_dict(msg_dict)
 | 
						|
  msg_dict['_valid'] = valid
 | 
						|
  return msg_dict
 | 
						|
 | 
						|
 | 
						|
def append_dict(path, t, d, values):
 | 
						|
  if path not in values:
 | 
						|
    group = {}
 | 
						|
    group["t"] = []
 | 
						|
    for k in d:
 | 
						|
      group[k] = []
 | 
						|
    values[path] = group
 | 
						|
  else:
 | 
						|
    group = values[path]
 | 
						|
 | 
						|
  group["t"].append(t)
 | 
						|
  for k, v in d.items():
 | 
						|
    group[k].append(v)
 | 
						|
 | 
						|
 | 
						|
def potentially_ragged_array(arr, dtype=None, **kwargs):
 | 
						|
  # TODO: is there a better way to detect inhomogeneous shapes?
 | 
						|
  try:
 | 
						|
    return np.array(arr, dtype=dtype, **kwargs)
 | 
						|
  except ValueError:
 | 
						|
    return np.array(arr, dtype=object, **kwargs)
 | 
						|
 | 
						|
def msgs_to_time_series(msgs):
 | 
						|
  """
 | 
						|
    Convert an iterable of canonical capnp messages into a dictionary of time series.
 | 
						|
    Each time series has a value with key "t" which consists of monotonically increasing timestamps
 | 
						|
    in seconds.
 | 
						|
  """
 | 
						|
  values = {}
 | 
						|
  for msg in msgs:
 | 
						|
    typ = msg.which()
 | 
						|
 | 
						|
    tm = msg.logMonoTime / 1.0e9
 | 
						|
    msg_dict = get_message_dict(msg, typ)
 | 
						|
    if msg_dict is not None:
 | 
						|
      append_dict(typ, tm, msg_dict, values)
 | 
						|
 | 
						|
  # Sort values by time.
 | 
						|
  for group in values.values():
 | 
						|
    order = np.argsort(group["t"])
 | 
						|
    for name, group_values in group.items():
 | 
						|
      group[name] = potentially_ragged_array(group_values)[order]
 | 
						|
 | 
						|
  return values
 | 
						|
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
  import sys
 | 
						|
  from openpilot.tools.lib.logreader import LogReader
 | 
						|
  m = msgs_to_time_series(LogReader(sys.argv[1]))
 | 
						|
  print(m['driverCameraState']['t'])
 | 
						|
  print(np.diff(m['driverCameraState']['timestampSof']))
 | 
						|
 |