Apollo星火计划学习笔记|L3 控制模块&|预测模块

499 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天。

#控制模块简介 控制模块的作用是根据规划(planning模块)生成的轨迹,计算出汽车的油门,刹车和方向盘信号,控制汽车按照规定的轨迹行驶。 控制输入: Chassis(车辆状态信息), LocalizationEstimate(位置信息), ADCTrajectory(planning模块规划的轨迹) 控制输出:纵向控制(油门,刹车,档位) 横向控制(方向盘)

控制基于模型,可将车辆分为运动学建模和动力学建模。运动学模型相对简单,将汽车看为刚体,动力学模型相对复杂,基于车体受力状态来推导运动方程。动力学模型也可进一步分解为纵向动力学模型和横向动力学模型。具体可参考下面这个链接:车辆建模

控制算法

PID算法

经典控制算法,一般用于纵向控制。由比例(P),积分(I),微分(D)单元组成。

在这里插入图片描述u(t)=Kpe(t)+Ki0te(τ)dτ+Kdde(t)dtu(t)=K_{p} e(t)+K_{i} \int_{0}^{t} e(\tau) d \tau+K_{d} \frac{d e(t)}{d 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是否应该一致?为什么? 答:不应该一致,因为高速情况下车辆的动力学特性会发生改变,相当于被控对象发生了变化,所以也应该调整相应的参数。

预测模块基本概念

定义:接收原始感知/定位/地图信息,对无人车周围的障碍物未来n秒的行为轨迹进行预测,指导无人车下一步的运动轨迹 在这里插入图片描述难点:

  • 上游输入的局限性
  • 交通参与者的不可预测性
  • 具体路线行驶的不可预测性 责任边界: 将常规的交通状况纳入考虑范畴,同时主要预测大动作。

流程概览

step1:预处理(把障碍物信息综合整理为算法能够理解的内容) 将障碍物投影到高敬地图 首先使用分段树粗略找出障碍物附近的车道 ,详见AABOXKDTREE2D()。判断障碍物的坐标是否在粗筛出的车道上,详见SetCurrentLanes()。同时也会找出障碍物附近五米的车道。最后以车道id为索引建立类ObstacleCluster。 忽略一部分不重要的障碍物 需要注意的障碍物有:车道附近(2m)的行人、车辆前方80m内,左右6m范围内的障碍物、交叉路口障碍物。 生成障碍物可能选择的动作 先搜索所在车道可能的车道序列,再搜索附近车道的所有可能序列。 选择要注意的障碍物 等级分为:ignore,normal和caution,详见AssignCautionLevel。

step2:评价器(评估障碍物会执行各种动作的可能性) evaluator用于评估障碍物在动作空间的可能性,大部分都是深度学习模型,有少量的基于规则的模型。

step3:轨迹生成器(类似后处理,将障碍物的动作细化为运动轨迹) 一共有三类predictor:FreeMovePredictor、LanceSequencePredictor和MoveSequencePredictor。 FreeMovePredictor主要预测不在路上所有类型的障碍物以及行人行为,通过运动学进行推断,可信度较低。 LaneSequencePredictor分析在车道线上车辆类型障碍物(normal级别)未来的行为。纵向:固定车速推进;横向:lt=rattres.l0一般设置ra=0.9mtres=0.1sl_t=r_a^{\frac{t}{ t_{res}}}.l_0 一般设置ra=0.9m,t_res= 0.1s

在这里插入图片描述

MoveSequencePredictor分析在车道线上车辆类型障碍物(caution级别)未来的行为。本质是多项式拟合,希望用一个光滑的曲线链接始末点,同时满足一些额外的限制,如加速度等。可以细分为纵向和横向。纵向处理需要满足的约束有初始位置,初始速度,初始加速度,终末位置,终末速度共5个,因此至少需要一个四阶多项式拟合;横向处理需要满足的约束有初始位置,初始速度,终末位置,终末速度。需要一个三阶多项式拟合。

在这里插入图片描述

Apollo相关代码

详见APOLLO/modules/Prediction。 PredictionComponent::Proc()调用PredictionEndToEndProc() PredictionEndToEndProc()调用Onperception()

参考文献

公众号关于预测的文章 蛇老师的代码解析