Planning-Apollo路径决策规划及问题

Apollo中采用路径规划和速度规划解耦的方法,由EM Planner演变而来,路径规划是基于参考线的规划,放弃了EM Planner中的路径决策DP过程。

1. 算法原理

百度已经将算法原理发表在《Optimal Vehicle Path Planning Using Quadratic Optimization for Baidu Apollo Open Platform》中。基于参考线将规划问题解耦为SL坐标系中的路径规划和ST坐标系中的速度规划。

在这里插入图片描述

1.1 优化模型

Apollo采用了piecewise-jerk的方法,即分段冲击度ADC在每两个采样点之间以恒定的jerk进行横向运动。沿着参考线在道路前进方向上按照 Δ s \Delta s Δs的距离进行离散化,每个采样点的状态有 l i , l i ′ , l i ′ ′ l_{i},l^{\prime}_{i},l^{\prime \prime}_{i} li,li,li,按照 l i → i + 1 ′ ′ ′ l^{\prime \prime \prime}_{i \rightarrow i+1} lii+1 的冲击度运动到状态 l i + 1 , l i + 1 ′ , l i + 1 ′ ′ l_{i+1},l^{\prime}_{i+1},l^{\prime \prime}_{i+1} li+1,li+1,li+1 l i , l i ′ , l i ′ ′ l_{i},l^{\prime}_{i},l^{\prime \prime}_{i} li,li,li是优化问题的决策变量。

在这里插入图片描述

l i → i + 1 ′ ′ ′ = l i + 1 ′ ′ − l i ′ ′ Δ s (1-1) l^{\prime \prime \prime}_{i \rightarrow i+1} = \frac{l^{\prime \prime}_{i+1} - l^{\prime \prime}_{i}}{\Delta s} \tag{1-1} lii+1=Δsli+1li(1-1)
由于相邻采样点之间的 l i → i + 1 ′ ′ ′ l^{\prime \prime \prime}_{i \rightarrow i+1} lii+1是常量,因此可以通过积分,根据采样点 i i i的值可以得到采样点 i + 1 i+1 i+1的值:
l i + 1 ′ ′ = l i ′ ′ + ∫ 0 Δ s l i → i + 1 ′ ′ ′ d s = l i ′ ′ + l i → i + 1 ′ ′ ′ × Δ s l i + 1 ′ = l i ′ + ∫ 0 Δ s l i → i + 1 ′ ′ d s = l i ′ + l i ′ ′ × Δ s + 1 2 l i → i + 1 ′ ′ ′ × Δ s 2 l i + 1 = l i + ∫ 0 Δ s l i → i + 1 ′ d s = l i + l i ′ × Δ s + 1 2 l i ′ ′ × Δ s 2 + 1 6 l i → i + 1 ′ ′ ′ × Δ s 3 (1-2) \begin{aligned} l^{\prime \prime}_{i+1} &= l^{\prime \prime}_{i} + \int^{\Delta s}_{0} {l^{\prime \prime \prime}_{i \rightarrow i+1}} ds = l^{\prime \prime}_{i} + l^{\prime \prime \prime}_{i \rightarrow i+1} \times \Delta s \\ l^{\prime}_{i+1} &= l^{\prime}_{i} + \int^{\Delta s}_{0} {l^{ \prime \prime}_{i \rightarrow i+1}} ds = l^{\prime}_{i} + l^{\prime \prime}_{i} \times \Delta s + \frac{1}{2} l^{\prime \prime \prime}_{i \rightarrow i+1} \times {\Delta s}^2 \\ l_{i+1} &= l_{i} + \int^{\Delta s}_{0} {l^{ \prime}_{i \rightarrow i+1}} ds = l_{i} + l^{\prime}_{i} \times \Delta s + \frac{1}{2} l^{\prime \prime}_{i} \times {\Delta s}^2 + \frac{1}{6} l^{\prime \prime \prime}_{i \rightarrow i+1} \times {\Delta s}^3 \end{aligned} \tag{1-2} li+1li+1li+1=li+0Δslii+1ds=li+lii+1×Δs=li+0Δslii+1ds=li+li×Δs+21lii+1×Δs2=li+0Δslii+1ds=li+li×Δs+21li×Δs2+61lii+1×Δs3(1-2)

