The Vehicle
class is designed to model and analyze various aspects of vehicle dynamics, including steering geometry, suspension kinematics, and wheel loads. It uses numerical methods to solve equations related to vehicle kinematics and dynamics, aiming to provide a comprehensive understanding of vehicle behavior under different conditions.
# Create a Vehicle instance with example parameters
vehicle = Vehicle(
r_A=np.array([0, 0, 0]),
r_B=np.array([1, 0, 0]),
r_C=np.array([2, 0, 0]),
r_O=np.array([0, 1, 0]),
r_K=np.array([0, 0, 1]),
slr=300,
initial_camber=2,
tw=1500,
wb=2500,
GVW=2000,
b=1000,
wheel_rate_f=50,
wheel_rate_r=50,
tire_stiffness_f=100,
tire_stiffness_r=100,
pinion=3,
tirep=32,
dila=5,
r_La=np.array([0, 0, 0]),
r_Lb=np.array([0, 0, 0]),
r_strut=np.array([0, 0, 0]),
r_Ua=np.array([0, 0, 0]),
r_Ub=np.array([0, 0, 0])
)
Please put appropriate values to instantiate an object.
Effective visualization helps in understanding vehicle dynamics and suspension behavior:
Visualize steering parameters such as:
Illustrate the kinematics of FVSA and SVSA systems:
Plot key dynamics metrics to assess vehicle performance:
Here’s the Python script for the Vehicle
class and its methods.
Define $ \zeta = [\alpha_L, \beta_L]
$ as the domain for the right wheel Kingpin angle (in degrees), where:
\alpha_L
$ is the lock angle when steered right \beta_L
$ is the lock angle when steered leftFor example, for QUTE, $ \zeta = [-47.31^\circ, 37.28^\circ]
$.
\theta = 0^\circ
$We know the initial position vectors:
$ (\mathbf{r}_K)_0, (\mathbf{r}_A)_0, (\mathbf{r}_B)_0, (\mathbf{r}_O)_0, (\mathbf{r}_T)_0, (\mathbf{r}_W)_0, (\mathbf{r}_C)_0, (\mathbf{r}_{ICF})_0, (\mathbf{r}_{ICS})_0
$
Here, $ (\mathbf{r}_M)_0
$ represents the initial position vector of point M.
\theta = 0.1^\circ
$: (\mathbf{r}_B), (\mathbf{r}_O), (\mathbf{r}_T), (\mathbf{r}_W)
$ as per the rotation about the Kingpin axis (KPA) given by $ (\mathbf{r}_A)_0 - (\mathbf{r}_K)_0
$. (\mathbf{r}_T), (\mathbf{r}_W)
$ as per a virtual bump/droop, keeping the same Z-coordinate. \Delta (\mathbf{r}_{TW})
$. (\delta z)_{\theta=0.1^\circ}
$. (\mathbf{r}_O)
$ after accounting for the virtual bump/droop $ (\delta z)_{\theta=0.1^\circ}
$. (\mathbf{r}_K), (\mathbf{r}_A)
$ based on the rotation about the KPA given by $ (\mathbf{r}_{ICF})_0 - (\mathbf{r}_{ICS})_0
$ and the virtual bump/droop $ (\delta z)_{\theta=0.1^\circ}
$. (\mathbf{r}_B)
$ considering the forced suspension path from $ \Delta (\mathbf{r}_K)
$ (or $ \Delta (\mathbf{r}_A)
$ if the steering arm is connected to point A). (\mathbf{r}_C)
$ based on the intersection with $ (\mathbf{r}_C)_0 + \lambda \mathbf{j}
$, where $ \lambda
$ is a scalar. \Delta (\mathbf{r}_C)
$. \theta = \theta_0 \in \zeta
$:Assume that after memoization, we know the position vectors:
$ (\mathbf{r}_K)_{\theta_0}, (\mathbf{r}_A)_{\theta_0}, (\mathbf{r}_B)_{\theta_0}, (\mathbf{r}_O)_{\theta_0}, (\mathbf{r}_T)_{\theta_0}, (\mathbf{r}_W)_{\theta_0}, (\mathbf{r}_C)_{\theta_0}, (\mathbf{r}_{ICF})_{\theta_0}, (\mathbf{r}_{ICS})_{\theta_0}, (\delta z)_{\theta_0}
$
Where $ (\mathbf{r}_M)_{\theta_0}
$ represents the position vector of point M at $ \theta = \theta_0
$.
For $ \theta = \theta_0 \pm 0.1^\circ
$ :
(\mathbf{r}_B), (\mathbf{r}_O), (\mathbf{r}_T), (\mathbf{r}_W)
$ as per the rotation about the KPA given by $ (\mathbf{r}_A) - (\mathbf{r}_K)
$ at $ \theta = \theta_0
$. (\mathbf{r}_T)
$ keeping the same Z-coordinate as $ (\mathbf{r}_T)_{\theta_0}
$. \Delta (\mathbf{r}_{TW}) = (\mathbf{r}_{TW})_{\theta_0 \pm 0.1^\circ} - (\mathbf{r}_{TW})_0
$. (\delta z)_{\theta_0 \pm 0.1^\circ} - (\delta z)_{\theta_0}
$. (\mathbf{r}_O)
$ after accounting for the virtual bump/droop $ (\delta z)_{\theta_0 \pm 0.1^\circ} - (\delta z)_{\theta_0}
$. (\mathbf{r}_K), (\mathbf{r}_A)
$ based on the rotation about the KPA given by $ (\mathbf{r}_{ICF}) - (\mathbf{r}_{ICS})
$ at $ \theta = \theta_0
$ and the virtual bump/droop $ (\delta z)_{\theta_0 \pm 0.1^\circ} - (\delta z)_{\theta_0}
$. (\mathbf{r}_B)
$ considering the forced suspension path from $ \Delta (\mathbf{r}_K) = (\mathbf{r}_K)_{\theta_0 \pm 0.1^\circ} - (\mathbf{r}_K)_{\theta_0}
$. (\mathbf{r}_C)
$ based on the intersection with $ (\mathbf{r}_C)_{\theta_0} + \lambda \mathbf{j}
$, where $ \lambda
$ is a scalar. \Delta (\mathbf{r}_C) = (\mathbf{r}_C)_{\theta_0 \pm 0.1^\circ} - (\mathbf{r}_C)_{\theta_0}
$.To facilitate this process, store the variables from $ 0
$ to $ \alpha_L
$ in increments of $ 0.1^\circ
$ and from $ 0
$ to $ \beta_L
$ in decrements of $ 0.1^\circ
$.
Ensure you have the following libraries installed:
numpy
scipy
matplotlib
pip install numpy scipy matplotlib