携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天。
#控制模块简介 控制模块的作用是根据规划(planning模块)生成的轨迹,计算出汽车的油门,刹车和方向盘信号,控制汽车按照规定的轨迹行驶。 控制输入: Chassis(车辆状态信息), LocalizationEstimate(位置信息), ADCTrajectory(planning模块规划的轨迹) 控制输出:纵向控制(油门,刹车,档位) 横向控制(方向盘)
控制基于模型,可将车辆分为运动学建模和动力学建模。运动学模型相对简单,将汽车看为刚体,动力学模型相对复杂,基于车体受力状态来推导运动方程。动力学模型也可进一步分解为纵向动力学模型和横向动力学模型。具体可参考下面这个链接:车辆建模
控制算法
PID算法
经典控制算法,一般用于纵向控制。由比例(P),积分(I),微分(D)单元组成。
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是否应该一致?为什么? 答:不应该一致,因为高速情况下车辆的动力学特性会发生改变,相当于被控对象发生了变化,所以也应该调整相应的参数。
预测模块基本概念
定义:接收原始感知/定位/地图信息,对无人车周围的障碍物未来n秒的行为轨迹进行预测,指导无人车下一步的运动轨迹
难点:
- 上游输入的局限性
- 交通参与者的不可预测性
- 具体路线行驶的不可预测性 责任边界: 将常规的交通状况纳入考虑范畴,同时主要预测大动作。
流程概览
step1:预处理(把障碍物信息综合整理为算法能够理解的内容) 将障碍物投影到高敬地图 首先使用分段树粗略找出障碍物附近的车道 ,详见AABOXKDTREE2D()。判断障碍物的坐标是否在粗筛出的车道上,详见SetCurrentLanes()。同时也会找出障碍物附近五米的车道。最后以车道id为索引建立类ObstacleCluster。 忽略一部分不重要的障碍物 需要注意的障碍物有:车道附近(2m)的行人、车辆前方80m内,左右6m范围内的障碍物、交叉路口障碍物。 生成障碍物可能选择的动作 先搜索所在车道可能的车道序列,再搜索附近车道的所有可能序列。 选择要注意的障碍物 等级分为:ignore,normal和caution,详见AssignCautionLevel。
step2:评价器(评估障碍物会执行各种动作的可能性) evaluator用于评估障碍物在动作空间的可能性,大部分都是深度学习模型,有少量的基于规则的模型。
step3:轨迹生成器(类似后处理,将障碍物的动作细化为运动轨迹) 一共有三类predictor:FreeMovePredictor、LanceSequencePredictor和MoveSequencePredictor。 FreeMovePredictor主要预测不在路上所有类型的障碍物以及行人行为,通过运动学进行推断,可信度较低。 LaneSequencePredictor分析在车道线上车辆类型障碍物(normal级别)未来的行为。纵向:固定车速推进;横向:
MoveSequencePredictor分析在车道线上车辆类型障碍物(caution级别)未来的行为。本质是多项式拟合,希望用一个光滑的曲线链接始末点,同时满足一些额外的限制,如加速度等。可以细分为纵向和横向。纵向处理需要满足的约束有初始位置,初始速度,初始加速度,终末位置,终末速度共5个,因此至少需要一个四阶多项式拟合;横向处理需要满足的约束有初始位置,初始速度,终末位置,终末速度。需要一个三阶多项式拟合。
Apollo相关代码
详见APOLLO/modules/Prediction。 PredictionComponent::Proc()调用PredictionEndToEndProc() PredictionEndToEndProc()调用Onperception()