1.2 优化目标

J = w l ∑ 0 n − 1 l i 2 + w l ′ ∑ 0 n − 1 l i ′ 2 + w l ′ ′ ∑ 0 n − 1 l i ′ ′ 2 + w l ′ ′ ′ ∑ 0 n − 1 ( l i + 1 ′ ′ − l i ′ ′ Δ s ) 2 + w o b s ∑ 0 n − 1 ( l i − 0.5 × ( l i m i n + l i m a x ) ) 2 (1-3) J = w_l \sum^{n-1}_{0} {l^{2}_{i}} + w_{l^{\prime}} \sum^{n-1}_{0} {l^{\prime 2}_{i}} + w_{l^{\prime \prime}} \sum^{n-1}_{0} {l^{\prime \prime 2}_{i}} + w_{l^{\prime \prime \prime}} \sum^{n-1}_{0} ({\frac{l^{\prime \prime}_{i+1} - l^{\prime \prime}_{i}}{\Delta s}})^2 + w_{obs} \sum^{n-1}_{0} ({l_{i}} - 0.5 \times (l^{min}_{i} + l^{max}_{i}))^2 \tag{1-3} J=wl0n1li2+wl0n1li2+wl0n1li2+wl0n1(Δsli+1li)2+wobs0n1(li0.5×(limin+limax))2(1-3)

1.3 约束条件

由于在Frenet坐标系中会丢失道路的曲率信息,不能对车辆形成运动学约束,因此需要计算车辆在运动过程中的曲率,避免超过车辆的运动极限能力。
κ = ( ( ( l ′ ′ + ( κ r ˙ l + κ r l ′ ) ) t a n Δ θ ) c o s 2 Δ θ 1 − κ r l + κ r ) c o s Δ θ 1 − κ r l (1-4) \kappa = \frac{(\frac{((l^{\prime \prime} + (\dot{{\kappa}_{r}}l + \kappa_r l^{\prime}) )tan \Delta \theta)cos^2 \Delta \theta}{1-\kappa_r l}+\kappa_r){cos \Delta \theta}}{1-\kappa_r l} \tag{1-4} κ=1κrl(1κrl((l+(κr˙l+κrl))tanΔθ)cos2Δθ+κr)cosΔθ(1-4)
其中, κ r \kappa_r κr κ r ˙ \dot{\kappa_r} κr˙是参考线在点 p r p_r pr处的曲率和曲率变化率, Δ θ \Delta \theta Δθ是车辆和参考线点 p r p_r pr处切线方向的角度差。显然上式过于复杂,对其进行简化:

  • 假设车辆几乎在沿着道路方向行驶,因此 Δ θ = 0 \Delta \theta = 0 Δθ=0
  • “横向加速度” l ′ ′ l^{\prime \prime} l是很小的,数量级在 1 0 − 2 10^{-2} 102,因此 l ′ ′ = 0 l^{\prime \prime}=0 l=0

