如何使线穿过3D点云?

问题描述 投票:7回答:1

我有一条电缆,正在将车辆从地面上掉下来。通过使用摄像头系统,我可以实时估计绳索接触地面的位置。车辆的运动和位置估计中的不准确性导致着陆位置的点云。从这一点开始,我想得出电缆在地面上最可能的路径。我想实时实现这一目标,并且希望根据新数据来更新拟合度。被添加的新点的频率约为20 Hz,而车辆的运动速度约为1 m / s。因此,点云相当密集。电缆在地面上所经过的路径是平滑的(因为电缆是硬的),并且在3D模式下(x,y,z:地面不平坦!)。

我一直在寻找3D线/样条线/曲线拟合/插值。我发现了一些有前途的方法(B样条拟合,LOWESS->似乎可行,可用于2D,但不适用于3D)。但是,对于哪种方法适合我的情况,我找不到任何明确的解释。您会针对这种情况建议哪种拟合方法?

我正在处理的当前数据集是由:

import numpy as np

tMax = 10 # s
f = 20 # hz
v = 2 # m/s
samples = tMax*f
t = np.linspace(0,tMax, samples)
div = 00.[![2][2]][2]
x=1*np.sin(t)+t+np.random.uniform(-div,div,samples)
y=1*np.cos(t)+t+np.random.uniform(-div,div,samples)
z=1*np.sin(t)*np.cos(t)+t+np.random.uniform(-div,div,samples)

enter image description here

我设法通过LOWESS以2D格式获得合理的结果,如下图所示,但不是3D。

enter image description here

我可能要添加的另一件事是数据带有时间戳。我可以想象,这可能对调整生产线是有益的。

python numpy scipy curve-fitting
1个回答
0
投票

您可以使用scipy UnivariateSpline。

from scipy.interpolate import UnivariateSpline

# new axis
u = np.arange(len(x))

# UnivariateSpline
s = 0.7 * len(u)     # smoothing factor
spx = UnivariateSpline(u, x, s=s)
spy = UnivariateSpline(u, y, s=s)
spz = UnivariateSpline(u, z, s=s)
#
xnew = spx(u)
ynew = spy(u)
znew = spz(u)
© www.soinside.com 2019 - 2024. All rights reserved.