In [1]:
%matplotlib inline
DEFAULT_FIGSIZE = (12, 8)
import itertools
import sys
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('darkgrid')
sys.path.append('..')
from antlia import dtc
from antlia.record import load_records
from antlia import util
%load_ext autoreload
%autoreload 2
import matplotlib as mpl
mpl.rcParams['figure.figsize'] = DEFAULT_FIGSIZE
In [2]:
def set_title(ax, title):
try:
mpld3
except NameError:
ax.figure.suptitle(title)
else:
ax.set_title(title)
DEFAULT_FIGSIZE = (14, 7)
In [4]:
records = load_records(sync=True)
In [5]:
# rider, trial, speed, dist1, dist2, dist_interp, max_y
data = np.zeros((4*15, 7))
plt.close('all')
for rid, tid in itertools.product(range(4), range(15)):
if (rid == 0) and (tid == 1):
data[rid*15 + tid, :] = np.array([
rid,
tid,
np.nan, # speed
np.nan, # dist1
np.nan, # dist2
np.nan, # dist_interp
np.nan]) # max_y
continue
record = records[rid]
trial = record.trial[tid]
# get steer event
_, (ev_time, _, _), ev = trial.steer_event_parameters()
# determine max y-position
indices = record.lidar.frame_index(
lambda t: (t > ev_time[0]) & (t < ev_time[-1]))
max_y = record.lidar[indices].cartesian(xlim=(-6, 2), ylim=(0.5, 3))[1].max()
# get index before time 0
index = record.lidar.frame_index(ev_time[0])
# indices before and after event start
index = np.insert(index, 0, index[0] - 1)
ax = None
dist = []
for i in index:
x, y = record.lidar[[i]].cartesian(xlim=(-19, 1),
ylim=(0.5, 3))
if ax is None:
colors = sns.color_palette('Paired', 10)[::2]
else:
colors = sns.color_palette('Paired', 10)[1::2]
ax, pair = dtc.plot_closest_pair(
*dtc.cluster(x, y),
ax=ax,
colors=colors)
dist.append(dtc.dist(pair))
for l in ax.get_lines()[-5:]:
l.set_label('{} (t = {:0.3f} s)'.format(
l.get_label(),
record.lidar.time[i]))
ax.legend()
ax.set_aspect('equal', 'datalim')
ax.set_title('rider {} trial {:02d}, dist {}'.format(
rid, tid, ','.join('{:0.02f}'.format(d) for d in dist)))
dist_interp = np.interp(ev_time[0], record.lidar.time[index], dist)
data[rid*15 + tid, :] = np.array([rid, tid, ev.speed, dist[0], dist[-1], dist_interp, max_y])
plt.show()
In [6]:
import pandas as pd
from antlia.plotdf import plotjoint
colors = sns.color_palette()
# remove rows with nan
index = np.where(np.any(np.isnan(data), axis=1))[0]
data = np.delete(data, index, axis=0)
# Average speed (v) in this dataframe is over the
# steer avoidance event (infl, min, infl, max, infl, min, infl)
# and not just the sinusoid fit region (infl, min, infl)
df = pd.DataFrame(data=data, columns=[
'rider id',
'trial id',
'starting velocity',
'distance-to-collision frame-before',
'distance-to-collision frame-after',
'distance-to-collision',
'maximum lateral distance'])
df[['rider id', 'trial id']] = df[['rider id', 'trial id']].apply(np.int64)
df['time-to-collision frame-before'] = df.apply(
lambda row: row['distance-to-collision frame-before']/row['starting velocity'], axis=1)
df['time-to-collision frame-after'] = df.apply(
lambda row: row['distance-to-collision frame-after']/row['starting velocity'], axis=1)
df['time-to-collision'] = df.apply(
lambda row: row['distance-to-collision']/row['starting velocity'], axis=1)
df.to_pickle('steering_ttc.p.gz')
df # display dataframe
Out[6]:
In [7]:
# exclude trials without working velocity sensor
plt.close('all')
#
g = plotjoint('starting velocity', 'distance-to-collision', df[df['starting velocity'] > 1],
('rider id', colors))
g.fig.set_size_inches(DEFAULT_FIGSIZE)
g.set_axis_labels('velocity [m/s]', 'distance-to-collision [m]')
g = plotjoint('starting velocity', 'time-to-collision', df[df['starting velocity'] > 1],
('rider id', colors))
g.fig.set_size_inches(DEFAULT_FIGSIZE)
g.set_axis_labels('velocity [m/s]', 'time-to-collision [s]')
g = plotjoint('starting velocity', 'maximum lateral distance', df[df['starting velocity'] > 1],
('rider id', colors))
g.fig.set_size_inches(DEFAULT_FIGSIZE)
g.set_axis_labels('velocity [m/s]', 'maximum y-position [m]')
plt.show()
In [8]:
%matplotlib inline
plt.close('all')
# exclude trial without working velocity sensor
fig, ax = plt.subplots(figsize=DEFAULT_FIGSIZE)
sns.swarmplot(x='rider id', y='starting velocity', data=df[df['starting velocity'] > 1], ax=ax)
ax.set_title('rider id vs velocity')
fig, ax = plt.subplots(figsize=DEFAULT_FIGSIZE)
sns.swarmplot(x='rider id', y='distance-to-collision', data=df, ax=ax)
ax.set_title('rider id vs distance')
fig, ax = plt.subplots(figsize=DEFAULT_FIGSIZE)
sns.swarmplot(x='rider id', y='time-to-collision', data=df[df['starting velocity'] > 1], ax=ax)
ax.set_title('rider id vs time to collision')
fig, ax = plt.subplots(figsize=DEFAULT_FIGSIZE)
sns.swarmplot(x='rider id', y='maximum lateral distance', data=df[df['starting velocity'] > 1], ax=ax)
ax.set_title('rider id vs time to collision')
plt.show()