Apollo Planning2.0决策规划算法代码详细解析 (3):PlanningComponent框架介绍

🌟 面向自动驾驶规划算法工程师的专属指南 🌟

欢迎来到《Apollo9.0 Planning2.0决策规划算法代码详细解析》专栏!本专栏专为自动驾驶规划算法工程师量身打造,旨在通过深入剖析Apollo9.0开源自动驾驶软件栈中的Planning2.0模块,帮助读者掌握自动驾驶决策规划算法的核心原理与实现细节。

🔍 VSCode+GDB:精准调试,洞悉代码逻辑 🔍

在自动驾驶算法的开发过程中,调试是至关重要的一环。本专栏将带你深入掌握VSCode+GDB这一强大的调试工具组合,让你能够逐行分析代码,精准定位问题,从而洞悉算法背后的逻辑与原理。通过实战演练,你将学会如何高效地利用调试工具,提升代码质量与开发效率。

💻 C++语法同步讲解:构建算法基石 💻

C++作为自动驾驶领域的主流编程语言,其重要性不言而喻。本专栏在解析算法代码的同时,将同步介绍C++语法,从基础到进阶,涵盖数据类型、控制结构、面向对象编程等核心知识点。通过系统学习,你将能够熟练运用C++语言编写高效、可维护的自动驾驶规划算法代码。

🚀 掌握自动驾驶PNC工程师从业能力 🚀

完成本专栏的学习后,你将具备自动驾驶PNC(规划、导航与控制)工程师的从业能力。你将能够深入理解自动驾驶决策规划算法的设计思路与实现方法,掌握Apollo9.0 Planning2.0模块的核心技术,为自动驾驶汽车的智能决策提供有力支持。

🚀 Apollo9.0 Planning2.0:探索自动驾驶技术前沿 🚀

Apollo9.0作为百度开源的自动驾驶软件栈,其Planning2.0模块在决策规划算法方面取得了显著进展。本专栏将带你深入探索Apollo9.0 Planning2.0的奥秘,揭秘其背后的算法原理与实现细节。通过系统学习,你将能够站在自动驾驶技术的前沿,为自动驾驶汽车的未来发展贡献力量。

🎉 立即加入,开启自动驾驶规划算法之旅 🎉

无论你是自动驾驶领域的初学者,还是有一定经验的工程师,本专栏都将为你提供宝贵的学习资源与实战机会。立即加入《Apollo9.0 Planning2.0决策规划算法代码详细解析》专栏,与我们一起探索自动驾驶技术的无限可能,共同推动自动驾驶技术的未来发展!

正文:

Apollo Planning 2.0的框架更新涉及多个方面,这些更新旨在提升自动驾驶系统的灵活性、可扩展性和性能。

以下是Apollo Planning 2.0 的框架图:

其中,Apollo的PlanningComponent在自动驾驶系统中扮演着至关重要的角色。其主要作用可以归纳为以下几点:

PlanningComponent功能介绍:

一、核心功能

1、决策规划:

  • PlanningComponent是自动驾驶系统中负责决策规划的组件。它基于来自其他模块(如预测、底盘和定位等)的输入信息,计算出车辆在未来一段时间内的行驶轨迹、速度、加速度等关键参数。
  • 这些规划结果将直接指导车辆的实际驾驶操作,确保车辆能够安全、高效地行驶。

2、事件触发机制:

  • PlanningComponent是一个事件触发的组件,即它不会持续运行,而是等待特定的事件或条件触发时才开始工作。这些事件通常包括同时收到预测、底盘和定位信息等。
  • 这种设计有助于减少不必要的计算资源消耗,并提高系统的响应速度和效率。

二、数据处理流程

1、输入数据检查:

  • 在进行决策规划之前,PlanningComponent会首先进行输入数据的检查,确保所有必要的数据都已正确接收并准备好。
  • 这些输入数据包括预测信息(如障碍物位置、速度等)、底盘信息(如车辆当前状态、控制指令等)和定位信息(如车辆位置、姿态等)。

2、数据融合与处理:

  • PlanningComponent会将这些输入数据进行融合和处理,以构建出一个全面的车辆行驶环境模型。
  • 这个模型将作为决策规划的基础,用于评估不同行驶策略的风险和收益,并选择出最优的行驶方案。

 3、决策规划与输出:

  • 基于构建的车辆行驶环境模型,PlanningComponent会进行决策规划,计算出车辆在未来一段时间内的行驶轨迹。
  • 这些规划结果将以特定的数据结构(如ADCTrajectory)输出给控制模块(Control Module),用于指导车辆的实际驾驶操作。

