簡體   English   中英

如何通過 3D 點雲擬合一條線?

[英]How to fit a line through a 3D pointcloud?

我有一根電纜從移動的車輛上掉到地上。 我使用相機系統實時估計繩索接觸地面的位置。 車輛的移動和位置估計的不准確導致着陸位置的點雲。 從這個點雲,我想獲得最有可能的電纜鋪設在地面上的路徑。 我想實時實現這一點,我想根據新數據更新擬合。 添加新點的頻率約為 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)

在此處輸入圖片說明

我設法在 2D 中使用 LOWESS 獲得合理的結果,如下圖所示,但不是 3D。

在此處輸入圖片說明

我可能要補充的另一件事是數據帶有時間戳。 我可以想象這可能有利於擬合這條線。

您可以使用 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM