我想使用ransac算法来分割地平面激光雷达环,我使用python-pcl来做到这一点,但是我得到了错误的结果,如下图所示。
我们知道,激光雷达数据有许多接地平面环,它找不到正确的地面平面,但找到了高于地面的平面。我可以猜测的原因是,激光雷达的地面可能非常稀疏,并且地面上方的平面的点数多于地面,因此算法发现了错误的结果。代码可以如下所示:
seg = point_cloud.make_segmenter()
seg.set_optimize_coefficients(True)
seg.set_model_type(pcl.SACMODEL_PLANE)
seg.set_method_type(pcl.SAC_RANSAC)
seg.set_distance_threshold(0.1)
indices, model = seg.segment()
我不确定是不是这个问题,所以如果有人以前遇到过这个问题,请告诉我。而且我不知道如何解决该问题,关于激光雷达环分割的信息很少,有人知道如何解决吗?
还有其他方法可以进行激光雷达地面分割吗?
答案 0 :(得分:1)
尝试一下-
from mpl_toolkits.mplot3d.axes3d import *
import matplotlib.pyplot as plt
from sklearn import linear_model
fig = plt.figure("Pointcloud")
ax = Axes3D(fig)
ax.grid = True
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")
xyz = get_points()# here xyz is a 3d numpy array
if xyz.size > 10:
XY = xyz[:, :2]
Z = xyz[:, 2]
ransac = linear_model.RANSACRegressor(residual_threshold=0.01)
ransac.fit(XY, Z)
inlier_mask = ransac.inlier_mask_
outlier_mask = np.logical_not(inlier_mask)
inliers = np.zeros(shape=(len(inlier_mask), 3))
outliers = np.zeros(shape=(len(outlier_mask), 3))
a, b = ransac.estimator_.coef_
d = ransac.estimator_.intercept_
for i in range(len(inlier_mask)):
if not outlier_mask[i]:
inliers[i] = xyz[i]
else:
outliers[i] = xyz[i]
min_x = np.amin(inliers[:, 0])
max_x = np.amax(inliers[:, 0])
min_y = np.amin(inliers[:, 1])
max_y = np.amax(inliers[:, 1])
x = np.linspace(min_x, max_x)
y = np.linspace(min_y, max_y)
X, Y = np.meshgrid(x, y)
Z = a * X + b * Y + d
AA = ax.plot_surface(X, Y, Z, cmap='binary', rstride=1, cstride=1,
alpha=1.0)
BB = ax.scatter(outliers[:, 0], outliers[:, 1], outliers[:, 2],c='k', s
=1)
CC = ax.scatter(inliers[:, 0], inliers[:, 1], inliers[:, 2], c='green',
s=1)
plt.show()
或者请提供您的数据集。还可以使用ransac参数