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

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() , 默认值如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/434575.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用yum为centos系统安装软件以及使用(包含阿里云yum源配置)

centos系统配置阿里云yum源 因为centos7官方停止维护&#xff0c;自带yum源用不了了&#xff0c;所以可以更换成阿里云yum源 方法&#xff1a; 使用root权限执行以下语句 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo CentOS…

番外篇 | 复现AC-YOLOv5,进行自动化织物缺陷检测

前言:Hello大家好,我是小哥谈。我们提出了一种基于AC-YOLOv5的新型纺织缺陷检测方法。将空洞空间金字塔池化(ASPP)模块引入YOLOv5主干网络中,提出了squeeze-and-excitation(CSE)通道注意力模块,并将其引入到YOLOv5主干网络中。🌈 目录 🚀1.基础概念 🚀2.添…

一文上手Kafka【中】

一、发送消息细节 在发送消息的特别注意: 在版本 3.0 中&#xff0c;以前返回 ListenableFuture 的方法已更改为返回 CompletableFuture。为了便于迁移&#xff0c;2.9 版本添加了一个方法 usingCompletableFuture&#xff08;&#xff09;&#xff0c;该方法为 CompletableFu…

【韩顺平Java笔记】第2章:Java概述

按视频的标号来对应小标题&#xff0c;自用学习笔记 文章目录 5. 内容梳理6. 程序举例6.1 什么是程序 7. Java故事7.1 Java诞生小故事7.2 Java技术体系平台 8. Java特性8.1 Java重要特点 9. sublime10. jdk介绍10.1 Java运行机制及运行过程10.1.1 Java虚拟机&#xff08;JVM&a…

【Python】多个dataframe存入excel的不同的sheet表里,而不会被覆盖的方法

我发现&#xff0c;我原来用的多个工作簿存入的方法&#xff0c;发现不太可行&#xff0c;如果我用原来的方法&#xff0c;然后for循环&#xff0c;新的dataframe会把原来的覆盖掉&#xff0c;然后只剩下一个工作薄。原先的代码&#xff1a; with pd.ExcelWriter(file_name ) …

【题解】2022ICPC杭州-K

翻译 原题链接   简述一下就是每次询问重新定义一个字母排序表&#xff0c;问在这个顺序下n个字符串的序列的逆序数是多少。 字典树计算逆序数 先考虑初始状况下&#xff0c;即 a < b < . . . < z a<b<...<z a<b<...<z的情况下&#xff0c;逆序…

[SAP ABAP] 锁对象

在SAP中使用锁对象&#xff0c;用于避免在数据库中插入或更改数据时出现不一致的情况 1.创建锁对象 数据准备 学校表(ZDBT_SCH_437) 使用事务码SE11创建锁对象 点击"锁对象"单选按钮&#xff0c;输入以E开头的锁定对象的名称&#xff0c;然后点击创建按钮 锁对象名…

看480p、720p、1080p、2k、4k、视频一般需要多大带宽呢?

看视频都喜欢看高清&#xff0c;那么一般来说看电影不卡顿需要多大带宽呢&#xff1f; 以4K为例&#xff0c;这里引用一位网友的回答&#xff1a;“视频分辨率4092*2160&#xff0c;每个像素用红蓝绿三个256色(8bit)的数据表示&#xff0c;视频帧数为60fps&#xff0c;那么一秒…

基于VUE的在线茶叶购物网站的设计与实现后端SpringBoot数据库MySQL

目录 1. 项目结构规划 2. 技术选型与工具链 3. 关键功能模块设计 4. 数据库设计 5. 安全性考虑 6. 性能优化建议 在开发一个在线茶叶购物网站之前&#xff0c;了解相关的研究背景和技术发展趋势是非常重要的。以下是一些关键点&#xff0c;可以帮助理解该项目的开发背景和…

召回07 双塔模型——正负样本

