Best way to simulate weight distribution between car wheels

Started by
23 comments, last by adriansnetlis 8 years ago

Hello!

I am looking for the best way to calculate weight distribution between the car wheels. I need to calculate it runtime dependant on car's acceleration and other factors. It should be generic(support 3-wheeled vehicles, 6-wheeled vehicles and, of course, the usual 4-wheeled vehicles). Has anyone got some equations and tips for doing this?

I have access to following values:

  • car's mass
  • magnitude of scene's gravity
  • wheel's distance from CG(a vector for all 3 axis)
  • wheelbase
  • track/tread
  • height of CG from ground
  • car's acceleration(a 3-float vector)

I am using SI units. My current equations are non-generic. They're for 4-wheeled car's only. They're based on Marco Monster's tutorial. What I'm looking for is more generic and more advanced calculations.

Advertisement
Was looking for this myself at some point. I guess what you want in the end is the wheel load. IMHO the easiest way to get it is by simulating suspension with spring and dampener. When you tweak to hold proper clearance, suspension force will be your wheel load. As a bonus it take care of load change due acceleration and slopes.
Simple spring and dampener can be modeled using this:
F=a*c - (k*v)
A is spring stiffness
C is spring compression ratio
K is dampener ratio
V is a spring compression/depression velocity

A and K are what you tweak. C you calculate from frame to frame, by measuring spring length. V you calculate from spring length change.

Hello!
I am looking for the best way to calculate weight distribution between the car wheels. I need to calculate it runtime dependant on car's acceleration and other factors. It should be generic(support 3-wheeled vehicles, 6-wheeled vehicles and, of course, the usual 4-wheeled vehicles). Has anyone got some equations and tips for doing this?

I have access to following values:

  • car's mass
  • magnitude of scene's gravity
  • wheel's distance from CG(a vector for all 3 axis)
  • wheelbase
  • track/tread
  • height of CG from ground
  • car's acceleration(a 3-float vector)
I am using SI units. My current equations are non-generic. They're for 4-wheeled car's only. They're based on Marco Monster's tutorial. What I'm looking for is more generic and more advanced calculations.

Hi! This is kind of what I have already. However, for the suspension to work correctly I need to apply the gravity impulses at wheels(basicly - the load force) which leads to the fact that this method kind of won't work.

Gravity impulse at wheel would be -SuspensionForce (the same force that pushes chassis but opposite direction) + gravity of the wheel itself (all unsprung mass to be precise).
Or you mean something else?

Hi! This is kind of what I have already. However, for the suspension to work correctly I need to apply the gravity impulses at wheels(basicly - the load force) which leads to the fact that this method kind of won't work.

The approach you tell doesn't seem to take in account the weight transfer.

What I've currently got:


static_load = c / wheelbase * mass * gravity

And:


transfer_long = h / wheelbase * mass * acceleration_long
transfer_lat = h / track_width * mass * acceleration_lat

However, this doesn't seem to work with vehicles with more than 4 wheels.


The approach you tell doesn't seem to take in account the weight transfer.

weight transfer is caused by squatting (on accel), or nosediving (on decel).

typically the CG will be above the pitch center of a vehicle, so any change of acceleration makes the CG move forward or back with respect to the pitch center (IE the roll center in pitch direction). thus more weight is transferred to the front or rear wheels.

are you modeling roll, pitch, and yaw centers as well as CG (center of mass, actually)?

when acceleration is applied to the axle, the wheel can turn, and the axle housing can turn with respect to the wheel and axle.. what happens is actually a little of both.

the wheel tries to turn, but must overcome the inertial of the car's mass. the house also tries to turn, which lifts the nose, causing weight transfer. the springs respond to the weight transfer and squat. meanwhile, the wheel is overcoming the vehicle's intertia and beginning to turn and move the car down the road.

in drag racing you sometimes see driver's whose nose lifts, and they ride it out on two wheels, sometimes all the way to the end, applying enough acceleration to keep the nose up in an effort to go faster, but not applying so much acceleration that the center of mass rotates so far behind the pitch center that the car flips over backwards.

also note that the pitch center changes when the car does a wheel stand, from somewhere behind the center of the car, to the rear axle, essentially.

Norm Barrows

Rockland Software Productions

"Building PC games since 1989"

rocklandsoftware.net

PLAY CAVEMAN NOW!

http://rocklandsoftware.net/beta.php

The approach you tell doesn't seem to take in account the weight transfer.

What I've currently got:


static_load = c / wheelbase * mass * gravity

And:


transfer_long = h / wheelbase * mass * acceleration_long
transfer_lat = h / track_width * mass * acceleration_lat

However, this doesn't seem to work with vehicles with more than 4 wheels.

It does cover weight transfer and works with as many wheel as you want:

and with more obvious weight transfer:

You need a rigid body simulation to handle influence of gravity and moment of inertia, I'm using UE4 which uses PhysX. The unfortunate part is that suspension is pretty much the only practical way to get wheel/ski/track load for arbitrary configuration of the vehicle. If you need it specifically for the friction modelling then as a part of the collision response you get "normal impulse" which can be used to calculate normal force, otherwise suspension is your friend.

I've seen some formulas for the truck with 3 axle, those didn't cover weight transfer, only static case. To calculate dynamic weight transfer you need to be able to calculate moments of inertia from linear and angular acceleration in arbitrary points. You car have to react to it somehow, which again means that you need suspension.

