{"id":19783506,"url":"https://github.com/krypten/flyingcar-motionplanning","last_synced_at":"2026-05-01T22:35:53.165Z","repository":{"id":80314343,"uuid":"143859107","full_name":"krypten/FlyingCar-MotionPlanning","owner":"krypten","description":"This project is a continuation of the Backyard Flyer project where you executed a simple square shaped flight path. In this project you will integrate the techniques that you have learned throughout the last several lessons to plan a path through an urban environment.","archived":false,"fork":false,"pushed_at":"2018-08-16T16:57:39.000Z","size":30824,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-28T13:12:05.542Z","etag":null,"topics":["flying-car","planning","planning-algorithms","python"],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","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/krypten.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":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-08-07T10:41:56.000Z","updated_at":"2018-10-11T17:16:34.000Z","dependencies_parsed_at":null,"dependency_job_id":"93cab96c-37bf-41a0-8df8-53ce3993a356","html_url":"https://github.com/krypten/FlyingCar-MotionPlanning","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/krypten/FlyingCar-MotionPlanning","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krypten%2FFlyingCar-MotionPlanning","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krypten%2FFlyingCar-MotionPlanning/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krypten%2FFlyingCar-MotionPlanning/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krypten%2FFlyingCar-MotionPlanning/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/krypten","download_url":"https://codeload.github.com/krypten/FlyingCar-MotionPlanning/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krypten%2FFlyingCar-MotionPlanning/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32515838,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-30T13:12:12.517Z","status":"online","status_checked_at":"2026-05-01T02:00:05.856Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["flying-car","planning","planning-algorithms","python"],"created_at":"2024-11-12T06:08:32.097Z","updated_at":"2026-05-01T22:35:53.154Z","avatar_url":"https://github.com/krypten.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FCND - 3D Motion Planning\n![Quad Image](./misc/enroute.png)\n\n\n\nThis project is a continuation of the Backyard Flyer project where you executed a simple square shaped flight path. In this project you will integrate the techniques that you have learned throughout the last several lessons to plan a path through an urban environment. Check out the [project rubric](https://review.udacity.com/#!/rubrics/1534/view) for more detail on what constitutes a passing submission.\n\n## Option to do this project in a GPU backed virtual machine in the Udacity classroom!\nRather than downloading the simulator and starter files you can simply complete this project in a virual workspace in the Udacity classroom! Follow [these instructions](https://classroom.udacity.com/nanodegrees/nd787/parts/5aa0a956-4418-4a41-846f-cb7ea63349b3/modules/0c12632a-b59a-41c1-9694-2b3508f47ce7/lessons/5f628104-5857-4a3f-93f0-d8a53fe6a8fd/concepts/ab09b378-f85f-49f4-8845-d59025dd8a8e?contentVersion=1.0.0\u0026contentLocale=en-us) to proceed with the VM. \n\n## To complete this project on your local machine, follow these instructions:\n### Step 1: Download the Simulator\nThis is a new simulator environment!  \n\nDownload the Motion-Planning simulator for this project that's appropriate for your operating system from the [simulator releases respository](https://github.com/udacity/FCND-Simulator-Releases/releases).\n\n### Step 2: Set up your Python Environment\nIf you haven't already, set up your Python environment and get all the relevant packages installed using Anaconda following instructions in [this repository](https://github.com/udacity/FCND-Term1-Starter-Kit)\n\n### Step 3: Clone this Repository\n```sh\ngit clone https://github.com/udacity/FCND-Motion-Planning\n```\n### Step 4: Test setup\nThe first task in this project is to test the [solution code](https://github.com/udacity/FCND-Motion-Planning/blob/master/backyard_flyer_solution.py) for the Backyard Flyer project in this new simulator. Verify that your Backyard Flyer solution code works as expected and your drone can perform the square flight path in the new simulator. To do this, start the simulator and run the [`backyard_flyer_solution.py`](https://github.com/udacity/FCND-Motion-Planning/blob/master/backyard_flyer_solution.py) script.\n\n```sh\nsource activate fcnd # if you haven't already sourced your Python environment, do so now.\npython backyard_flyer_solution.py\n```\nThe quad should take off, fly a square pattern and land, just as in the previous project. If everything functions as expected then you are ready to start work on this project. \n\n### Step 5: Inspect the relevant files\nFor this project, you are provided with two scripts, `motion_planning.py` and `planning_utils.py`. Here you'll also find a file called `colliders.csv`, which contains the 2.5D map of the simulator environment. \n\n### Step 6: Explain what's going on in  `motion_planning.py` and `planning_utils.py`\n\n`motion_planning.py` is basically a modified version of `backyard_flyer.py` that leverages some extra functions in `planning_utils.py`. It should work right out of the box.  Try running `motion_planning.py` to see what it does. To do this, first start up the simulator, then at the command line:\n \n```sh\nsource activate fcnd # if you haven't already sourced your Python environment, do so now.\npython motion_planning.py\n```\n\nYou should see the quad fly a jerky path of waypoints to the northeast for about 10 m then land.  What's going on here? Your first task in this project is to explain what's different about `motion_planning.py` from the `backyard_flyer_solution.py` script, and how the functions provided in `planning_utils.py` work. \n\n### Step 7: Write your planner\n\nYour planning algorithm is going to look something like the following:\n\n- Load the 2.5D map in the `colliders.csv` file describing the environment.\n- Discretize the environment into a grid or graph representation.\n- Define the start and goal locations. You can determine your home location from `self._latitude` and `self._longitude`. \n- Perform a search using A* or other search algorithm. \n- Use a collinearity test or ray tracing method (like Bresenham) to remove unnecessary waypoints.\n- Return waypoints in local ECEF coordinates (format for `self.all_waypoints` is [N, E, altitude, heading], where the drone’s start location corresponds to [0, 0, 0, 0]). \n\nSome of these steps are already implemented for you and some you need to modify or implement yourself.  See the [rubric](https://review.udacity.com/#!/rubrics/1534/view) for specifics on what you need to modify or implement.\n\n### Step 8: Write it up!\nWhen you're finished, complete a detailed writeup of your solution and discuss how you addressed each step. You can use the [`writeup_template.md`](./writeup_template.md) provided here or choose a different format, just be sure to describe clearly the steps you took and code you used to address each point in the [rubric](https://review.udacity.com/#!/rubrics/1534/view). And have fun!\n\n## Extra Challenges\nThe submission requirements for this project are laid out in the rubric, but if you feel inspired to take your project above and beyond, or maybe even keep working on it after you submit, then here are some suggestions for interesting things to try.\n\n### Try flying more complex trajectories\nIn this project, things are set up nicely to fly right-angled trajectories, where you ascend to a particular altitude, fly a path at that fixed altitude, then land vertically. However, you have the capability to send 3D waypoints and in principle you could fly any trajectory you like. Rather than simply setting a target altitude, try sending altitude with each waypoint and set your goal location on top of a building!\n\n### Adjust your deadbands\nAdjust the size of the deadbands around your waypoints, and even try making deadbands a function of velocity. To do this, you can simply modify the logic in the `local_position_callback()` function.\n\n### Add heading commands to your waypoints\nThis is a recent update! Make sure you have the [latest version of the simulator](https://github.com/udacity/FCND-Simulator-Releases/releases). In the default setup, you're sending waypoints made up of NED position and heading with heading set to 0 in the default setup. Try passing a unique heading with each waypoint. If, for example, you want to send a heading to point to the next waypoint, it might look like this:\n\n```python\n# Define two waypoints with heading = 0 for both\nwp1 = [n1, e1, a1, 0]\nwp2 = [n2, e2, a2, 0]\n# Set heading of wp2 based on relative position to wp1\nwp2[3] = np.arctan2((wp2[1]-wp1[1]), (wp2[0]-wp1[0]))\n```\n\nThis may not be completely intuitive, but this will yield a yaw angle that is positive counterclockwise about a z-axis (down) axis that points downward.\n\nPut all of these together and make up your own crazy paths to fly! Can you fly a double helix?? \n![Double Helix](./misc/double_helix.gif)\n\nOk flying a double helix might seem like a silly idea, but imagine you are an autonomous first responder vehicle. You need to first fly to a particular building or location, then fly a reconnaissance pattern to survey the scene! Give it a try!","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkrypten%2Fflyingcar-motionplanning","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkrypten%2Fflyingcar-motionplanning","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkrypten%2Fflyingcar-motionplanning/lists"}