如何使线穿过3D点云?

mar*_*ram 6 python numpy curve-fitting scipy

我有一条电缆正在从车辆上移到地面上。通过使用摄像头系统,我可以实时估计绳索接触地面的位置。车辆的运动和位置估计中的不准确性导致着陆位置的点云。从这一点开始,我想得出电缆在地面上最可能的路径。我想实时实现这一目标,并且希望根据新数据来更新拟合度。被添加的新点的频率约为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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我设法在2D中使用LOWESS获得合理的结果,如下图所示,但不是3D。

在此处输入图片说明

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

小智 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)
Run Code Online (Sandbox Code Playgroud)