The approach you tell doesn't seem to take in account the weight transfer.

What I've currently got:


static_load = c / wheelbase * mass * gravity

And:


transfer_long = h / wheelbase * mass * acceleration_long
transfer_lat = h / track_width * mass * acceleration_lat

However, this doesn't seem to work with vehicles with more than 4 wheels.

It does cover weight transfer and works with as many wheel as you want:

and with more obvious weight transfer:

You need a rigid body simulation to handle influence of gravity and moment of inertia, I'm using UE4 which uses PhysX. The unfortunate part is that suspension is pretty much the only practical way to get wheel/ski/track load for arbitrary configuration of the vehicle. If you need it specifically for the friction modelling then as a part of the collision response you get "normal impulse" which can be used to calculate normal force, otherwise suspension is your friend.

I've seen some formulas for the truck with 3 axle, those didn't cover weight transfer, only static case. To calculate dynamic weight transfer you need to be able to calculate moments of inertia from linear and angular acceleration in arbitrary points. You car have to react to it somehow, which again means that you need suspension.


The approach you tell doesn't seem to take in account the weight transfer.

weight transfer is caused by squatting (on accel), or nosediving (on decel).

typically the CG will be above the pitch center of a vehicle, so any change of acceleration makes the CG move forward or back with respect to the pitch center (IE the roll center in pitch direction). thus more weight is transferred to the front or rear wheels.

are you modeling roll, pitch, and yaw centers as well as CG (center of mass, actually)?

when acceleration is applied to the axle, the wheel can turn, and the axle housing can turn with respect to the wheel and axle.. what happens is actually a little of both.

the wheel tries to turn, but must overcome the inertial of the car's mass. the house also tries to turn, which lifts the nose, causing weight transfer. the springs respond to the weight transfer and squat. meanwhile, the wheel is overcoming the vehicle's intertia and beginning to turn and move the car down the road.

in drag racing you sometimes see driver's whose nose lifts, and they ride it out on two wheels, sometimes all the way to the end, applying enough acceleration to keep the nose up in an effort to go faster, but not applying so much acceleration that the center of mass rotates so far behind the pitch center that the car flips over backwards.

also note that the pitch center changes when the car does a wheel stand, from somewhere behind the center of the car, to the rear axle, essentially.

The thing is that you have good suspension controllers there while I model it manually.

I use Blender Game Engine which's current built-in vehicle dynamics are bad. I also don't know how much physics data can I access.

However, I use this formula:


suspension_force = stiffness * compression + damper_rate * compression_speed

And raycasting for calculation of compression. And than I apply this value as an impulse in positive car axis at position of each wheel. I do the same for load, but in -Z world axis. However, when doing for load, I need to calculate it correctly. Currently I do it, but it isn't a generic way. It's kind of hardcoded and supports only 4 wheels. I need to solve this.


The thing is that you have good suspension controllers there while I model it manually.

I use Blender Game Engine which's current built-in vehicle dynamics are bad. I also don't know how much physics data can I access.

However, I use this formula:


suspension_force = stiffness * compression + damper_rate * compression_speed

And raycasting for calculation of compression. And than I apply this value as an impulse in positive car axis at position of each wheel. I do the same for load, but in -Z world axis. However, when doing for load, I need to calculate it correctly. Currently I do it, but it isn't a generic way. It's kind of hardcoded and supports only 4 wheels. I need to solve this.

Not sure what you mean by controllers, suspension on tank is done using ray casting and calculating suspension force from spring equation. Suspension force is applied to chassis of tank as "add force at location". Later, the same suspension force is projected on surface where track "collides" with the ground to get normal force for calculation of friction. This is done in 10 points - at each road wheel.

IMHO if you have rigid body simulation and can call AddForceAtLocation() or similar functions, then it's all what you need.

I'm not sure what you mean by "I do the same for load", force pushing on the wheel itself?


The thing is that you have good suspension controllers there while I model it manually.

I use Blender Game Engine which's current built-in vehicle dynamics are bad. I also don't know how much physics data can I access.

However, I use this formula:


suspension_force = stiffness * compression + damper_rate * compression_speed

And raycasting for calculation of compression. And than I apply this value as an impulse in positive car axis at position of each wheel. I do the same for load, but in -Z world axis. However, when doing for load, I need to calculate it correctly. Currently I do it, but it isn't a generic way. It's kind of hardcoded and supports only 4 wheels. I need to solve this.

Not sure what you mean by controllers, suspension on tank is done using ray casting and calculating suspension force from spring equation. Suspension force is applied to chassis of tank as "add force at location". Later, the same suspension force is projected on surface where track "collides" with the ground to get normal force for calculation of friction. This is done in 10 points - at each road wheel.

IMHO if you have rigid body simulation and can call AddForceAtLocation() or similar functions, then it's all what you need.

I'm not sure what you mean by "I do the same for load", force pushing on the wheel itself?

I don't understand how can suspension force contain load. If I used it for the load, than the car would not lean, roll over. I need to have exact value. The force of gravity, load. I need that exact thing. Oh, and I have AddForceAtLocation(), it's called applyImpulse() in BGE.

This topic is closed to new replies.

Advertisement