学习百度Apollo中的决策规划

学习视频链接

无人车的任务:定位(在哪里)、感知(看到了什么)、预测(环境下一步怎么变化)、规划(我们应该怎么移动)、控制(怎样控制车辆)

一、无人车规划问题与解决框架

1.定义:

无人车规划问题就是控制车辆安全平稳地运行到终点。要求无人车需要遵守交通规则,计算模块的速率小于100ms(0.1s),还有保证一定的舒适性、平稳性,可以适应复杂的路况。

2.输入与输出:

接收从上游模块(如感知、定位、导航)获得的信息,生成一条无人车可以行驶的轨迹,交给下游模块(如控制)去执行。

具体来说,无人车规划问题的输入为:周围障碍物的信息、本车状态(一部分是来自底盘本身发出的关于方向盘转角等信息,另一部分是来自定位的输出)、交通灯信息、高精地图的信息(包含路径的信息,以及路径间的拓扑关系)、导航信息。

3.无人车规划模块的设计思路

①多策略并发机制
在这里插入图片描述
先进行不同道路策略上的规划,不同策略间相互独立,然后通过不同策略的比较选择最优。

②道路内规划

在这里插入图片描述
将道路信息整合在道路中心线构建的平滑坐标系上,找到满足交通规则的道路内最优解,还要满足性能上的优化。
在这里插入图片描述
若生成右图所示的路径,那么乘坐感会较差,因为在直线与转弯的交界处需要猛打方向盘。所以先根据道路中心线获得左图的若干小黑点,然后生成灰色的框,希望规划的路径尽可能平稳地穿过这个灰色的框,并且满足曲率2阶可导(这样就避免猛打方向盘了)。

③道路内规划的“硬约束”与“软约束”
在这里插入图片描述
对于上图所示情景,主车想要给红车让道。那么硬约束就是诸如指示灯的要求、不能撞车等任何情况下都不能违背的交通规则,会将这些条件以规则的形式写入代码中;软约束就是人为决策,比如跟着红车,或者绕过红车,这些是通过动态优化策略去完成的。当已经完成人为决策之后,会通过基于样条的二次规划去生成一条平滑的轨迹。

4.无人车的规划模块架构
在这里插入图片描述
根据路网,对多条路径建立起多条参考线,即参考线的预选模块。
建立多个参考线之后,不同参考线之间建立起不同的参考系,不同的参考系内部进行路径规划。通过动态规划的方式去寻找软约束条件,再通过二次规划(QP)生成一条平稳的轨迹。也就是说,这是个动态规划二次规划相结合的路径规划速度规划结合的方式。

对于无人车的新框架的核心可以总结为三点:决策规划合二为一换道策略分而治之道路内规划要稳定,满足实效性

二、决策规划中的优化问题

1.定义

决策规划中的优化问题一般是指道路内的优化问题。而道路内的规划问题其实是一个三维的规划:沿道路行驶的x方向坐标、横向坐标L、时间T,即为LST坐标

根据EM(期望最大化)迭代的原理,将复杂的三维规划问题降维成速度规划问题和路径规划问题,然后不断将其进行迭代求解。
具体做法为:

基于道路内建立的平滑坐标系,对障碍物进行投影(SL投影,E step);
投影完之后,生成一条最优的路径(M step);
对于这条路径,把周围的障碍物在纵向和时间的平面上进行投影(ST投影, E step);
在此平面内对无人车进行速度规划优化(M step)。

2.优化问题的三个关键点

①目标函数cost:对于无人车来说,是指各项指标的线性叠加。比如曲率的平滑率、安全性等。

②约束条件:满足交规,避免碰撞的前提条件

③优化求解
在这里插入图片描述
凸函数只有唯一的一个最优解,在我们求解时方便。
而上图就是一个非凸函数,也就是既有全局最优点,又有局部最优点。而目标是寻找全局最优解,解决这类非凸函数的优化问题的思路为:
Ⅰ 撒点获取粗略解。如在上图的0.2,0.4,0.6,0.8,1.0,1.2的位置撒点,获取函数在这些点上的数值,从而获得函数的粗略解。对应规划模块的动态规划算法(DP)。
Ⅱ 二次优化QP获得精确解。基于上述获得的粗略解,进行二次样条获取全局最优解。对应规划模块的二次样条(QP)。

3.planning

①路径规划
在这里插入图片描述
通过道路中心线建立的SL坐标上,从主车位置出发向前方撒若干排点;利用动态规划的方式,设置目标函数,进行动态规划的求解;然后通过折线的方式连接出一条粗略的解。

②路径QP算法
即基于路径的二次规划算法
在这里插入图片描述
当已经有了粗略解,知道对于这个静态障碍物,需要从下方绕过它时,对于纵向坐标s取若干个控制的位置,在这些位置处获取能走的上下界的范围,如上图中橘红色的可行区域。这就是二次规划问题的约束条件。将曲率和曲率连续性,贴近中心线等作为约束条件。这样就将整个问题转化为一个凸问题。

