如何通过一个三维点云拟合一条直线?

7
我有一根电缆从移动车辆上垂直落到地面上。使用相机系统我能实时估算绳子接触地面的位置。车辆运动和位置估计的不精确性导致了一个接触点云。从这个点云中,我想得出电缆在地面上最可能的路径。我希望能够实时完成,并且希望拟合能够根据新数据进行更新。新加入数据的频率大约是20Hz,而车辆的运动速度大约为1 m/s,因此点云非常密集。电缆在地面上的路线是平滑的(因为电缆很硬),并且是三维的(x,y,z:地面不是平坦的!)。
我一直在寻找三维线/样条/曲线拟合/插值。我找到了一些有前途的方法(B样条拟合, LOWESS->看起来可行,在二维中可用,但在三维中不可用)。然而,我找不到任何明确说明哪种方法适用于我的情况的解释。您会建议哪种拟合方法来处理这种情况吗?
我目前正在处理的数据集是通过以下方式生成的:
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获得了合理的结果,如下图所示,但在三维中没有。

enter image description here

另外一件我可以补充的事情是数据有时间戳。我可以想象这对于拟合线条可能是有益的。

也许可以考虑使用高斯过程回归(Gaussian process regression)?由于无法获取数据,很难给出更具体的答案。 - ali_m
能否添加一些数据? - Cleb
请发布一个数据集或链接到一个数据集。这不是一个难题,既然你已经问了,我们不妨发布一个答案。 - DrM
由于该问题是在'16年发布的,我无法再访问相应的数据集(我知道第一个请求数据也是从'16年开始的-对此未做出回应表示抱歉)。而且,这些数据已经被分类,无法共享。不过,这个问题与提供的代码生成的数据非常接近。使用该数据会给你带来哪些问题? - marqram
1
@ali_m. 基本上就是卡尔曼滤波器吗? - Mad Physicist
@marqram。你考虑过为你的进程编写一个简单的卡尔曼滤波器吗?在对导数和允许偏差进行一些假设后,它将作为数据上的低通滤波器。 - Mad Physicist
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接