系列文章目录
L1 Apollo平台安装
L2 CyberRT学习
L5 Routing简介
L7 控制模块
L8 预测模块
简介
控制模块的作用是根据规划(planning模块)生成的轨迹,计算出汽车的油门,刹车和方向盘信号,控制汽车按照规定的轨迹行驶。
控制输入: Chassis(车辆状态信息), LocalizationEstimate(位置信息), ADCTrajectory(planning模块规划的轨迹)
控制输出:纵向控制(油门,刹车,档位) 横向控制(方向盘)
控制基于模型,可将车辆分为运动学建模和动力学建模。运动学模型相对简单,将汽车看为刚体,动力学模型相对复杂,基于车体受力状态来推导运动方程。动力学模型也可进一步分解为纵向动力学模型和横向动力学模型。具体可参考下面这个链接:车辆建模
控制算法
PID算法
经典控制算法,一般用于纵向控制。由比例§,积分(I),微分(D)单元组成。
u
(
t
)
=
K
p
e
(
t
)
+
K
i
∫
0
t
e
(
τ
)
d
τ
+
K
d
d
e
(
t
)
d
t
u(t)=K_{p} e(t)+K_{i} \int_{0}^{t} e(\tau) d \tau+K_{d} \frac{d e(t)}{d t}
u(t)=Kpe(t)+Ki∫0te(τ)dτ+Kddtde(t)
LQR(MPC)
最优控制经典算法,基于车辆横向动力学算法,用于横向控制。
Apollo控制模块
Apollo纵向控制
坡度补偿:在有坡度时对刹车和油门进行补充。
标定工具:modules/tools/vehicles_calibration
Control模块的目录结构如下:
├── BUILD // bazel编译文件
├── common // PID和控制器的具体实现 — 算法具体实现
├── conf // 配置文件 — 配置文件
├── control_component.cc // 模块入口
├── control_component.h
├── control_component_test.cc
├── controller // 控制器 — 具体的控制器实现
├── dag // dag依赖
├── integration_tests // 测试
├── launch // launch加载
├── proto // protobuf文件,主要是各个控制器的配置数据结构
├── testdata // 测试数据
└── tools // 工具类
作业
1 遇到长下坡,PID调节是否会和人一样“不能长时间踩踏板”?
答:会,因为PID时基于误差进行调节,若想解决该问题,可以把误差阈值调高,同时取消PID的积分环节,这样就可以防止PID一直给出刹车指令。
2 高速和低速的PID是否应该一致?为什么?
答:不应该一致,因为高速情况下车辆的动力学特性会发生改变,相当于被控对象发生了变化,所以也应该调整相应的参数。