基于上述假设:
κ ≈ κ r 1 − κ r l (1-5) \kappa \approx \frac{\kappa_r}{1-\kappa_r l} \tag{1-5} κ1κrlκr(1-5)
根据车辆的阿克曼转向特性:
κ r 1 − κ r l ≤ t a n ( δ m a x ) L (1-6) \frac{\kappa_r}{1-\kappa_r l} \leq \frac{tan(\delta_{max})}{L} \tag{1-6} 1κrlκrLtan(δmax)(1-6)
整理后得到:
t a n ( δ m a x ) × κ r × l − t a n ( δ m a x ) + κ r × L ≤ 0 (1-7) tan(\delta_{max}) \times \kappa_r \times l - tan(\delta_{max}) + \kappa_r \times L \leq 0 \tag{1-7} tan(δmax)×κr×ltan(δmax)+κr×L0(1-7)
同时各个决策变量需要满足上下边界约束:
l m i n ≤ l i ≤ l m a x l m i n ′ ≤ l i ′ ≤ l m a x ′ l m i n ′ ′ ≤ l i ′ ′ ≤ l m a x ′ ′ l m i n ′ ′ ′ ≤ l i ′ ′ ′ ≤ l m a x ′ ′ ′ (1-8) l_{min} \leq l_i \leq l_{max} \\ l^{\prime}_{min} \leq l^{\prime}_i \leq l^{\prime}_{max} \\ l^{\prime \prime}_{min} \leq l^{\prime \prime}_i \leq l^{\prime \prime}_{max} \\ l^{\prime \prime \prime}_{min} \leq l^{\prime \prime \prime}_i \leq l^{\prime \prime \prime}_{max} \tag{1-8} lminlilmaxlminlilmaxlminlilmaxlminlilmax(1-8)
因此,路径优化问题是由优化目标 ( 1 − 3 ) (1-3) (13),等式约束 ( 1 − 2 ) (1-2) (12)和不等式约束 ( 1 − 7 ) ( 1 − 8 ) (1-7)(1-8) (17)(18)构成。

2. 代码实现

Apollo中路径规划的实现流程如下:

在这里插入图片描述

2.1 LaneChangeDecider

换道决策决定ADC是否进行换道。目前Apollo的体系是当有多条参考线时即进行换道。

  • 如果不换道,在PathBoundsDecider中会将 l l l的边界限制在本车道内(如果不借道);
  • 如果换道,在PathBoundsDecider中会将 l l l的边界向目标车道一侧进行拓展;

2.2 PathLaneBorrowDecider

ADC在借道工况中:判断本车道可通过性,如果在连续 n n n(参数配置)帧规划中本车道可以通行,则取消借道。

ADC不在借道工况中ADC需要同时满足以下条件才可以进入借道工况:

  • 必须只有一条参考线;
  • 规划起点的速度不能过高(参数配置);
  • 不能在SIGNALSTOP_SIGNJunction附近;
  • 不能在终点附近;
  • Block ObstacleADC一定范围内,并且堵塞原因不是Traffic Flow
  • 地图车道线线型(虚线)允许借道;

如果借道,在PathBoundsDecider中会将 l l l的边界借道方向一侧进行拓展。

2.3 PathBoundsDecider

PathBoundsDecider会根据换道决策和借道决策生成相应的 l l l的边界。

  • FallbackBound+PullOverBound
  • FallbackBound+LaneChangeBound
  • FallbackBound+NoBorrow/LeftBorrow/RightBorrow

不管在何种决策下,PathBoundsDecider都会生成一条FallbackBound,其与NoBorrow的区别是,不会删除Block Obstacle后道路边界。

2.4 PiecewiseJerkPathOptimizer

会针对PathBoundsDecider生成的每一条Bound进行路径优化。

2.5 PathAssessmentDecider

PathAssessmentDecider会依据设计好的规则筛选处最终的path,并在规划路径上的采样点添加标签(IN_LANEOUT_ON_FORWARD_LANEOUT_ON_REVERSE_LANE等),作为路径筛选的依据,并为速度规划提供限制。

路径筛选的规则是:

  • 不能偏离参考线和Road太远;
  • 不能和Static Obstacle相撞;
  • 不能停止在对向车道上;
  • 选择优先级最高的Path,排序规则:
    • Regular path优先于fallback path
    • 如果两条路径至少有一条是self_lane,并且两条路径长度的差大于15m,选择路径长的;
    • 如果两条路径至少有一条是self_lane,并且两条路径长度的差小于5m,是self_lane的;
    • 如果两条路径都不是self_lane,并且两条路径长度的差大于25m,选择路径长的;
    • 选择占据反向车道更少的路径;
    • 如果有block obstacle,选择占据空间少的方向的路径;
    • 如果没有block obstacle,选择ADC靠近方向的路径,使车辆少打方向盘;
    • 选择返回本车道更早的路径;
    • 在上述情况无法区分的情况下选择左侧的路径;

