{"id":13528691,"url":"https://github.com/gisbi-kim/PyICP-SLAM","last_synced_at":"2025-04-01T14:32:55.683Z","repository":{"id":38793003,"uuid":"213172505","full_name":"gisbi-kim/PyICP-SLAM","owner":"gisbi-kim","description":"Full-python LiDAR SLAM using ICP and Scan Context","archived":false,"fork":false,"pushed_at":"2023-11-17T10:15:32.000Z","size":20456,"stargazers_count":529,"open_issues_count":5,"forks_count":81,"subscribers_count":12,"default_branch":"master","last_synced_at":"2024-11-02T15:36:06.339Z","etag":null,"topics":["icp","lidar","loop","odometry","place","pointcloud","recognition","robot","scan","slam"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gisbi-kim.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-10-06T13:21:30.000Z","updated_at":"2024-10-31T05:48:29.000Z","dependencies_parsed_at":"2024-01-06T00:04:39.382Z","dependency_job_id":null,"html_url":"https://github.com/gisbi-kim/PyICP-SLAM","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gisbi-kim%2FPyICP-SLAM","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gisbi-kim%2FPyICP-SLAM/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gisbi-kim%2FPyICP-SLAM/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gisbi-kim%2FPyICP-SLAM/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gisbi-kim","download_url":"https://codeload.github.com/gisbi-kim/PyICP-SLAM/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246655221,"owners_count":20812601,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["icp","lidar","loop","odometry","place","pointcloud","recognition","robot","scan","slam"],"created_at":"2024-08-01T07:00:22.816Z","updated_at":"2025-04-01T14:32:50.667Z","avatar_url":"https://github.com/gisbi-kim.png","language":"Python","funding_links":[],"categories":["4. LIDAR based SLAM","Python","Recommended github repository"],"sub_categories":["4.2 Others","Lidar SLAM"],"readme":"# PyICP SLAM\nFull-python LiDAR SLAM.\n- If you find a C++ version of this repo, go to [SC-LeGO-LOAM](https://github.com/irapkaist/SC-LeGO-LOAM) or [SC-A-LOAM](https://github.com/gisbi-kim/SC-A-LOAM).\n\n### Purpose\n- Full-python LiDAR SLAM\n    - Easy to exchange or connect with any Python-based components (e.g., DL front-ends such as [Deep Odometry](https://www.youtube.com/watch?v=Y2s08dv-Mq0))\n        - Here, ICP, which is a very basic option for LiDAR, and [Scan Context (IROS 18)](https://github.com/irapkaist/scancontext) are used for odometry and loop detection, respectively.\n- Hands-on LiDAR SLAM\n    - Easy to understand (could be used for educational purpose)\n- The practical use case of [miniSAM](https://github.com/dongjing3309/minisam)\n    - The miniSAM is easy to use at Python\n\n### What is SLAM?\n- In this repository, SLAM (Simultaneous localization and mapping) is considered as\n    - SLAM = Odometry + Loop closure\n- In this repository, the state to be optimized only has robot poses; that is _pose-graph SLAM_.\n\n### Overview of the PyICP SLAM\n- The pipeline of the PyICP SLAM is composed of three parts\n    1. Odometry: [ICP (iterative closest point)](https://github.com/ClayFlannigan/icp/blob/master/icp.py)\n        - In here, Point-to-point and frame-to-frame (i.e., no local mapping)\n    2. Loop detection: [Scan Context (IROS 18)](https://github.com/irapkaist/scancontext)\n       -  Reverse loop detection is supported.\n    3. Back-end (graph optimizer): [miniSAM](https://github.com/dongjing3309/minisam)\n       - Python API\n\n\n### Features\n- Thanks to the Scan Context, reverse loops can be successfully closed.\n    - E.g., see _KITTI 14_ at Results section below.\n\n- Time costs\n    - (Here, no accelerated and naive) ICP gets 7-10 Hz for randomly downsampled points (7000 points)\n    - (Here, no accelerated and naive) Scan Context gets 1-2 Hz (when 10 ringkey candidates).\n        - if you need the more faster one, consider the C++ version of Scan Context (e.g., https://github.com/irapkaist/SC-LeGO-LOAM)\n    - miniSAM is enough fast.\n\n\n### How to use\nJust run\n\n```sh\n$ python3 main_icp_slam.py\n```\n\nThe details of parameters are eaily found in the argparser in that .py file.\n\n\n### Results (KITTI dataset)\nThose results are produced under the same parameter conditions:\n- ICP used random downsampling, 7000 points.\n- Scan Context's parameters:\n    - Ring: 20, Sector: 60\n    - The number of ringkey candidates: 30\n    - Correct Loop threshold: 0.17 for 09, 0.15 for 14, and 0.11 for all others\n\nResults (left to right):\n\n- 00 (loop), 01, 02 (loop), 03\n\n\u003cimg src=\"docs/fig/00_7000_011.gif\" width=\"200\"\u003e \u003cimg src=\"docs/fig/01_7000_011.gif\" width=\"200\"\u003e \u003cimg src=\"docs/fig/02_7000_011.gif\" width=\"200\"\u003e \u003cimg src=\"docs/fig/03_7000_011.gif\" width=\"200\"\u003e\n\n- 04, 05 (loop), 06 (loop), 09 (loop)\n\n\u003cimg src=\"docs/fig/04_7000_011.gif\" width=\"200\"\u003e \u003cimg src=\"docs/fig/05_7000_011.gif\" width=\"200\"\u003e \u003cimg src=\"docs/fig/06_7000_011.gif\" width=\"200\"\u003e \u003cimg src=\"docs/fig/09_7000_017.gif\" width=\"200\"\u003e\n\n- 10, 11, 12, 13 (loop)\n\n\u003cimg src=\"docs/fig/10_7000_011.gif\" width=\"200\"\u003e \u003cimg src=\"docs/fig/11_7000_011.gif\" width=\"200\"\u003e \u003cimg src=\"docs/fig/12_7000_011.gif\" width=\"200\"\u003e \u003cimg src=\"docs/fig/13_7000_011.gif\" width=\"200\"\u003e\n\n- 14 (loop), 15 (loop), 16 (loop), 17\n\n\u003cimg src=\"docs/fig/14_7000_015.gif\" width=\"200\"\u003e \u003cimg src=\"docs/fig/15_7000_011.gif\" width=\"200\"\u003e \u003cimg src=\"docs/fig/16_7000_015.gif\" width=\"200\"\u003e \u003cimg src=\"docs/fig/17_7000_011.gif\" width=\"200\"\u003e\n\n- 18 (loop), 20\n\n\u003cimg src=\"docs/fig/18_7000_011.gif\" width=\"200\"\u003e \u003cimg src=\"docs/fig/20_7000_011.gif\" width=\"200\"\u003e\n\nSome of the results are good, and some of them are not enough.\nThose results are for the study to understand when is the algorithm works or not.\n\n\n\n### Findings\n- The Scan Context does not find loops well when there is a lane level change (i.e., KITTI 08, as below figures).\n- If the loop threshold is too low (0.07 in the below figure), no loops are detected and thus the odometry errors cannot be reduced.\n\n  - \u003cimg src=\"docs/fig/08_7000_011_notclosed.gif\" width=\"300\"\u003e\n\n- If the loop threshold is high (0.20 in the below figure), false loops are detected and thus the graph optimization failed.\n    - \u003cimg src=\"docs/fig/08_7000_020_fail.gif\" width=\"300\"\u003e\n    - but using this non-conservative threshold with a robust kernel would be a solution.\n        - see https://github.com/irapkaist/SC-LeGO-LOAM/blob/3170ba1de7bb0d3f8de5192742e0bbe267415ab4/SC-LeGO-LOAM/LeGO-LOAM/src/mapOptmization.cpp#L994\n\n\n\n### Author\n```sh\n  Giseop Kim (paulgkim@kaist.ac.kr)\n```\n\n### Contirbutors\n```sh\n  @JustWon\n    - Supports Pangolin-based point cloud visualization along the SLAM poses.\n    - Go to https://github.com/JustWon/PyICP-SLAM\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgisbi-kim%2FPyICP-SLAM","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgisbi-kim%2FPyICP-SLAM","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgisbi-kim%2FPyICP-SLAM/lists"}