CarND-Controls-MPC

Self-Driving Car Engineer Nanodegree Program


Dependencies

  • cmake >= 3.5
  • All OSes: click here for installation instructions
  • make >= 4.1
  • gcc/g++ >= 5.4
  • uWebSockets == 0.14, but the master branch will probably work just fine
    • Follow the instructions in the uWebSockets README to get setup for your platform. You can download the zip of the appropriate version from the releases page. Here's a link to the v0.14 zip.
    • If you have MacOS and have Homebrew installed you can just run the ./install-mac.sh script to install this.
  • Fortran Compiler
    • Mac: brew install gcc (might not be required)
    • Linux: sudo apt-get install gfortran. Additionall you have also have to install gcc and g++, sudo apt-get install gcc g++. Look in this Dockerfile for more info.
  • Ipopt
    • Mac: brew install ipopt
    • Linux
      • You will need a version of Ipopt 3.12.1 or higher. The version available through apt-get is 3.11.x. If you can get that version to work great but if not there's a script install_ipopt.sh that will install Ipopt. You just need to download the source from the Ipopt releases page or the Github releases page.
      • Then call install_ipopt.sh with the source directory as the first argument, ex: bash install_ipopt.sh Ipopt-3.12.1.
    • Windows: TODO. If you can use the Linux subsystem and follow the Linux instructions.
  • CppAD
    • Mac: brew install cppad
    • Linux sudo apt-get install cppad or equivalent.
    • Windows: TODO. If you can use the Linux subsystem and follow the Linux instructions.
  • Eigen. This is already part of the repo so you shouldn't have to worry about it.
  • Simulator. You can download these from the releases tab.
  • Not a dependency but read the DATA.md for a description of the data sent back from the simulator.

Basic Build Instructions

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

Implementation MPC

The Model

This project uses the kinematic vehicule model which can be derived as follows:

alt text

Where the actuators delta express the steering angle and a acceleration (negative for braking and positive to throttle).

The controller will activate the actuators so that car follows the reference trajectory, in order to do that first we have to take into account the error between the current position and the desired position. We consider two errors:

Cross track error (CTE)

the difference between the center of the road and the current car's position.

alt text

Orientation Error

the difference between the current car's orientation and the desired orientation.

alt text

So finally we can include these error into the the car's state as follow:

alt text

Timestep Length and Elapsed Duration (N & dt)

The enviroment around the car is likely to change within seconds, predict more than that probably will fail to correspond with the actual enviroment. For that reason I chose Timestep Length (T) equal to 1s which was N = 10 and dt= 0.1. This means that the model will perform 10 prediction and actuations evey 100ms.This values were found in a trial and error method.

Polynomial Fitting and MPC Preprocessing

In order to use the MPC with the data from the simulator, I had to transform the given waypoint to the car's perspective using the equations here then fitted a 3d order polynomial and finally I calculated the CTE and orientation error. Since the calculations are being performed in the car's space, the car's position at each timestep is 0,0.

Model Predictive Control with Latency

In this project the latency is 100ms, this means that there is a delay between the time the command to activate the actuator is sent and the time the actuator is actually executed. For this reason I chose the prediction horizont (T) to be 100ms. Aditionally I calculated the state of car 100ms in the future, before predicting the next state.

Result

You can watch my results here: https://youtu.be/IhJoblYIQXU