# Coulomb friction in a closed form

This topic is 3710 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

I'm working through all the different forces a physics simulation might have, and trying to arrive at a closed form that describes a body's motion (position (r) and velocity (v) at time t) for each one. However, I'm stuck at (coulomb) friction. That familiar Ff = u * Fn Specifically I'm having two problems: 1. I'm working through all these equations as vector functions. Fn and Ff are orthogonal, so I'm pretty certain there's a cross product involved. I think it's something like Fn = F cross n where F is the current force acting on the body and n is the surface normal. But I'm not entirely certain. Plus this would seem to create a loop in the implicit equation (ie: r"(t) := f(r"(t))) 2. Ff is really a maximum force. If the body is at rest, there is no friction force acting on it. But I have no idea how to arrive at the implicit differential equation to represent this. That is, for drag I had this implicit form: r"(t) := -b * r'(t), which I could then solve for y(t), but I don't know how to build the equivalent for friction. So any insights anyone can provide would be appreciated.

##### Share on other sites
Do not forget that friction is resistance to motion; this means that the ultimate direction of the frictional force will be in the opposite direction of any motion.

In other words, sneak in an inverted r' normal somewhere.

##### Share on other sites
Yeah, and it's also limited in some way by the length of r' (it can't cause the object to change direction).

So any idea where to stick that r' term? :)

##### Share on other sites
Let's see...

N is unit normal vector
F is force on body sans the friction

fn1 = F dot N
fn = max(fn1,0) - magnitude of the normal force toward the surface

ff1 = µ fn
ff = max(ff1, r'/|r'| dot F) - magnitude of the frictional force

Ff = - r'/|r'| ff

##### Share on other sites
Quote:
 Original post by SnotBobLet's see...N is unit normal vectorF is force on body sans the frictionfn1 = F dot N fn = max(fn1,0) - magnitude of the normal force toward the surfaceff1 = µ fnff = max(ff1, r'/|r'| dot F) - magnitude of the frictional forceFf = - r'/|r'| ff

Hmm... closer I think. But the ff term doesn't take in to account the case where the body is already in motion, and the friction force can possibly overcome not only F but the initial velocity as well. Also, you're pointing the friction force along the velocity vector, but it's really pointing along the tangent (perp to normal) vector. So maybe something like...

T is the unit tangent vector (perp to N)
Rn = (r' dot T) * T
...
ff = -min(-ff1, (Rn/|Rn| dot F) + |Rn|)
Ff = Perp(ff * N) <-- tangent vector

I think that's closer, but not quite there yet.

##### Share on other sites
Static friction is more complex than to be modeled as the usual differential equation. Linear Programming is involved..

This subject is tackled by David Barraf a long while ago. For the time being, I don't give a damn about static friction, going with kinetic friction only - you may want more though cuz everything creeps slowly..

Chris Hecker has a little trick with turning kinetic friction into static friction without going outside the impulse based realm.

##### Share on other sites
Ff = u * Fn * V / |V|

Where V is the relative velocity between the two points in contact. Assumption here is that velocity has no component normal to the contact point.

What I usually do in my code is to work out what force (in the V direction) would bring the relative velocity to zero, then limit it to u*Fn. This prevents the body reversing direction during a time step, keeps it at rest if it is at rest, and limits the maximum force to the correct value based on the coefficient of friction.

I don't think you can solve these sorts of things very easily with differential equations, unless you split up the time into periods where the friction force is constant or linear.

##### Share on other sites
Quote:
 Original post by sgb27Ff = u * Fn * V / |V|Where V is the relative velocity between the two points in contact. Assumption here is that velocity has no component normal to the contact point.

That's a large assumption! Also your equation scales friction by velocity, which isn't technically kosher. I think you meant something more like:

Ff = min(u * Fn, (V dot T) / |V|) * T (where T is the Tangent vector)

(Arg, except that that equation only works if V dot T is positive... I'll think more on it later.)

But that still does not include the case where a body is initially at rest and a force is applied to accelerate it, but the static friction force prevents motion (since just relating it to velocity means the body has to actually be set in to motion before resistive forces are felt).

Perhaps the static and sliding friction cases need to be handles differently beyond just different coefficients? Two entirely separate equations.

Quote:
 Original post by arithmaStatic friction is more complex than to be modeled as the usual differential equation. Linear Programming is involved..

I've recently read something like that in Mirtich's thesis. Do you have to use techniques like that, though? Why can't I express it in terms of a ODE? Can I at least closely approximate it with an ODE?

Quote:
 This subject is tackled by David Barraf a long while ago. For the time being, I don't give a damn about static friction, going with kinetic friction only

Um, that's nice?

Quote:
 you may want more though cuz everything creeps slowly..

Um...?

Quote:
 Chris Hecker has a little trick with turning kinetic friction into static friction without going outside the impulse based realm.

Such as...?

1. 1
2. 2
Rutin
22
3. 3
JoeJ
18
4. 4
5. 5

• 37
• 23
• 13
• 13
• 17
• ### Forum Statistics

• Total Topics
631705
• Total Posts
3001827
×