Solving three equations

Started by
1 comment, last by haegarr 12 years, 11 months ago
Hello all,

I've been working on a piece of code that is designed to move an object smoothly over a given distance. My intent is to have the object move in three segments: A) acceleration B) max speed C) decceleration. The motion should be smooth ( no jumps in speed ) and object should always end up with a speed of zero. I am using a function to compute distance over time for each segment with a fixed acceleration/deccelearation and a top speed, so in general my problem is just finding the appropriate time values.

My current solution works by always starting the object with a speed of zero, so it's fairly easy to determine the time values because the acceleration time is always the same as the deccelearation time ( and so is the distance ). Either I have time to hit my top speed ( in which case all values are known except segment B ), or I only accellerate up to half the distance, but here I can simply plug in the values and solve for time using the quadratic equation.

However, a problem occurs when the object needs to re-compute a movement while already moving: its speed will "jerk" back to 0 as it begins the next set of segments (which looks bad visually). What I would like to do is to use the current object speed for segment A), and find the three time values that will accelerate to a max, hold, and deccelerate. However, I cannot seem to substitute my eqations down into anything with a single variable that could actually be solved. Below is what I am working with; as a note, S is speed, A is acceleration, T is time, and D is distance. Subscripts a,b,c refer to the Segment, i refers to the initial speed, and m refers to the max speed that could be reached.

Currently, I have 2 equations for speed:

(Segment A) : Sm = Si + A(Ta)
(Segment C) : 0 = Sm - A(Tc)

And I have 4 equations for distance:

(Segment A) : Da = Si(Ta) + 1/2(A)(Ta^2)
(Segment B) : Db = Sm(Tb)
(Segment C) : Dc = Sm(Tc) - 1/2(A)(Tc^2)

(Total ) : D = Da + Db + Dc

If I plug in the three segment distance equations to the total, I end up with four unknown variables: Sm, Da, Db, and Dc. I could then substitute relative to Sm for Ta and Tc using the speed equations, but I unfortunatley don't have anything to substitute for Db. So at best I end up with 2 unknowns, and no equations that could further eliminate one of them. Does anybody know of a way that I might be able to solve this problem? Or, is there a better way of approaching this kind of "controlled speed curve"? Thanks much for any advice!
Advertisement
Do you really have to calculate the velocity beforehand as a function of time?

In the context of a simulation/game I usually do this by calculating for every time step whether to accelerate or break.


if(distance <= 0.5*v*v/a_brake)
{
v = max(0, v - a_brake*dt);
}
else
{
v = min(v_max, v+a*dt);
}


This will automatically hit the brakes at the latest possible point or accelerate to v_max otherwise.

Edit: whoops, had the min and max functions the wrong way around
If I understood the problem correctly, then:

The acceleration phase would ideally last until the current speed

v( t ) := a * ( t - t[sub]0[/sub] ) for t >= t[sub]0[/sub], a > 0 const, v( t[sub]0[/sub] ) = 0

has reached the (desired) maximum at a time t[sub]1[/sub]

v( t[sub]1[/sub] ) = a * ( t[sub]1[/sub] - t[sub]0[/sub] ) == v[sub]max[/sub]

so that the durartion of acceleration will be

T[sub]1[/sub] := t[sub]1[/sub] - t[sub]0[/sub] = v[sub]max[/sub] / a

and the distance driven in this time will be

D[sub]1[/sub] := 0.5 * a * T[sub]1[/sub][sup]2[/sup]

Because later the deceleration will be -a, the deceleration phase will last as long as the acceleration phase and the distance will be the same:

D[sub]3[/sub] := D[sub]1[/sub]
T[sub]3[/sub] := T[sub]1[/sub]

Obviously, D[sub]1[/sub]+D[sub]3[/sub] must be less or equal to D to let the object reach v[sub]max[/sub] at all. Then the route with constant speed will be

D[sub]2[/sub] = D - D[sub]1[/sub] - D[sub]3[/sub]

for which a time of

T[sub]2[/sub] := D[sub]2[/sub] / v[sub]max[/sub]

will be needed. Hence the sequence of time moments will be

{ start: t[sub]0[/sub]; acc_to_const: t[sub]1[/sub] = t[sub]0[/sub] + T[sub]1[/sub]; const_to_dec: t[sub]2[/sub] = t[sub]1[/sub] + T[sub]2[/sub]; stop: t[sub]3[/sub] = t[sub]2[/sub] + T[sub]3[/sub] }

All necessary values are IMHO given.

This topic is closed to new replies.

Advertisement