激光雷达数据的Ransac地平面分割

时间:2018-09-11 12:35:06

标签: plane lidar ransac

我想使用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()

我不确定是不是这个问题,所以如果有人以前遇到过这个问题,请告诉我。而且我不知道如何解决该问题,关于激光雷达环分割的信息很少,有人知道如何解决吗?

还有其他方法可以进行激光雷达地面分割吗?

enter image description here

1 个答案:

答案 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参数