Self-Driving Car Engineer Nanodegree Program
- 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 == 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.
- 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
.
This project uses the kinematic vehicule model which can be derived as follows:
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:
the difference between the center of the road and the current car's position.
the difference between the current car's orientation and the desired orientation.
So finally we can include these error into the the car's state as follow:
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.
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.
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.
You can watch my results here: https://youtu.be/IhJoblYIQXU