Official page of "Patchwork: Concentric Zone-based Region-wise Ground Segmentation with Ground Likelihood Estimation Using a 3D LiDAR Sensor"

Overview

Patchwork

Official page of "Patchwork: Concentric Zone-based Region-wise Ground Segmentation with Ground Likelihood Estimation Using a 3D LiDAR Sensor", which is accepted by RA-L with IROS'21 option

[Video] [Preprint Paper] [Project Wiki]

Patchwork Concept of our method (CZM & GLE)

It's an overall updated version of R-GPF of ERASOR [Code] [Paper].


Demo

KITTI 00

Rough Terrain


Characteristics

  • Single hpp file (include/patchwork/patchwork.hpp)

  • Robust ground consistency

As shown in the demo videos and below figure, our method shows the most promising robust performance compared with other state-of-the-art methods, especially, our method focuses on the little perturbation of precision/recall.

Please kindly note that the concept of traversable area and ground is quite different! Please refer to our paper.

Contents

  1. Test Env.
  2. Requirements
  3. How to Run Patchwork
  4. Citation

Test Env.

The code is tested successfully at

  • Linux 18.04 LTS
  • ROS Melodic

Requirements

ROS Setting

    1. Install ROS on a machine.
    1. Thereafter, jsk-visualization is required to visualize Ground Likelihood Estimation status.
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
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
git clone https://github.com/LimHyungTae/patchwork.git
cd .. && catkin build patchwork 

How to Run Patchwork

We provide three examples

  • Offline KITTI dataset
  • Online (ROS Callback) KITTI dataset
  • Own dataset using pcd files

Offline KITTI dataset

  1. Download SemanticKITTI Odometry dataset (We also need labels since we also open the evaluation code! :)

  2. Set the data_path in launch/offline_kitti.launch for your machine.

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

data_path (e.g. 00, 01, ..., or 10)
_____velodyne
     |___000000.bin
     |___000001.bin
     |___000002.bin
     |...
_____labels
     |___000000.label
     |___000001.label
     |___000002.label
     |...
_____...
   
  1. Run launch file
roslaunch patchwork offline_kitti.launch

You can directly feel the speed of Patchwork! 😉

Online (ROS Callback) KITTI dataset

We also provide rosbag example. If you run our patchwork via rosbag, please refer to this example.

  1. Download readymade rosbag
wget https://urserver.kaist.ac.kr/publicdata/patchwork/kitti_00_xyzilid.bag
  1. After building this package, run the roslaunch as follows:
roslaunch patchwork rosbag_kitti.launch
  1. Then play the rosbag file in another command
rosbag play kitti_00_xyzilid.bag

Own dataset using pcd files

To be updated (In fact, we already set the data loader in include/tools/pcd_loader.hpp)

Citation

If you use our code or method in your work, please consider citing the following:

@article{lim2021patchwork,
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 Robotics and Automation Letters},
year={2021}
}

Description

All explanations of parameters and other experimental results will be uploaded in wiki

Contact

If you have any questions, please let me know:

TODO List

  • Add ROS support
  • Add preprint paper
  • Add demo videos
  • Add demo examples
  • Update wiki

