import struct import numpy as np def parse_mjl_logs(read_filename, skipamount): with open(read_filename, mode='rb') as file: fileContent = file.read() headers = struct.unpack('iiiiiii', fileContent[:28]) nq = headers[0] nv = headers[1] nu = headers[2] nmocap = headers[3] nsensordata = headers[4] nuserdata = headers[5] name_len = headers[6] name = struct.unpack(str(name_len) + 's', fileContent[28:28+name_len])[0] rem_size = len(fileContent[28 + name_len:]) num_floats = int(rem_size/4) dat = np.asarray(struct.unpack(str(num_floats) + 'f', fileContent[28+name_len:])) recsz = 1 + nq + nv + nu + 7*nmocap + nsensordata + nuserdata if rem_size % recsz != 0: print("ERROR") else: dat = np.reshape(dat, (int(len(dat)/recsz), recsz)) dat = dat.T time = dat[0,:][::skipamount] - 0*dat[0, 0] qpos = dat[1:nq + 1, :].T[::skipamount, :] qvel = dat[nq+1:nq+nv+1,:].T[::skipamount, :] ctrl = dat[nq+nv+1:nq+nv+nu+1,:].T[::skipamount,:] mocap_pos = dat[nq+nv+nu+1:nq+nv+nu+3*nmocap+1,:].T[::skipamount, :] mocap_quat = dat[nq+nv+nu+3*nmocap+1:nq+nv+nu+7*nmocap+1,:].T[::skipamount, :] sensordata = dat[nq+nv+nu+7*nmocap+1:nq+nv+nu+7*nmocap+nsensordata+1,:].T[::skipamount,:] userdata = dat[nq+nv+nu+7*nmocap+nsensordata+1:,:].T[::skipamount,:] data = dict(nq=nq, nv=nv, nu=nu, nmocap=nmocap, nsensordata=nsensordata, name=name, time=time, qpos=qpos, qvel=qvel, ctrl=ctrl, mocap_pos=mocap_pos, mocap_quat=mocap_quat, sensordata=sensordata, userdata=userdata, logName = read_filename ) return data