Apollo规划模块:lattice算法原理解析

一、概述

Apollo规划模块以预测模块、routing模块、高精地图和定位的结果作为输入,输出一条平稳、舒适、安全的轨迹,下游交给控制模块去执行,由控制器完成对局部轨迹的跟踪控制。
在这里插入图片描述
Lattice算法属于规划模块,是一种局部轨迹规划器,输出是一条光滑无碰撞满足车辆运动学约束和速度约束的平稳安全的局部轨迹。输入端主要由三部分组成,感知及障碍物信息、参考线信息及定位信息。(预测模块、routing模块、高精地图和定位的结果)输出是带有位置、速度信息的一系列轨迹点组成的平稳、舒适、安全的轨迹。

二、算法思想

Lattice规划算法是一种基于采样的运动规划算法,通过将车辆坐标系转换到参考线坐标系(frenet坐标系),然后在frenet坐标系下分别对frenet的d轴和s轴进行规划,形成frenet坐标系下的规划轨迹,然后将frenet坐标系下的轨迹合成到世界坐标系下还原为世界坐标系下的轨迹。

三、算法流程

1、主要流程

(1)采样足够多的候选轨迹,提供尽可能多的选择。
(2)计算每一条轨迹计算的cost。这个cost考虑了轨迹的可行性、安全性等因素。
(3)循环检测的过程。每次会先挑选出cost最低的轨迹,对其进行物理限制检测和碰撞检测。如果挑出来的轨迹不能同时通过这两个检测,就将其筛除,考察下一条cost最低的轨迹。
(4)输出最优轨迹或者停车轨迹。
在这里插入图片描述

2、原理解析

(1) Frenet坐标系和ST图
采用Frent坐标系表示车辆状态。参考线起点到投影点的路径长度就是汽车在Frenet坐标系下的纵向偏移量,用s表示;投影点到汽车位置的距离则是汽车在Frenet坐标系下的横向偏移量,用l表示。

由于参考线是足够光滑的,通过汽车的朝向、速度、加速度来计算出Frenet坐标系下,横向和纵向偏移量的一阶导和二阶导。
(将横向偏移量L设计成纵向偏移量S的函数,横向运动是由纵向运动诱发的)
在这里插入图片描述
st图中上边界表示车头,下边界表示车尾,斜率表示车速,蓝车在tin时刻进入车道,tout时刻离开车道。红车红线跟车在阴影下方,绿线超车在阴影下方。
在这里插入图片描述
(2)生成轨迹过程
**第一步:**计算得到汽车在在零时刻的当前状态,接着在Frenet坐标系下采样一个在T1时刻的末状态。
在这里插入图片描述
**第一步:**将末状态和起始状态做多项式拟合。分别形成横向和纵向的多项式轨迹
**第三步:*二维合成。给定一个时刻T,计算出在T时刻的纵向偏移量和横向偏移量,再通过参考线,可还原成一个二维平面中的轨迹点。通过一系列的时间点T0,T1,…,Tn,可以获得一系列的轨迹点P0,P1,…,Pn,最终形成一条完整的轨迹。
(3)采样轨迹过程
横向轨迹的采样: 包括多种横向运动状态。设计了三个末状态横向偏移量,-0.5,0.0和0.5,以及四个到达这些横向偏移量的纵向位移,分别为10,20,40,80。用两层循环遍历各种组合,再通过多项式拟合,即可获得一系列的横向轨迹。

纵向轨迹的采样:考虑巡航、跟车或超车、停车这三种状态。
停车状态: 给定停车点,末状态的速度和加速度都是零,末状态是确定的。用一层循环来采样到达停车点的时间。
在这里插入图片描述
巡航状态:
两层循环来完成采样。外层循环将速度从零到上限值按等间隔均匀遍历。内层循环遍历到达末状态速度的时间,从1秒到8秒按1秒的间隔均匀遍历。由于巡航状态不需要指明到达末状态的S值,只需要用四次多项式拟合即可。
在这里插入图片描述
超车状态:
采样末状态时,分别在S-T图中障碍物对应的阴影区域的上方和下方分别采样。上方的末状态对应超车,下方的末状态对应跟车。多个障碍物时,对这些障碍物分别采样超车和跟车所对应的末状态。

遍历所有和车道有关联的障碍物,分别采样超车和跟车的末状态,然后用多项式拟合即可获得一系列纵向轨迹。
在这里插入图片描述
所有纵向轨迹进行组合,再将所有纵向轨迹和所有横向轨迹两两配对二维合成,完成采样。

(4)轨迹COST设计:
在这里插入图片描述
轨迹规划所需要满足到达目的、符合交规,避免碰撞、平稳舒适。设计了六个cost,cost越高就表示越不满足要求。

到达目的的cost:
存在停车指令,相对大的车速,其对应的轨迹cost就越大;
没有停车指令,那么低速轨迹的cost就会越大。(设计了参考速度实现)
横向偏移cost:
为了让自动驾驶汽车能尽量沿着道路中心行驶。靠道路一边行驶,画龙的行驶轨迹,cost都相对较高。
碰撞cost:
轨迹和在S-T图中的阴影区域有重叠,说明有碰撞风险,碰撞cost就会相对较高。轨迹在S-T图中反映出来的碰撞风险较小,碰撞cost就相对较低。
纵向加加速度的cost:
加加速度(jerk)是加速度对时间的导数,表示加速度的变化率。加加速度的最大值来表示这个cost。
横向加速度的cost:
设计这个cost是为了平稳地换道。猛打方向盘的轨迹,它的横向加速度cost就会相对较大。
向心加速度cost:
设计这个cost是为了在转弯或调头的时候能够减速慢行。在弯道处,车速慢的轨迹,其向心加速度cost就会相对较低。

六个cost加权求和就是轨迹的总cost。根据需要,调试六个权重。

(5)限制检测和碰撞检测
限制检测:轨迹的加速度、加加速度、和曲率。
碰撞检测:自动驾驶汽车的轨迹和其他障碍物的预测轨迹是否有轨迹重叠。

三、应用场景:

换道场景Lattice算法需要对目标车道对应的参考线做一次采样+选择的流程。本车道和目标车道均能产生一条最优轨迹。给换道轨迹的cost上增加额外的车道优先级的cost,再将两条轨迹比较,选择cost较小的那条。

Lattice采样+选择过程,横纵同时求解。更多用于封闭结构化道路的规划,低速园区和高速公路的场景;城市道路简单路况,对于相对复杂的交规处理还有待完善。

Apolo开发者社区:http://apollo.baidu.com/developer/index_cn.html#/
参考链接:
https://www.cnblogs.com/fuhang/p/9563884.html

内容皆来源于网络和参考链接整理,侵权联系删。

  • 1
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

执着且专注

予人玫瑰,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值