CarND-Controls-PID

Self-Driving Car Engineer Nanodegree Program

Introduction

The purpose of this project was to build a PID controller and tune the controller to drive a car on a simulator given the cross track error (CTE) and speed of the vehicle via uws socket. Two separate controllers were used
to provide the throttle and steer value for longitudinal and lateral control.

Rubric

Describe the effect each of the P, I, D components had in your implementation.

Only With Kp: Proportional control (Kp) makes the car steer to the right if the car is on the left. It steers to the left if the car is on the right. As long as the CTE is non-zero, steering value is non-zero. Since the car approaches the trajectory at a large heading angle. The car keeps oscillating about the trajectory with only Kp control as show in the video below.

Only With Kp

With Kp and Kd: Kd damps the controls. As the cte starts reducing, this compensates the steering angle so that the car can approach the trajectory smoothly with a small heading angle to the trajectory. This almost makes the control perfect enough.

With Kp and Kd

With twiddle tuned PID:

Since Kp and Kd does not make the car stay on the trajectory over a long time. A small amount of Ki is added to bring the back to the center. The car stays at the center as shown in the video below:

With twiddle tuned PID

Describe how the final hyperparameters were chosen.

A proportional controller was used for longitudinal control to slow down the at sharp turns where CTE was high. A maximum throttle of 0.4 seemed optimal for this case.

Twiddle method was used for tuning the PID algorithm. The logs are shown in tuningLog file. Initially the car was tuned manually to keep the car in the trajectory manually. Later Twiddle tuning was done to check the sensitivity and cost for each change. If the change is more optimal then the change is incorporated into the system for the next iteration. For each iteration the car went through the entire loop. twiddle tuning

Sample log is shown below for illustration:

new parameters
P: 0.088, I: 0.0005, D: 0.055
step: 4800
total error: 1470.24
best error: 1093.24
new parameters
P: 0.088, I: 0.0005, D: 0.045
step: 6400
total error: 920.065
best error: 1093.24
improvement!
new parameters
P: 0.088, I: 0.00055, D: 0.045

Original Question ReadMe

Dependencies

Fellow students have put together a guide to Windows set-up for the project here if the environment you have set up for the Sensor Fusion projects does not work for this project. There's also an experimental patch for windows in this PR.

Basic Build Instructions

  1. Clone this repo.
  2. Make a build directory: mkdir build && cd build
  3. Compile: cmake .. && make
  4. Run it: ./pid.

Tips for setting up your environment can be found here

Editor Settings

We've purposefully kept editor configuration files out of this repo in order to keep it as simple and environment agnostic as possible. However, we recommend using the following settings:

  • indent using spaces
  • set tab width to 2 spaces (keeps the matrices in source code aligned)

Code Style

Please (do your best to) stick to Google's C++ style guide.

Project Instructions and Rubric

Note: regardless of the changes you make, your project must be buildable using cmake and make!

More information is only accessible by people who are already enrolled in Term 2 of CarND. If you are enrolled, see the project page for instructions and the project rubric.

Hints!

  • You don't have to follow this directory structure, but if you do, your work will span all of the .cpp files here. Keep an eye out for TODOs.

Call for IDE Profiles Pull Requests

Help your fellow students!

We decided to create Makefiles with cmake to keep this project as platform agnostic as possible. Similarly, we omitted IDE profiles in order to we ensure that students don't feel pressured to use one IDE or another.

However! I'd love to help people get up and running with their IDEs of choice. If you've created a profile for an IDE that you think other students would appreciate, we'd love to have you add the requisite profile files and instructions to ide_profiles/. For example if you wanted to add a VS Code profile, you'd add:

  • /ide_profiles/vscode/.vscode
  • /ide_profiles/vscode/README.md

The README should explain what the profile does, how to take advantage of it, and how to install it.

Frankly, I've never been involved in a project with multiple IDE profiles before. I believe the best way to handle this would be to keep them out of the repo root to avoid clutter. My expectation is that most profiles will include instructions to copy files to a new location to get picked up by the IDE, but that's just a guess.

One last note here: regardless of the IDE used, every submitted project must still be compilable with cmake and make./

How to write a README

A well written README file can enhance your project and portfolio. Develop your abilities to create professional README files by completing this free course.