[ODE] ODE uses forces that are twice as large as specified. Bug?
Matthias Baas
baas at ira.uka.de
Thu Jan 13 19:14:48 MST 2005
Jon Watte wrote:
>>dt: 0.04
>>pos = (0.000000, 0.000000, -0.001600)
>>vel = (0.000000, 0.000000, -0.040000)
>
>>The velocity is v=g*dt which is -0.04 for the z component, so that's
>>correct. But the position should be p=0.5*g*dt^2 which should yield a z
>>component of -0.0008 but the z component in the ODE simulation is twice
>
> If the velocity is 0.04, and acceleration is linear, then physics say
> that you really should have moved by 0.02, as position is just the
> integral of velocity, and with constant acceleration, velocity is a
> triangle.
How did you get a distance of 0.02?
But anyway, it seems you've hit the point. If I take a constant velocity
of 0.04 without acceleration, then the distance traveled is x=v*dt which
yields 0.0016 - which is the value that ODE returned.
So is that like ODE works internally? First, it computes the new
velocity at the end of the time step and then it takes this velocity and
assumes it was constant throughout the entire time step.
> If you think just about the fact that ODE uses a first-order Euler
> integrator, then the body shouldn't have moved at all.
Ah, here's the keyword I was looking for, it's only a *first-order*
Euler integrator!
Chris Ledwith wrote:
> I think you will find that if you provide a smaller stepsize (say 100 Hz
> instead of the 25 Hz you have used here, you will get a result closer to
> what you'd expect. [...]
Well, in my application I was controlling the position of a body by
calculating the force that's necessary to move the body to a specific
target position. The calculated force was always too large and only if I
divided it by two I got the expected result. So decreasing the step size
wouldn't have any effect on the outcome as this would also affect the
magnitude of the calculated force.
But now as I begin to understand what's going on, it's ok with me to
divide my forces by 2.
It's quite an interesting thing to note that in ODE you have to apply
"physically incorrect" forces to get the "physically correct" behavior.
- Matthias -
More information about the ODE
mailing list