Self-Driving Car Engineer Nanodegree Program
This project is to build a MPC controller and make the vehicle drive successfully around the track without going out of the track.
The MPC controller is implemented in ./src/MPC.cpp. It utilizes the IPOPT and CppAD libraries to calculate the optimal trajectory and the corresponding actuation commands i.e. the throttle/brake and steering angle, to minimize the cost function of cross track error, steering angle error and penalization of roughness .
The MPC model uses a kinematic model without taking into account of the complex road and tire interactions. The model equations are below:
The model has 6 state variables:
- x : car's position x
- y : car's position y
- psi : car's heading angle
- v : car's velocity
- cte : cross track error
- epsi : heading angle error
*Note:The variable Lf is the length from front to center of gravity, it is given by Udacity sample code.
The model has two outputs:
- a : acceleration/deceleration value
- delta: steering angle
The objective is to find the best acceleration/deceleration (a) and steering angle (delta) values to minimize the cost function which includes multiple factors:
- cross track error and heading angle error
- penalization of uses of actuations
- penalization of rapid changes
Number of points (N) and time interval (dt) together define the prediction horizon. With too many points, the model will become slower easily. However, too less points will not predict a good curve. This project uses the Udacity suggested values: N = 10; dt = 0.1;
In this project, the provided waypoints are transformed to the vehicle coordinates first, then fitted a 3rd order polynomial.
To take care of the actuator latency, this project calculates and uses the delayed states to feed into the MPC solver, instead of using the initial values.
Here is a video shows the car successfully drove one lap using the implemented MPC controller: ./videos/mpc.mp4
-
cmake >= 3.5
-
All OSes: click here for installation instructions
-
make >= 4.1(mac, linux), 3.81(Windows)
- 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
-
- 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
-
Ipopt and CppAD: Please refer to this document for installation instructions.
-
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
.
- The MPC is recommended to be tested on examples to see if implementation behaves as desired. One possible example is the vehicle offset of a straight line (reference). If the MPC implementation is correct, it tracks the reference line after some timesteps(not too many).
- The
lake_track_waypoints.csv
file has waypoints of the lake track. This could fit polynomials and points and see of how well your model tracks curve. NOTE: This file might be not completely in sync with the simulator so your solution should NOT depend on it. - For visualization this C++ matplotlib wrapper could be helpful.)
- Tips for setting up your environment are available here