Source code for biomechzoo.conversion.mvnx2zoo_data

import numpy as np
from biomechzoo.mvn.load_mvnx import load_mvnx
from biomechzoo.mvn.mvn import JOINTS, SEGMENTS
from biomechzoo.utils.set_zoosystem import set_zoosystem

[docs] def mvnx2zoo_data(fl): """ loads mvnx file from xsens""" mvnx_file = load_mvnx(fl) # create zoo data dict data = {'zoosystem': set_zoosystem()} # extract joint angle data (All JOINTS may not exist in a given dataset) for key, val in JOINTS.items(): try: r = mvnx_file.get_joint_angle(joint=key) data[val] = { 'line': np.array(r), 'event': {} } data['zoosystem']['Video']['Channels'].append(val) except KeyError: print('joint {} does not exist, skipping'.format(val)) # extract segment orientations (All SEGMENTS may not exist in a given dataset) for key, val in SEGMENTS.items(): try: r = mvnx_file.get_sensor_ori(segment=key) data[val] = { 'line': np.array(r), 'event': {} } data['zoosystem']['Video']['Channels'].append(val) except KeyError: print('segment {} does not exist, skipping'.format(val)) # get foot strike events data = _get_foot_strike_events(mvnx_file, data) # add meta information data = _get_meta_info(fl, mvnx_file, data) return data
[docs] def is_valid_for_zoo(val): """ Returns True if the value is valid for a MATLAB-compatible zoo structure. """ if val is None: return False if isinstance(val, list) and len(val) == 0: return False if isinstance(val, np.ndarray) and val.size == 0: return False return True
def _get_meta_info(fl, mvnx_file, data): # todo: add more, see mvnx_file object data['zoosystem']['Video']['Freq'] = int(mvnx_file.frame_rate) data['zoosystem']['mvnx_version'] = mvnx_file.version data['zoosystem']['mvnx_configuration'] = mvnx_file.configuration data['zoosystem']['recording_date'] = mvnx_file.recording_date data['zoosystem']['original_file_name'] = mvnx_file.original_file_name data['zoosystem']['frame_count'] = mvnx_file.frame_count return data def _get_foot_strike_events(mvnx_file, data): RHeel = np.zeros(mvnx_file.frame_count) LHeel = np.zeros(mvnx_file.frame_count) for n in range(mvnx_file.frame_count): list_contact = mvnx_file.get_foot_contacts(n) for contact in list_contact: if contact['segment_index'] == 17: RHeel[n] = True elif contact['segment_index'] == 21: LHeel[n] = True hs_r = [] hs_l = [] for i in range(1, len(LHeel)): # Start from 1 to avoid i-1 out-of-range if RHeel[i - 1] == 0 and RHeel[i] == 1: hs_r.append(i) if LHeel[i - 1] == 0 and LHeel[i] == 1: hs_l.append(i) # add to event branch of any channel if 'jL5S1' in data: ch = 'jL5S1' else: ch = next(iter(data)) if hs_r: for i, rHS in enumerate(hs_r): data[ch]['event']['R_FS' + str(i + 1)] = [rHS, 0, 0] if hs_l: for i, lHS in enumerate(hs_l): data[ch]['event']['L_FS' + str(i + 1)] = [lHS, 0, 0] return data if __name__ == '__main__': """ testing """ import os from biomechzoo.processing.split_trial_data import split_trial_data # -------TESTING-------- project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) fl = os.path.join(project_root, 'data', 'other', 'Flat001.mvnx') fl_zoo = fl.replace('.mvnx', '.zoo') data = mvnx2zoo_data(fl)