Source code for sensors.xio
'''
Import data saved with "x-IMU" sensors from x-io, through subclassing "IMU_Base"
Note that the data are in two files:
- a data-file
- a reg-file
More info about the sensor on http://x-io.co.uk
'''
'''
Author: Thomas Haslwanter
'''
import numpy as np
import pandas as pd
from scipy import constants
import abc
# To ensure that the relative path works
import os
import sys
parent_dir = os.path.abspath(os.path.join( os.path.dirname(__file__), '..' ))
if parent_dir not in sys.path:
sys.path.insert(0, parent_dir)
from imus import IMU_Base
[docs]def read_ratefile(reg_file):
'''Read send-rates from an XIO sensor.
"Disabled" channels have the "rate" set to "None".
Parameters
----------
in_file : string
Has to be the "Registers"-file.
Returns
-------
rates: directory
Contains the send-rates for the different "params".
'''
params = ['Sensor',
'DateTime',
'BatteryAndThermometer',
'InertialAndMagnetic',
'Quaternion'
]
rates = {}
# The the file content
with open(reg_file, 'r') as in_file:
lines = in_file.readlines()
# Get the send rates
for param in params:
for line in lines:
if line.find(param) > 0:
rate_flag = int(line.split(',')[2])
if rate_flag:
'''
0 ... 1 Hz
1 ... 2 Hz
10 ... 512 Hz
'''
rates[param] = 2 ** (rate_flag-1)
else:
# Disabled
rates[param] = None
return rates
[docs]def read_datafile(in_file):
'''Read data from an XIO "CalInertialAndMag"-file.
Parameters
----------
in_file : string
Has to be the name of the "CalInertialAndMag"-file.
Returns
-------
out_list: list
Contains the following parameters:
- acceleration
- angular_velocity
- mag_field_direction
- packet_nr
'''
data = pd.read_csv(in_file)
out_list = []
# Extract the columns that you want, by name
param_list=['Acc', 'Gyr', 'Mag', 'Packet']
for Expression in param_list:
out_list.append(data.filter(regex=Expression).values)
return out_list
[docs]class XIO(IMU_Base):
"""Concrete class based on abstract base class IMU_Base """
[docs] def get_data(self, in_file, in_data=None):
'''
Get the sampling rate, as well as the recorded data,
and assign them to the corresponding attributes of "self".
Assigns the following properties
- rate : rate
- acc : acceleration
- omega : angular_velocity
- mag : mag_field_direction
- packet_nr : packet_nr
Parameters
----------
in_selection : string
Directory containing all the data-files, or
filename of one file in that directory
in_data : not used here
'''
in_selection = in_file
if os.path.isdir(in_selection):
in_dir = in_selection
else:
in_file = in_selection
in_dir = os.path.split(in_file)[0]
file_list = os.listdir(in_dir)
# Get the filenames, based on the XIO-definitions
files = {}
for file in file_list:
if file.find('Registers') > 0:
files['register'] = os.path.join(in_dir, file)
if file.find('CalInertialAndMag') > 0:
files['data'] = os.path.join(in_dir, file)
# Read in the registers-file, and extract the sampling rates
rates = read_ratefile(files['register'])
# Read the sensor-data
data = read_datafile(files['data'])
# Set the class properties
in_data = {'rate':rates['InertialAndMagnetic'],
'acc': data[0] * constants.g,
'omega': np.deg2rad(data[1]),
'mag': data[2]}
self._set_data(in_data)
self.packet_nr = data[-1]
if __name__ == '__main__':
test_dir = r'../tests/data/data_xio'
assert os.path.exists(test_dir)
my_sensor = XIO(in_file=test_dir)
import matplotlib.pyplot as plt
plt.plot(my_sensor.acc)
print(my_sensor.rate)
plt.show()
print('Done')