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
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.
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);
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;
The following output was obtained with: N = 12, dt = 0.1, ref_v = 50, latency = 0.1
:
Here's a link to my video result (mov).
- 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.
- Clone this repo.
- Make a build directory:
mkdir build && cd build
- Compile:
cmake .. && make
- Run it:
./mpc
.
or
./run.sh