考虑加速度的插值

Mir*_*pas 1 math physics

我真的不知道我想做的是否被认为是插值,但我会尽力解释。

现在,当我想及时从一个点移动A到另一个点B(为简单起见,仅考虑 1 个坐标空间)时,T我使用线性插值公式计算位置:

P(t) = A + (B-A) * (t / T), T != 0
Run Code Online (Sandbox Code Playgroud)

这在大多数情况下都可以正常工作,但我想像这样考虑加速和制动:

  • x%一次会是从vi一个速度到另一个v速度的加速
  • 下次y%将是v匀速
  • 最后z%一次将减速以达到vf速度t = T

在考虑加速和制动时P(t),我如何计算, ?t[0, T]

Nic*_*ler 5

考虑我们有以下时间点:

t0 = 0 is the beginning of the movement
ta is the point when acceleration ends
td is the point when decceleration begins
T is the end of the movement
Run Code Online (Sandbox Code Playgroud)

然后我们有运动的三个部分。[t0, ta], (ta, td], (td, T]。每个都可以单独指定。对于加速度/减速度,我们需要计算加速度aa和减速度,ad如下所示:

aa = (v - vi) / (ta - t0)
ad = (vf - v) / (T - td)
Run Code Online (Sandbox Code Playgroud)

根据你的问题,所有的值都给出了。

那么运动可以表示为:

P(t) :=
    if(t < ta)
        1 / 2 * aa * t^2 + vi * t + A
    else if(t < td)
        v * (t - ta) + 1 / 2 * aa * ta^2 + vi * ta + A
                    // this is the length of the first part
    else
        1 / 2 * ad * (t - td)^2 + v * (t - td) 
          + v * (td - ta) + 1 / 2 * aa * ta^2 + vi * ta + A
          //those are the lengths of the first two parts
Run Code Online (Sandbox Code Playgroud)

如果我们预先计算零件的长度为

s1 := 1 / 2 * aa * ta^2 + vi * ta + A
s2 := v * (td - ta)
Run Code Online (Sandbox Code Playgroud)

那么公式就变得短一点:

P(t) :=
    if(t < ta)
        1 / 2 * aa * t^2 + vi * t + A
    else if(t < td)
        v * (t - ta) + s1
    else
        1 / 2 * ad * (t - td)^2 + v * (t - td) + s1 + s2
Run Code Online (Sandbox Code Playgroud)

这是一个示例图:

例子

然而,除非您选择了正确的值,否则运动很可能不会B发生T。这是因为方程被过度指定。例如,您可以v根据 B 进行计算,而不是指定它。

编辑

v达到具体的计算方法B为:

v = (2 * A - 2 * B - td * vf + T * vf + ta * vi) / (ta - td - T)
Run Code Online (Sandbox Code Playgroud)