/SDCN-T2-P5

Udacity Self-Driving Car Nanodegree - Model Predictive Control Project

Primary LanguageC++

Self-Driving Car Engineer Nanodegree Program

The model

Model Predictive Controller uses a Kinematic model that emulates the vehicle controls dynamics as closely as possible. The state, actuators and update equations are described below:

  • State is given by:
    • { px position, py position, orientation (psi), speed (v), cross track error (cte), orientation error (epsi)}
  • Actuators:
    • { steering angle (delta), acceleration (a)}
  • Prediction equations:
    • x1 = x0 + v0 * cos(psi0) * dt
    • y1 = y0 + v0 * sin(psi0) * dt
    • psi1 = psi0 + v0 / Lf * delta0 * dt
    • v1 = v0 + a0 * dt

Timestep Length and Elapsed Duration (N & dt)

First I started with the values used in the lesson, N = 25, dt = 0.05 but the vehicle was unstable and went off of track at the first turn. Next I changed the reference speed to 50 mph and started to play with different values for N and dt. After a few tries I saw that vehicle is quite stable for values of N which were between 10 - 12 and dt = 0.1 Using a reference speed of 80 mph the model performed with the following values: N = 12, dt = 0.1 and this were the values I choosed to use in the end.

Polynomial Fitting and MPC Preprocessing

Because ptsx and ptsy provieded by the simulator were in map coordinate, in order to use the values in our model I had to tranform the points into vehicle coordinates using the following equations:

  • wptsx[i] = x_trans * cos(-psi) - y_trans * sin(-psi);
  • wptsy[i] = x_trans * sin(-psi) + y_trans * cos(-psi);

Model Predictive Control with Latency

In order to test our model like on a real vehicle, where latency between the actuation command and the physical actuation exists, latency value was set up as 100ms. To handle this our vehicle coordinations, orientation and speed were calculated using the following equations:

  • px += v * cos(psi) * latency;
  • py += v * sin(psi) * latency;
  • psi -= v * delta / Lf * latency;
  • v += a * latency;

Result

The following output was obtained with: N = 12, dt = 0.1, ref_v = 50, latency = 0.1:

image1

Here's a link to my video result (mov).

Dependencies

  • cmake >= 3.5
  • All OSes: click here for installation instructions
  • make >= 4.1
  • gcc/g++ >= 5.4
  • uWebSockets
    • Run either install-mac.sh or install-ubuntu.sh.
    • If you install from source, checkout to commit e94b6e1, i.e.
      git clone https://github.com/uWebSockets/uWebSockets
      cd uWebSockets
      git checkout e94b6e1
      
      Some function signatures have changed in v0.14.x. See this PR for more details.
  • 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.

or

  1. ./run.sh