The objective of the control module is to generate control commands to the vehicle based on planning trajectory and the current car status.
- Planning trajectory
- Current car status
- HMI driving mode change request
- Monitor System
The output control command governs functions such as steering, throttle, and brake in the canbus.
The controllers include a lateral controller that manages the steering commands and a longitudinal controller that manages the throttle and brakes commands .
The lateral controller is an LQR-Based Optimal Controller. The dynamic model of this controller is a simple bicycle model with side slip. It is divided into two categories, including a closed loop and an open loop.
- The closed loop provides discrete feedback LQR controller with 4 states:
- Lateral Error
- Lateral Error Rate
- Heading Error
- Heading Error Rate
- The open loop utilizes the path curvature information to cancel the constant steady state heading error.
The longitudinal controller is configured as a cascaded PID + Calibration table. It is divided into two categories, including a closed loop and an open loop.
- The closed loop is a cascaded PID (station PID + Speed PID), which takes the following data as controller input:
- Station Error
- Speed Error
- The open loop provides a calibration table which maps acceleration onto throttle/brake percentages.
Tool like diagnostics and realtime_plot are useful for controller tuning and can be found under apollo/modules/tools/.
The lateral controller is designed for minimal tuning effort. The basic lateral controller tuning steps for all vehicles are:
-
Set all elements in
matrix_qto zero. -
Increase the third element of
matrix_q, which defines the heading error weighting, to minimize the heading error. -
Increase the first element of
matrix_q, which defines the lateral error weighting to minimize the lateral error.
For a Lincoln MKZ, there are four elements that refer to the diagonal elements of the state weighting matrix Q:
- Lateral error weighting
- Lateral error rate weighting
- Heading error weighting
- Heading error rate weighting
Tune the weighting parameters by following the basic lateral controller tuning steps listed above in Lateral Controller Tuning. An example is shown below.
lat_controller_conf {
matrix_q: 0.05
matrix_q: 0.0
matrix_q: 1.0
matrix_q: 0.0
}
When tuning a vehicle type that is other than a Lincoln MKZ, first update the vehicle-related physical parameters as shown in the example below. Then, follow the basic lateral controller tuning steps listed above in Lateral Controller Tuning and define the matrix Q parameters.
An example is shown below.
lat_controller_conf {
cf: 155494.663
cr: 155494.663
wheelbase: 2.85
mass_fl: 520
mass_fr: 520
mass_rl: 520
mass_rr: 520
eps: 0.01
steer_transmission_ratio: 16
steer_single_direction_max_degree: 470
}
The longitudinal controller is composed of Cascaded PID controllers that include one station controller and a high/low speed controller with different gains for different speeds. Apollo manages tuning in open loop and closed loop by:
- OpenLoop: Calibration table generation. Please refer to how_to_update_vehicle_calibration.md for detailed steps.
- Closeloop: Based on the order of High Speed Controller -> Low Speed Controller -> Station Controller.
The high speed controller code is used mainly to track the desired speed above a certain speed value. For example:
high_speed_pid_conf {
integrator_enable: true
integrator_saturation_level: 0.3
kp: 1.0
ki: 0.3
kd: 0.0
}
- First set the values for
kp,ki, andkdto zero. - Then start to increase
kpto reduce the rising time of step response to velocity changes. - Finally, increase
kito reduce velocity controller steady state error.
Once you obtain relatively accurate speed tracking performance for the higher speed, you can start tuning the low speed PID controller for a comfortable acceleration rate from the start point.
low_speed_pid_conf {
integrator_enable: true
integrator_saturation_level: 0.3
kp: 0.5
ki: 0.3
kd: 0.0
}
Note: Apollo usually sets the switch speed to be a coasting speed when the gear switches to Drive.
Apollo uses the station controller for the vehicle to track the station error between the vehicle trajectory reference and the vehicle position. A station controller tuning example is shown below.
station_pid_conf {
integrator_enable: true
integrator_saturation_level: 0.3
kp: 0.3
ki: 0.0
kd: 0.0
}
-
"Vehicle dynamics and control." Rajamani, Rajesh. Springer Science & Business Media, 2011.
-
"Optimal Trajectory generation for dynamic street scenarios in a Frenet Frame", M. Werling et., ICRA2010