正样本&#xff1a; 二八法则&#xff0c;少部分物品占据了大多数点击&#xff0c;会导致正样本大多是热门物品。以一定的概率抛弃一些热门物品&#xff0c;抛弃的概率与样本的点击次数正相关。 负样本&#xff1a; 简单负样本 上述简单负样本是从全体样本中抽样。其中&#…

Python编码系列—Python备忘录模式:掌握对象状态保存与恢复技术

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

[Redis][Zset]详细讲解

目录 0.前言1.常见命令1.ZADD2.ZCARD3.ZCOUNT4.ZRANGE5.ZREVRANGE6.ZRANGEBYSCORE7.ZPOPMAX8.BZPOPMAX9.ZPOPMIN10.BZPOPMIN11.ZRANK12.ZREVRANK13.ZSCORE14.ZREM15.ZREMRANGEBYRANK16.ZREMRANGEBYSCORE17.ZINCRBY 2.集合间操作1.有序集合的交集操作2.ZINTERSTORE3.有序集合的并…

H5响应式的文化传媒娱乐公司HTML网站模板源码

源码名称&#xff1a;响应式的文化传媒娱乐公司HTML网站模板源码 源码介绍&#xff1a;一款自适应H5文化传媒娱乐公司官网源码&#xff0c;源码带有6个H5页面&#xff0c;可用于文化传媒和娱乐公司官网。 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.51888w.c…

Netty系列-5 Netty启动流程

背景 Netty程序有固定的模板格式&#xff0c;以ServerBootstrap为例: public class NettyServer {public void start(int port) {ServerBootstrap serverBootstrap new ServerBootstrap();EventLoopGroup boosGroup new NioEventLoopGroup(1);EventLoopGroup workGroup ne…

Kubernetes配置管理(kubernetes)

实验环境&#xff1a; 在所有节点上拉取镜像&#xff1b;然后把资源清单拉取到第一个master节点上&#xff1b; 同步会话&#xff0c;导入镜像&#xff1a; configmap/secret 配置文件的映射 变量&#xff1a; 基于valuefrom的方式 cm--》pod 特点&#xff1a;变量的名称可…

[JavaEE] IP协议

目录 一、 IP协议 1.1 基本概念 1.2 协议头格式 1.3 特殊IP 二、 地址管理 2.1 网段划分 2.2 CIDR(Classless Interdomain Routing) 2.3 私有IP地址和公网IP地址 2.4 NAT(Network Address Translation)-网络地址转换 2.5 路由选择 三、数据链路层 3.1 认识以太网 3…

什么是AQS

目录 AQS 介绍 原理 以可重入的互斥锁 ReentrantLock 为例 以倒计时器 CountDownLatch 以例 AQS 资源共享方式 实现自定义同步器 示例 性能优化 AQS 介绍 AQS &#xff08;AbstractQueuedSynchronizer &#xff09;&#xff0c;抽象队列同步器。AQS 是一个功能强大且…

cmd命令大全详解

CMD是Windows操作系统中的命令行解释器&#xff0c;它允许用户通过键入命令来执行各种操作。以下是一些常用的CMD命令及其简要说明&#xff1a; dir - 显示目录中的文件和子目录。 cmddir cd - 更改当前目录。 cmdcd [目录路径] mkdir - 创建新目录。 cmdmkdir [目录名] rmd…

Vue.js 与 Flask/Django 后端配合开发实战

Vue.js 与 Flask/Django 后端配合开发实战 在现代的 Web 开发中&#xff0c;前后端分离已成为一种主流架构&#xff0c;其中前端使用 Vue.js 等流行的框架&#xff0c;后端采用 Flask 或 Django 提供 API 接口。在这种开发模式下&#xff0c;前端负责页面的交互和动态效果&…

将Mixamo的模型和动画导入UE5

首先进入Mixamo的官网 , 点击 Character 选择一个模型 (当然你也可以自己上传模型/绑定动画) 然后点击下载 , 这个作为带骨骼的模型 选择FBX格式 , T Pose 直接下载 点击 Animations 选择动画 , 搜索 idle 默认站立动画 点击下载 , 格式选择 FBX , 不带模型只要骨骼 , 帧数选6…