2.6 PathDecider

遍历每个障碍物, 根据规则判断前面优化并筛选出来的path生成对应的decisions(GNORE, STOP, LEFT NUDGE, RIGHT NUDGE等)。

  • 对以有IGNORE/STOP/KEEP_CLEAR决策的obstacle不做处理;

  • 如果是block obstacle,并且不是借道工况,设为STOP决策;

  • 不在path纵向范围内的障碍物设为IGNORE决策;

  • 对于碰撞的obstacle,设为STOP决策;

  • 根据位置关系设置LEFT NUDGE或者RIGHT NUDGE的决策;

3. 问题

3.1 原理方面

  • 由于是使用sl坐标系,dl,ddl,dddl应该是 l ′ , l ′ ′ , l ′ ′ ′ l^{\prime},l^{\prime \prime},l^{\prime \prime \prime} l,l,l,公式 ( 1 − 2 ) (1-2) (12)的物理含义是否合适有待商榷;
  • 不能显式的处理航向角约束;
  • dl,ddl的上下限约束必须包括零点,即下限必须小于零,上限必须大于零,否则会造成primal infeasible求解失败;
  • 只是针对车辆质点(后轴中心)的建模,对于大型车辆的路径规划可能存在问题。例如当道路上不存在障碍物时,按照其规划方法,车辆后轴或者前轴必然在道路中心行驶,会使大型车辆超出道路边界,而人类驾驶大型车辆在弯道行驶时并不会沿着道路中心线。

在这里插入图片描述

3.2 代码实现方面

  • 代码中没有实现公式 ( 1 − 7 ) (1-7) (17)的车辆行驶的曲率约束;

  • l ′ ′ l^{\prime \prime} l的约束处理不正确,代码错误地将 l ′ ′ l^{\prime \prime} l和曲率做了等价处理:

    // piecewise_jerk_path_optimizer.cc 
    const auto& veh_param =
            common::VehicleConfigHelper::GetConfig().vehicle_param();
        const double lat_acc_bound =
            std::tan(veh_param.max_steer_angle() / veh_param.steer_ratio()) /
            veh_param.wheel_base();
        std::vector<std::pair<double, double>> ddl_bounds;
        for (size_t i = 0; i < path_boundary.boundary().size(); ++i) {
          double s = static_cast<double>(i) * path_boundary.delta_s() +
                     path_boundary.start_s();
          double kappa = reference_line.GetNearestReferencePoint(s).kappa();
          ddl_bounds.emplace_back(-lat_acc_bound - kappa, lat_acc_bound - kappa);
        }
    

4 算法改进

由于Apollo采用的单质点模型,可以对车辆模型进行修改。如下图所示,可以使用无穷多个圆盘覆盖车身,这些圆盘的圆心致密的覆盖车体纵轴,其直径均为车宽。

在这里插入图片描述
在这里插入图片描述

