import os
import numpy as np
import matplotlib . pyplot as plt
import pylab
from selfdrive . config import Conversions as CV
class ManeuverPlot ( object ) :
def __init__ ( self , title = None ) :
self . time_array = [ ]
self . gas_array = [ ]
self . brake_array = [ ]
self . steer_torque_array = [ ]
self . distance_array = [ ]
self . speed_array = [ ]
self . acceleration_array = [ ]
self . up_accel_cmd_array = [ ]
self . ui_accel_cmd_array = [ ]
self . uf_accel_cmd_array = [ ]
self . d_rel_array = [ ]
self . v_rel_array = [ ]
self . v_lead_array = [ ]
self . v_target_lead_array = [ ]
self . pid_speed_array = [ ]
self . cruise_speed_array = [ ]
self . jerk_factor_array = [ ]
self . a_target_array = [ ]
self . v_target_array = [ ]
self . fcw_array = [ ]
self . title = title
def add_data ( self , time , gas , brake , steer_torque , distance , speed ,
acceleration , up_accel_cmd , ui_accel_cmd , uf_accel_cmd , d_rel , v_rel ,
v_lead , v_target_lead , pid_speed , cruise_speed , jerk_factor , a_target , fcw ) :
self . time_array . append ( time )
self . gas_array . append ( gas )
self . brake_array . append ( brake )
self . steer_torque_array . append ( steer_torque )
self . distance_array . append ( distance )
self . speed_array . append ( speed )
self . acceleration_array . append ( acceleration )
self . up_accel_cmd_array . append ( up_accel_cmd )
self . ui_accel_cmd_array . append ( ui_accel_cmd )
self . uf_accel_cmd_array . append ( uf_accel_cmd )
self . d_rel_array . append ( d_rel )
self . v_rel_array . append ( v_rel )
self . v_lead_array . append ( v_lead )
self . v_target_lead_array . append ( v_target_lead )
self . pid_speed_array . append ( pid_speed )
self . cruise_speed_array . append ( cruise_speed )
self . jerk_factor_array . append ( jerk_factor )
self . a_target_array . append ( a_target )
self . fcw_array . append ( fcw )
def write_plot ( self , path , maneuver_name ) :
# title = self.title or maneuver_name
# TODO: Missing plots from the old one:
# long_control_state
# proportional_gb, intergral_gb
if not os . path . exists ( path + " / " + maneuver_name ) :
os . makedirs ( path + " / " + maneuver_name )
plt_num = 0
# speed chart ===================
plt_num + = 1
plt . figure ( plt_num )
plt . plot (
np . array ( self . time_array ) , np . array ( self . speed_array ) * CV . MS_TO_MPH , ' r ' ,
np . array ( self . time_array ) , np . array ( self . pid_speed_array ) * CV . MS_TO_MPH , ' y-- ' ,
np . array ( self . time_array ) , np . array ( self . v_target_lead_array ) * CV . MS_TO_MPH , ' b ' ,
np . array ( self . time_array ) , np . array ( self . cruise_speed_array ) * CV . KPH_TO_MPH , ' k ' ,
np . array ( self . time_array ) , np . array ( self . v_lead_array ) * CV . MS_TO_MPH , ' m '
)
plt . xlabel ( ' Time [s] ' )
plt . ylabel ( ' Speed [mph] ' )
plt . legend ( [ ' speed ' , ' pid speed ' , ' Target (lead) speed ' , ' Cruise speed ' , ' Lead speed ' ] , loc = 0 )
plt . grid ( )
pylab . savefig ( " / " . join ( [ path , maneuver_name , ' speeds.svg ' ] ) , dpi = 1000 )
# acceleration chart ============
plt_num + = 1
plt . figure ( plt_num )
plt . plot (
np . array ( self . time_array ) , np . array ( self . acceleration_array ) , ' g ' ,
np . array ( self . time_array ) , np . array ( self . a_target_array ) , ' k-- ' ,
np . array ( self . time_array ) , np . array ( self . fcw_array ) , ' ro ' ,
)
plt . xlabel ( ' Time [s] ' )
plt . ylabel ( ' Acceleration [m/s^2] ' )
plt . legend ( [ ' ego-plant ' , ' target ' , ' fcw ' ] , loc = 0 )
plt . grid ( )
pylab . savefig ( " / " . join ( [ path , maneuver_name , ' acceleration.svg ' ] ) , dpi = 1000 )
# pedal chart ===================
plt_num + = 1
plt . figure ( plt_num )
plt . plot (
np . array ( self . time_array ) , np . array ( self . gas_array ) , ' g ' ,
np . array ( self . time_array ) , np . array ( self . brake_array ) , ' r ' ,
)
plt . xlabel ( ' Time [s] ' )
plt . ylabel ( ' Pedal [] ' )
plt . legend ( [ ' Gas pedal ' , ' Brake pedal ' ] , loc = 0 )
plt . grid ( )
pylab . savefig ( " / " . join ( [ path , maneuver_name , ' pedals.svg ' ] ) , dpi = 1000 )
# pid chart ======================
plt_num + = 1
plt . figure ( plt_num )
plt . plot (
np . array ( self . time_array ) , np . array ( self . up_accel_cmd_array ) , ' g ' ,
np . array ( self . time_array ) , np . array ( self . ui_accel_cmd_array ) , ' b ' ,
np . array ( self . time_array ) , np . array ( self . uf_accel_cmd_array ) , ' r '
)
plt . xlabel ( " Time, [s] " )
plt . ylabel ( " Accel Cmd [m/s^2] " )
plt . grid ( )
plt . legend ( [ " Proportional " , " Integral " , " feedforward " ] , loc = 0 )
pylab . savefig ( " / " . join ( [ path , maneuver_name , " pid.svg " ] ) , dpi = 1000 )
# relative distances chart =======
plt_num + = 1
plt . figure ( plt_num )
plt . plot (
np . array ( self . time_array ) , np . array ( self . d_rel_array ) , ' g ' ,
)
plt . xlabel ( ' Time [s] ' )
plt . ylabel ( ' Relative Distance [m] ' )
plt . grid ( )
pylab . savefig ( " / " . join ( [ path , maneuver_name , ' distance.svg ' ] ) , dpi = 1000 )
plt . close ( " all " )