我真的不知道我想做的是否被认为是插值,但我会尽力解释。
现在,当我想及时从一个点移动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]
考虑我们有以下时间点:
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)