- This repository is an unofficial implementation of "MapCleaner", a method for removing moving objects from point cloud maps.
- Please note that I created this software as a hobby and there is no guarantee that the contents of the paper are accurately implemented.
| Result | Terrain |
|---|---|
![]() |
![]() |
| Result | Terrain |
|---|---|
![]() |
![]() |
Support for GLIM
- Supported the format of
traj_lidar.txtoutput by GLIM. - By default, GLIM does not store the individual scan frames required to run the algorithm.
- Use this plugin to save individual scan frames.
- The algorithm used for GroundSegmentation has been changed from TRAVEL to PatchWork++.
- Because this change made it no longer necessary to apply the GPL license, the license of this repository has been changed to BSD.
- This repository uses ROS1 for visualization, but since ROS1 has become obsolete and it is difficult to prepare an environment, I have prepared a Docker environment.
- Please refer to the README in the docker directory for how to use the Docker environment.
- Ubuntu 20.04 LTS
- ROS Noetic
- Dependencies
sudo apt install ros-noetic-grid-map ros-noetic-pcl-ros
- Build
mkdir -p catkin_ws/src
cd catkin_ws/src
git clone "this repo" src
catkin_make
- Open
config/config.yamlorconfig/config_kitti.yaml. - Change the following part of the opened yaml.
loader:
pcds_dir: "[Directory path containing LiDAR scan frames]"
pose_file: "[File path of pose data]"
kitti_calibration_file: "[File path of KITTI calibration data]"
start: [Start frame number]
end: [End frame number] #If you set a negative value, it will be processed until the end.
format: "[Dataset format]" #Please specify "kitti" or "erasor"
map_cleaner:
save_dir: "[Directory path where results are saved]"
- Run with the following command.
source devel/setup.bash
roslaunch map_cleaner run.launch config:=[config_file_path]
ground.pcd, static.pcd, dynamic.pcd, ground_below, other.pcd, terrain.pcdare output to the directory specified bysave_dir.
*1: other.pcd contains the unprocessed point clouds that are not on the terrain model. If divide_by_terrain/on_terrain_only is false, all point clouds are processed. Therefore, other.pcd will not be output.
- I recommend using SemanticKITTI's Pose data because the Pose data of KITTI Odometry is not accurate.
- In addition to the KITTI Odometry format, it also supports the data format indicated in the "In your own dataset" section of ERASOR. Please refer to ERASOR's README for details.
- My other repository SimpleLoopClosure supports output in ERASOR format.
- In the paper, Patchwork is used for the initial estimation of ground point clouds, but in this repository, PatchWork++ is used.
- A 3x3 Median Filter has been added after the second BGK Filter.
- The judgment condition of "Fused Result" is partially different from the pseudocode in the paper.
- Original Paper
@Article{rs14184496,
AUTHOR = {Fu, Hao and Xue, Hanzhang and Xie, Guanglei},
TITLE = {MapCleaner: Efficiently Removing Moving Objects from Point Cloud Maps in Autonomous Driving Scenarios},
JOURNAL = {Remote Sensing},
VOLUME = {14},
YEAR = {2022},
NUMBER = {18},
ARTICLE-NUMBER = {4496},
URL = {https://www.mdpi.com/2072-4292/14/18/4496},
DOI = {10.3390/rs14184496}
}
@inproceedings{lee2022patchworkpp,
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.},
year={2022},
pages={13276-13283}
}
@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 Robot. Autom. Lett.},
volume={6},
number={4},
pages={6458--6465},
year={2021},
}
@misc{blanco2014nanoflann,
title = {nanoflann: a {C}++ header-only fork of {FLANN}, a library for Nearest Neighbor ({NN}) with KD-trees},
author = {Blanco, Jose Luis and Rai, Pranjal Kumar},
howpublished = {\url{https://github.com/jlblancoc/nanoflann}},
year = {2014}
}




