Ground Segmentation Benchmark

This repository contains various Ground Segmentation baseline methods. Currently, 7 projects are organized for SemanticKITTI dataset:


If our open sources have been helpful, please cite the below papers published by our research group:

    title={{TRAVEL: Traversable ground and above-ground object segmentation using graph representation of 3D LiDAR scans}},
    author={Oh, Minho and Euigon, Jung and Lim, Hyungtae and Song, Wonho and Hu, Sumin and Lee, Eungchang Mason and Park, Junghee and Kim, Jaekyung and Lee, Jangwoo and Myung, Hyun},
    booktitle={IEEE Robotics and Automation Letters},

    title={{Patchwork++: Fast and robust ground segmentation solving partial under-segmentation using 3D point cloud}},
    author={Lee, Seungjae and Lim, Hyungtae and Myung, Hyun},
    booktitle={Proc. IEEE/RSJ Int. Conf. Intell. Robots Syst.},

    title={Patchwork: Concentric Zone-based Region-wise Ground Segmentation with Ground Likelihood Estimation Using a 3D LiDAR Sensor},
    author={Lim, Hyungtae and Minho, Oh and Myung, Hyun},
    journal={IEEE Robot. Autom. Lett.},


  1. Description
  2. Requirements
  3. Preparing DataSet
  4. Getting Started


This benchmark provides:

Performance Calculation

  • The benchmark calculates the performance of each method and save the results as csv files.
  • The output files contain frame index - time taken - Precision - Recall - TP - FP - FN - TF values.
  • Two versions are to be saved: considering vegetation / not considering vegetation.

Image text


  • It visualizes the ground segmentation result on RVIZ. Image text

    • green: True Positive
    • blue: False Negative
    • red: False Positive


Test Environment

The code wass tested successfully at

  • Linux 18.04 LTS
  • ROS Melodic


sudo apt update
sudo apt-get install ros-melodic-jsk-recognition
sudo apt-get install ros-melodic-jsk-common-msgs
sudo apt-get install ros-melodic-jsk-rviz-plugins
sudo apt-get install libpcl-dev

Install Package

$ cd catkin_ws/src
$ git clone [email protected]:url-kaist/Ground-Segmentation-Benchmark.git
$ catkin build gseg_benchmark

Preparing Dataset

Offline KITTI dataset

  1. Download SemanticKITTI Odometry dataset including Velodyne point clouds, calibration data, and label data.
  2. Set data_path parameter in shellscripts/ for your machine.

The data_path consists of velodyne folder and labels folder as follows:

        |    |___000000.label
        |    |___000001.label
        |    |___ ...
            |___ ...
        |    |___ ...
            |___ ...

Getting Started

Set Parameters of Benchmark

  • Set parameters about dataset path, running method, saving csv output files in shellscripts/
  • Make directories to load SemanticKITTI dataset and save output files and apply them in rosparam setting.

rosparam set /data_path "/data/SemanticKITTI/"      # path of downloaded KITTI dataset. It must include '/' at the end part
rosparam set /stop_for_each_frame false             # set as true to make it stop every frame 
rosparam set /init_idx 0                            # index of first frame to run
rosparam set /save_csv_file true                    # set as false if csv output files are not needed
rosparam set /output_csvpath "/data/patchwork/"     # path of output files to be generated

Run Ground Segmentation Algorithms

  • Start roscore:
$ roscore
  • Open a new terminal and launch node with specification of algorithm and data sequence:
$ roslaunch gseg_benchmark gseg_benchmark.launch alg:=${name of algorithm} seq:=${sequence}

For example,

$ roslaunch gseg_benchmark gseg_benchmark.launch alg:=patchwork seq:=05
  • There are 7 algorithms provided: gpf, cascaded_gseg, r_gpf, linefit, ransac, patchwork, gaussian
  • The examples of seq are 00, 01, …, 10
    • If you do not set seq or set as seq:=all, then the csv output files of all datasets from “00” to “10” will be saved automatically.
  • Rviz result will be shown automatically.



If the following error occurs in flann

/usr/include/flann/util/serialization.h:35:14: error: ‘class std::unordered_map<unsigned int, std::vector<unsigned int> >’ has no member named ‘serialize’

then open header file

sudo gedit /usr/include/flann/util/serialization.h

and change all terms of “map” into “unordered_map”.


Creative Commons LicenseThis work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.


  • All codes on this page are copyrighted by KAIST and published under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 License. You must attribute the work in the manner specified by the author. You may not use the work for commercial purposes, and you may only distribute the resulting work under the same license if you alter, transform, or create the work.


View Github