Apollo control
控制模块简介
输入车自身的信息,位置信息和路径信息。输出油门、刹车、方向盘、档位信息给汽车底盘。
需要对汽车进行建模:
-
动力学模型
经典力学的角度进行建模
- 运动学模型
把汽车当作刚体,根据汽车的运动规律对汽车进行建模
动力学主要考虑受力,运动学主要考虑运动轨迹。
PID+LQR(MPC)
PID 做纵向控制,LQR主要是横向控制(方向盘的控制)。MPC两种都可以做。
汽车负载变化,相同的PID参数是不太可靠的。
PID三个参数调节:
LQR控制方法:
Q是时间的权重,R是代价的权重。 Q,R 参数矩阵调节计算COST。
指定Q,R之后,是的代价函数最小。最优控制理论的东西。
Apollo控制模块
纵向控制----->刹车油门,主要是级联PID。第一个是位置,第二个是速度,坡度补偿。最后通过校正表。校正表的作用就是:你现在知道你的速度,知道你的加速度,但是你不知道踩大的油门。这个校正表就是在你知道这些信息的时候,查询这个表你要多大的油门。
得到这个值之后,你再去进行反馈,达到这个值。
系统响应比较慢,条件P,过充比较大,调节D这个值。
坡度补偿:
坡度值根据汽车的俯仰角得到。但是会有噪声,因此加上了数字滤波。
代码环节
Control模块是一个定时模块,也就是会定时触发。
class ControlComponent final: public apollo::cyber::TimerComponents{}
Control模块会调用配置文件 control_conf.pb.txt。值得注意的是:告诉的PID参数和低速的PID参数是不一样。
还有倒车的PID参数。也就是不同场景下,PID参数可能会不一样。
lon_controller.cc
//纵向
Status LonController::ComputeControlCommand(
//获取定位信息,汽车信息,轨迹信息
localization_ = localization;
chassis_ = chassis;
trajectory_message_ = planning_published_trajectory;
//计算位置的error
double station_error_limit = lon_controller_conf.station_error_limit();
//...
//...
station_pid_controller_.SetPID() //位置PID调节
//...
//...
//计算速度error
double speed_offset = station_pid_controller_.Control(station_error_limited, ts);
//...
//...
//坡度补偿,从汽车Pitch获取 GRA_ACC重力加速度
double slope_offset_compensation = digital_filter_pitch_angle_.Filter(
GRA_ACC * std::sin(injector_->vehicle_state()->pitch());
//坡上提车或者near-stop的时候
acceleration_cmd =
(chassis->gear_location() == canbus::Chassis::GEAR_REVERSE)
? std::max(
acceleration_cmd,
-lon_controller_conf.standstill_acceleration()
)
)
坡上停车加速度不为0,不然会溜车。
汽车标定:
油门刹车和加速度的关系。
标定工具
tools\vehicle_calibration\
生成的表:
calibration_table.pb.txt
作业
- 遇到长下坡,PID调节是否会和人一样"不能长时间踩脚踏板"?
- 高速和低速的PID参数是否会一致?为什么?
Q&A
Q1: Apollo标定论文,讲解了原理和方法。
Q2: PID响应时间?响应时间看行业标准,算法。没有严格标准。
Q3: Apollo为什么没有用MPC? Apollo使用PID和LQR足够。
Q4: PID和LQR对车辆模型敏感,不太适合动态,但对于Apollo够用。
Q5: 坑坑洼洼会导致系统震荡,有反馈进行一定的调节。
Q&A
Q1: Apollo标定论文,讲解了原理和方法。
Q2: PID响应时间?响应时间看行业标准,算法。没有严格标准。
Q3: Apollo为什么没有用MPC? Apollo使用PID和LQR足够。
Q4: PID和LQR对车辆模型敏感,不太适合动态,但对于Apollo够用。
Q5: 坑坑洼洼会导致系统震荡,有反馈进行一定的调节。