三、支持多种规划模式和场景

  • Apollo的PlanningComponent支持多种规划模式和场景,包括NaviPlanning(用于高速公路的导航规划)、OnLanePlanning(对高速公路以及城市道路的处理)和OpenSpacePlanning(主要处理自主泊车以及狭窄道路等场景)。
  • 这种灵活性使得Apollo自动驾驶系统能够适应不同的道路条件和驾驶需求,提供更加智能和安全的驾驶体验。

综上所述,Apollo的PlanningComponent是自动驾驶系统中不可或缺的一部分,它负责基于输入数据进行决策规划,并输出指导车辆实际驾驶操作的规划结果。通过支持多种规划模式和场景以及不断优化和改进算法和功能,Apollo的PlanningComponent为自动驾驶系统提供了强大的决策支持能力。

本文将重点解析PlanningComponent的init()函数。

PlanningComponent::init() 介绍

init()函数主要有以下几个重要功能:

一、初始化injector_

injector_ = std::make_shared<DependencyInjector>();

class DependencyInjector {

 public:

  DependencyInjector() = default;

  ~DependencyInjector() = default;


  PlanningContext* planning_context() { return &planning_context_; }

  FrameHistory* frame_history() { return &frame_history_; }

  History* history() { return &history_; }

  EgoInfo* ego_info() { return &ego_info_; }

  apollo::common::VehicleStateProvider* vehicle_state() {

   return &vehicle_state_;

  }

  LearningBasedData* learning_based_data() { return &learning_based_data_; }


 private:

  PlanningContext planning_context_;

  FrameHistory frame_history_;

  History history_;

  EgoInfo ego_info_;

  apollo::common::VehicleStateProvider vehicle_state_;

  LearningBasedData learning_based_data_;

};

DependencyInjector提供不同的planning模块运行所需要的所有信息。

DependencyInjector(依赖注入器)的设计模式 主要体现在依赖注入(Dependency Injection, 简称DI)的过程中。依赖注入是一种面向对象编程中的设计模式,其核心思想是将对象之间的依赖关系从对象内部移到对象外部,通过外部方式(如构造函数、setter方法或接口)将依赖项注入到对象中。DependencyInjector作为这一过程的执行者,扮演着至关重要的角色。

依赖注入器(DependencyInjector)的作用:

 1、创建和管理依赖实现:

  • DependencyInjector负责创建和管理依赖项的具体实现。这些依赖项可能是其他对象、服务或资源,它们在应用程序中被多个组件所共享或需要。

 2、注入依赖项:

  • DependencyInjector将创建好的依赖项注入到需要它们的对象中。这通常通过构造函数、setter方法或接口注入的方式实现。

 3、降低耦合度:

  • 通过将依赖关系从对象内部移到外部,并由DependencyInjector统一管理,可以显著降低对象之间的耦合度。这使得各个组件更加独立,易于维护和测试。

 4、 提高可扩展性和灵活性:

  • 当需要添加新的依赖项或替换现有的依赖项时,只需在DependencyInjector中进行相应的配置,而无需修改依赖项的使用者代码。这提高了系统的可扩展性和灵活性。

二、创建planning的实例,默认配置创建的是OnLanePlanning

三、创建planning 模块需要的reader和writter

planning_command_reader_ = node_->CreateReader<PlanningCommand>(

      config_.topic_config().planning_command_topic(),

     [this](const std::shared_ptr<PlanningCommand>& planning_command) {

        AINFO << "Received planning data: run planning callback."

             << planning_command->header().DebugString();

        std::lock_guard<std::mutex> lock(mutex_);

        planning_command_.CopyFrom(*planning_command);

     });


  traffic_light_reader_ = node_->CreateReader<TrafficLightDetection>(

      config_.topic_config().traffic_light_detection_topic(),

     [this](const std::shared_ptr<TrafficLightDetection>& traffic_light) {

        ADEBUG << "Received traffic light data: run traffic light callback.";

        std::lock_guard<std::mutex> lock(mutex_);

        traffic_light_.CopyFrom(*traffic_light);

     });

以planning_command_reader_ 为例,收到topic name是 config_.topic_config().planning_command_topic() 的信号后,调用回调函数给 planning_command_ 赋值,

其中,topic name 来自 config_.topic_config().planning_command_topic() , 默认值如下:

### 回答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
发出的红包

打赏作者

自动驾驶Player

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值