绘制一条经过圆盘圆心且垂直于 s s s轴的直线,将该直线与圆盘的两个交点记为 A A A B B B。如果每一个圆形的两端交点 A A A B B B均与隧道左右边界不相撞,则整个车身一定不会发生碰撞。需要强调的是,上述结论仅在圆盘个数为无穷大时成立,并且这样会在车头车尾处增加半圆形冗余区域。可以建立避障约束:
η ⋅ tan ⁡ θ + l ( s ) + L b 2 ≤ u b ( s + η ) η ⋅ tan ⁡ θ + l ( s ) − L b 2 ≥ l b ( s + η ) ∀ η ∈ [ − L r cos ⁡ θ , ( L f + L w ) cos ⁡ θ ] (4-1) \eta \cdot \tan \theta + l(s) + \frac{L_b}{2} \leq ub(s+\eta) \\ \eta \cdot \tan \theta + l(s) - \frac{L_b}{2} \geq lb(s+\eta) \\ \forall \eta \in [-L_r \cos \theta, (L_f + L_w)\cos \theta] \tag{4-1} ηtanθ+l(s)+2Lbub(s+η)ηtanθ+l(s)2Lblb(s+η)η[Lrcosθ,(Lf+Lw)cosθ](4-1)
在求解过程中需要对 η \eta η离散化,显然 Q P QP QP问题中不可能包含无穷数目约束条件,可以在 [ − L r cos ⁡ θ , ( L f + L w ) cos ⁡ θ ] [-L_r \cos \theta, (L_f + L_w)\cos \theta] [Lrcosθ,(Lf+Lw)cosθ]区间上均匀采样 ( N s a m p l e + 1 ) (N_{sample}+1) (Nsample+1)个采样点 { η k } \{ \eta_k \} {ηk}来表征连续变量 η \eta η,从而构成一下离散约束:
η k ⋅ tan ⁡ θ i + l ( s i ) + L b 2 ≤ u b ( s i + η k ) η k ⋅ tan ⁡ θ i + l ( s i ) − L b 2 ≥ l b ( s i + η k ) η k = − L r cos ⁡ θ i + ( L r + L f + L w ) cos ⁡ θ i N s a m p l e ⋅ k , k = 0 , 1 , ⋯   , N s a m p l e (4-2) \eta_k \cdot \tan \theta_i + l(s_i) + \frac{L_b}{2} \leq ub(s_i+\eta_k) \\ \eta_k \cdot \tan \theta_i + l(s_i) - \frac{L_b}{2} \geq lb(s_i+\eta_k) \\ \eta_k = -L_r \cos \theta_i + \frac{(L_r + L_f + L_w)\cos \theta_i}{N_{sample}} \cdot k,k=0,1,\cdots,N_{sample} \tag{4-2} ηktanθi+l(si)+2Lbub(si+ηk)ηktanθi+l(si)2Lblb(si+ηk)ηk=Lrcosθi+Nsample(Lr+Lf+Lw)cosθik,k=0,1,,Nsample(4-2)
可以将 t a n θ tan \theta tanθ替换为 l ′ l^{\prime} l,显然上述不等式为非线性约束。不等式左侧的采样点 η k \eta_k ηk可能取值不是常数,这是因为 η k \eta_k ηk是在与 c o s θ cos\theta cosθ有关的区间上采样,而 c o s θ cos\theta cosθ l ′ l^{\prime} l相关,因此采样点 η k \eta_k ηk可能的取值区间长度是与 l ′ l^{\prime} l有关的变量,类似的情况也出现在不等式的右侧。可以将采样点的数目确定下来从而完成线性化。为了使 [ − L r cos ⁡ θ , ( L f + L w ) cos ⁡ θ ] [-L_r \cos \theta, (L_f + L_w)\cos \theta] [Lrcosθ,(Lf+Lw)cosθ]与变量 l ′ l^{\prime} l解耦,可以利用 cos ⁡ θ ≤ 1 \cos\theta \leq 1 cosθ1条件将其放宽至固定长度的区间 [ − L r , L f + L w ] [-L_r, L_f + L_w] [Lr,Lf+Lw]。放宽采样点取值区间会使车辆行驶行为更加保守,但考虑到结构化道路上的车辆姿态角一般是不会显著偏离参考线的,因此假设是合理的。

但需要注意的是 θ \theta θ是车辆航向与参考线航向的偏差,由于没有利用到参考线的曲率信息,当车辆后轴中心完全沿着参考线行驶,即 l = 0 , l ′ = 0 , l ′ ′ = 0 l=0,l^{\prime}=0,l^{\prime \prime}=0 l=0,l=0,l=0,当车辆尺寸较大时仍会出现 3.1 3.1 3.1中的问题4情况。

5 参考

  1. Apollo代码:https://github.com/ApolloAuto/apollo
  2. 李柏, 张友民, 彭晓燕, 欧阳亚坤, 孔旗. 自动驾驶决策规划技术理论与实践. 北京:铁道出版社. ISBN:9787113282523. 2021.11.
### 回答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是一种基于深度强化学习的决策规划算法,具有高效、自主、可靠等特点,在智能驾驶领域具有广泛应用前景。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值