1

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

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

P(t) = A + (B-A) * (t / T), T != 0

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

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

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

4

1 回答 1

4

考虑我们有以下时间点:

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

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

aa = (v - vi) / (ta - t0)
ad = (vf - v) / (T - td)

根据您的问题,所有值都已给出。

那么运动可以表示为:

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

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

s1 := 1 / 2 * aa * ta^2 + vi * ta + A
s2 := v * (td - ta)

然后公式变得有点短:

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

这是一个示例图:

例子

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

编辑

v达到特定的计算B是:

v = (2 * A - 2 * B - td * vf + T * vf + ta * vi) / (ta - td - T)
于 2013-06-25T10:19:17.973 回答