suppressPackageStartupMessages({
library(dplyr)
library(tidyr)
library(ggplot2)
library(htmltools)
})
options(digits = 4)
A rough engineering analysis of vehicle throttle behavior relating acceleration, speed, acceleration, and losses.
As an example, key design parameters for typical Toyota Corollas have been collected here:
g <- 9.81 # N/m^2
rho_air_std <- 1.225 # kg/m^3, https://en.wikipedia.org/wiki/Density_of_air
hp_to_W <- 745.7 # W/hp
lbm_to_kg <- 0.4536
in_to_m <- 0.0254
mm_to_m <- 0.001
mph_to_ms <- 0.447 # meters-per-second per miles-per-hour
corolla_tbl <- read.table( text =
'Variable Value Unit URL
mass 2910 "lbm" "https://www.caranddriver.com/toyota/corolla/specs"
c_d 0.3 "-" "https://en.wikipedia.org/wiki/Automobile_drag_coefficient"
c_d_A_cs 0.631 "m^2" "https://en.wikipedia.org/wiki/Automobile_drag_coefficient"
c_rr 0.01 "-" "https://en.wikipedia.org/wiki/Rolling_resistance"
tire_id 15 "in" "https://www.lesschwab.com/article/tire-size-explained-reading-the-sidewall.html"
tire_width 200 "mm" "https://www.lesschwab.com/article/tire-size-explained-reading-the-sidewall.html"
tire_aspect 65 "%" "https://www.lesschwab.com/article/tire-size-explained-reading-the-sidewall.html"
P_rated 139 "hp" "https://www.caranddriver.com/toyota/corolla/specs"
R_G 40 "RPM-hr/mi" "http://www.corollaforum.com/threads/2012-le-high-rpm-at-80-mph.1305/"
omega_max 6100 "RPM" "https://www.caranddriver.com/toyota/corolla/specs"
', header = TRUE, as.is=TRUE )
# corolla <- list( mass = 2910 * lbm_to_kg # kg,
# , c_d = 0.3 #
# , A_cs = 0.631 / 0.3 # m^2, ditto
# , c_rr = 0.01 # unitless
# , r = 15/2*in_to_m + 200 * mm_to_m * 65/100 # 200/65R15,
# , P_rated = 130 * hp_to_W # W, says 139
# )
corolla_tbl
Variable <chr> | Value <dbl> | Unit <chr> | |
---|---|---|---|
mass | 2910.000 | lbm | |
c_d | 0.300 | - | |
c_d_A_cs | 0.631 | m^2 | |
c_rr | 0.010 | - | |
tire_id | 15.000 | in | |
tire_width | 200.000 | mm | |
tire_aspect | 65.000 | % | |
P_rated | 139.000 | hp | |
R_G | 40.000 | RPM-hr/mi | |
omega_max | 6100.000 | RPM |
Making the units consistent:
corolla <- ( corolla_tbl
%>% select( Variable, Value )
%>% spread( Variable, Value )
%>% mutate( mass = mass * lbm_to_kg
, A_cs = c_d_A_cs / c_d
, r = tire_id/2*in_to_m + tire_width * mm_to_m * tire_aspect / 100
, P_rated = P_rated * hp_to_W
, R_G = R_G / mph_to_ms
)
%>% select( mass, c_d, A_cs, c_rr, r, P_rated, R_G, omega_max )
)
knitr::kable( corolla
, col.names = c( "Mass (kg)", "$C_d$ (unitless)", "$A_{cs}$ ($m^2$)", "$C_{rr}$ (unitless)", "Tire radius (m)", "$P_{rated}$ (kW)", "Gearing (RPM-s/m)", "Rated $\\omega$ (RPM)" )
)
Mass (kg) | Cd (unitless) | Acs (m2) | Crr (unitless) | Tire radius (m) | Prated (kW) | Gearing (RPM-s/m) | Rated Ï (RPM) |
---|---|---|---|---|---|---|---|
1320 | 0.3 | 2.103 | 0.01 | 0.3205 | 103652 | 89.49 | 6100 |
From force is mass times acceleration:
W=m⋅g
W <- corolla$mass * g
For the Corolla, W=(1319.976)(9.81)=1.2949×104 N.
From physics1, rolling resistance is a fraction of the weight:
Fr=crr⋅W
F_r_corolla <- corolla$c_rr * W
For the Corolla, Fr,Corolla=(0.01)(1.2949×104)=129.4896 N.
Density, coefficient of drag, and cross-sectional area modify the relative air speed to obtain air drag.
Fd=12⋅cdρAcsu2
F_d <- function( u, rho = rho_air_std, car_info = corolla ) {
0.5 * car_info$c_d * rho * car_info$A_cs * u^2
}
F_d_corolla_70 <- F_d( 70 * mph_to_ms )
For the Corolla at 70mph, Fd=12⋅(0.3)(1.225)(2.1033)(70⋅0.447)2=378.396 N
If you intend to maintain speed up a hill then you will need to be able to overcome the force of gravity:
Fg=W⋅sinθ
where a slope of 3.4336 ∘ is the usual limit2.
F_g_corolla <- W * sin( atan2( 6, 100 ) )
which is Fg,Corolla=775.5432 N
Since work is force times distance, power is force times velocity:
P=F⋅u
If we add the opposition forces and multiply by velocity, we can compute the power being absorbed by these mechanisms at different velocities:
Popposition=(Fr+Fd+Fg)⋅u
P_opposition_corolla_70 = (F_r_corolla + F_d_corolla_70 + F_g_corolla) * (70 * mph_to_ms)
For the Corolla, this is P=((129.4896)+(378.396)+(775.5432))⋅(31.3)=4.0158×104 W
The torque produced in response to throttle pedal position is not exactly constant over the variation of engine speed (subject to transmission gear setting, corresponding to velocity). Some example curves from Ford3 support the idea that torque is approximately constant4 at full throttle though the torque does reduce with speed when throttle position is only partially-engaged. However, of more interest is the torque vs. throttle position at a mid-speed condition, which shows that while not-quite-linear, the throttle position can be used to obtain a range of desired torque levels.
knitr::include_graphics( "Engine-map-engine-torque-vs-throttle-and-engine-RPM.png" )
So for a moment, letâs approximate this behavior at mid-RPM conditions as a linear mapping between throttle position p and torque T:
T=p⋅Tmax
Since power is torque times angular speed, and the gearing between the wheel and the engine (RG in RPM/ms) links angular speed with velocity:
Pengine=T⋅ω=(p⋅Tmax)(RG⋅u)=p⋅(Tmaxωmaxωmax)⋅RG⋅u=p⋅Pengine,maxRGuωmax
Here we assume Pengine,max=1.0365×105 W.
If the power out of the engine equals the power being absorbed by air drag and rolling resistance then the forces involved will also be balanced and the velocity will be constant (vehicle steady speed).
pedal_levels <- seq( 10, 70, 10 )
( expand.grid( MPH = 10:80
, p = pedal_levels
)
%>% mutate( p_f = factor( p, levels = pedal_levels )
, u = MPH * mph_to_ms
, F_d_corolla = F_d( u )
, P_opposition_corolla = ( F_d_corolla + F_r_corolla + F_g_corolla ) * u
, P_engine_corolla = p/100 * corolla$P_rated * corolla$R_G * u / corolla$omega_max
)
%>% select( MPH, p_f, P_opposition_corolla, P_engine_corolla )
%>% gather( variable, value, -c( MPH, p_f ) )
%>% ggplot( aes( x = MPH, y = value, colour = variable ) ) ) +
geom_line() +
facet_wrap( ~p_f ) +
scale_colour_discrete( name = "Power Flow" ) +
ylab( "Power (W)" ) +
xlab( "Speed (miles/hour)" )
When the blue line is below the red engine output (e.g. at low speed and high pedal position) the car can accelerate. But when the blue line catches up to the red line (e.g. at 45 mph/70% pedal), you have no ability to accelerate. And when the blue line is above the red line (e.g. at 45 mph/50% pedal) the car will be decelerating.
This value of RG represents high gear, and the fact that it is so difficult to overcome the losses in high gear is why cars have low gears.
\require{cancel}
For reference, 1 kilogram of gasoline releases approximately 46.4~MJ of heat5 and the density of gasoline is about 0.755~kg/L6, so a car traveling at 70~mph with a fuel efficiency of 35~mpg is converting \frac{46.4~\cancel{MJ}}{1~\cancel{kg}} \frac{1000~kJ}{1~\cancel{MJ}} \frac{0.755~\cancel{kg}}{1~\cancel{L}} \frac{3.785~\cancel{L}}{1~\cancel{gal}} \frac{1~\cancel{gal}}{35~\cancel{mi}} \frac{70~\cancel{mi}}{1~\cancel{h}} \frac{1~\cancel{h}}{3600~s}=73.6645~kW of power from chemical form to heat. Since only about 20-30% of the thermal power typically makes it mechanically to the wheels where the above analysis applies7, one would expect that this means only 15-25~kW is available at the wheels, which seems only sort of consistent with the above analysis.
In fact you probably cannot achieve 35~mpg while traveling up a 6% slope at 45~mph in a 1300~kg vehicle⦠under those conditions you are likely running at a lower efficiency such as 20~mpg or lower. Some combination of slowing down to reduce opposing power and burning more fuel to increase power availability can increase the power excess (red minus blue). The available mechanical power at 20~mpg would be on the order of \frac{35}{20} \cdot 25~kW \approx 44~kW. Reducing weight can also affect the rolling resistance and gravity forces and therefore reduce power losses that need to be overcome. Driving a Toyota Prius with the Eco indicator8 enabled can give you some intuitive insight into just how much driving conditions affect instantaneous efficiency.
Assuming the road slope is level (0~{}^\circ), we get:
pedal_levels <- seq( 10, 70, 10 )
( expand.grid( MPH = 10:80
, p = pedal_levels
)
%>% mutate( p_f = factor( p, levels = pedal_levels )
, u = MPH * mph_to_ms
, F_d_corolla = F_d( u )
, P_opposition_corolla = ( F_d_corolla + F_r_corolla + 0 ) * u
, P_engine_corolla = p/100 * corolla$P_rated * corolla$R_G * u / corolla$omega_max
)
%>% select( MPH, p_f, P_opposition_corolla, P_engine_corolla )
%>% gather( variable, value, -c( MPH, p_f ) )
%>% ggplot( aes( x = MPH, y = value, colour = variable ) ) ) +
geom_line() +
facet_wrap( ~p_f ) +
scale_colour_discrete( name = "Power Flow" ) +
ylab( "Power (W)" ) +
xlab( "Speed (miles/hour)" )
which has quite a lot of potential to accelerate the car (red above blue) in high gear even at medium pedal positions (well below engine maximum power rating).
Laila, D.S., P. Shakouri, A. Ordys, and M. Askari. âLongitudinal Vehicle Dynamics Using Simulink/Matlab.â In UKACC International Conference on CONTROL 2010, 955â60. Coventry, UK: Institution of Engineering and Technology, 2010. https://doi.org/10.1049/ic.2010.0410. Figure from https://www.researchgate.net/figure/Engine-map-engine-torque-vs-throttle-and-engine-RPM_fig7_261390259â©
https://www.toyotanation.com/threads/torque-curves-for-new-engines-vs-previous-gen.1623010/#post-13768106 djoyce101 posted some example dynamometer curvesâ©
https://www.toyotaguru.us/prius-2010-manual/i-hybrid-system-indicator.htmlâ©