[英]Getting a good interpolation/fit for 1d curve in 3d space — Python
我有一组3d坐标(x,y,z)
,我想将这些坐标拟合到空间曲线。 有人知道Python中已有的例程吗?
根据我发现的内容( https://docs.scipy.org/doc/scipy/reference/interpolate.html ),现有的模块可以将曲线拟合到一组二维坐标,而其他模块则可以将曲面拟合到3d坐标集。 我想要中间路径-将曲线拟合到一组3d坐标。
编辑-
我在这里的另一篇文章中找到了一个明确的答案,使用interpolate.splprep()
和interpolate.splenv()
。 这是我的数据点:
import numpy as np
data = np.array([[21.735556483642707, 7.9999120559310359, -0.7043281314370935],
[21.009401429607784, 8.0101161320825103, -0.16388503829177037],
[20.199370045383134, 8.0361339131845497, 0.25664085801558179],
[19.318149385194054, 8.0540100864979447, 0.50434139043379278],
[18.405497793567243, 8.0621753888918484, 0.57169888018720161],
[17.952649703401562, 8.8413995204241491, 0.39316793526155014],
[17.539007529982641, 9.6245700151356104, 0.14326173861202204],
[17.100154581079089, 10.416295524018977, 0.011339000091976647],
[16.645143439968102, 11.208477191735446, 0.070252116425261066],
[16.198247656768263, 11.967005154933993, 0.31087815045809558],
[16.661378578010989, 12.717314230004659, 0.54140549139204996],
[17.126106263351478, 13.503461982612732, 0.57743407626794219],
[17.564249250974573, 14.28890107482801, 0.42307198199366186],
[17.968265052275274, 15.031985807202176, 0.10156997950061938]])
这是我的代码:
from scipy import interpolate
from mpl_toolkits.mplot3d import Axes3D
data = data.transpose()
#now we get all the knots and info about the interpolated spline
tck, u= interpolate.splprep(data, k=5)
#here we generate the new interpolated dataset,
#increase the resolution by increasing the spacing, 500 in this example
new = interpolate.splev(np.linspace(0,1,500), tck, der=0)
#now lets plot it!
fig = plt.figure()
ax = Axes3D(fig)
ax.plot(data[0], data[1], data[2], label='originalpoints', lw =2, c='Dodgerblue')
ax.plot(new[0], new[1], new[2], label='fit', lw =2, c='red')
ax.legend()
plt.savefig('junk.png')
plt.show()
这是图像:
您可以看到拟合效果不好,而我已经在使用允许的最大拟合顺序值( k=5
)。 这是因为曲线没有完全凸出吗? 有谁知道我该如何提高身材?
取决于这些点代表什么,但是如果只是位置数据,则可以使用卡尔曼过滤器,例如用python编写的过滤器 。 您可以随时查询卡尔曼过滤器以获取当时的“期望点”,因此它就像时间的函数一样工作。
如果您确实打算使用卡尔曼滤波器,只需将初始估计值设置为第一个坐标,并将协方差设置为大数字的对角矩阵,这将表明您不确定下一个点的位置,即会很快将过滤器锁定到您的坐标上。
您不希望使用样条线拟合方法,因为样条线将始终遍历您的数据。
您可以将曲线拟合到任何尺寸数据。 曲线拟合/优化算法(例如,在scipy.optimize
)都将要建模的观测值视为普通的一维数组,而不管独立变量是什么。 如果将3d数据展平,则每个值将对应一个(x,y,z)元组。 您可以将该信息作为“额外”数据传递给拟合例程,以帮助您计算适合数据的模型曲线。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.