Comments
  • md5sum mismatch : Connection drop

    md5sum mismatch : Connection drop

    I am trying to run rosbag_kitti.launch on a rosbag which contains sensor::PointCloud2 message. Using Ubuntu 20.04, ROS Noetic.

    On running rosbag, I am getting --

    [ERROR] [1645128512.247642039]: Client [/ros_kitti_bhooshan_Legion] wants topic /os_cloud_node/points to have 
    datatype/md5sum [patchwork/node/8ffdb3dcfd475161209f2ce2c04a5bcc], but our version has 
    [sensor_msgs/PointCloud2/1158d486dd51d683ce2f1be655c3c181]. Dropping connection.
    

    According to internet there is a mismatch in what the subscriber is asking for and what my rosbag is publishing. The same rosbag works well on pub_for_legoloam.launch. I compared the two files and found out the difference being line 150 in rosbag_kitti.cpp :

        ros::Subscriber NodeSubscriber = nh.subscribe<patchwork::node>("/node", 5000, callbackNode);
    

    and line 90 on pub_for_legloam.cpp :

        ros::Subscriber NodeSubscriber = nh.subscribe<sensor_msgs::PointCloud2>("/node", 5000, callbackNode);
    

    That's what I think on a primary check. Can you help? You can try running any rosbag with PointCloud2 msgs and try running it with rosbag_kitti.launch. Could it be due to ROS Noetic??

    opened by BhooshanDeshpande 8
  • The different between code and paper

    The different between code and paper

    Thank you for your excellent work. In your paper, If the probability of Ground Likelihood Estimation is larger than 0.5, than ˆGn belongs to the actual ground. However, I noticed you don't do this step, Besides, the calculation of equation (10)and (11)didn't happen. I want to know whether it's just some kind of simplification.

    opened by HMX2013 2
  • 12.27 patchwork 수정사항

    12.27 patchwork 수정사항

    1. pub_for_legoloam.cpp로 kitti bagfile에 대해 pcl::PointXYZ pointtype으로 source / ground / non-ground를 publish할 수 있도록 수정하였습니다.
    2. xy2theta function를 수정하여 sector_idx가 음수가 되는것을 방지하였습니다.
    3. comb.msg를 만들어서 LeGO-LOAM을 위해 source와 ground msg를 합쳐 보낼 수 있도록 수정하였습니다. 추가적으로 launch파일,rviz도 추가하였고 REAMDE의 How to run에 적어두었습니다!
    opened by SeoDU 2
  • Skipped empty section pointcloud's ground estimation proposals

    Skipped empty section pointcloud's ground estimation proposals

    Hello,

    I noticed that we are letting empty sections and calculate the singular values on them which will lead to nan values.

    https://github.com/LimHyungTae/patchwork/blob/4b4f2118f706e339c1ed23b5710bc732d8c7c54d/include/patchwork/patchwork.hpp#L444-L462

    1. Here is the output of Size of the pointcloud for ring(section), singular values and Linearity/Planarity results in original code:
      1. You can clearly see that from the last ring(section), even we don't have any points in section, if there were calculations done in step before; the values of respective features will copied from the last section. Which will definetely effect the correctness of the height calculation.
      2. Here is the subset of the wrong output:
    patchwork_ground_seg: SizeOfRing: 33
    patchwork_ground_seg: * Singular Values: 0.0368877, 0.00435487, 1.95469e-05
    patchwork_ground_seg: * Linearity: 0.881942
    patchwork_ground_seg: * Planarity: 0.117528
    patchwork_ground_seg: SizeOfRing: 0
    patchwork_ground_seg: * Singular Values: 0.0368877, 0.00435487, 1.95469e-05
    patchwork_ground_seg: * Linearity: 0.881942
    patchwork_ground_seg: * Planarity: 0.117528
    
    patchwork_ground_seg: SizeOfRing: 0
    patchwork_ground_seg: * Singular Values: 0, 0, 0
    patchwork_ground_seg: * Linearity: -nan
    patchwork_ground_seg: * Planarity: -nan
    patchwork_ground_seg: SizeOfRing: 143
    patchwork_ground_seg: * Singular Values: 0.109471, 0.0290639, 3.99177e-05
    patchwork_ground_seg: * Linearity: 0.734506
    patchwork_ground_seg: * Planarity: 0.26513
    patchwork_ground_seg: SizeOfRing: 279
    patchwork_ground_seg: * Singular Values: 0.294544, 0.0965589, 3.21574e-05
    patchwork_ground_seg: * Linearity: 0.672175
    patchwork_ground_seg: * Planarity: 0.327716
    patchwork_ground_seg: SizeOfRing: 323
    patchwork_ground_seg: * Singular Values: 0.462427, 0.120994, 4.09155e-05
    patchwork_ground_seg: * Linearity: 0.738349
    patchwork_ground_seg: * Planarity: 0.261562
    patchwork_ground_seg: SizeOfRing: 493
    patchwork_ground_seg: * Singular Values: 0.422977, 0.111352, 4.06778e-05
    patchwork_ground_seg: * Linearity: 0.736741
    patchwork_ground_seg: * Planarity: 0.263163
    patchwork_ground_seg: SizeOfRing: 478
    patchwork_ground_seg: * Singular Values: 0.265785, 0.124776, 5.04178e-05
    patchwork_ground_seg: * Linearity: 0.530537
    patchwork_ground_seg: * Planarity: 0.469274
    patchwork_ground_seg: SizeOfRing: 430
    patchwork_ground_seg: * Singular Values: 0.158036, 0.113088, 3.39509e-05
    patchwork_ground_seg: * Linearity: 0.284418
    patchwork_ground_seg: * Planarity: 0.715367
    patchwork_ground_seg: SizeOfRing: 461
    patchwork_ground_seg: * Singular Values: 0.163267, 0.104623, 4.05746e-05
    patchwork_ground_seg: * Linearity: 0.359195
    patchwork_ground_seg: * Planarity: 0.640557
    patchwork_ground_seg: SizeOfRing: 527
    patchwork_ground_seg: * Singular Values: 0.202164, 0.128592, 9.12833e-05
    patchwork_ground_seg: * Linearity: 0.363922
    patchwork_ground_seg: * Planarity: 0.635627
    patchwork_ground_seg: SizeOfRing: 786
    patchwork_ground_seg: * Singular Values: 0.356911, 0.116977, 8.66355e-05
    patchwork_ground_seg: * Linearity: 0.672251
    patchwork_ground_seg: * Planarity: 0.327506
    patchwork_ground_seg: SizeOfRing: 843
    patchwork_ground_seg: * Singular Values: 0.350674, 0.110203, 8.68107e-05
    patchwork_ground_seg: * Linearity: 0.68574
    patchwork_ground_seg: * Planarity: 0.314012
    patchwork_ground_seg: SizeOfRing: 754
    patchwork_ground_seg: * Singular Values: 0.237328, 0.132515, 5.75546e-05
    patchwork_ground_seg: * Linearity: 0.441639
    patchwork_ground_seg: * Planarity: 0.558119
    patchwork_ground_seg: SizeOfRing: 558
    patchwork_ground_seg: * Singular Values: 0.162093, 0.110739, 5.16564e-05
    patchwork_ground_seg: * Linearity: 0.316819
    patchwork_ground_seg: * Planarity: 0.682862
    patchwork_ground_seg: SizeOfRing: 753
    patchwork_ground_seg: * Singular Values: 0.167197, 0.103093, 0.00201635
    patchwork_ground_seg: * Linearity: 0.383403
    patchwork_ground_seg: * Planarity: 0.604537
    patchwork_ground_seg: SizeOfRing: 795
    patchwork_ground_seg: * Singular Values: 0.195423, 0.126148, 0.00168774
    patchwork_ground_seg: * Linearity: 0.354488
    patchwork_ground_seg: * Planarity: 0.636875
    patchwork_ground_seg: SizeOfRing: 702
    patchwork_ground_seg: * Singular Values: 0.35721, 0.123147, 0.00249468
    patchwork_ground_seg: * Linearity: 0.655252
    patchwork_ground_seg: * Planarity: 0.337764
    patchwork_ground_seg: SizeOfRing: 511
    patchwork_ground_seg: * Singular Values: 0.480244, 0.13327, 0.002766
    patchwork_ground_seg: * Linearity: 0.722495
    patchwork_ground_seg: * Planarity: 0.271745
    patchwork_ground_seg: SizeOfRing: 187
    patchwork_ground_seg: * Singular Values: 0.279308, 0.105251, 0.000206188
    patchwork_ground_seg: * Linearity: 0.623173
    patchwork_ground_seg: * Planarity: 0.376089
    patchwork_ground_seg: SizeOfRing: 33
    patchwork_ground_seg: * Singular Values: 0.0368877, 0.00435487, 1.95469e-05
    patchwork_ground_seg: * Linearity: 0.881942
    patchwork_ground_seg: * Planarity: 0.117528
    patchwork_ground_seg: SizeOfRing: 0
    patchwork_ground_seg: * Singular Values: 0.0368877, 0.00435487, 1.95469e-05
    patchwork_ground_seg: * Linearity: 0.881942
    patchwork_ground_seg: * Planarity: 0.117528
    
    1. And here is the after the code change:
    patchwork_ground_seg: SizeOfRing: 142
    patchwork_ground_seg: * Singular Values: 0.110376, 0.0330322, 3.93967e-05
    patchwork_ground_seg: * Linearity: 0.700729
    patchwork_ground_seg: * Planarity: 0.298914
    patchwork_ground_seg: SizeOfRing: 254
    patchwork_ground_seg: * Singular Values: 0.233747, 0.106727, 3.83107e-05
    patchwork_ground_seg: * Linearity: 0.54341
    patchwork_ground_seg: * Planarity: 0.456426
    patchwork_ground_seg: SizeOfRing: 288
    patchwork_ground_seg: * Singular Values: 0.411811, 0.121756, 4.87517e-05
    patchwork_ground_seg: * Linearity: 0.704341
    patchwork_ground_seg: * Planarity: 0.295541
    patchwork_ground_seg: SizeOfRing: 414
    patchwork_ground_seg: * Singular Values: 0.443487, 0.123922, 4.69576e-05
    patchwork_ground_seg: * Linearity: 0.720574
    patchwork_ground_seg: * Planarity: 0.27932
    patchwork_ground_seg: SizeOfRing: 497
    patchwork_ground_seg: * Singular Values: 0.327631, 0.115926, 3.13969e-05
    patchwork_ground_seg: * Linearity: 0.646168
    patchwork_ground_seg: * Planarity: 0.353736
    patchwork_ground_seg: SizeOfRing: 423
    patchwork_ground_seg: * Singular Values: 0.16464, 0.100782, 2.70376e-05
    patchwork_ground_seg: * Linearity: 0.387868
    patchwork_ground_seg: * Planarity: 0.611967
    patchwork_ground_seg: SizeOfRing: 422
    patchwork_ground_seg: * Singular Values: 0.167495, 0.0648561, 3.43014e-05
    patchwork_ground_seg: * Linearity: 0.612789
    patchwork_ground_seg: * Planarity: 0.387007
    patchwork_ground_seg: SizeOfRing: 487
    patchwork_ground_seg: * Singular Values: 0.229241, 0.104464, 0.000121826
    patchwork_ground_seg: * Linearity: 0.544303
    patchwork_ground_seg: * Planarity: 0.455166
    patchwork_ground_seg: SizeOfRing: 767
    patchwork_ground_seg: * Singular Values: 0.36055, 0.138742, 9.2921e-05
    patchwork_ground_seg: * Linearity: 0.615193
    patchwork_ground_seg: * Planarity: 0.384549
    patchwork_ground_seg: SizeOfRing: 852
    patchwork_ground_seg: * Singular Values: 0.307547, 0.121315, 0.000131403
    patchwork_ground_seg: * Linearity: 0.605542
    patchwork_ground_seg: * Planarity: 0.394031
    patchwork_ground_seg: SizeOfRing: 730
    patchwork_ground_seg: * Singular Values: 0.198971, 0.129057, 6.5772e-05
    patchwork_ground_seg: * Linearity: 0.351377
    patchwork_ground_seg: * Planarity: 0.648292
    patchwork_ground_seg: SizeOfRing: 529
    patchwork_ground_seg: * Singular Values: 0.158642, 0.100017, 4.66582e-05
    patchwork_ground_seg: * Linearity: 0.369541
    patchwork_ground_seg: * Planarity: 0.630164
    patchwork_ground_seg: SizeOfRing: 741
    patchwork_ground_seg: * Singular Values: 0.16636, 0.103954, 0.00170705
    patchwork_ground_seg: * Linearity: 0.375128
    patchwork_ground_seg: * Planarity: 0.614611
    patchwork_ground_seg: SizeOfRing: 804
    patchwork_ground_seg: * Singular Values: 0.201368, 0.123692, 0.00174579
    patchwork_ground_seg: * Linearity: 0.385743
    patchwork_ground_seg: * Planarity: 0.605588
    patchwork_ground_seg: SizeOfRing: 704
    patchwork_ground_seg: * Singular Values: 0.360332, 0.119244, 0.00250925
    patchwork_ground_seg: * Linearity: 0.669073
    patchwork_ground_seg: * Planarity: 0.323963
    patchwork_ground_seg: SizeOfRing: 507
    patchwork_ground_seg: * Singular Values: 0.4803, 0.135758, 0.00307255
    patchwork_ground_seg: * Linearity: 0.717348
    patchwork_ground_seg: * Planarity: 0.276255
    patchwork_ground_seg: SizeOfRing: 184
    patchwork_ground_seg: * Singular Values: 0.278921, 0.10715, 0.000249198
    patchwork_ground_seg: * Linearity: 0.615843
    patchwork_ground_seg: * Planarity: 0.383264
    patchwork_ground_seg: SizeOfRing: 30
    patchwork_ground_seg: * Singular Values: 0.0474286, 0.00591493, 3.23724e-05
    patchwork_ground_seg: * Linearity: 0.875288
    patchwork_ground_seg: * Planarity: 0.12403
    
    
    
    opened by yucedagonurcan 1
  • How to show pointcloud frame by frame?

    How to show pointcloud frame by frame?

    Hi, it's a wonderful work! I'm a new user of ROS and I wonder how can I show the result of patchwork frame by frame, since your work show the result in a video-like style.

    opened by mc171819 1
  • Feature: Publish ground and non-ground pointcloud

    Feature: Publish ground and non-ground pointcloud

    Issue

    Need ground and non-ground point cloud for further processing downline.

    Solution

    Add previously commented publishing lines back in. Also removed CloudPublisher comment.

    opened by asatria-nix 1
  • Is there a mistake in patchwork.hpp????

    Is there a mistake in patchwork.hpp????

    Line 439 if (ground_z_elevation > elevation_thr_[ring_idx + 2 * k]) {

    is index 'ring_idx + 2k' wrong ? the size of elevation_thr_ is 4. So, ' ring_idx + 2k' may be large than 4. Can you explain it?

    opened by 512938445 1
  • Why is elevation_threshold different for each zone?

    Why is elevation_threshold different for each zone?

    Hi,

    I read through your paper explaining the patchwork algorithm, but need a little more clarification on why different elevation thresholds are needed for each zone.

    If I am understanding the parameter correctly, the elevation thresholds represent the adaptive midpoint function κ(r). Would I be correct to say that this parameter is simply the maximum height that the ground plane can be? In this case, why would the maximum ground height change depending on the distance of each zone?

    Thanks!

    opened by natashasoon 1
  • patchwork.hpp:373

    patchwork.hpp:373

    include/patchwork/patchwork.hpp:373: double PatchWork<PointT>::consensus_set_based_height_estimation(const RowVectorXd&, const RowVectorXd&, const RowVectorXd&) [with PointT = pcl::PointXYZ; Eigen::RowVectorXd = Eigen::Matrix<double, 1, -1>]: Assertion!only_one_element' failed.`

    Hi, when I tried to run my own data, some troubles occurred in this line. I find some comments behind this line, i.e. "TODO: admit a trivial solution". Is there any bugs when you debuged it?

    opened by XFFer 0
Owner
Hyungtae Lim
Ph.D Candidate of URL lab. @ KAIST, South Korea
Hyungtae Lim
Official PyTorch Code of GrooMeD-NMS: Grouped Mathematically Differentiable NMS for Monocular 3D Object Detection (CVPR 2021)

GrooMeD-NMS: Grouped Mathematically Differentiable NMS for Monocular 3D Object Detection GrooMeD-NMS: Grouped Mathematically Differentiable NMS for Mo

Abhinav Kumar 75 Jul 31, 2022
The official implementation of our CVPR 2021 paper - Hybrid Rotation Averaging: A Fast and Robust Rotation Averaging Approach

Graph Optimizer This repo contains the official implementation of our CVPR 2021 paper - Hybrid Rotation Averaging: A Fast and Robust Rotation Averagin

Chenyu 103 Sep 14, 2022
The official implementation of the research paper "DAG Amendment for Inverse Control of Parametric Shapes"

DAG Amendment for Inverse Control of Parametric Shapes This repository is the official Blender implementation of the paper "DAG Amendment for Inverse

Elie Michel 155 Sep 21, 2022
The official Brainfuckn't esolang

Brainfuckn't Backstory Brainfuckn't is an esolang created by me (4gboframram) that is similar to brainfuck, but definitely isn't. The name came from a

null 1 Nov 7, 2021
Praprotem Official Repository.

Praprotem V1.0.0 Praprotem Official Repository. Praprotem is a project management system being built to help users easily manage all projects from one

Praise Codes 2 Nov 19, 2021
Official Pytorch implementation of RePOSE (ICCV2021)

RePOSE: Fast 6D Object Pose Refinement via Deep Texture Rendering (ICCV2021) [Link] Abstract We present RePOSE, a fast iterative refinement method for

Shun Iwase 69 Sep 21, 2022
Official Code for StyleMesh

StyleMesh This is the official repository that contains source code for StyleMesh. [Arxiv] [Project Page] [Video] If you find StyleMesh useful for you

Lukas Hoellein 92 Sep 15, 2022
Official page of ERASOR RA-L with ICRA'21

?? ERASOR (RA-L'21 with ICRA Option) Official page of "ERASOR: Egocentric Ratio of Pseudo Occupancy-based Dynamic Object Removal for Static 3D Point C

Hyungtae Lim 200 Sep 23, 2022
ERASOR - Official page of ERASOR (RA-L'21 with ICRA'21)

?? ERASOR (RA-L'21 with ICRA Option) Official page of "ERASOR: Egocentric Ratio of Pseudo Occupancy-based Dynamic Object Removal for Static 3D Point C

Hyungtae Lim 200 Sep 23, 2022
Official page of MLCPP (IROS'18 @ Barcelona, Spain): Offline Coverage Path Planner

MLCPP: Multi-layer coverage path planner for autonomous structural inspection of high-rise structures The purpose of the algorithm is to inspect high-

Sungwook Jung 12 Jul 19, 2022
A continuation of FSund's pteron-keyboard project. Feel free to contribute, or use these files to make your own! Kits and PCBs are also available through my facebook page.

pteron-pcb Intro This project is the evolution of the Pteron-Keyboard project, an incredible ergonomic keyboard that was handwired only. I aimed to in

null 16 Aug 15, 2022
Cold-start page provisioning speed test for WIndows

largepages This is a rudimentary test of cold-start memory paging on Windows that I put together for Raymond Chen's Tie, who was kind enough to ask it

Casey Muratori 30 Aug 19, 2022
ESP 32 webserver to serve a static page for wifi settings

ESP32 Settings WebServer This is a ESP32 Firmware developed in PlatformIO which consists in a HTTP server for serve static files and provides an API f

Mateus Mello de Oliveira 2 Oct 29, 2021
reverse proxy with web server and preview page

Reverse Proxy Dependencies Go Make Suport Termux (android/afsd kernel) linux (kernel) Install: Termux: 1 step: Install Go-lang, Git and Make pkg insta

AlbâniaSecurity-RT 7 Feb 19, 2022
Exploring the Design Space of Page Management for Multi-Tiered Memory Systems (USENIX ATC'21)

AutoTiering This repo contains the kernel code in the following paper: Exploring the Design Space of Page Management for Multi-Tiered Memory Systems (

Computer Systems Laboratory @ Ajou University 17 Aug 31, 2022
A split-screen menu page

split_screen_menu A split-screen menu page Getting Started ###isMobileLayout retun bool SplitScreenMenu menu Widget initialRoute String? initPage Widg

Chans 4 Feb 19, 2022
Creates an AP with a web page interface that allows configuration of ESP for local WiFi network.

Creates an AP with a web page interface that allows configuration of ESP for local WiFi network.

null 3 Feb 5, 2022
A simple C++ ImGui loader base you can use for all your projects that need a login / register page.

C++ Loader Base ??️ What is this? ⚡ This is a very simple base I made for projects that require a login / register page that use ImGui. ??️ Screenshot

Alfie 18 Aug 29, 2022
Program that allows you to get the source code of a website's home page without doing it manually. Use it at your own risk.

Website-Homepage-Grabber Install one of the folders x64 or x32 if the program doesn't work(probably because you don't have visual studio installed) If

null 5 Feb 19, 2022
Parallel bitonic sorter with limited enclave page cache (default 80MB).

Parallel Oblivious Sorter with SGX Parallel bitonic sorter with limited Intel SGX enclave page cache (default 80MB). Compile and Run Compile make clea

ZHENG Leqian 3 Jul 7, 2022