Source code for sensors.xio_ngimu
'''
Import data saved with "NGIMU" 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
dir_name = os.path.dirname(__file__)
sys.path.insert(0, os.path.realpath(os.path.join(dir_name, "..")))
from imus import IMU_Base
[docs]def read_ratefile(reg_file):
'''Read send-rates from an NGIMU 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 following paramters:
- sensors
- magnitudes
- quaternion
- matrix
- euler
- linear
- earth
- altitude
- temperature
- humidity
- battery
- analogue
- rssi
'''
rates = {}
# The the file content
with open(reg_file, 'r') as in_file:
lines = in_file.readlines()
# Get the send rates
for line in lines:
if line.find('rate') > 0:
# e.g.: "/rate/quaternion, 50f"
param_full, val_txt = line.split()
value = np.float64(val_txt[:-1]) # skip the "f"
param = param_full.split('/')[2][:-1]
if value > 0:
rates[param] = value
else:
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 "sensors.csv"-file.
Returns
-------
out_list: list
Contains the following parameters:
- time [s]
- acceleration [g]
- angular_velocity [deg/s]
- mag_field_direction [uT]
- barometer [hPa]
'''
data = pd.read_csv(in_file)
out_list = []
# Extract the columns that you want, by name
param_list=['Time', 'Acc', 'Gyr', 'Mag', 'Baro']
for Expression in param_list:
out_list.append(data.filter(regex=Expression).values)
return out_list
[docs]class NGIMU(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".
For the x-io.NGIMU, the data are stored in different files:
- "Settings.txt" : contains all the sensor-settings
- "sensors.csv" : contains the recorded sensor data
Assigns the following properties:
- rate : rate
- acc : acceleration
- omega : angular_velocity
- mag : mag_field_direction
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('Settings') >= 0:
files['settings'] = os.path.join(in_dir, file)
if file.find('sensors') >= 0:
files['data'] = os.path.join(in_dir, file)
# Read in the registers-file, and extract the sampling rates
rates = read_ratefile(files['settings'])
# Read the sensor-data
data = read_datafile(files['data'])
# Set the class properties
in_data = {'rate':rates['sensors'],
'acc': data[1] * constants.g,
'omega': np.deg2rad(data[2]),
'mag': data[3]}
self._set_data(in_data)
self.packet_nr = data[-1]
if __name__ == '__main__':
test_dir = r'../tests/data/data_ngimu'
assert os.path.exists(test_dir)
my_sensor = NGIMU(in_file=test_dir)
import matplotlib.pyplot as plt
plt.plot(my_sensor.acc)
print(my_sensor.rate)
plt.show()
print('Done')