In [1]:
%load_ext autoreload
%autoreload 2
%pylab inline
In [2]:
import px4tools.ulog
import pandas
import os
import pickle
import scipy.interpolate
import px4tools.version
In [3]:
pandas.__version__
Out[3]:
In [4]:
px4tools.version.git_revision
Out[4]:
In [5]:
d_gyro = px4tools.ulog.cached_log_processing(
log='/home/jgoppert/logs/19_19_32.ulg',
msg_filter='sensor_gyro',
processing_func=lambda x: x['sensor_gyro_0'].resample('1 s').agg('mean'),
save_path='./logs/19_19_32-sensor_gyro_0.pkl',
force_processing=False)[:'4 h']
In [6]:
d_gyro.t_sensor_gyro_0__f_x.plot()
d_gyro.t_sensor_gyro_0__f_y.plot()
d_gyro.t_sensor_gyro_0__f_z.plot()
Out[6]:
In [7]:
gyro_debiased = (d_gyro.t_sensor_gyro_0__f_x - d_gyro.t_sensor_gyro_0__f_x.ffill().rolling('1 h min').mean().bfill())
gyro_debiased.plot()
gcf().autofmt_xdate()
In [8]:
var = np.sqrt(gyro_debiased['2 h': ].var())
dt = 0.001
sigma_gyro = np.sqrt(var*dt)
sigma_gyro
Out[8]:
In [9]:
np.rad2deg(9.8e-5)
Out[9]:
In [10]:
ps_data = px4tools.power_spectrum(d_gyro.t_sensor_gyro_0__f_x, cross_points = (-1, 0, 0.5))
In [11]:
ps_data
Out[11]:
In [12]:
ps_data[0][0]['val']**2*2
Out[12]:
In [13]:
px4tools.ulog.noise_analysis_sensor(
d_gyro[:'4.99 h'],
'sensor_gyro_0',
allan_args={'poly_order':4})
Out[13]:
In [14]:
d_accel = px4tools.ulog.cached_log_processing(
log='/home/jgoppert/logs/19_19_32.ulg',
msg_filter='sensor_accel',
processing_func=lambda x: x['sensor_accel_0'].resample('1 s').agg('mean'),
save_path='./logs/19_19_32-sensor_accel_0.pkl',
force_processing=False)
In [15]:
px4tools.ulog.noise_analysis_sensor(
d_accel[:'4.9 h'],
'sensor_accel_0',
allan_args={'poly_order':2})
Out[15]:
In [16]:
d_baro = px4tools.ulog.cached_log_processing(
log='/home/jgoppert/logs/19_19_32.ulg',
msg_filter='sensor_baro',
processing_func=lambda x: x['sensor_baro_0'].resample('100 ms').agg('mean'),
save_path='./logs/19_19_32-sensor_baro_0.pkl',
force_processing=False)
In [17]:
px4tools.ulog.plot_allan_std_dev(d_baro.t_sensor_baro_0__f_altitude,
poly_order=2, min_intervals=200)
Out[17]:
In [18]:
px4tools.ulog.plot_autocorrelation(d_baro.t_sensor_baro_0__f_altitude)
Out[18]:
In [19]:
d_mag = px4tools.ulog.cached_log_processing(
log='/home/jgoppert/logs/19_19_32.ulg',
msg_filter='sensor_mag',
processing_func=lambda x: x['sensor_mag_0'].resample('1 s').agg('mean'),
save_path='./logs/19_19_32-sensor_mag_0.pkl',
force_processing=False)
In [20]:
d_mag.t_sensor_mag_0__f_x.plot()
d_mag.t_sensor_mag_0__f_y.plot()
d_mag.t_sensor_mag_0__f_z.plot()
Out[20]:
In [21]:
np.sqrt(d_mag.t_sensor_mag_0__f_x**2 + d_mag.t_sensor_mag_0__f_y**2 + d_mag.t_sensor_mag_0__f_z**2).mean()
Out[21]:
In [22]:
d_mag.t_sensor_mag_0__f_x.plot()
d_mag.t_sensor_mag_0__f_y.plot()
d_mag.t_sensor_mag_0__f_z.plot()
Out[22]:
In [23]:
px4tools.ulog.plot_allan_std_dev(d_mag.t_sensor_mag_0__f_x[:'4.99 h'],
poly_order=2)
Out[23]:
In [24]:
px4tools.ulog.plot_autocorrelation(d_mag.t_sensor_mag_0__f_x['1 h':'4.99 h'],
poly_order=2)
Out[24]:
In [25]:
d_mag2 = px4tools.ulog.cached_log_processing(
log='/home/jgoppert/logs/01-03-17-mhkabir-pixhawk2.ulg',
msg_filter='sensor_mag',
processing_func=lambda x: x['sensor_mag_0'].resample('1 s').agg('mean'),
save_path='./logs/01-03-17-mhkabir-pixhawk-mag-0.pkl',
force_processing=False)
In [26]:
mag_norm = np.linalg.norm(
np.vstack([d_mag2.t_sensor_mag_0__f_x.ffill(),
d_mag2.t_sensor_mag_0__f_y.ffill(),
d_mag2.t_sensor_mag_0__f_z.ffill()]), axis=0)
mag_norm.mean()
Out[26]:
In [27]:
px4tools.ulog.plot_allan_std_dev(d_mag2.t_sensor_mag_0__f_x[:'4.99 h']/mag_norm.mean(),
poly_order=2)
Out[27]:
In [28]:
px4tools.ulog.plot_autocorrelation(
d_mag2.t_sensor_mag_0__f_x['1 h':'4.99 h'], poly_order=2)
Out[28]:
In [29]:
d_mag = d_mag2['1 m': '4 h']
B_b = np.array([
d_mag.t_sensor_mag_0__f_x.ffill(),
d_mag.t_sensor_mag_0__f_y.ffill(),
d_mag.t_sensor_mag_0__f_z.ffill()]).T
B_b_mean = B_b.mean(axis=0)
B_b_mean[2] = 0
B_b[:,2] = 0
mag_heading_error = pandas.Series(
np.arcsin(np.cross(B_b_mean, B_b)[:,2]/np.linalg.norm(B_b, axis=1)/np.linalg.norm(B_b_mean)),
d_mag.index, name='heading error')
mag_heading_error.plot()
ylabel('heading error, rad')
Out[29]:
In [30]:
res_mag = px4tools.plot_allan_std_dev(mag_heading_error)
legend()
title('Magnetic Heading Allan Variance')
res_mag
Out[30]:
In [31]:
px4tools.ulog.plot_autocorrelation(
mag_heading_error, poly_order=2)
Out[31]: