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);
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.
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.
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.
- 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.shorinstall-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-getis 3.11.x. If you can get that version to work great but if not there's a scriptinstall_ipopt.shthat will install Ipopt. You just need to download the source from the Ipopt releases page or the Github releases page. - Then call
install_ipopt.shwith 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
- Mac:
- CppAD
- Mac:
brew install cppad - Linux
sudo apt-get install cppador equivalent.
- 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.