如何插入 3D 数据的时间和速度?

How can I interpolate time and velocity of 3D data?

我正在使用 MATLAB 尝试为以可变速度在 3D space 中移动的对象插入数据。我从一个包含列的数组开始:时间、x、y、z、速度。我想对 xyz 路径进行插值,但我不知道如何在 xyz 插值产生的相同点上对时间和速度进行插值。

我的问题是,如果我使用 cscvn 函数和 fnval 进行插值,则插值点不均匀 spaced(下图中的黄色星星)并且我我不确定如何为这些点插入时间和速度。 或者,如果我用 interp1 进行插值,它确实会均匀地产生 spaced 个点,但是 cscvn.

的插值效果并不好

我尝试进行 5 维插值,但没有产生预期的结果。我不知道如何处理这个问题。

如何插值 xyz 路径,然后在那些不均匀的 spaced 点插值时间和速度?

这是我使用的代码:

% Generate some fake data
flightPathRate = 1;
x = (-5:flightPathRate:10)';
y = sin(4*x);
z = linspace(3,5, length(x))';
t = ((0:length(x)-1)*flightPathRate)';
vel = x.^2 + 10;

pathData = [t x y z vel];

% Interpolate with cscvn
curve = cscvn(pathData(:,2:4)');

plot3(x, y, z, 'ob-')
hold on
fnplt(curve) 

% Evaluate the spline curve created with cscvn at finer points.
splinePoints = fnval(curve, 0:0.1:16);
plot3(splinePoints(1,:), splinePoints(2,:), splinePoints(3,:), '*')

%% Interpolate with interp1
cs = cat(1,0,cumsum(sqrt(sum(diff([x, y, z], [], 1).^2, 2))));
dd = interp1(cs, [x, y, z], unique([cs(:)' linspace(0,cs(end),100)]), 'spline')

hold on
plot3(dd(:,1), dd(:,2), dd(:,3), '.r-')
axis image, view(3), legend({'Original', 'Spline Curve with cscvn/fnplt', 'Interp. Points with cscvn/fnval', 'Interp. Spline with interp1'})

这里是制作的剧情。

我运行你的代码成功了。
Q.1:请解释速度在您的代码中的作用。您在每个假数据时间点将 vel 定义为假数据。但它与x,y,z假数据完全无关。
回答关于如何确定与从 cscvn() 获得的 x、y、z 点相关联的时间的问题:没有经过合理验证的方法可以做到这一点。因此我建议您不要使用 cscvn()。它的主要优点是制作周期性样条曲线,即 return 到其原点的 cirves 样条曲线。但是这个问题不是那样的。 你从 interp1() 得到的内插数据对我来说看起来不错。我会同意的。从插值点估计速度(|v| 和 vx、vy、vz)是一件简单的事情。当您这样做时,我建议在每个点之前和之后使用插值点,以在中间获得未移动的估计值。如果您认为 'spline' 过冲太多,请尝试使用 interp1() 的 'makima' 或 'pchip' 方法,而不是 'spline' 方法。