MPC
Model Predictive Controller to keep a car on track
Dependencies
- cmake >= 3.5
- All OSes: click here for installation instructions
- make >= 4.1
- Linux: make is installed by default on most Linux distros
- Mac: install Xcode command line tools to get make
- Windows: Click here for installation instructions
- gcc/g++ >= 5.4
- Linux: gcc / g++ is installed by default on most Linux distros
- Mac: same deal as make - [install Xcode command line tools]((https://developer.apple.com/xcode/features/)
- Windows: recommend using MinGW
- uWebSockets
- Run either
install-mac.sh
orinstall-ubuntu.sh
. - If you install from source, checkout to commit
e94b6e1
, i.e.Some function signatures have changed in v0.14.x. See this PR for more details.git clone https://github.com/uWebSockets/uWebSockets cd uWebSockets git checkout e94b6e1
- Run either
- 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.
- Mac:
- 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 scriptinstall_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
.
- You will need a version of Ipopt 3.12.1 or higher. The version available through
- Windows: TODO. If you can use the Linux subsystem and follow the Linux instructions.
- Mac:
- 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.
- Mac:
- 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
- Clone this repo.
- Make a build directory:
mkdir build && cd build
- Compile:
cmake .. && make
- Run it:
./mpc
.
The Model
The model is basically the same as shown in the project instructions. The state is given by position (x,y), speed (v), orientation (psi) and the errors: cross track error (cte) and orientation error (epsi). The actuators are given by steering angle (delta) and acceleration (a). The update quations for the state are given by
- x(t+dt) = x(t) + v(t) * cos(psi(t)) * dt,
- y(t+dt) = y(t) + v(t) * sin(psi(t)) * dt,
- v(t+dt) = v(t) + a(t) * dt,
- psi(t+dt) = psi(t) + v(t) * delta(t) / Lf * dt,
- cte(t+dt) = cte(t) + v(t) * sin(epsi(t)) * dt,
- epsi(t+dt) = epsi(t) - v(t) * delta(t) / Lf * dt.
Number of Time Steps & Timestep Length
The time step length dt is taken from the project instructions, dt=0.1, while the number of time steps has been set to N = 1.5 / dt = 15, corresponding to 1.5 seconds. 1.5s turned out to be sufficient for stable control (1s was not); reducing dt while keeping N*dt constant led to a huge increase in computation effort.
Latency
The simulation implements a delay of 100ms for the computation of new actuator values in order to simulate the dynamics of the actuators. This can be take into account by extending the model introducing state variables for the actuators. In this solution, I do so using state variables s_delta and s_a for the corresponding actuators delta and a. The update equations for this are implemented as
- s_delta(t+dt) = (1 - filter) * s_delta(t) + filter * delta(t),
- s_a(t+dt) = (1 - filter) * s_a(t) + filter * a(t).
The variable filter is a number between 0 and 1. 0 means, that the state of the actuator does not react on the actuation, while 1 leads to an immediate reaction. In order to reflect the delay in the update equations, one has to replace delta(t) by s_delta(t+dt) and a(t) by s_a(t+dt) in equations 4. and 6, while s_delta(t) and s_a(t) are the state of the actuators from the last time step.