③速度规划
在这里插入图片描述
生成一条无人车可以行驶的路径之后,需要对无人车的速度进行规划。

首先将周围障碍物投影到需要行进的路上。
若一辆车出现在主车前方时,路径方向的s方向和时间t组成的st图中,就会形成上方所示的遮盖区域,表示生成的曲线必须存在于遮盖区域的下方,即跟着前车开。
若一辆车比较慢,在主车后方时,会形成图中下面的框,表明应该通过一些方式绕开那辆车。

然后类似于路径规划,先粗略找到图中红色线所在处的粗略解。

④速度QP算法
在这里插入图片描述
得到速度规划的粗略解之后,需要进行二次规划算法。具体做法为:
当获得粗略解之后,就可以在图中获得一个可求解区域(在这个可求解区域内,是凸的),并且我们不可以穿过上面的阴影区,也不能低于下面的阴影区。
同样也需要用到二次规划的样条算法去求解。

总结一下,也就是路径和速度算法的不断迭代,在不断迭代的过程中下层的速度算法在进行下一周期的路径规划时也会有相应的影响。不断EM迭代的过程,在内部,速度和路径算法就分成了一个动态规划和二次规划的结合,从而可以解决二维平面中的非凸问题。二次规划算法主要的作用就是生成一条平滑的可避开障碍物的轨迹,从而交给车辆的控制模块去平稳运行。

  • 13
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Apollo Planning决策规划算法在无人驾驶领域被广泛应用,在自动驾驶车辆起着至关重要的作用。该算法主要通过对车辆周围环境的感知和分析,实现智能驾驶路线的规划决策,确保车辆安全行驶。 该算法的代码主要包含三个部分:感知模块、规划模块和控制模块。其感知模块主要负责采集车辆周围的环境信息,包括车辆所处的位置、路况、障碍物等。规划模块通过对这些信息的分析,提出一系列可能的驾驶路线,并通过评估这些路线的优劣来选择最佳驾驶路线。控制模块负责实现规划模块选择的最佳驾驶路线,并控制车辆按照路线行驶。 在Apollo Planning决策规划算法规划模块是实现驾驶决策的最重要模块,也是最具技术难度的模块。规划模块通过对车辆当前状态和环境信息的分析,提出一系列汽车驾驶路线。该算法采用在线生成路线方案的方法,路线生成的步骤如下: 1. 动态路径规划:根据车辆的位置和行驶状态,实时选择当前最佳的驾驶路线。 2. 静态路线生成:基于当前车辆所处的环境信息,生成固定的驾驶路线。 3. 组合路径规划:将动态路径规划和静态路线生成相结合,生成最终的驾驶路线。 除此之外,Apollo Planning决策规划算法还包括计算机视觉、机器学习、深度学习和人工智能等技术,这些技术的综合应用使得Apollo Planning决策规划算法成为无人驾驶领域应用最广泛的决策规划算法。 ### 回答2: Apollo Planning决策规划算法是一种用于自动驾驶系统的规划算法。该算法的主要作用是实时生成安全、有效且符合路况的路径以实现自动驾驶功能。本文将对该算法进行详细解析。 Apollo Planning决策规划算法主要包括三个步骤:路线规划、运动规划决策规划。具体代码如下: 1. 路线规划 ```c++ bool Planning::PlanOnReferenceLine() { std::vector<const hdmap::HDMap*> hdmap_vec; hdmap_vec.reserve(1); if (!GetHdmapOnRouting(current_routing_, &hdmap_vec)) { AERROR << "Failed to get hdmap on current routing with " << current_routing_.ShortDebugString(); return false; } const auto& reference_line_info = reference_line_infos_.front(); std::vector<ReferencePoint> ref_points; if (!CreateReferenceLineInfo(hdmap_vec.front(), reference_line_info, &ref_points)) { AERROR << "Failed to create reference line from routing"; return false; } // Smooth reference line Spline2d smoothed_ref_line; std::vector<double> s_refs; std::vector<double> l_refs; std::vector<double> headings; std::vector<double> kappas; std::vector<double> dkappas; if (!SmoothReferenceLine(ref_points, &smoothed_ref_line, &s_refs, &l_refs, &headings, &kappas, &dkappas)) { AERROR << "Failed to smooth reference line"; return false; } reference_line_info.SetTrajectory(&smoothed_ref_line); reference_line_info.SetReferenceLine(&ref_points); // set origin point if (!reference_line_info.SLToXY(s_refs.front(), 0.0, &origin_point_)) { AERROR << "Failed to get origin point on reference line"; return false; } return true; } ``` 在路线规划阶段Apollo Planning决策规划算法首先获取当前行驶路线和高精度地图数据。然后根据行驶路线和地图数据构建参考线,对参考线进行平滑处理,得到平滑后的参考线。此时我们可以得到平滑后的参考线的位置、方向和曲率等信息,这些信息将作为后面的运动和决策规划的输入。 2. 运动规划 ```c++ bool Planning::PlanOnPrediction() { PredictionObstacles prediction_obstacles; if (!GetPrediction(&prediction_obstacles)) { AERROR << "Prediction failed"; return false; } std::vector<Obstacle> obstacles; if (!BuildObstacle(prediction_obstacles, &obstacles)) { AERROR << "Unable to build obstacle"; return false; } const auto& reference_line_info = reference_line_infos_.front(); const auto& reference_line = reference_line_info.reference_line(); SpeedData speed_data; Cruiser::PlanningTarget planning_target; Status status = cruiser_->Plan(reference_line_info, obstacles, 0.0, reference_line.Length(), &speed_data, &planning_target); if (status != Status::OK()) { AERROR << "Failed to plan path with status: " << status; return false; } RecordDebugInfo(reference_line_info, obstacles, speed_data); return true; } ``` 运动规划主要用于生成车辆在参考线上的运行轨迹。在运动规划阶段,Apollo Planning决策规划算法首先获取预测障碍物信息,将预测的障碍物转化为Obstacle对象。然后根据当前平滑后的参考线、障碍物等信息进行运动规划。运动规划的目标是生成符合规划目标的速度曲线。最后,Apollo Planning决策规划算法记录调试信息,以便后续分析调试。 3. 决策规划 ```c++ bool Planning::MakeDecision() { const auto& reference_line_info = reference_line_infos_.front(); const auto& reference_line = reference_line_info.reference_line(); std::vector<const Obstacle*> obstacles; if (!Obstacle::CreateObstacleRegions(FLAGS_max_distance_obstacle, reference_line_info, &obstacles)) { AERROR << "Failed to create obstacle regions"; return false; } for (auto obstacle_ptr : obstacles) { const auto& obstacle = *obstacle_ptr; if (obstacle.IsVirtual()) { continue; } if (obstacle.IsStatic()) { continue; } if (obstacle.type() == PerceptionObstacle::BICYCLE || obstacle.type() == PerceptionObstacle::PEDESTRIAN) { continue; } const auto& nearest_path_point = obstacle.nearest_point(); const SLPoint obstacle_sl = reference_line_info.xy_to_sl(nearest_path_point); if (obstacle_sl.s() < -FLAGS_max_distance_obstacle || obstacle_sl.s() > reference_line.Length() + FLAGS_max_distance_obstacle) { continue; } ObjectDecisionType decision; decision.mutable_avoid(); decision.mutable_avoid()->set_distance_s(-obstacle_sl.s()); reference_line_info.AddCost(&obstacle, &decision); } std::vector<ObjectDecisionType> decisions; if (!traffic_rule_manager_.ApplyRule(reference_line_info, &decisions)) { AERROR << "Failed to apply traffic rule manager"; return false; } reference_line_info.SetDecision(decisions); return true; } ``` 决策规划是基于当前环境信息和规划的路径等输入信息,实时生成控制命令的过程。在Apollo Planning决策规划算法决策规划阶段根据当前参考线、障碍物等信息生成决策。该算法根据不同的规则和策略,生成不同的控制命令,以保证车辆安全、有效地运行。 综上,Apollo Planning决策规划算法是自动驾驶系统重要的规划算法之一,它通过路线规划、运动规划决策规划三个步骤,实现了安全、有效和符合路况的路径规划,为自动驾驶车辆的控制提供了重要的支持。 ### 回答3: Apollo Planning(阿波罗规划)是百度自动驾驶平台Apollo的一种决策规划算法,主要用于规划车辆的驾驶行为。该算法基于深度强化学习,使用了运动学模型和环境感知技术,可以根据车辆当前位置和目的地,生成一条最优的行驶路径,包括车辆的控制指令和行驶速度等。 该算法的核心技术是深度强化学习,它通过对驾驶过程进行大量的仿真,让计算机通过自我学习得到驾驶规则,使车辆能够根据不同的场景做出最优的决策。具体而言,算法先通过神经网络生成一系列潜在的行动策略,然后通过与环境进行交互、执行行动并接收环境反馈来评估每个策略的优劣,最终选取最优策略进行执行。 在实现上,Apollo Planning算法主要由四个模块构成:感知模块、规划模块、执行模块和控制模块。感知模块主要用于获取车辆周围环境的信息,包括车辆位置、速度、道路情况、交通灯等;规划模块根据感知模块提供的信息和车辆的目的地,生成一条最优的行驶路径;执行模块则根据规划模块生成的路径信息,实现车辆的自主驾驶;控制模块则根据执行模块生成的控制指令,控制车辆的加速、刹车、转向等行为。 在算法实现上,Apollo Planning采用了C++编程语言,结合ROS框架实现各模块之间的数据交互和代码复用,保证了算法的高效性和可维护性。算法代码实现方面还采用了许多优化技术,包括多线程并发执行、高效的数据结构和算法等,以提升算法的运行效率和稳定性。 总之,Apollo Planning是一种基于深度强化学习决策规划算法,具有高效、自主、可靠等特点,在智能驾驶领域具有广泛应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值