Source code for sensors.polulu
'''
Import data saved with polulu-sensors
https://www.pololu.com/product/2738
These are low-cost IMUS (<20 US$), where acceleration/gyroscope data are not
sampled at the same time as the magnetic field data (just over 100 Hz).
As a result, the interpolated sampling rate has to be set by hand.
'''
'''
Author: Thomas Haslwanter
Version: 0.2
Date: May-2016
'''
import numpy as np
import pandas as pd
[docs]def get_data(inFile, rate=125):
'''Get the sampling rate, as well as the recorded data.
Parameters
----------
in_file : string
Filename of the data-file
Returns
-------
out_list: list
Contains the following parameters:
- rate
- acceleration
- angular_velocity
- mag_field_direction
'''
# Get the sampling rate from the second line in the file
try:
# Get the data, and label them
data = pd.read_csv(inFile, header=None, sep='[ ]*')
data.columns = ['acc_x', 'acc_y', 'acc_z', 'gyr_x', 'gyr_y', 'gyr_z', 'mag_x', 'mag_y', 'mag_z', 'taccgyr', 'tmag']
# interpolate with a manually set rate
dt = 1/rate
t_lin = np.arange(0, 25, dt)
data_interp = pd.DataFrame()
for ii in range(6):
data_interp[data.keys()[ii]] = np.interp(t_lin*1000, data['taccgyr'], data.ix[:,ii])
for ii in range(6,9):
data_interp[data.keys()[ii]] = np.interp(t_lin*1000, data['tmag'], data.ix[:,ii])
data_interp['time'] = t_lin
# Set the conversion factors by hand, and apply them
conversions = {}
conversions['mag'] = 1/6842
conversions['acc'] = 0.061/1000
conversions['gyr'] = 4.375/1000 * np.pi/180
data_interp.ix[:,:3] *= conversions['acc']
data_interp.ix[:,3:6] *= conversions['gyr']
data_interp.ix[:,6:9] *= conversions['mag']
except FileNotFoundError:
print('{0} does not exist!'.format(in_file))
return -1
returnValues = [rate]
# Extract the columns that you want, by name
paramList=['acc', 'gyr', 'mag']
for param in paramList:
Expression = param + '*'
returnValues.append(data_interp.filter(regex=Expression).values)
return returnValues
if __name__ == '__main__':
inFile = r'..\tests\data\data_barnobi.txt'
data = get_data(inFile)
print(data[0])
print(data[1])
input('Done')