EM planner算法(附代码理解)

EM Planner算法概述

EM Planner(Expectation-Maximization Planner)是百度Apollo自动驾驶平台中的一种面向L4级别的实时运动规划算法。该算法通过顶层多车道策略选择参考路径,并在Frenet坐标系下进行车道级的路径和速度规划。EM Planner的设计充分考虑了无人车的安全性、舒适性和可扩展性,能够适应高速公路和低速城区等多种场景。该算法通过动态规划(Dynamic Programming)和基于样条的二次规划(Quadratic Programming)实现,展现了较高的可靠性和低耗时性。 

EM Planner的工作原理

EM Planner的工作流程包括以下关键步骤:

  1. 多车道策略:算法首先通过搜索算法结合代价估算形成变道策略,将多车道策略划分为被动变道和主动变道,后者考虑动态障碍物而做出决策。

  2. 路径-速度迭代算法:在Frenet坐标下,EM Planner通过迭代地进行路径和速度最优求解,考虑与障碍物的交互,上一帧的速度规划将帮助下一帧的路径规划。

  3. 决策和交通规则约束:交通规则作为硬约束,与障碍物的交互作为软约束。决策模块为规划带来更明确的意图,减少最优求解的搜索空间。

  4. SL和ST投影:在E-step中,障碍物被投影到车道Frenet坐标系,包括静态和动态障碍物。在M-step中,障碍物在速度时间(ST)图中与生成的速度信息进行估计。

  5. DP路径和QP路径:通过Dynamic Programming获得一个粗略的解,并构建一个凸的通道,然后使用基于Quadratic Programming的样条曲线生产光滑路径。

  6. 参考线轨迹决策:最后,参考线轨迹决策器根据当前车辆状态、相关约束和每条轨迹的代价,决定最优的轨迹。 

1. 多车道策略

在多车道策略中,EM Planner采用了一种分层决策机制,将策略划分为主动变道 (Proactive Lane Changing)被动变道(Reactive Lane Changing)。主动变道策略通常由导航需求触发,如到达目的地所需的车道变更。被动变道则是在当前车道受阻时(例如,前方有障碍物或车辆),系统自动选择另一条车道以确保安全行驶。这种策略通过结合搜索算法和代价估算,能够智能地预测和选择最佳变道路径,同时考虑动态障碍物的影响,确保决策的安全性和效率性。

主动变道

主动变道通常是由导航系统触发的,例如当车辆需要在前方路口左转或右转时,系统会提前规划并选择正确的车道。这种变道策略需要考虑目的地、交通规则、车道可用性等因素。

void proactiveLaneChange(const NavigationData &navData, VehicleState &vehicleState) {
    // 假设navData包含目的地信息和当前路口信息
    // vehicleState包含车辆当前状态和位置

    // 检查是否需要变道
    if (navData.needsTurn() && vehicleState.getCurrentLane() != navData.getTargetLane()) {
        // 执行变道逻辑
        vehicleState.changeLane(navData.getTargetLane());
    }
}
被动变道

被动变道是在当前车道受阻时自动触发的,例如前方有慢车或障碍物。系统会评估周围车道的情况,并选择一条安全的车道进行变道,以避免碰撞并保持行驶效率。

void reactiveLaneChange(VehicleState &vehicleState, const std::vector<Obstacle> &obstacles) {
    // 假设vehicleState包含车辆当前状态和位置
    // obstacles是一个包含所有障碍物的向量

    // 检查当前车道是否有障碍物
    for (const auto &obstacle : obstacles) {
        if (obstacle.isBlocking(vehicleState.getCurrentLane()) &&
            !obstacle.isTooCloseForSafePassing(vehicleState)) {
            // 寻找安全的车道进行变道
            int safeLane = findSafeLane(vehicleState, obstacles);
            if (safeLane != -1) {
                vehicleState.changeLane(safeLane);
                break;
            }
        }
    }
}

int findSafeLane(const VehicleState &vehicleState, const std::vector<Obstacle> &obstacles) {
    // 遍历所有车道,寻找没有障碍物或障碍物距离安全的车道
    for (int lane = 0; lane < MAX_LANES; ++lane) {
        if (!isLaneBlocked(obstacles, lane)) {
            return lane;
        }
    }
    return -1; // 如果所有车道都被阻塞,返回-1
}

bool isLaneBlocked(const std::vector<Obstacle> &obstacles, int lane) {
    // 检查指定车道是否有障碍物
    for (const auto &obstacle : obstacles) {
        if (obstacle.isInLane(lane)) {
            return true;
        }
    }
    return false;
}
2. 路径-速度迭代算法

在Frenet坐标系下,EM Planner采用了路径-速度迭代算法。这一过程涉及两步:首先,算法基于当前车辆状态和环境信息,通过迭代优化求解最优路径。然后,算法利用上一帧的速度规划信息来指导下一帧的路径规划,形成一个闭

Emplanner算法是一种用于解决多目标规划问题的算法。多目标规划问题是一类在给定多个目标函数和约束条件下,寻找多个最优解的优化问题。 Emplanner算法基于进化计算的思想,使用群体智能算法进行求解。它的核心思想是通过不断地迭代,逐步优化解的质量,直到找到一组近似最优解。 该算法的基本步骤如下: 1. 初始化种群:随机生成一组可行解,作为初始种群。 2. 评估适应度:计算每个个体在目标函数下的适应度值。 3. 选择操作:根据适应度值,选择一定数量的个体作为父代。 4. 交叉操作:使用交叉算子对选出的父代进行交叉操作,生成一定数量的子代。 5. 变异操作:对子代进行变异操作,引入新的搜索空间。 6. 更新种群:将父代和子代合并,更新种群。 7. 重复步骤2-6,直到达到停止条件。 在Emplanner算法中,适应度值用于评估每个个体的解的质量。通常情况下,适应度值的计算基于目标函数的值,如果目标函数的值越小,适应度值越高。 通过一系列的迭代,Emplanner算法能够不断搜索近似最优解空间,提供一组解决多目标规划问题的有效解。它的优势在于不依赖于问题的具体形式和数学模型,具有灵活性和鲁棒性。 总之,Emplanner算法是一种用于解决多目标规划问题的进化计算算法,通过优化解的质量,寻找一组近似最优解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值