如何通过3D pointcloud安装线?

时间:2016-02-08 15:53:42

标签: python numpy scipy curve-fitting

我有一条电缆,我正在将车辆移到地面上。使用相机系统,我估计绳索实时接触地面的位置。车辆的移动和位置估计的不准确性导致着陆点的点云。从这一点云,我想要看到躺在地上的最可能的电缆路径。我想实时实现这一点,并且我希望根据新数据进行更新。添加的新点的频率约为20Hz,而车辆的移动速度约为1m / 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

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

enter image description here

我可能添加的另一件事是数据带有时间戳。我可以想象这可能有利于拟合这条线。

1 个答案:

答案 0 :(得分: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)