dcmlr / groundgrid

Source code for the article "GroundGrid: LiDAR Point Cloud Ground Segmentation and Terrain Estimation"
https://ieeexplore.ieee.org/document/10319084
BSD 3-Clause "New" or "Revised" License
146 stars 15 forks source link

About Using for Solid-State LiDAR in SLAM #5

Open moonsheep99 opened 1 week ago

moonsheep99 commented 1 week ago

Hello, developer, thank you for the great open source work! I would like to inquire about what operations should be performed if using your algorithm with solid-state LiDAR (such as Livox Mid 360). Additionally, could you tell me about how to apply the ground segmentation to other algorithms?

Nussknacker commented 20 hours ago

Hi @moonsheep99,

The algorithm should also work with solid-state Lidars like the Livox Mid 360 but the parameters have certainly to be adapted. Most of them are located in the file cfg/GroundGrid.cfg. I would start with the parameters "point_count_cell_variance_threshold" (increase for more noisy measurements), "distance_factor" (increase if most of the points are clustered close to the sensor, decrease otherwise) and "ground_patch_detection_minimum_point_count_threshold" which controls if cells with fewer points than expected can still be classified as ground cells. The expected point count per cell is estimated using the distance of the cell and the angular resolution of the lidar (see the init function in GroundSegmentation.cpp). This angular resolution parameter "verticalPointAngDist" has to be changed in the GroundSegmentation.h file, line 69. It should be set to the approximate angular horizontal resolution (not sure what the vertical is doing in the parameter name). It does not have to be exact but it should not be set too high (better a bit lower). This parameter is used to estimate the amount of points to be expected in a grid map cell and if the cell might be partially occluded. One last important thing to note is that if you have a Lidar setup with beams going upwards thus never hitting the ground, you should filter points from these beams before applying the ground segmentation. Otherwise, you might face the issue the ceilings are classified as ground, leading to wrong results. For Velodyne sensors, the max_ring parameter is intended for this purpose, which filters higher rings before applying the ground segmentation and re-adds them at the end as obstacle points.

Currently, GroundGrid overwrites the intensity value of the points with its classification results and publishes the full point cloud. If you want to have your algorithm working only on obstacle points you would have to remove the else statement in GroundSegmentation.cpp in line 180 and the loop in line 187, where the outlier points are re-added. Also, you want to remove line 177 to avoid the intensity value being overwritten. Then, your node can subscribe to the "groundgrid/segmented_cloud" to receive an obstacle point cloud.