Source code for velocity_optimization.opt_postproc.vis.VisGlobalVals
from matplotlib import pyplot as plt
import numpy as np
import linecache
import json
try:
import tikzplotlib
except ImportError:
print('Warning: No module tikzplotlib found. Not necessary on car but for development.')
# from velocity_optimization.opt_postproc.src.read_ltpl_raw import read_ltpl_raw
# Line width
LW = 1.5
# The higher the less bins are plotted
BIN_WIDTH = 20
[docs]class VisVP_GlobalVals:
__slots__ = ()
def __init__(self,
vis_main,
csv_name: str,
csv_name_ltpl: str,
log_lines: int,
row_count: int,
glob_lim: int):
"""
Python version: 3.5
Created by: Thomas Herrmann (thomas.herrmann@tum.de)
Created on: 01.02.2020
Documentation: Class for the visualization of global values for an entirely logged race session.
Inputs:
vis_main: Main object for logging data visualization
csv_name: path + name of csv-file to logged data
csv_name_ltpl: raw local trajectory planner raw file
log_line: number of lines building one data block in logged data
row_count: number of rows in log file
glob_lim: limit of lines to be read from logs
"""
self.extract_vals(vis_main=vis_main,
csv_name=csv_name,
csv_name_ltpl=csv_name_ltpl,
log_lines=log_lines,
row_count=row_count,
glob_lim=glob_lim)
[docs] def extract_vals(self,
vis_main,
csv_name: str,
csv_name_ltpl: str,
log_lines: int,
row_count: int,
glob_lim: int):
"""
Python version: 3.5
Created by: Thomas Herrmann
Created on: 01.02.2020
Documentation: Visualization of global values for an entirely logged race session.
Inputs:
vis_main: Main object for logging data visualization
csv_name: path + name of csv-file to logged data
csv_name_ltpl: raw local trajectory planner raw file
log_line: number of lines building one data block in logged data
row_count: number of rows in log file
glob_lim: limit of lines to be read from logs
"""
# --- Initialize empty lists
s_glob_m = []
v_glob_mps = []
P_glob_kW = []
F_glob_kN = []
# --- Read from file
for idx in range(1, row_count):
row_lc = linecache.getline(csv_name, idx)
# Data format conversion
row_lc = row_lc[:-1].rsplit(';')
if idx == glob_lim:
break
if np.mod(idx, log_lines) == 1:
# Status
print(str(idx) + " / " + str(row_count))
# Update of constraints
vis_main.vis_log(idx - 1)
s_m = json.loads(row_lc[1])
s_glob_m.append(s_m)
v_mps = json.loads(row_lc[6])
v_glob_mps.append(v_mps)
# Check for variable power
if vis_main.Pmax_kW.size == 1:
P_glob_kW.append(float(vis_main.velqp.P_cst[0]) + float(vis_main.P_max))
else:
P_glob_kW.append(float(vis_main.velqp.P_cst[0]) + float(vis_main.P_max[0]))
F_glob_kN.append(float(vis_main.velqp.F_cst[0]) + vis_main.velqp.sym_sc_['Fmax_kN_'])
################################################################################################################
# Postprocessing
################################################################################################################
# --- Retrieve LTPL raw logs
'''
s_glob_m_ltpl, \
v_mps_ltpl, \
ax_mps2_ltpl, \
ay_mps2_ltpl = read_ltpl_raw(csv_name=csv_name_ltpl)
F_kN_ltpl = ax_mps2_ltpl * vis_main.velqp.sym_sc_['m_t_']
F_kN_ltpl[F_kN_ltpl < 0] = 0
E_glob_kJ_ltpl = np.cumsum(np.diff(s_glob_m_ltpl[4332:6382]) * F_kN_ltpl[4332:6381])
'''
# --- Match entries to best fitting global s coordinate
s_glob_m_filt = []
v_glob_mps_filt = []
P_glob_kW_filt = []
F_glob_kN_filt = []
for i in range(0, len(s_glob_m) - 2):
s_tmp = s_glob_m[i]
v_tmp = v_glob_mps[i]
P_tmp = P_glob_kW[i]
F_tmp = F_glob_kN[i]
if s_tmp == s_glob_m[i + 1]:
pass
else:
s_glob_m_filt.append(s_tmp)
v_glob_mps_filt.append(v_tmp)
P_glob_kW_filt.append(P_tmp)
F_glob_kN_filt.append(F_tmp)
# --- Overwrite negative values (no recuperation)
F_glob_kN_filt = np.array(F_glob_kN_filt)
F_glob_kN_filt[F_glob_kN_filt < 0] = 0
P_glob_kW_filt_pos = np.array(P_glob_kW_filt)
P_glob_kW_filt_pos[P_glob_kW_filt_pos < 0] = 0
dt_glob_s = np.diff(s_glob_m_filt) / v_glob_mps_filt[:-1]
E_glob_kJ_filt = np.cumsum(dt_glob_s * P_glob_kW_filt_pos[:-1])
E_glob_kJ_filt = np.cumsum(np.diff(s_glob_m_filt) * F_glob_kN_filt[0:-1])
# --- Power
plt.figure()
plt.plot(s_glob_m_filt, P_glob_kW_filt)
plt.xlabel(r'$s$' + ' in ' + r'm')
plt.ylabel(r'$P$' + ' in ' + r'kW')
tikzplotlib.save("power.tex")
# --- Energy
plt.figure()
plt.plot(s_glob_m_filt[1:], E_glob_kJ_filt / 3600)
plt.xlabel(r'$s$' + ' in ' + r'm')
plt.ylabel(r'$E$' + ' in ' + r'kWh')
tikzplotlib.save("energy.tex")
plt.show()
if __name__ == '__main__':
pass