Skip to content

IvanLim/mpc-controller

Repository files navigation

MPC Controller Project


Observations

Model

The state model consists of the following components:

  • x: x position
  • y: y position
  • psi: heading
  • v: velocity
  • cte: cross track error
  • epsi: heading error

It also has the following actuators:

  • delta: steering angle
  • a: acceleration

Each step uses the following update equations: (Lf is the distance from the front of the car to its center of gravity)

  • x: x1 - (x0 + v0 * cos(psi0) * dt)
  • y: y1 - (y0 + v0 * sin(psi0) * dt)
  • psi: psi1 - (psi0 - v0 * delta0 / Lf * dt)
  • v: v1 - (v0 + a0 * dt)
  • cte: cte1 - ((evaluated_polynomial_with_coefficients_at_x0 - y0) + (v0 * sin(epsi0) * dt))
  • epsi: epsi1 - ((psi0 - psides0) - v0 * delta0 / Lf * dt);

Choice of N and dt

The values N = 10 and dt = 0.1 were used as a starting point (from the MPC project Q&A video). When N was increased to 20, the car turned erratically. Similarly, when dt was set to 0.2, or 0.05, the car could not follow the waypoints well. As there were issues caused by latency, I ended up settling for a dynamic dt and ref_v value that adjusted according to the observed latency.

Dealing with latency

The first time this project was submitted, the car drove smoothly around the track on my machine, but crashed on the reviewer's machine. To workaround the problems caused by unpredictable latency, the following changes were made:

  • dt is now calculated based on time elapsed since the last MPC.solve() call.
  • ref_v (reference velocity) is now adjusted depending on how good/bad the latency is.
  • If the latency is too bad (> 400ms), a safety mechanism kicks in and will not allow the car to continue driving.

Prepocessing

The list of waypoints ptsx and ptsy were transformed so that they centered around 0. The same thing for the vehicle heading. This was done to reduce the number of transforms needed later on.

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.
  • CppAD
    • Mac: brew install cppad
    • Linux sudo apt-get install cppad or equivalent.
  • 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.

About

MPC Controller project. Part of the Udacity Self Driving Car Engineer Nanodegree program. Implement Model Predictive Control in C++ to control a vehicle and make sure it can drive around the simulator track properly.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors