繁体   English   中英

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

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

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

我的问题是,如果我使用cscvn function 和fnval进行插值,则插值点的间距不均匀(下图中的黄色星星),我不确定如何为这些点插值时间和速度。 或者,如果我使用interp1进行插值,它会产生均匀间隔的点,但使用cscvn进行插值并不更好。

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

我怎样才能插值 xyz 路径,然后在那些不均匀间隔的点上插值时间和速度?

这是我正在使用的代码:

% 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'})

这是生成的 plot。 插值图 MATLAB

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM