├── images
├── .gitkeep
├── bicycle_model_01.png
├── bicycle_model_02.png
├── bicycle_model_03.png
└── Pacejka_Fx_coefs_for_Fz_4kN.png
├── _config.yml
├── README.md
├── books.md
├── Minaker.md
├── Softwares.md
└── bicycle_model.ipynb
/images/.gitkeep:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-cayman
--------------------------------------------------------------------------------
/images/bicycle_model_01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EricCabrol/VehicleDynamics/HEAD/images/bicycle_model_01.png
--------------------------------------------------------------------------------
/images/bicycle_model_02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EricCabrol/VehicleDynamics/HEAD/images/bicycle_model_02.png
--------------------------------------------------------------------------------
/images/bicycle_model_03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EricCabrol/VehicleDynamics/HEAD/images/bicycle_model_03.png
--------------------------------------------------------------------------------
/images/Pacejka_Fx_coefs_for_Fz_4kN.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EricCabrol/VehicleDynamics/HEAD/images/Pacejka_Fx_coefs_for_Fz_4kN.png
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # VehicleDynamics
2 |
3 |
4 | ## In this repo
5 |
6 | [Bicycle (aka single-track) model](https://github.com/EricCabrol/VehicleDynamics/blob/master/bicycle_model.ipynb) : a python notebook
7 |
8 | [Reference books](https://github.com/EricCabrol/VehicleDynamics/blob/master/books.md) : a personal list
9 |
10 | [Softwares](https://github.com/EricCabrol/VehicleDynamics/blob/master/Softwares.md)
11 |
12 | [Fundamentals of Vehicle Dynamics and Modelling](https://github.com/EricCabrol/VehicleDynamics/blob/master/Minaker.md) : my review of Bruce Minaker's 2019 book
13 |
14 | ## Elsewhere
15 |
16 | [MFEval](https://www.mathworks.com/matlabcentral/fileexchange/63618-mfeval) : an open-source implementation of Pacejka's Magic Formula (made available by Marco Furlan of Jaguar Land-Rover for MF versions 5.2, 6.1 and 6.2)
17 |
18 | [Vehicle Component Library](https://github.com/TUMFTM/Component_Library_for_Full_Vehicle_Simulations) : a Matlab library for longitudinal vehicle dynamics, by TUMFTM
19 |
--------------------------------------------------------------------------------
/books.md:
--------------------------------------------------------------------------------
1 | ## Some major books about Vehicle Dynamics
2 |
3 | ### The reference about tires ###
4 |
5 | * **Hans B Pacejka, _Tyre and Vehicle Dynamics_, Butterworth-Heinemann, (three editions in 2002 - 2006 - 2012)**
6 |
7 | 670 pages
8 | Professor Pacejka from Delft University is the author of the well-known Magic Formula, and his book is definitely an undisputed reference on the subject.
9 |
10 | ### The classic ones ###
11 |
12 | * **J.Y. Wong. _Theory of Ground Vehicles_ (1978 - 1993 - 2001 - 2008)**
13 |
14 | 560 pages. Seven chapters (see details on [wiley](https://www.wiley.com/en-us/Theory+of+Ground+Vehicles%2C+4th+Edition-p-9780470170380) website).
15 | Covers off-road vehicles, including tractors, etc. Includes a whole chapter on "terramechanics" (vehicle terrain interaction).
16 |
17 | * **John C Dixon, _Tires, Suspension and Handling_ (1991 - 1996)**
18 |
19 | 621 pages
20 | Quite advanced, and rather short on illustrations.
21 | No ebook available on [Google Books](https://books.google.fr/books?id=r6pTAAAAMAAJ), you can find the paper version on [Amazon](https://www.amazon.fr/Tires-Suspension-Handling-John-Dixon/dp/1560918314).
22 | The author also wrote _The Shock Absorber Handbook_ and _Suspension Geometry and computation_
23 |
24 | * **T. Gillespie, _Fundamentals of Vehicle Dynamics_ (1992)**
25 |
26 | Intermediate level.
27 | The only classic without any updated edition ? Looks quite old now. Chapters about acceleration and braking performance, road load, aerodynamics, rolling resistance, ride, steady-state cornering, suspensions, steering system, rollover, tires.
28 | Some examples with solutions at the end of each chapter.
29 |
30 |
31 | * **W. Milliken & D. Milliken, _Race Car Vehicle Dynamics_ (1995)**
32 |
33 | * **W. Milliken & D. Milliken, _Chassis Design - Principles and Analysis_ (2002)**
34 |
35 | * **G. Genta, _Motor Vehicle Dynamics. Modeling and Simulation_ (1997)**
36 |
37 | ### More recent books ###
38 |
39 | * **Reza N Jazar, _Vehicle Dynamics, Theory and Application_ (2008 - 2014 - 2017)**
40 |
41 | 988 pages
42 | Springer website claims that the 3rd edition has been reduced by 25% ("to allow for coverage over one semester"), but there is still approximately one thousand pages ...
43 | Professor Jazar also wrote _Advanced Vehicle Dynamics_ published in 2019, rather intended for post-graduate students.
44 |
45 | * **Rajesh Rajamani, _Vehicle Dynamics and Control_ (2006 - 2012)**
46 |
47 | 524 pages
48 | Great book, very clear. Addresses lateral control, longitudinal control, suspension control ... Some ADAS applications are processed, such as automated lane keeping or adaptive cruise-control.
49 | In the second edition of the book chapters on roll dynamics, rollover prevention and hybrid electric vehicles have been added, and the chapter on electronic stability control has been enhanced. There's even a chapter about IC engines.
50 |
51 |
52 | * **Karnopp - Vehicle Dynamics, Stability, and Control 2nd ed (2004 - 2013)**
53 |
54 | 300 pages
55 | Dean Karnopp is professor emeritus at UC Davis. The book is not restricted to automobiles, and contains chapters about trailers, two-wheeled and tilting vehicles, aircrafts, rail vehicle dynamics (and also 40 pages of problems at the end). Covers the basics of stability and control but less thoroughly than Rajamani's book. Karnopp addresses only lateral (yaw) control for example.
56 | Level : intermediate
57 |
58 |
59 | * **Bruce Minaker, _Fundamentals of Vehicle Dynamics and Modelling_ (2019)**
60 |
61 | See my [detailed review](https://github.com/EricCabrol/VehicleDynamics/blob/master/Minaker.md)
62 |
63 | ### French-speaking only ###
64 |
65 | * **Thierry Halconruy, _Les liaisons au sol_ (1995 - 200 pages)**
66 |
67 | * **Jean-Pierre Brossard, _Dynamique du véhicule: Modélisation des systèmes complexes_ (2013 - 710 pages)**
68 |
69 |
70 | ### Some I haven't read .. yet :) ###
71 |
72 | * Rao V Dukkipati and others, _Road Vehicle Dynamics_, SAE, 2008
73 | * Georg Rill, _Road Vehicle Dynamics: Fundamentals and Modeling_, 2011
74 | * D. J. N. Limebeer and Matteo Massaro, _Dynamics and Optimal Control of Road Vehicles_, 2018
75 |
--------------------------------------------------------------------------------
/Minaker.md:
--------------------------------------------------------------------------------
1 | # Fundamentals of vehicle dynamics and modelling
2 |
3 | Book published in 2019, and first attempt from the writer, [Bruce Minaker](http://www.uwindsor.ca/engineering/mame/321/dr-b-minaker), associate professor at the university of Windsor.
4 |
5 | 
6 |
7 | The [preface](https://books.google.fr/books?id=-HCqDwAAQBAJ&pg=PA1&hl=fr&source=gbs_toc_r&cad=3#v=onepage&q&f=false) explains his intent :
8 | > I have found many texts on this topic and others that, while providing good relevant coverage, add much more content than necessary. I believe that this level of breadth is not in the reader's best interest, With many Ieft overwhelmed by the prospect of mastering so much material, and eventually resigning themselves to never finishing.
9 | > (...)
10 | > **The book does not aim to be a complete reference, but rather to give a solid foundation while generating enthusiasm in the student reader**
11 |
12 | As a result the book is rather short (a little less than 200 pages)
13 |
14 | **Chapters**
15 | 1. Introduction
16 | 2. Tire Modelling
17 | 3. Longitudinal dynamics
18 | 4. Linear dynamic models
19 | 5. Full car model
20 | 6. Multibody dynamics
21 | 7. Mathematics
22 |
23 | Most chapters are illustrated with a few numerical examples, and also with problems (no solutions given).
24 |
25 | The chapter dedicated to **tire modelling** is very brief (10 pages), almost equation-free (no Magic Formula inside !), it is a basic introduction to the underlying physics.
26 |
27 | **Longitudinal dynamics** deals with acceleration and braking performance, with a focus on load transfer. The optimal brake distribution is very clearly explained.
28 |
29 | **Linear models** are then introduced, starting with the *yaw plane* model for cornering dynamics (often called bicycle model in the literature). The classical first-order system is derived and its applications are illustrated, both for steady-state analysis and for transient behaviour. Stability conditions are discussed, explaining clearly the influence of the location of the center of gravity. A *truck and trailer* model is also presented.
30 | For vertical motion, two models are presented : *quarter-car* for suspension analysis, and *bounce-pitch* for vehicle body motion.
31 |
32 | A **full-car model** is presented in chapter 5, restricted to bounce, pitch and roll motions (no longitudinal neither lateral equations). The way this chapter is built doesn't seem as obvious as the previous ones. Firstly some pages more heavily loaded of equations and linear algebra, just to conclude that the problem becomes too big to be solved by hand and must be computed numerically. Then only a few lines to comment the results obtained and detail the corresponding modes.
33 | Then we get back to more physics with a couple of pages about kinematic effects (roll centers, jacking effects ...), but I don't understand the timing.
34 |
35 | Chapter 6 about **Multibody dynamics** becomes more theoretical, explaining how the governing equations are generated. I would have liked to see a paragraph explaining the fundamental difference between pure multibody softwares and solvers based on prior symbolic resolution of the equations of motion (like all the commercial softwares dedicated to vehicle dynamics)
36 |
37 | In the last chapter about **Mathematics** I liked the focus on the difference between algebraic and differential equations. But did it deserve a full chapter ?
38 |
39 |
40 | ### Conclusion
41 |
42 | **I did appreciate that**
43 | * The main concepts are clearly explained.
44 | * The balance between "theory" and "physics" is fine.
45 | * Most of the equations come with interpretations.
46 |
47 | **I was less convinced by**
48 | * 25 pages about mathematics at the end, but only 10 pages about tire modelling in chapter 1 ? Odd choice !
49 | * the structure of chapter 5 about full-car modelling.
50 | * The quite high $/page cost :)
51 |
52 | But in the end the book is definitely worth reading, and respects imho the intent of the author to provide a first step that should lead readers to dive deeper into vehicle dynamics.
53 |
--------------------------------------------------------------------------------
/Softwares.md:
--------------------------------------------------------------------------------
1 |
2 | NB : the categories below only reflect my personal view. There is no such thing as "truth" here (except may be the market share figures, which I do not have). The most important point when choosing a software is to know if it fits your needs and requirements.
3 |
4 | ## Champions
5 | * [IPG CarMaker](https://ipg-automotive.com/fr/produits-et-services/simulation-software/carmaker/), which is probably the heavyweight of this competition, used by many OEM and suppliers. But also the most expensive software, as far as I know :)
6 | * [CarSim](https://www.carsim.com/). The company (Mechanical Simulation) was co-founded in 1996 by Thomas Gillespie, author of a [reference book](https://github.com/EricCabrol/VehicleDynamics/blob/master/books.md) about vehicle dynamics.
7 | * [VI-CarRealTime](https://www.vi-grade.com/en/products/vi-carrealtime/). The company (VI-Grade) was created in 2005 as a spin-off from MSC Software.
8 | * [Dyna4](https://www.vector.com/int/en/products/products-a-z/software/dyna4/). The company (TESIS) was created in 1992 by Cornelius Chucholowski (who was at that time a freelancer for BMW, in charge of real-time capable vehicle models), and acquired in 2019 by VECTOR.
9 | * [MSC Adams/Car](https://www.mscsoftware.com/fr/product/adamscar) which unlike the others is a multibody solver, hence more "generic" but less computationally efficient (*). [Adams Real-Time](https://www.mscsoftware.com/fr/product/adams-real-time) is a "simplified" version for RT applications
10 |
11 |
12 | ## Challengers
13 | * [Modelon Vehicle Dynamics Library](https://www.modelon.com/library/vehicle-dynamics-library), based on Modelica (... but not free :) )
14 | * [Simcenter Amesim](https://www.plm.automation.siemens.com/global/fr/products/simulation-test/vehicle-dynamics.html) with a dedicated Vehicle Dynamics library
15 | * [Simulink Vehicle Dynamics Blockset](https://www.mathworks.com/products/vehicle-dynamics.html)
16 | * [AVSimulation Callas](https://www.avsimulation.com/callas-vehicle-dynamics-model-runtime/), included in the SCANeR simulation suite.
17 | * [dSpace ASM Vehicle Dynamics](https://www.dspace.com/en/pub/home/products/sw/automotive_simulation_models/produkte_asm/vehicle_dynamics_models.cfm)
18 | * [AVL VSM](https://www.avl.com/-/avl-vsm-4-)
19 | * [ChassisSim](https://www.chassissim.com/), with the excellent youtube channel animated by Danny Nowlan. Recently partnered with [Altair](https://altairengineering.fr/chassissim/)
20 | * [RACE Software](https://race.software/)
21 | * [Dynacar](https://www.winemantech.com/products/dynacar-vehicle-simulator/), available as an add-on for NI VeriStand for HIL testing
22 |
23 | ## See also
24 |
25 | There are solutions among the majority of simulation software vendors, but knowing how relevant they are would require a full time survey, which I can't afford :)
26 | You can have a look at [SimulationX](https://www.simulationx.com/iti/newsdetail/news/driving-maneuvers-models-for-mbs-vehicle-dynamics-simulation.html) by ESI, [MapleSoft](https://www.maplesoft.com/solutions/engineering/IndustrySolutions/vehicledynamics.aspx), etc ...
27 |
28 | * [SimVehicle](https://www.faac.com/realtime-technologies/products/simvehiclelt/) (not well known, at least by me)
29 | * [MapleCar](https://www.maplesoft.com/webinars/recorded/featured.aspx?id=1288) : looks like a student project at that time
30 |
31 |
32 |
33 | ## On the freeware or open-source side
34 | * [Project Chrono](https://projectchrono.org/) with a a financial support from the US Army
35 | * [MBDyn](https://www.mbdyn.org/) which is a generic multibody solver by a team from Politecnico di Milano
36 | * [OpenVD](https://github.com/andresmendes/openvd) by Andres Mendes, available for Octave (free alternative to Matlab)
37 | * [EoM](https://github.com/BPMinaker/EoM.jl) in Julia, by Bruce Minaker ([his book](https://www.wiley.com/en-bz/Fundamentals+of+Vehicle+Dynamics+and+Modelling:+A+Textbook+for+Engineers+With+Illustrations+and+Examples-p-9781118980095)). Far from a ready to use package, but interesting to understand how the equations are derived
38 | * [MBSymba](http://www.multibody.net/mbsymba/) in the same vein, by Roberto Lot (well known for its academic contributions). But it is Maple based, I think.
39 | * [PyCar](https://github.com/aarrietac/pycar_animator), by [Abel Arrieta Castro](https://aarrietac.github.io/academic/project/vitual-test-car/). The software is mentioned [here](https://www.maxwell.vrac.puc-rio.br/33168/33168_4.PDF)
40 | * [DynaV](http://brejaud.pascal.pagesperso-orange.fr/index.htm) (last updated in 2006 !) if you can read french, and are still reading this page ... :)
41 |
42 | OpenModelica used to propose a Vehicle Dynamics library in the early times, but from [this discussion](https://www.openmodelica.org/forum/default-topic/2668-free-vehicle-dynamics-library) it's unlikely that it still works.
43 |
44 | ---
45 |
46 | (*) If you want to know more about the difference between multibody solvers and dedicated vehicle dynamics softwares, you can have a look at the sixth slide of my document [Resources for Multibody simulation](https://github.com/EricCabrol/Short_stories/blob/master/multibody_simulation_resources_in_10slides.pdf).
47 | To make it simple, most softwares from the above list use a symbolic formulation for a predefined topology of the model (see for example the [14dof model](https://www.mathworks.com/help/vdynblks/ug/passenger-vehicle-dynamics-models.html) of Mathworks' VD BlockSet).
48 | If you want to add a body with its own dynamic, you can't ! But these softwares are fast, around 10 times faster than real-time.
49 |
50 | With Adams/Car on the other hand you can do what you want in terms of topology, but it has a strong impact on CPU performance : it depends a lot on the complexity level of the model of course, but with a very rough approximation Adams/Car is 10 times slower than real-time, and Adams-RT is barely fast enough to be used on RT platforms.
51 |
52 | There are of course other major differences between the two families (such as hardpoints vs elasto-kinematic maps), but it would go beyond the scope of this page ...
53 |
--------------------------------------------------------------------------------
/bicycle_model.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "textile-tongue",
6 | "metadata": {},
7 | "source": [
8 | "# Single track model\n",
9 | "\n",
10 | "\n",
11 | "## Introduction\n",
12 | "\n",
13 | "The single-track model also called bicycle model is a simple yet useful representation of the behaviour of a (4-wheeled) vehicle. Fundamental quantities used to assess handling both in steady-state and transient conditions can be derived from this model, which is covered by most authors of vehicle dynamics. \n",
14 | "I particularly appreciate the clarity of the dedicated chapter in the book [Vehicle Handling Dynamics](https://www.elsevier.com/books/vehicle-handling-dynamics/abe/978-0-08-100390-9) by Masato Abe.\n",
15 | "\n",
16 | "But don't forget that it is a very simplified representation of a vehicle. As Massimo Guiggani writes in [The Science of Vehicle Dynamics](https://www.springer.com/gp/book/9789401776875) :\n",
17 | "> Vehicle engineers should be well aware of the steps taken to simplify the model, and hence realize that in some cases the single track model may miss some crucial phenomena, and the double track model should be used instead\n",
18 | "\n",
19 | "\n",
20 | "You can find great information online in the course given by Pierre Duysinx at University of Liège (Belgium), especially in [MECA0525](http://www.ingveh.ulg.ac.be/index.php?page=MECA0525). \n",
21 | "The most useful pdf to understand this single track model is \n",
22 | "[Vehicle dynamics 1](http://www.ingveh.ulg.ac.be/uploads/education/MECA0525/11_MECA0525_VEHDYN1_SSTURN_2020-2021.pdf), in which you can find some more details than those given in this notebook. \n",
23 | "\n",
24 | "\n",
25 | "\n",
26 | "## Symbols\n",
27 | "\n",
28 | "```\n",
29 | "L wheelbase (m)\n",
30 | "a distance between the center of gravity G and the front axle (m)\n",
31 | "b distance between the center of gravity G and the rear axle (m)\n",
32 | "m mass of the vehicle (kg)\n",
33 | "osr overall steering ratio\n",
34 | "R radius of the turn (m)\n",
35 | "V tangent velocity (m/s)\n",
36 | "ay lateral acceleration (m/s^2)\n",
37 | "δ steering angle at the wheel (rad)\n",
38 | "α slip angle of the wheel (rad)\n",
39 | "β slip angle of the vehicle (rad)\n",
40 | "```\n",
41 | "\n",
42 | "Caution : in the above mentioned course P. Duysinx uses the variables `b` and `c` for the distances between the CoG and the axles. In this notebook I chose `a` and `b` instead, which is a more standard convention in reference books.\n",
43 | "\n",
44 | "\n",
45 | "\n",
46 | "## Steady-state turning\n",
47 | "\n",
48 | "\n",
49 | "### Low lateral acceleration\n",
50 | "\n",
51 | "\n",
52 | "\n",
53 | "The steering angle at very low lateral acceleration is called Ackermann angle `δ_ack` (french readers may use Jeantaud instead of Ackermann). We have from simple kinematic conditions :\n",
54 | "```\n",
55 | "tan(δ_ack) = L/R\n",
56 | "```\n",
57 | "and using the approximation for small angles it is often written\n",
58 | "```\n",
59 | "δ_ack = L/R\n",
60 | "```\n"
61 | ]
62 | },
63 | {
64 | "cell_type": "code",
65 | "execution_count": 129,
66 | "id": "israeli-bandwidth",
67 | "metadata": {},
68 | "outputs": [
69 | {
70 | "name": "stdout",
71 | "output_type": "stream",
72 | "text": [
73 | "\n",
74 | "Lateral acceleration = 0.31 m/s^2\n",
75 | "Ackermann angle at the wheel = 0.035 rad.\n",
76 | "Angle at the steering wheel = 30.1 deg.\n"
77 | ]
78 | }
79 | ],
80 | "source": [
81 | "%matplotlib inline\n",
82 | "import matplotlib.pyplot as plt\n",
83 | "import math\n",
84 | "import numpy as np\n",
85 | "\n",
86 | "# Vehicle data\n",
87 | "a = 1.2 # m\n",
88 | "b = 1.6 # m\n",
89 | "m = 1500 # kg\n",
90 | "osr = 15\n",
91 | "L = a + b # m\n",
92 | "\n",
93 | "# Manoeuver data\n",
94 | "R = 80 # m\n",
95 | "V = 5 # m/s\n",
96 | "\n",
97 | "rad2deg = 180/math.pi\n",
98 | "g = 9.81 # m/s^2\n",
99 | "\n",
100 | "ay = V**2 / R\n",
101 | "δ_ack = math.atan(L/R)\n",
102 | "\n",
103 | "# Caution : f-string used here (only with Python 3.6+ - Switch to the older format function if required)\n",
104 | "\n",
105 | "print()\n",
106 | "print(f\"{'Lateral acceleration':40} = {ay:.2f} m/s^2\")\n",
107 | "print(f\"{'Ackermann angle at the wheel':40} = {δ_ack:.3f} rad.\")\n",
108 | "print(f\"{'Angle at the steering wheel':40} = {δ_ack*osr*rad2deg:.1f} deg.\")\n"
109 | ]
110 | },
111 | {
112 | "cell_type": "markdown",
113 | "id": "positive-geneva",
114 | "metadata": {},
115 | "source": [
116 | "### Increasing lateral acceleration\n",
117 | "\n",
118 | "At higher lateral acceleration, a slip angle α appears between the plane of the wheel and its velocity vector. \n",
119 | "\n",
120 | "\n",
121 | "\n",
122 | "The slip angle is related to the lateral force due to the acceleration and to the cornering stiffness of the tire (which depends on the vertical load, the camber angle, the tire pressure, etc ...). Most of the time the front and rear slip angles won't be equal, and the difference between them is a measure of the understeering or oversteering behavior of the vehicle. \n",
123 | "\n",
124 | "Let's show this, starting with the following notations :\n",
125 | "```\n",
126 | "αf slip angle of the front wheel (rad)\n",
127 | "αr slip angle of the rear wheel (rad)\n",
128 | "mf mass on the front axle (kg)\n",
129 | "mr mass on the rear axle (kg)\n",
130 | "Fyf lateral force on the front tire (N)\n",
131 | "Fyr lateral force on the rear tire (N)\n",
132 | "Cf cornering stiffness of the front axle (N/rad)\n",
133 | "Cr cornering stiffness of the rear axle (N/rad)\n",
134 | "```\n",
135 | "If the only data you have is the cornering stiffness of one tire, you will need to multiply these values by 2 to get `Cf` and `Cr` values, since the bicycle model uses the assumption that the properties of the tires of an axle are aggregated at its \"center\". \n",
136 | "But don't forget that in real life there other elements than tires contributing to the steering flexibility. "
137 | ]
138 | },
139 | {
140 | "cell_type": "code",
141 | "execution_count": 130,
142 | "id": "dressed-clause",
143 | "metadata": {},
144 | "outputs": [
145 | {
146 | "name": "stdout",
147 | "output_type": "stream",
148 | "text": [
149 | "\n",
150 | "Lateral acceleration = 5.00 m/s^2\n",
151 | "Mass on the front axle = 857.1 kg\n",
152 | "Mass on the rear axle = 642.9 kg\n",
153 | "Lateral force on the front axle = 4286 N\n",
154 | "Lateral force on the rear axle = 3214 N\n",
155 | "Slip angle at the front axle = 0.036 rad\n",
156 | "Slip angle at the rear axle = 0.018 rad\n"
157 | ]
158 | }
159 | ],
160 | "source": [
161 | "Cf = 120000 # N/rad\n",
162 | "Cr = 180000 # N/rad\n",
163 | "\n",
164 | "# From the static balance we have \n",
165 | "mf = m * b / L\n",
166 | "mr = m * a / L\n",
167 | "\n",
168 | "# Let's increase the speed to reach a non-negligible lateral acceleration\n",
169 | "V = 20 # m/s\n",
170 | "# Recompute\n",
171 | "ay = V**2 / R\n",
172 | "# So\n",
173 | "Fyf = mf * ay\n",
174 | "Fyr = mr * ay\n",
175 | "\n",
176 | "# The slip angles at the front and rear axle are \n",
177 | "αf = Fyf / Cf\n",
178 | "αr = Fyr / Cr\n",
179 | "\n",
180 | "print()\n",
181 | "print(f\"{'Lateral acceleration':40} = {ay:.2f} m/s^2\")\n",
182 | "print(f\"{'Mass on the front axle':40} = {mf:.1f} kg\")\n",
183 | "print(f\"{'Mass on the rear axle':40} = {mr:.1f} kg\")\n",
184 | "print(f\"{'Lateral force on the front axle':40} = {Fyf:.0f} N\")\n",
185 | "print(f\"{'Lateral force on the rear axle':40} = {Fyr:.0f} N\")\n",
186 | "print(f\"{'Slip angle at the front axle':40} = {αf:.3f} rad\")\n",
187 | "print(f\"{'Slip angle at the rear axle':40} = {αr:.3f} rad\")"
188 | ]
189 | },
190 | {
191 | "cell_type": "markdown",
192 | "id": "demanding-duration",
193 | "metadata": {},
194 | "source": [
195 | "### Introducing the understeer gradient\n",
196 | "\n",
197 | "With a bit of trigonometry it can be shown that the steering angle becomes\n",
198 | "\n",
199 | "$$ \\delta = \\arctan(\\frac{L}{R}) + \\alpha_f -\\alpha_r $$\n",
200 | "\n",
201 | "or \n",
202 | "\n",
203 | "$$ \\delta = \\delta_{ack} + \\alpha_f -\\alpha_r $$\n",
204 | "\n",
205 | "with the Ackermann angle already introduced. \n",
206 | "\n",
207 | "Caution : depending on the conventions some authors may use opposite signs before $\\alpha_f$ and $\\alpha_r$. It is for example the case in [Vehicle Dynamics, Stability, and Control](https://www.taylorfrancis.com/books/mono/10.1201/b13767/vehicle-dynamics-stability-control-dean-karnopp) by Dean Karnopp. \n",
208 | "\n",
209 | "Let's rewrite the last equation to see the velocity dependence :\n",
210 | "\n",
211 | "$$ \\delta = \\delta_{ack} + (\\frac{m_f}{C_f} - \\frac{m_r}{C_r}) \\cdot \\frac{V^2}{R} $$\n",
212 | "\n",
213 | "We then define the understeer gradient (USG)\n",
214 | "\n",
215 | "$$ K = (\\frac{m_f}{C_f} - \\frac{m_r}{C_r}) $$\n",
216 | "\n",
217 | "so that\n",
218 | "\n",
219 | "$$ \\delta = \\delta_{ack} + K \\cdot \\frac{V^2}{R} $$\n",
220 | "\n",
221 | "We see that for a given technical definition of the vehicle, K is a constant. It is the amount of steering angle you need to add/remove for a given increase in lateral acceleration.\n",
222 | "\n",
223 | "- If K > 0, the vehicle understeers : you need to add steering angle when the lateral acceleration increases\n",
224 | "- If K < 0, the vehicle oversteers : you need to remove steering angle when the lateral acceleration increases\n",
225 | "\n",
226 | "Passenger vehicles (most vehicles actually) are designed to understeer (for stability reasons, that we will see later) : the faster you drive in a turn, the more you need to steer.\n",
227 | "\n",
228 | "K can be expressed in degrees by m/s^2, or in degrees by g. \n",
229 | "It can also be expressed at the wheel, or at the steering wheel.\n"
230 | ]
231 | },
232 | {
233 | "cell_type": "code",
234 | "execution_count": 137,
235 | "id": "substantial-material",
236 | "metadata": {},
237 | "outputs": [
238 | {
239 | "name": "stdout",
240 | "output_type": "stream",
241 | "text": [
242 | "\n",
243 | "Understeer gradient at the wheel = 0.20 °/(m/s^2)\n",
244 | " = 2.01 °/g\n",
245 | "\n",
246 | "Understeer gradient at the steering wheel = 3.07 °/(m/s^2)\n",
247 | " = 30.11 °/g\n"
248 | ]
249 | }
250 | ],
251 | "source": [
252 | "K = mf/Cf - mr/Cr\n",
253 | "\n",
254 | "print()\n",
255 | "print(f\"{'Understeer gradient at the wheel':40} = {K * rad2deg :.2f} °/(m/s^2)\")\n",
256 | "print(f\"{'':40} = {K * rad2deg * g :.2f} °/g\")\n",
257 | "print()\n",
258 | "print(f\"{'Understeer gradient at the steering wheel':45} = {K * rad2deg * osr :.2f} °/(m/s^2)\")\n",
259 | "print(f\"{'':45} = {K * rad2deg * g * osr :.2f} °/g\")\n",
260 | "\n"
261 | ]
262 | },
263 | {
264 | "cell_type": "markdown",
265 | "id": "extended-continuity",
266 | "metadata": {},
267 | "source": [
268 | "### Characteristic speed\n",
269 | "\n",
270 | "The characteristic speed $ V_{ch} $ is the speed that requires a steering angle that is twice the Ackermann angle. We then have \n",
271 | "\n",
272 | "$$ \\frac{V_{ch}^2}{R} = \\frac{L}{R} $$\n",
273 | "\n",
274 | "So \n",
275 | "\n",
276 | "$$ V_{ch} = \\sqrt{\\frac{L}{K}} $$\n",
277 | "\n",
278 | "We see that $ V_{ch} $ is, like K, dependent only on the vehicle characteristics. \n",
279 | "This quantity is used by ESC suppliers to tune their software for a given car (did I mention that ESC logic is based on a bicycle model ?) \n",
280 | "\n",
281 | "If the vehicle oversteers, in which case $ K<0 $, we need to write $ \\sqrt{\\frac{L}{\\mid K \\mid}} $ which is called *critical speed*. Above this speed the vehicle becomes unstable. "
282 | ]
283 | },
284 | {
285 | "cell_type": "code",
286 | "execution_count": 132,
287 | "id": "detected-supplement",
288 | "metadata": {},
289 | "outputs": [
290 | {
291 | "name": "stdout",
292 | "output_type": "stream",
293 | "text": [
294 | "\n",
295 | "Characteristic speed = 28.0 m/s\n",
296 | " = 100.8 km/h\n"
297 | ]
298 | }
299 | ],
300 | "source": [
301 | "print()\n",
302 | "if K>=0:\n",
303 | " print(f\"{'Characteristic speed':40} = {math.sqrt(L/K):.1f} m/s\")\n",
304 | " print(f\"{'':40} = {math.sqrt(L/K) * 3.6:.1f} km/h\")\n",
305 | "else:\n",
306 | " print(f\"{'Critical speed':40} = {math.sqrt(L/abs(K)):.1f} m/s\")\n",
307 | " print(f\"{'':40} = {math.sqrt(L/abs(K)) * 3.6:.1f} km/h\")"
308 | ]
309 | },
310 | {
311 | "cell_type": "markdown",
312 | "id": "complimentary-cisco",
313 | "metadata": {},
314 | "source": [
315 | "### Lateral acceleration gain\n",
316 | "\n",
317 | "Lateral acceleration gain is defined by $$ \\frac{a_y}{\\delta} $$\n",
318 | "which can be rewritten\n",
319 | "$$ \\frac{\\frac{V^2}{R}}{\\frac{L}{R}+K \\cdot \\frac{V^2}{R}} $$\n",
320 | "or, dividing by $R\\cdot L$\n",
321 | "$$ \\frac{\\frac{V^2}{L}}{1 + K \\cdot \\frac{V^2}{L}} $$\n",
322 | "\n",
323 | "This value is sometimes expressed for 100° at the steering wheel."
324 | ]
325 | },
326 | {
327 | "cell_type": "code",
328 | "execution_count": 133,
329 | "id": "monetary-grounds",
330 | "metadata": {},
331 | "outputs": [
332 | {
333 | "name": "stdout",
334 | "output_type": "stream",
335 | "text": [
336 | "\n",
337 | "Lateral acceleration gain = 1.65 (m/s^2)/°\n",
338 | " = 0.168 g/°\n",
339 | "\n",
340 | "Lateral acceleration for 100° at the SW = 1.122 g\n"
341 | ]
342 | },
343 | {
344 | "data": {
345 | "image/png": "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\n",
346 | "text/plain": [
347 | ""
348 | ]
349 | },
350 | "metadata": {
351 | "needs_background": "light"
352 | },
353 | "output_type": "display_data"
354 | }
355 | ],
356 | "source": [
357 | "lateral_accel_gain = (V**2/L) / (1 + K*V**2/L)\n",
358 | "print()\n",
359 | "print(f\"{'Lateral acceleration gain':40} = {lateral_accel_gain / rad2deg :.2f} (m/s^2)/°\")\n",
360 | "print(f\"{'':40} = {lateral_accel_gain / rad2deg / g :.3f} g/°\")\n",
361 | "print()\n",
362 | "print(f\"{'Lateral acceleration for 100° at the SW':40} = {lateral_accel_gain / rad2deg / g * 100 / osr :.3f} g\")\n",
363 | "\n",
364 | "\n",
365 | "# Let's plot this gain variation with speed\n",
366 | "V1 = np.linspace(10, 40, 100)\n",
367 | "plt.plot(V1, (V1**2/L) / (1 + K*V1**2/L) / rad2deg / g * 100 / osr, label='ay for 100° SW');\n",
368 | "plt.legend();\n",
369 | "plt.xlabel('V (m/s)');\n",
370 | "plt.ylabel('ay (g)');\n"
371 | ]
372 | },
373 | {
374 | "cell_type": "markdown",
375 | "id": "crucial-kinase",
376 | "metadata": {},
377 | "source": [
378 | "### Yaw rate gain \n",
379 | "\n",
380 | "Yaw rate (aka yaw velocity) is defined by $ r = \\frac{V}{R} $ (for readers used to see the yaw angle denoted $ \\psi $, the yaw rate is obviously $ \\dot \\psi $)\n",
381 | "\n",
382 | "We can show that the yaw rate gain, with a unit of 1/s, is $$ \\frac{r}{\\delta} = \\frac{\\frac{V}{L}}{1 + K \\cdot \\frac{V^2}{L}} $$"
383 | ]
384 | },
385 | {
386 | "cell_type": "code",
387 | "execution_count": 134,
388 | "id": "brief-dividend",
389 | "metadata": {},
390 | "outputs": [
391 | {
392 | "name": "stdout",
393 | "output_type": "stream",
394 | "text": [
395 | "\n",
396 | "Yaw rate gain = 4.73 s^-1\n",
397 | "\n"
398 | ]
399 | },
400 | {
401 | "data": {
402 | "image/png": "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C6Cq84APgKuA/cAp4AfOZVUi8iDwEeAPPK+qO1wUd4tKTEwkMjKSTZs2cfz4cYYPH05kZCSVlZX88pe/5IsvvsDPz4+jR49y/PhxRo4cSWpqKsXFxQQHBzNixAhSUlL48ssvefrpp+vdxs0333zm+fbt23nssccoKCigpKSEK6644jv1S0pKWLNmDTfddNOZsvLy8u/UW716NUuXLgVgypQpdOrU6cyyp59++syy9PR09u3b951k0bNnT4YNGwbAyJEjSUtLa94vzQsVnKpg1d4cPt2VzRf7cig4VfNNu19sODeOjGdUYmdGJXamS8cQN0faOjqFBZEU1pmkxM7fKs87WcGurCJ2ZhaxI7OQbUcL+XT38TPnUnpEtmNY9wiGd48gKbEz/buEE2DnQjyGS5KF80qmofWUz6v1XIEHGlj/A2qSSYtprAXQmu6++25efPFFjh07xuzZswF49dVXycnJITU1lcDAQBITEykrKzvz/IUXXuDiiy9myJAhfP755xw4cIABAwbU+/5hYd9827vzzjt5++23GTp0KC+++CIrV678Tn2Hw0FERASbN29uNG5t4OzoypUr+eSTT/j6669p164dEyZMqPd+ieDgb74x+/v7U1pa2uj2vM3xojI+2nGMD7Zlsf5QHg6FqPZBXNY/lvF9oxjTK5KYcN9MDs3VOSyIsb2jGNs76kxZcVkl248WsTWjgE1HClh7MJd3Ntf0MocF+TMsIYLkxEiSe3ZmeEIEIYEt0xVnzp5dF+di1113HY8//jiVlZUsXLgQgMLCQmJiYggMDOTzzz/n8OFvRgkeP348//d//8fzzz/P4MGDeeSRRxg5cmSz7ksoLi4mLi6OyspKXn31Vbp16wZAeHg4xcXFAHTo0IGePXvyxhtvcNNNN6GqbN26laFDv53bx40bx+LFi/n5z3/OihUryM/PPxN7p06daNeuHbt372bt2rUt8nvyBoWnKnl/WxZvbz7KhrQ8VKF3THvun9CbywfGMqRbRzu524TwkEDG9IpkTK9vWqJHC0pJPZxPaloe69Py+dune1GFIH8/hiVEMOaCSC7uFcmwhIgWO49jmmbJwsWCgoKYOHEiERERZ65Wuu2227jmmmtISkpi2LBh3zq5fMkll/DUU08xZswYwsLCCAkJafB8RV2///3vGT16ND169GDw4MFnEsTMmTO55557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\n",
403 | "text/plain": [
404 | ""
405 | ]
406 | },
407 | "metadata": {
408 | "needs_background": "light"
409 | },
410 | "output_type": "display_data"
411 | }
412 | ],
413 | "source": [
414 | "yaw_rate_gain = (V/L) / (1 + K*V**2/L)\n",
415 | "print()\n",
416 | "print(f\"{'Yaw rate gain':40} = {yaw_rate_gain :.2f} s^-1\")\n",
417 | "print()\n",
418 | "\n",
419 | "# Let's plot this gain variation with speed\n",
420 | "V1 = np.linspace(10, 40, 100)\n",
421 | "plt.plot(V1, (V1/L) / (1 + K*V1**2/L), label='yaw rate gain');\n",
422 | "plt.legend();\n",
423 | "plt.xlabel('V (m/s)');\n",
424 | "plt.ylabel(r'$r\\ /\\ \\delta$');\n"
425 | ]
426 | },
427 | {
428 | "cell_type": "markdown",
429 | "id": "offshore-generic",
430 | "metadata": {},
431 | "source": [
432 | "We can see that the yaw rate gain goes through a maximum. It can be shown that **the speed for which the gain is maximum is the characteristic speed** defined above. \n"
433 | ]
434 | },
435 | {
436 | "cell_type": "markdown",
437 | "id": "persistent-theory",
438 | "metadata": {},
439 | "source": [
440 | "### Static margin\n",
441 | "\n",
442 | "We first define the neutral steer point as the point where a lateral perturbation force won't induce any yaw motion.\n",
443 | "\n",
444 | "\n",
445 | "\n",
446 | "By writing the equlibrium of yaw moments with respect to the center of gravity we can compute the distance `e` \n",
447 | "\n",
448 | "$$ e = \\frac{a \\cdot C_f - b \\cdot C_r}{C_f + C_r} $$\n",
449 | "\n",
450 | "The static margin is then computed as being equal to $ \\frac{e}{L} $\n",
451 | "\n",
452 | "It is negative when the neutral steer point is located at the rear, and means the vehicle understeers. \n",
453 | "Reminder : static margin < 0 $\\leftrightarrow $ understeer gradient > 0"
454 | ]
455 | },
456 | {
457 | "cell_type": "code",
458 | "execution_count": 135,
459 | "id": "finite-increase",
460 | "metadata": {},
461 | "outputs": [
462 | {
463 | "name": "stdout",
464 | "output_type": "stream",
465 | "text": [
466 | "\n",
467 | "Static margin = -17.14 %\n"
468 | ]
469 | }
470 | ],
471 | "source": [
472 | "distance_CoG_to_neutral_steer_point = (a*Cf-b*Cr)/(Cf+Cr)\n",
473 | "print()\n",
474 | "print(f\"{'Static margin':40} = {distance_CoG_to_neutral_steer_point/L*100 :.2f} %\")\n"
475 | ]
476 | },
477 | {
478 | "cell_type": "code",
479 | "execution_count": null,
480 | "id": "reserved-sweden",
481 | "metadata": {},
482 | "outputs": [],
483 | "source": []
484 | }
485 | ],
486 | "metadata": {
487 | "kernelspec": {
488 | "display_name": "Python 3.7.7 64-bit",
489 | "language": "python",
490 | "name": "python37764bitbbd15436faaa4c99bc9d20b2efce7691"
491 | },
492 | "language_info": {
493 | "codemirror_mode": {
494 | "name": "ipython",
495 | "version": 3
496 | },
497 | "file_extension": ".py",
498 | "mimetype": "text/x-python",
499 | "name": "python",
500 | "nbconvert_exporter": "python",
501 | "pygments_lexer": "ipython3",
502 | "version": "3.7.7"
503 | }
504 | },
505 | "nbformat": 4,
506 | "nbformat_minor": 5
507 | }
508 |
--------------------------------------------------------------------------------