{"id":21031449,"url":"https://github.com/tkkim-robot/visibility_rrt","last_synced_at":"2026-03-06T12:33:04.370Z","repository":{"id":243207597,"uuid":"745207631","full_name":"tkkim-robot/visibility_rrt","owner":"tkkim-robot","description":"The Visibility-Aware RRT* implementation for safety-critical navigation with perception-limited robots.","archived":false,"fork":false,"pushed_at":"2025-12-19T08:37:54.000Z","size":1333,"stargazers_count":58,"open_issues_count":0,"forks_count":10,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-12-22T02:51:34.217Z","etag":null,"topics":["cbf","navigation","robotics","rrt","rrt-star","safety-critical"],"latest_commit_sha":null,"homepage":"https://www.taekyung.me/visibility-rrt","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/tkkim-robot.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-01-18T21:10:20.000Z","updated_at":"2025-12-19T08:37:59.000Z","dependencies_parsed_at":"2024-11-19T12:38:44.635Z","dependency_job_id":"d6c94ec6-3a55-41ff-97dc-e53820a8bfd5","html_url":"https://github.com/tkkim-robot/visibility_rrt","commit_stats":null,"previous_names":["tkkim-robot/visibility-rrt","tkkim-robot/visibility_rrt"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tkkim-robot/visibility_rrt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tkkim-robot%2Fvisibility_rrt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tkkim-robot%2Fvisibility_rrt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tkkim-robot%2Fvisibility_rrt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tkkim-robot%2Fvisibility_rrt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tkkim-robot","download_url":"https://codeload.github.com/tkkim-robot/visibility_rrt/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tkkim-robot%2Fvisibility_rrt/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30176264,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-06T11:48:51.886Z","status":"ssl_error","status_checked_at":"2026-03-06T11:48:51.460Z","response_time":250,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["cbf","navigation","robotics","rrt","rrt-star","safety-critical"],"created_at":"2024-11-19T12:28:23.525Z","updated_at":"2026-03-06T12:33:03.252Z","avatar_url":"https://github.com/tkkim-robot.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# visibility_rrt\n\nThis repository contains the implementation of the Visibility-Aware RRT* algorithm, a sampling-based path planning method that generates safe and efficient global reference paths for robots with limited sensing capabilities in partially unknown environments. The algorithm incorporates a collision avoidance Control Barrier Function (CBF) and a novel visibility CBF to ensure that the generated paths are not only collision-free but also respect the robot's limited perception capabilities. Please see our paper [\"Visibility-Aware RRT* for Safety-Critical Navigation of Perception-Limited Robots in Unknown Environments\"](https://ieeexplore.ieee.org/document/10930526) for more details.\n\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"https://github.com/user-attachments/assets/7d889ef0-ca4e-4788-9b11-7d37fea916a6\" width=\"700px\"\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[[Homepage]](https://www.taekyung.me/visibility-rrt)\n[[Arxiv]](https://arxiv.org/abs/2406.07728)\n[[Paper]](https://ieeexplore.ieee.org/document/10930526)\n[[Video]](https://youtu.be/l4vlMTf8s74)\n[[Research Group]](https://dasc-lab.github.io/)\n\n\u003c/div\u003e\n\u003c/div\u003e\n\n# Installation\n\nThis repositry only requires common libraries: `numpy`, `matplotlib`, and `scipy`. \n\nFor running CBF-QP, it requires `cvxpy`, `gurobipy`, and `shapely`.\n\n# How to Run Example\n\n## Path Planning\nYou can run our test example by:\n\n```bash\npython visibility_rrtStar.py\n```\n\nAlternatively, you can import `VisibilityRRTStar` from 'visibility_rrtStar.py'.\n\n```python\nfrom visibility_rrtStar import VisibilityRRTStar\nrrt_star = VisibilityRRTStar(x_start=x_start, x_goal=x_goal,\n                              visibility=True,\n                              collision_cbf=True)\n\n# assuming you have set the workspace (environment) in rrt_star.env\nwaypoints, _ , _ = rrt_star.planning()\n```\n\nYou can test the baseline algorithms:\n- [LQR-RRT*](https://ieeexplore.ieee.org/document/6225177):\n    - by setting `visibility=False` and `collision_cbf=False`.\n- [LQR-CBF-RRT*](https://arxiv.org/abs/2304.00790): \n    - by setting `visibility=False` and `collision_cbf=True`.\n\nThe sample results of the generated global paths:\n\n|                                                     Visibility-Aware RRT* (w/ visibility CBF)                                                    |                                                                        LQR-CBF-RRT* (w/o visibility CBF)                |\n| :------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: |\n|  \u003cimg src=\"https://github.com/tkkim-robot/visibility-rrt/assets/40379815/6e6976d1-09b2-4189-b186-e4b59ece3efb\"  height=\"200px\"\u003e | \u003cimg src=\"https://github.com/tkkim-robot/visibility-rrt/assets/40379815/2831ad29-88d9-4b36-a7e3-87566a06bad3\"  height=\"200px\"\u003e |\n\n\n## Path Tracking (CBF-QP)\nThen, you can test a CBF-QP controller to track the resulted path by specifying the saved path:\n\n```bash\npython tracking/cbf_qp_tracking.py\n```\n\nAlternatively, you can import `UnicyclePathFollower` from 'tracking/cbf_qp_tracking.py'.\n\n```python\nfrom tracking.cbf_qp_tracking import UnicyclePathFollower\n\nx_init = waypoints[0]\npath_follower = UnicyclePathFollower('DynamicUnicycle2D', x_init, \n                                         waypoints)\n_ = path_follower.run()\n```\n\nYou can also set hidden obstacles, which were not considered during the path planning phase:\n```python\nunknown_obs = np.array([[x_center, y_center, radius]]) \npath_follower.set_unknown_obs(unknown_obs)\n```\nThe hidden obstacles are depicted in orange circle, and can be detected by the onboard sensor of the robot. The detection points will be depicted in red points.\n\nYou can test with two dynamics model:\n- `'Unicycle2D'`: A standard unicycle model with translational velocity and rotational speed as control input.\n- `'DynamicUnicycle2D'`: It uses translational acceleration as control input and treats translational velocity as a state.\n\nThe sample results of the CBF-QP tracking (FOV: 45°):\n\n|                                                     Tracking a Path of the Visibility-Aware RRT*                                                    |                                                                       Tracking a Path of the LQR-CBF-RRT*                 |\n| :------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: |\n|  \u003cimg src=\"https://github.com/tkkim-robot/visibility-rrt/assets/40379815/6c3fc15f-1796-49b8-8892-79b1aae2598a\"  height=\"200px\"\u003e | \u003cimg src=\"https://github.com/tkkim-robot/visibility-rrt/assets/40379815/0ed47755-5ce4-4233-9a22-b3cba408016e\"  height=\"200px\"\u003e |\n\n\nWhile the CBF-QP tracking a path from the baseline algorithm (which is agnostic to the sensing capability), the robot detects the hidden obstacle too late, leaving no feasible solution for the CBF-QP to avoid the obstacle.\n\n## Path Tracking (GateKeeper)\nYou can also simulate a GateKeeper controller. The red shaded area in front of the robot depicts the minimum breaking distance at the current speed. If this area lies outside of the sensed collision-free space, the next waypoint to follow (the nominal trajectory) is deemed unsafe. \n\n\u003cp align=\"center\"\u003e\n    \u003cimg width=\"300\" alt=\"env2_gatekeeper_baseline\" src=\"https://github.com/tkkim-robot/visibility-rrt/assets/40379815/f98224f7-42b7-4798-8360-4e15bd345454\"\u003e\n\u003c/p\u003e\n\nIn the code, the same `path_follower` instance returns the number of such violations:\n```python\nunexpected_beh = path_follower.run()\n```\nIf the output is larger than 0, it means that the nominal trajectory will be rejected by the GateKeeper algorithm more than one time.\n\nThe sample results of the GateKeeper tracking (FOV: 70°):\n\n|                                                     Tracking a Path of the Visibility-Aware RRT*                                                    |                                                                       Tracking a Path of the LQR-CBF-RRT*                 |\n| :------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: |\n|  \u003cimg src=\"https://github.com/tkkim-robot/visibility-rrt/assets/40379815/57007625-e8f8-4b13-b2c5-2d42a1f59f9e\"  height=\"200px\"\u003e | \u003cimg src=\"https://github.com/tkkim-robot/visibility-rrt/assets/40379815/f98c6be0-1e18-461c-bba4-cb1b1e18b328\"  height=\"200px\"\u003e |\n\n\n## LQR-CBF-Steer\nYou can also visualize how the LQR-CBF-Steer function works in the algorithm. An example of the steering process with the visibility CBF can be visualized by runnning:\n\n```bash\npython LQR_CBF_planning.py\n```\n\n\u003cp align=\"center\"\u003e\n    \u003cimg width=\"350\" alt=\"lqr_cbf_steer\" src=\"https://github.com/tkkim-robot/visibility-rrt/assets/40379815/0fdc0a5b-d465-46ee-90c4-f5b1b6f67175\"\u003e\n\u003c/p\u003e\n\n## Efficiency Comparison\nThe figure illustrates the average number of vertices maintained in the tree at iterations 1000, 2000, and 3000 over 100 runs. The results show that the Visibility-Aware RRT* consistently maintains fewer vertices compared to the two baseline algorithms, demonstrating its efficiency. By maintaining fewer nodes, it can reduce the computational complexity of the `choose_parent` and `rewire` functions. The additional vertices in the compared baselines arise from their lack of consideration for input constraints and visibility constraint, respectively.\n\n\u003cp align=\"center\"\u003e\n    \u003cimg width=\"350\" alt=\"vertices\" src=\"https://github.com/tkkim-robot/visibility-rrt/assets/40379815/38ab90d5-f967-49d7-9d4a-0502895f273a\"\u003e\n\u003c/p\u003e\n\n# Parameters Description\nThese are the important parameters to tune:\n\n### `iter_max`\n\n- The maximum number of iterations allowed for the RRT* algorithm. A higher value allows for more exploration and potentially better paths but increases the runtime.\n- We recommend 1,000 - 3,000, depending on the size of your environment.\n\n### `max_sampled_node_dist`\n- The maximum distance between the sampled node and the nearest node in the tree. This parameter controls the step size of the tree expansion.\n- A smaller value results in a denser tree but may require more iterations to reach the goal.\n\n### `rewiring_radius`\n\n- The radius used to find nearby nodes for rewiring. \n\n### `fov_angle` and `cam_range`\n\n- For planner, they are in 'visibility_cbf.py'.\n- For controller, they are in 'tracking/robot.py'.\n- They encode the sensing capability of the onboard sensor.\n\nSee our paper for further information.\n\n# Citing\n\nIf you find this repository useful, please consider citing our paper:\n\n```\n@article{kim2025visibility-aware, \n    author    = {Kim, Taekyung and Panagou, Dimitra},\n    title     = {{Visibility-Aware RRT* for Safety-Critical Navigation of Perception-Limited Robots in Unknown Environments}},\n    journal = {IEEE Robotics and Automation Letters},\n    shorttitle = {{Visibility}-{RRT}*},\n    year      = {2025},\n    volume = {10},\n    number = {5},\n    pages = {4508--4515},\n    doi = {10.48550/arXiv.2406.07728},\n}\n\n```\n\n# Related Works\n\nThis repository was built based on the [implementation of LQR_CBF_rrtStar](https://github.com/mingyucai/LQR_CBF_rrtStar), that I had contributed before. Thanks for the great work of [gy2256](https://github.com/gy2256) and [mingyucai](https://github.com/mingyucai).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftkkim-robot%2Fvisibility_rrt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftkkim-robot%2Fvisibility_rrt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftkkim-robot%2Fvisibility_rrt/lists"}