Apollo决策规划算法学习Chapter2 路径规划算法

Apollo决策规划算法学习系列目录

第一章 Apollo决策规划算法基本概念
第二章 Apollo决策规划之路径规划算法
第三章 Apollo决策规划之速度规划算法



前言

本文为第二章,主要讲解 Apollo决策规划算法中的路径决策算法,EM planner的路径决策算法是通过动态规划和二次规划实现的,下面来分两部分细讲路径决策算法中的动态规划和二次规划算法。


一、路径决策算法:动态规划

Notes

1.1 离散空间找粗解:动态规划

1)在Apollo决策规划算法学习的第一章中,我们已经讲过无人车怎样进行避障,下面我们针对第一章说的找粗解进行详细的讲解;第一章已经说明了怎么生成参考线,假设我们现在已经有了参考线的信息,然后就需要把车辆投影到参考线上,并以投影点为坐标原点,建立Frenet坐标系,同时把障碍物也投影到参考线上,生成SL图
2)大家是不是认为规划的起点都是通过车辆的位置投影到参考线上,然后得到投影点在SL坐标系下的坐标,以此点为路径规划的起点就可以了,这么认为其实不太正确,因为这样得到的规划轨迹在控制看来就是如下图所示,是离散的;
在这里插入图片描述
所以只有起点的时候可以用上面的方法来找规划的起点,其他位置正确的做法是判断当前车的位置与上个周期规划的结果是否差别很大,如果差别很大那就把车辆的位置投影到参考线上,然后得到投影点在SL坐标系下的坐标,以此点为路径规划的起点就可以了;如果差别不大,就需要把当前的位置投影到上个周期规划的轨迹上,再投影到参考线上的点作为规划起点;这样得到的轨迹就是如下图所示;
在这里插入图片描述

下面以图解的方式来看一看无人车通过动态规划得到避障的粗解的过程:
在这里插入图片描述
在这里插入图片描述

1.2 控制接口,轨迹拼接

1)规划出来的轨迹输入到控制模块后需要有反馈看车辆是否按照规划的轨迹行驶,没有反馈的话,规划做错了也不知道,因此规划模块的输出给控制需要涉及到规划和控制的接口问题;一般来说控制的周期为10ms,规划的周期为100ms,这意味着需要在10个周期内跟踪同一个规划进行控制,这样控制效果不是太好,接下来我们讲一下关于这个问题的解决方案;
2)上面已经提出来一个问题,那么规划模块的输出只有位置、速度、加速度、航向角等信息,但是却没有时间信息,我们在规划输出的信息中添加时间信息,轨迹上的每个点都带有时间戳,这样就可以搜索当前的时间对应的轨迹了,规划发出一条带时间的轨迹给控制模块就可以了;
3)目前还有问题就是规划需要100ms的时间,那么规划的起点是本周期规划模块开始规划轨迹的时间T还是T+100ms呢;还有另外一个问题就是为什么本周期开始规划的起点不是当前车辆所在的位置呢?
下面来解决这两个问题:首先说一下规划的起点是指本周期开始规划的位置,规划的起点应该是T+100ms,原因是规划需要100ms的时间,这100ms内跟踪的是上个周期的轨迹,那么即使你从时间T所在的位置作为规划起点,但是规划完成是在T+100ms,你从T+100ms才开始跟踪这次规划的轨迹,会出现如下图所示的情况:
在这里插入图片描述
T时刻作为规划起点,会造成规划的轨迹的不连续性,T+100ms作为起点得到的轨迹如下图所示:
在这里插入图片描述
这里我们也相当于解释了车辆当前定位的点为什么不能作为规划的起点,因为执行本周期规划的轨迹是在100ms以后,你在这里作为规划起点会造成几个周期之间规划轨迹的不连续性。

1.3 轻决策与重决策

1)首先来看一下什么是轻决策和重决策:
在这里插入图片描述
2)说详细一点,重决策就是给予人给定的规则(综合与障碍物的距离、相对速度、周围环境等信息)给出决策,它是一种场景与决策的映射关系,是人为事先设计好的;
缺点:场景太多了,无法完全覆盖;同时人给出的决策所开辟的凸空间未必满足约束;
优点:计算量小;在感知受限的情况下仍然能做决策,因为结合了专家的智慧;
3)轻决策就是一种离散空间,通过设计代价函数,使用动态规划算法求解离散空间的最优路径的方法,它不需要先验的规则;
优点:无需人为规则就可以处理复杂场景;通过设计代价函数,可以使找到的粗解满足约束,使二次规划求解成功的几率大大增加;
缺点:复杂场景计算量大;依赖预测;对周围环境感知、定位要求高;
总的来说目前L2、L3级别的自动驾驶都是使用重决策方法,L4级别的自动驾驶使用轻决策方法。

1.4 路径二次规划算法

1)二次规划是非线性规划中的一类特殊数学规划问题,在很多在非线性优化问题都有应用,二次规划的形式上一节已经说过了,我们来看一看怎么得到二次规划的等式约束和不等式约束;
在这里插入图片描述

2)得到了等式约束和不等式约束后,还有二次规划的目标函数呢,路径规划中目标函数就是损失函数,定义如下,二次规划计算出结果后,然后我们就完成了路径规划。
在这里插入图片描述

在这里插入图片描述

二、路径规划总结与疑难解答

2.1 靠近障碍物时,二次规划无解

1)在进行路径规划的时候.会出现靠近障碍物的时候,可能会出现二次规划无解的情况,这是因为规划的起点约束可能与碰撞约束冲突造成的,在离障碍物很远的时候轨迹拼接的起点与避障的凸空间边界离得比较远,看下图的图解可能比较清晰;
在这里插入图片描述
大家可能会问为什么规划的路径贴着边界,这是由二次规划的性质决定的,带约束的二次规划的最小值只会在极小值点或者边界点取得,我们有两种解决方案:1.增大障碍物的边界,不管规划的起点冲突问题,因为把障碍物边界放大后自然就不会冲突了;2.增大Wcentre的权重,使极小值点更靠近道路中心线(这种方法的缺点是Wcentre调大的幅度小不起作用,幅度大路径不平滑,因此这个权重的调整需要合适);

2.2 无人车方向盘大幅抖动,车辆抖动

在这里插入图片描述
1)这个问题还是由于规划的路径往边界靠拢造成的,边界不平滑不满足车辆动力学,我们可以通过增加约束的方法解决,同时带来的问题是约束的增加导致二次规划的求解变慢,针对这个问题我们提出解决方案:

在这里插入图片描述

2.3 速度规划对路径规划的影响

1)路径规划不仅要处理静态障碍物,还要拿上一帧的轨迹去判断与动态障碍物的交互,下图图解的方式更易懂一点;

在这里插入图片描述


总结

以上就是今天要讲的内容,本文介绍了Apollo决策规划算法中的路径决策算法,路径决策算法是通过动态规划和二次规划实现的。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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是一种基于深度强化学习决策规划算法,具有高效、自主、可靠等特点,在智能驾驶领域具有广泛应用前景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值