import numpy as np
import datetime
import time
from matplotlib import pyplot as plt
import matplotlib.patches as pltpatches
from matplotlib.widgets import Slider, Button
from velocity_optimization.src.params_vp_sqp import params_vp_sqp
from velocity_optimization.opt_postproc.src.CalcObjective import CalcObjective
# Font sizes
SMALL_SIZE = 12
MEDIUM_SIZE = 14
BIGGER_SIZE = 18
# Line Width
LW = 1.5
# TUM Color
TUMBlue = [0 / 255, 101 / 255, 189 / 255]
TUMWhite = [255 / 255, 255 / 255, 255 / 255]
TUMBlack = [0 / 255, 0 / 255, 0 / 255]
TUMBlue1 = [0 / 255, 51 / 255, 89 / 255]
TUMBlue2 = [0 / 255, 82 / 255, 147 / 255]
TUMGray1 = [51 / 255, 51 / 255, 51 / 255]
TUMGray2 = [127 / 255, 127 / 255, 127 / 255]
TUMGray3 = [204 / 255, 204 / 255, 204 / 255]
TUMBlue3 = [100 / 255, 160 / 255, 200 / 255]
TUMBlue4 = [152 / 255, 198 / 255, 234 / 255]
TUMIvory = [218 / 255, 215 / 255, 203 / 255]
TUMOrange = [227 / 255, 114 / 255, 34 / 255]
TUMGreen = [162 / 255, 173 / 255, 0 / 255]
# controls default text sizes
plt.rc('font', size=SMALL_SIZE)
# fontsize of the axes title
plt.rc('axes', titlesize=SMALL_SIZE)
# fontsize of the x and y labels
plt.rc('axes', labelsize=MEDIUM_SIZE)
# fontsize of the tick labels
plt.rc('xtick', labelsize=SMALL_SIZE)
# fontsize of the tick labels
plt.rc('ytick', labelsize=SMALL_SIZE)
# legend fontsize
plt.rc('legend', fontsize=SMALL_SIZE)
# fontsize of the figure title
plt.rc('figure', titlesize=BIGGER_SIZE)
Y_V_MAX_MPS = 70
Y_FORCE_MIN_KN = -20
Y_FORCE_MAX_KN = 8
Y_DELTAFORCE_MIN_KN = -5.5
Y_DELTAFORCE_MAX_KN = 5.5
Y_POWER_MIN_KW = -600
Y_POWER_MAX_KW = 280
Y_SLACK_TRE_MIN = -0.5
Y_SLACK_TRE_MAX = 5.0
X_AYMAX_MPS2 = 13
Y_AXMAX_MPS2 = 13
[docs]class VisVP_Logs_GUI:
__slots__ = ('m',
'vis_handler',
'vis_options',
'sol_options',
'main_fig',
'params_opt',
'constants_opt',
'n',
'text_status',
'slider_vel',
'but_next',
'but_prev',
'vel_dict', 'F_dict', 'P_dict', 'a_dict', 'ax_dict', 'ay_dict', 'F_f_dict', 'F_r_dict', 'F_fl_dict',
'F_fr_dict', 'F_rl_dict', 'F_rr_dict', 'slack_dict',
'p1_1', 'p1_2', 'p1_3', 'p1_4', 'p1_5', 'p1_6', 'p1_7', 'p1_8', 'p1_9', 'p1_10', 'p1_11', 'p1_11',
'p1_12', 'p1_13', 'p1_14', 'p1_15', 'p1_16', 'p1_17', 'p1_18',
'p3_1', 'p3_2', 'p3_3', 'p3_4', 'p3_5', 'p3_6', 'p3_7', 'p3_8', 'p3_9', 'p3_10', 'p3_11', 'p3_12',
'p3_13', 'p3_14', 'p3_15',
'p4_1',
'p5_1', 'p5_2', 'p5_3', 'p5_4', 'p5_5', 'p5_6', 'p5_7', 'p5_8', 'p5_9', 'p5_10', 'p5_11', 'p5_12',
'p5_13', 'p5_14', 'p5_15',
'p6_1', 'p6_2', 'p6_3', 'p6_4', 'p6_5', 'p6_6', 'p6_7', 'p6_8', 'p6_9', 'p6_10', 'p6_11', 'p6_12',
'p6_13', 'p6_14', 'p6_15', 'p6_16',
'p7_1', 'p7_2', 'p7_3', 'p7_4', 'p7_5', 'p7_6')
def __init__(self,
vis_handler,
m: int,
vis_options: dict,
params_path: str,
sol_options: dict):
"""
Python version: 3.5
Created by: Thomas Herrmann (thomas.herrmann@tum.de)
Created on: 01.02.2020
Modified by: Tobias Klotz
Documentation: Class creating a GUI to visualize logged data from the velocity optimization SQP.
Inputs:
vis_handler: main visualization handler object of type 'VisVP_Logs'
m: number of velocity optimization variables
vis_options: user specified visualization options
params_path: absolute path to folder containing config file .ini
sol_options: user specified solver options
"""
self.m = m
self.vis_handler = vis_handler
self.vis_options = vis_options
self.sol_options = sol_options
self.main_fig = None
self.params_opt = params_vp_sqp(m=m,
sid=vis_handler.sid,
params_path=params_path)[0]
self.constants_opt = CalcObjective(csv_name='empty',
log_lines=0,
sid=vis_handler.sid,
params_path=params_path)
# number of slack variables
self.n = np.int(np.ceil(m / self.params_opt['slack_every_v']))
# Text for QP status within logged data
self.text_status = None
# Slider to select logged data
self.slider_vel = None
# Command buttons to load logged data
self.but_next = None
self.but_prev = None
# Initialize solution dictionaries
self.vel_dict = {}
self.slack_dict = {}
self.F_dict = {}
self.P_dict = {}
self.a_dict = {}
self.ax_dict = {}
self.ay_dict = {}
self.F_f_dict = {}
self.F_r_dict = {}
self.F_fl_dict = {}
self.F_fr_dict = {}
self.F_rl_dict = {}
self.F_rr_dict = {}
# Lines within debug plots
self.p1_1, self.p1_2, self.p1_3, self.p1_4, self.p1_5, self.p1_6, self.p1_7, self.p1_8, self.p1_9, self.p1_10, \
self.p1_11, self.p1_12, self.p1_13, self.p1_14, self.p1_15, self.p1_16, self.p1_17, self.p1_18 = \
None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None
self.p3_1, self.p3_2, self.p3_3, self.p3_4, self.p3_5, self.p3_6, self.p3_7, self.p3_8, self.p3_9, \
self.p3_10, self.p3_11, self.p3_12, self.p3_13, self.p3_14, self.p3_15 = \
None, None, None, None, None, None, None, None, None, None, None, None, None, None, None
self.p4_1 = None
self.p5_1, self.p5_2, self.p5_3, self.p5_4, self.p5_5, self.p5_6, self.p5_7, self.p5_8, self.p5_9, self.p5_10, \
self.p5_11, self.p5_12, self.p5_13, self.p5_14, self.p5_15 = \
None, None, None, None, None, None, None, None, None, None, None, None, None, None, None
self.p6_1, self.p6_2, self.p6_3, self.p6_4, self.p6_5, self.p6_6, self.p6_7, self.p6_8, self.p6_9, self.p6_10, \
self.p6_11, self.p6_12, self.p6_13, self.p6_14, self.p6_15, self.p6_16 = \
None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None
self.p7_1, self.p7_2, self.p7_3, self.p7_4, self.p7_5, self.p7_6 = None, None, None, None, None, None
self.line_definition()
self.draw_gui()
self.initialize_plots()
[docs] def line_definition(self):
# Define Color, Line Style and Marker
for key, value in self.sol_options.items():
if self.sol_options[key]['Model'] == "PM" and self.sol_options[key]['Solver'] == "IPOPT":
self.sol_options[key].update({'Color': TUMBlue, 'Linestyle': ':', 'Marker': 'o'})
if self.sol_options[key]['Model'] == "KM" and self.sol_options[key]['Solver'] == "IPOPT":
self.sol_options[key].update({'Color': TUMOrange, 'Linestyle': '--', 'Marker': 'x'})
if self.sol_options[key]['Model'] == "DM" and self.sol_options[key]['Solver'] == "IPOPT":
self.sol_options[key].update({'Color': TUMGreen, 'Linestyle': '-.', 'Marker': 'v'})
if self.sol_options[key]['Model'] == "FW" and self.sol_options[key]['Solver'] == "IPOPT":
self.sol_options[key].update({'Color': TUMGray1, 'Linestyle': '-', 'Marker': 's'})
if self.sol_options[key]['Model'] == "PM" and self.sol_options[key]['Solver'] == "qpOASES":
self.sol_options[key].update({'Color': TUMBlue, 'Linestyle': ':', 'Marker': 'd'})
if self.sol_options[key]['Model'] == "KM" and self.sol_options[key]['Solver'] == "qpOASES":
self.sol_options[key].update({'Color': TUMOrange, 'Linestyle': '--', 'Marker': '2'})
if self.sol_options[key]['Model'] == "DM" and self.sol_options[key]['Solver'] == "qpOASES":
self.sol_options[key].update({'Color': TUMGreen, 'Linestyle': '-.', 'Marker': 'H'})
if self.sol_options[key]['Model'] == "FW" and self.sol_options[key]['Solver'] == "qpOASES":
self.sol_options[key].update({'Color': TUMGray1, 'Linestyle': '-', 'Marker': '^'})
[docs] def draw_gui(self):
"""
Python version: 3.5
Created by: Thomas Herrmann
Created on: 01.02.2020
Documentation: Creates a main windows including interactive objects in GUI to visualize logged data.
"""
# --- Draw main window for logs visualization
self.main_fig = plt.figure()
self.main_fig.add_subplot(100, 2, 1)
self.main_fig.subplots_adjust(bottom=0.1)
self.text_status = plt.text(0, 5,
r'$s_\mathrm{glob}$: ' + str('%.2f' % 0) + ' m' + r' $t$: '
+ str(3600 + time.mktime(
datetime.datetime.strptime(
'2020-01-01-01:01:01.00001', "%Y-%m-%d-%H:%M:%S.%f").timetuple())) + ' s'
+ r' $\mathrm{QP}_\mathrm{status}$: ' + str(0)
+ r' $\mathrm{QP}_\mathrm{iter}$: ' + str(0)
+ r' $\mathrm{SQP}_\mathrm{\Delta t}$: ' + str(0) + ' ms')
plt.axis('off')
################################################################################################################
# --- Slider and Button update functions
################################################################################################################
def update(val):
self.slider_vel.valtext.set_text(int(val / self.vis_handler.log_lines))
self.vis_handler.vis_log(int(val))
def next_val(event):
self.slider_vel.set_val(self.slider_vel.val + self.vis_handler.log_lines)
def prev_val(event):
self.slider_vel.set_val(self.slider_vel.val - self.vis_handler.log_lines)
ax_freq = plt.axes([0.1, 0.01, 0.8, 0.02])
self.slider_vel = Slider(ax_freq, 'Id', 0, self.vis_handler.row_count,
valinit=0)
# self.slider_vel = Slider(ax_freq, 'Id', 0, self.vis_handler.row_count,
# valinit=0, valstep=self.vis_handler.log_lines)
self.slider_vel.on_changed(update)
################################################################################################################
# --- Prev/Next Buttons
################################################################################################################
ax_next = plt.axes([0.95, 0.0, 0.04, 0.04])
self.but_next = Button(ax_next, 'Next')
self.but_next.on_clicked(next_val)
ax_prev = plt.axes([0.95, 0.05, 0.04, 0.04])
self.but_prev = Button(ax_prev, 'Prev')
self.but_prev.on_clicked(prev_val)
[docs] def initialize_plots(self):
"""
Python version: 3.5
Created by: Thomas Herrmann
Created on: 01.02.2020
Documentation: Initializes the plots within the debug GUI.
"""
x_dots = np.linspace(0, self.m - 2, self.m - 1)
x_dots_red = np.linspace(0, self.m - 2 - 1, self.m - 1 - 1)
################################################################################################################
# --- Velocity
################################################################################################################
ax1 = self.main_fig.add_subplot(4, 2, 1)
ax = ax1
ax.set_ylim([-1, Y_V_MAX_MPS])
p1, = ax.plot(np.zeros((self.m, 1)),
color='black', linewidth=LW, linestyle='-')
p2, = ax.plot(np.zeros((self.m, 1)),
color='red', linewidth=LW, linestyle='--')
p3, = ax.plot(self.m - 1, 0, marker='x',
color='green', linewidth=LW, markersize=LW * 3)
p4, = ax.plot(np.zeros((self.m, 1)),
color='gray', linewidth=LW, linestyle=':')
legend = [r'$v_\mathrm{o,OSQP}$',
r'$v_\mathrm{max}$',
r'$v_\mathrm{end}$',
r'$v_\mathrm{ini}$']
for key, value in self.sol_options.items():
self.vel_dict[key], = ax.plot(np.zeros((self.m, 1)), color=self.sol_options[key]["Color"], linewidth=LW,
linestyle=self.sol_options[key]["Linestyle"],
marker=self.sol_options[key]["Marker"], markevery=5)
legend.append(r'$v_\mathrm{o,{%s,%s}}$' % (self.sol_options[key]["Solver"],
self.sol_options[key]["Model"]))
self.p1_1 = p1
self.p1_2 = p2
self.p1_3 = p3
self.p1_4 = p4
plt.ylabel(r'$v$' + ' in ' r'$\mathrm{\frac{m}{s}}$')
plt.legend(legend,
mode='expand', ncol=11)
################################################################################################################
# --- Force
################################################################################################################
ax2 = self.main_fig.add_subplot(4, 2, 3)
ax = ax2
ax.set_ylim([Y_FORCE_MIN_KN, Y_FORCE_MAX_KN])
# --- Rm x tick labels
ax.set_xticklabels([])
legend = [r'$F_\mathrm{o,OSQP}$',
r'tol']
p1, = ax.plot(x_dots,
np.zeros((self.m - 1, 1)),
color='black', linewidth=LW, linestyle='-')
p2, = ax.plot([0, 0, 0],
[0,
0 + 1,
0 - 1],
linestyle='-', marker='_', color='red', linewidth=LW, markersize=LW * 3)
for key, value in self.sol_options.items():
self.F_dict[key], = ax.plot(np.zeros((self.m - 1, 1)), color=self.sol_options[key]["Color"], linewidth=LW,
linestyle=self.sol_options[key]["Linestyle"],
marker=self.sol_options[key]["Marker"], markevery=5)
legend.append(r'$F_\mathrm{o,%s,%s}$' % (self.sol_options[key]["Solver"],
self.sol_options[key]["Model"]))
self.p3_1 = p1
self.p3_2 = p2
plt.ylabel(r'$F$' + ' in ' r'$\mathrm{kN}$')
plt.legend(legend,
mode='expand', ncol=5)
################################################################################################################
# --- Delta Force
################################################################################################################
ax3 = self.main_fig.add_subplot(4, 2, 5)
ax = ax3
ax.set_ylim([Y_DELTAFORCE_MIN_KN, Y_DELTAFORCE_MAX_KN])
ax.set_xticklabels([])
p1, = ax.plot(x_dots_red,
np.zeros((self.m - 2, 1)),
color='black', linewidth=LW, linestyle='-')
self.p4_1 = p1
plt.ylabel(r'$\Delta F$' + ' in ' r'$\mathrm{kN}$')
################################################################################################################
# --- Power
################################################################################################################
ax4 = self.main_fig.add_subplot(4, 2, 7)
ax = ax4
ax.set_ylim([Y_POWER_MIN_KW, Y_POWER_MAX_KW])
legend = [r'$P$',
r'$P_\mathrm{max}$']
if self.params_opt['b_var_power']:
p1, = ax.plot(x_dots,
np.zeros((self.m - 1, 1)),
color='black', linewidth=LW, linestyle='-')
else:
p1, = ax.plot(x_dots,
np.zeros((self.m - 1, 1)),
color='black', linewidth=LW, linestyle='-')
# P_max_kW-limit
p2, = ax.plot(np.zeros((self.m - 1, 1)),
color='red', linewidth=LW, linestyle='--')
for key, value in self.sol_options.items():
self.P_dict[key], = ax.plot(np.zeros((self.m - 1, 1)), color=self.sol_options[key]["Color"], linewidth=LW,
linestyle=self.sol_options[key]["Linestyle"],
marker=self.sol_options[key]["Marker"], markevery=5)
legend.append(r'$P_\mathrm{o,%s,%s}$' % (self.sol_options[key]["Solver"],
self.sol_options[key]["Model"]))
self.p5_1 = p1
self.p5_2 = p2
self.p5_3 = p3
plt.ylabel(r'$P$' + ' in ' r'$\mathrm{kW}$')
plt.xlabel(r'$s_{\mathrm{loc},j}$')
plt.legend(legend,
loc='lower right', ncol=2)
# --- Combine x-axes
ax4.get_shared_x_axes().join(ax4, ax1)
ax4.get_shared_x_axes().join(ax4, ax2)
ax4.get_shared_x_axes().join(ax4, ax3)
################################################################################################################
# --- Slack variables
################################################################################################################
ax = self.main_fig.add_subplot(5, 2, 2)
ax.set_ylim([Y_SLACK_TRE_MIN, Y_SLACK_TRE_MAX])
legend = [r'$\epsilon_\mathrm{o,OSQP}$',
r'$\epsilon_\mathrm{ini}$',
r'$\epsilon_\mathrm{max}$']
p1, = ax.plot(np.zeros((self.n, 1)),
color='black', linewidth=LW, linestyle='-')
p2, = ax.plot(np.zeros((self.n, 1)),
color='gray', linewidth=LW, linestyle=':')
p3, = ax.plot(np.zeros((self.n, 1)),
color='red', linewidth=LW, linestyle='--')
for key, value in self.sol_options.items():
if self.sol_options[key]['Slack'] is True:
self.slack_dict[key], = ax.plot(np.zeros((self.n, 1)), color=self.sol_options[key]["Color"],
linewidth=LW,
linestyle=self.sol_options[key]["Linestyle"])
legend.append(r'$\epsilon_\mathrm{o,%s,%s}$' % (self.sol_options[key]["Solver"],
self.sol_options[key]["Model"]))
self.p7_1 = p1
self.p7_2 = p2
self.p7_3 = p3
plt.xlabel(r'$s_{\mathrm{loc},k}$')
plt.ylabel(r'$\epsilon$')
plt.legend(legend,
mode='expand', ncol=5)
########################################################################################################
# --- Tire usage
########################################################################################################
ax = self.main_fig.add_subplot(2, 2, 4)
ax.set_xlim([- X_AYMAX_MPS2, X_AYMAX_MPS2])
ax.set_ylim([- Y_AXMAX_MPS2, Y_AXMAX_MPS2])
legend = [r'$\bar{\mu}$',
r'$\bar{\mu} + \epsilon_\mathrm{max}$',
r'$\mu_\mathrm{o}$']
# --- Case of constant friction limits
p1, = ax.plot([self.constants_opt.params['aymax_mps2_'],
0,
- self.constants_opt.params['aymax_mps2_'],
0,
self.constants_opt.params['aymax_mps2_']],
[0,
self.constants_opt.params['axmax_mps2_'],
0,
- self.constants_opt.params['axmax_mps2_'],
0],
color='green', linestyle='-', linewidth=LW)
p2, = ax.plot([self.constants_opt.params['axmax_mps2_']
* (1 + self.constants_opt.params['s_v_t_lim_'] * self.constants_opt.params['s_v_t_unit_']),
0,
- self.constants_opt.params['axmax_mps2_']
* (1 + self.constants_opt.params['s_v_t_lim_'] * self.constants_opt.params['s_v_t_unit_']),
0,
self.constants_opt.params['axmax_mps2_']
* (1 + self.constants_opt.params['s_v_t_lim_'] * self.constants_opt.params['s_v_t_unit_'])],
[0,
self.constants_opt.params['axmax_mps2_']
* (1 + self.constants_opt.params['s_v_t_lim_'] * self.constants_opt.params['s_v_t_unit_']),
0,
- self.constants_opt.params['axmax_mps2_']
* (1 + self.constants_opt.params['s_v_t_lim_'] * self.constants_opt.params['s_v_t_unit_']),
0],
color='green', linestyle='--', linewidth=LW)
# Plot ellipse
for key, value in self.sol_options.items():
if self.sol_options[key]['Friction'] == 'Circle':
ax.add_patch(pltpatches.Ellipse((0, 0), self.constants_opt.params['aymax_mps2_'] * 2,
self.constants_opt.params['axmax_mps2_'] * 2,
facecolor='none', edgecolor='green', linewidth=LW, alpha=0.5))
p, = ax.plot(np.zeros((self.m - 1, 1)), np.zeros((self.m - 1, 1)),
marker='x', linestyle='', markersize=LW * 3, color='black')
for key, value in self.sol_options.items():
self.a_dict[key], = ax.plot(np.zeros((self.m - 1, 1)), np.zeros((self.m - 1, 1)),
color=self.sol_options[key]["Color"], linewidth=LW,
linestyle=self.sol_options[key]["Linestyle"],
marker=self.sol_options[key]["Marker"], markevery=2)
legend.append(r'$\mu_\mathrm{o,%s,%s}$' % (self.sol_options[key]["Solver"],
self.sol_options[key]["Model"]))
ax.axis('equal')
# --- Case of variable friction limits draw maximum available friction limits
if self.params_opt['b_var_friction']:
axmax_max_plot = 0
axmax_min_plot = 0
aymax_max_plot = 0
aymax_min_plot = 0
p3, = ax.plot([aymax_max_plot, 0, - aymax_max_plot, 0, aymax_max_plot],
[0, axmax_max_plot, 0, - axmax_max_plot, 0],
color='gray', linestyle='-', linewidth=LW)
p4, = ax.plot([aymax_min_plot, 0, - aymax_min_plot, 0, aymax_min_plot],
[0, axmax_min_plot, 0, - axmax_min_plot, 0],
color='gray', linestyle='--', linewidth=LW)
self.p6_1 = p
self.p6_2 = p3
self.p6_3 = p4
plt.xlabel(r'$a_\mathrm{y}$' + ' in ' + r'$\frac{m}{s^2}$')
plt.ylabel(r'$a_\mathrm{x}$' + ' in ' + r'$\frac{m}{s^2}$')
plt.legend(legend)
# --- Draw maximum motor acceleration potential
ax.plot([- self.constants_opt.params['axmax_mps2_'], self.constants_opt.params['axmax_mps2_']],
[self.constants_opt.params['Fmax_kN_'] / self.constants_opt.params['m_t_'],
self.constants_opt.params['Fmax_kN_'] / self.constants_opt.params['m_t_']],
linestyle='--', color='red', linewidth=LW)
for key, value in self.sol_options.items():
if self.sol_options[key]['Model'] == "DM" or self.sol_options[key]['Model'] == "FW":
########################################################################################################
# --- Front Axle Tire usage
########################################################################################################
ax = self.main_fig.add_subplot(4, 5, 9)
ax.set_xlim([- 1, 1])
ax.set_ylim([- 1, 1])
circle = plt.Circle((0, 0), 1, facecolor='none',
edgecolor=TUMGray1, linewidth=LW, alpha=0.5)
ax.add_patch(circle)
for key, value in self.sol_options.items():
if self.sol_options[key]['Model'] == "DM":
self.F_f_dict[key], = ax.plot(np.zeros((self.m - 1, 1)), np.zeros((self.m - 1, 1)),
color=self.sol_options[key]["Color"], linewidth=LW,
linestyle=self.sol_options[key]["Linestyle"],
marker=self.sol_options[key]["Marker"], markevery=2)
legend.append(r'$F_\mathrm{o,%s,%s}$' % (self.sol_options[key]["Model"],
self.sol_options[key]["Solver"]))
elif self.sol_options[key]['Model'] == "FW" and self.sol_options[key]['Solver'] == "IPOPT":
self.F_fl_dict[key], = ax.plot(np.zeros((self.m - 1, 1)), np.zeros((self.m - 1, 1)),
color=self.sol_options[key]["Color"], linewidth=LW,
linestyle=self.sol_options[key]["Linestyle"],
marker=self.sol_options[key]["Marker"], markevery=2)
self.F_fr_dict[key], = ax.plot(np.zeros((self.m - 1, 1)), np.zeros((self.m - 1, 1)),
color=TUMGreen, linewidth=LW,
linestyle=self.sol_options[key]["Linestyle"],
marker='*', markevery=2)
plt.xlabel(r'$F_\mathrm{y,f} / F_\mathrm{z,f}$')
plt.ylabel(r'$F_\mathrm{x,f} / F_\mathrm{z,f}$')
plt.title('Front Tire')
if self.sol_options[key]['Model'] == "FW":
plt.legend(['left', 'right'])
ax.axis('equal')
########################################################################################################
# --- Rear Axle Tire usage
########################################################################################################
ax = self.main_fig.add_subplot(4, 5, 10)
ax.set_xlim([- 1, 1])
ax.set_ylim([- 1, 1])
circle = plt.Circle((0, 0), 1, facecolor='none',
edgecolor=TUMGray1, linewidth=LW, alpha=0.5)
ax.add_patch(circle)
for key, value in self.sol_options.items():
if self.sol_options[key]['Model'] == "DM":
self.F_r_dict[key], = ax.plot(np.zeros((self.m - 1, 1)), np.zeros((self.m - 1, 1)),
color=self.sol_options[key]["Color"], linewidth=LW,
linestyle=self.sol_options[key]["Linestyle"],
marker=self.sol_options[key]["Marker"], markevery=2)
elif self.sol_options[key]['Model'] == "FW" and self.sol_options[key]['Solver'] == "IPOPT":
self.F_rl_dict[key], = ax.plot(np.zeros((self.m - 1, 1)), np.zeros((self.m - 1, 1)),
color=self.sol_options[key]["Color"], linewidth=LW,
linestyle=self.sol_options[key]["Linestyle"],
marker=self.sol_options[key]["Marker"], markevery=2)
self.F_rr_dict[key], = ax.plot(np.zeros((self.m - 1, 1)), np.zeros((self.m - 1, 1)),
color=TUMGreen, linewidth=LW,
linestyle=self.sol_options[key]["Linestyle"],
marker='*', markevery=2)
plt.xlabel(r'$F_\mathrm{y,r} / F_\mathrm{z,r}$')
plt.title('Rear Tire')
if self.sol_options[key]['Model'] == "FW":
plt.legend(['left', 'right'])
ax.axis('equal')
if __name__ == '__main__':
pass