Apollo10.0学习——planning模块(10)之依赖注入器injector_

好不好奇injector_是干什么用的?为什么planning每个模块都要初始化这个变量?


类功能概述

DependencyInjector(依赖注入器)是一个 集中管理规划模块关键数据和服务 的容器类。它通过提供统一的访问接口,解耦各个组件之间的直接依赖关系,实现以下目标:

  • 资源集中管理:避免模块内部重复创建对象,简化生命周期管理。
  • 数据一致性:确保不同算法组件访问的是同一份上下文数据。
  • 可测试性:方便在单元测试中替换 Mock 对象注入。

代码逐行解析

1. 命名空间与类定义
namespace apollo {
namespace planning {class DependencyInjector {public:DependencyInjector() = default;  // 默认构造函数~DependencyInjector() = default; // 默认析构函数
  • 作用域:归属于 Apollo 的 planning 命名空间,标识为规划模块专用。
  • 构造函数/析构函数:使用编译器默认生成版本,所有成员变量自动构造/析构。

2. 公有成员方法(访问接口)
  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_; }
  • 功能:提供对私有成员变量的 指针访问(注意此处是指针,不是引用)。
  • 接口用途
    • planning_context(): 获取规划上下文(如当前决策状态、障碍物交互信息)。
    • frame_history(): 获取历史帧数据(用于轨迹预测或回滚)。
    • history(): 全局历史记录(长期驾驶行为分析)。
    • ego_info(): 自车动态信息(位置、速度、航向等)。
    • vehicle_state(): 车辆状态提供器(实时传感器数据融合结果)。
    • learning_based_data(): 学习模型输出数据(如深度学习预测的轨迹)。

3. 私有成员变量(依赖项实例)
 private:PlanningContext planning_context_;       // 规划上下文数据FrameHistory frame_history_;             // 帧历史缓存History history_;                        // 全局历史记录EgoInfo ego_info_;                       // 自车状态信息apollo::common::VehicleStateProvider vehicle_state_; // 车辆状态提供器LearningBasedData learning_based_data_;  // 学习模型数据
  • 关键成员说明
    • PlanningContext
      存储当前规划周期内的动态上下文,如:

      • 参考线选择状态
      • 障碍物的预测轨迹与交互优先级
      • 交通规则应用结果(如红灯停车、让行)
    • FrameHistory
      按时间戳缓存历史帧数据,用于:

      • 轨迹连续性检查(防止突变)
      • 回滚调试(重现规划失败场景)
      • 多帧信息融合(如滤波算法)
    • VehicleStateProvider
      提供实时车辆状态,数据来源于:

      • 底盘 CAN 信号(速度、转向角)
      • 定位模块(GNSS/RTK 位置)
      • IMU(加速度、角速度)

设计模式解析

依赖注入模式
  • 传统问题:模块内部直接创建依赖对象会导致:

    • 高耦合:组件难以独立替换或测试。
    • 资源竞争:多个实例可能导致数据不一致。
  • 解决方案

    • 单一容器DependencyInjector 集中管理所有依赖项。
    • 接口隔离:外部组件通过接口获取依赖,不关心实现细节。
  • Apollo 应用场景

    // 示例:规划算法中获取车辆状态
    void PlanningAlgorithm::Run() {auto vehicle_state = injector_->vehicle_state();double speed = vehicle_state->linear_velocity();
    }
    

线程安全与数据同步
  • 潜在问题:多线程环境下,不同组件可能同时读写同一依赖项。
  • Apollo 处理策略
    • 写时复制:关键数据(如 EgoInfo)更新时生成副本,避免锁竞争。
    • 时序控制:规划周期内依赖项状态冻结,确保一致性。

演进与扩展性

  • 新增依赖项:只需在 DependencyInjector 中添加成员变量和访问接口,无需修改已有代码。
  • 动态替换:通过子类化实现依赖项的动态替换(如测试专用注入器)。

与 Apollo 其他模块的交互

  • 定位模块VehicleStateProvider 依赖定位数据更新。
  • 感知模块PlanningContext 整合感知障碍物信息。
  • 控制模块:最终规划轨迹通过 DependencyInjector 共享给控制模块执行。

通过这种设计,Apollo 的规划模块实现了 高内聚、低耦合 的架构,为复杂的自动驾驶决策规划提供了高效可靠的基础设施。

详细代码:

namespace apollo {
namespace planning {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_;
};}  // namespace planning
}  // namespace apollo

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

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

相关文章

关于vue彻底删除node_modules文件夹

Vue彻底删除node_modules的命令 vue的node_modules文件夹非常大,常规手段根本无法删除. 解决方法: 在node_modules文件夹所在的路径运行命令窗口,并执行下面的命令. npm install rimraf -g rimraf node_modules说明: npm install rimraf -g 该命令是安装 node…

MCTS-RAG:通过树搜索重塑小模型中的检索增强生成(RAG)

https://arxiv.org/pdf/2503.20757v1这篇论文提出了MCTS-RAG框架,用于解决小型语言模型在知识密集型任务上的推理能力不足问题。具体来说, ​​MCTS-RAG框架​​:MCTS-RAG通过迭代地精炼检索和推理过程来工作。给定一个查询,它探…

数据结构:绪论之时间复杂度与空间复杂度

作者主页 失踪人口回归,陆续回三中。 开辟文章新专栏——数据结构,恳请各位大佬批评指正! 文章目录 作者主页 数据结构的基本知识数据:数据元素:数据对象:数据类型:数据结构:逻辑结…

位图算法——判断唯一字符

这道题有多种解法,可以创建hash数组建立映射关系判断,但不用新的数据结构会加分,因此我们有“加分”办法——用位图。 我们可以创建一个整型变量(32位)而一共才26个字母,所以我们只要用到0-25位即可&#…

深度学习之-目标检测算法汇总(超全面)

YOLO目标检测改进 YOLO V1- YOLO V10: 点这进入https://www.researchgate.net/publication/381470743_YOLOv1_to_YOLOv10_A_comprehensive_review_of_YOLO_variants_and_their_application_in_the_agricultural_domain YOLO V11: YOLO11 🚀Ultralytics YOLO11 &…

软考中级软件设计师——计算机网络篇

一、计算机网络体系结构 1.OSI七层模型 1. 物理层(Physical Layer) 功能:传输原始比特流(0和1),定义物理介质(如电缆、光纤)的电气、机械特性。 关键设备:中继器&#…

高等数学-空间中的曲线与曲面

一、 向量的数量积: 直线与直线的夹角: 直线与平面的夹角: 平面与平面的夹角(锐角): 方向余弦: 注:空间向量与坐标轴的夹角定义为向量与坐标轴正方向的夹角 例1: 二、 1、z0所…

使用计算机视觉实现目标分类和计数!!超详细入门教程

什么是物体计数和分类 在当今自动化和技术进步的时代,计算机视觉作为一项关键工具脱颖而出,在物体计数和分类任务中提供了卓越的功能。 无论是在制造、仓储、零售,还是在交通监控等日常应用中,计算机视觉系统都彻底改变了我们感知…

javaweb-html

1.交互流程: 浏览器向服务器发送http请求,服务器对浏览器进行回应,并发送字符串,浏览器能对这些字符串(html代码)进行解释; 三大web语言:(1)html&#xff1a…

图漾相机错误码解析

文章目录 1.相机错误码汇总2.常见报错码2.1 -1001报错2.1.1 没有找到相机2.1.2 SDK没有进行初始化2.1.3 相机不支持Histo属性 2.2 -1005报错2.2.1 跨网段打开相机2.2.2 旧版本SDK在软触发失败后提示的报错2.2.3 相机初始化上电时报错2.2.4 USB相机被占用 2.3 -1009报错2.3.1 相…

18. 结合Selenium和YAML对页面继承对象PO的改造

18. 结合Selenium和YAML对页面继承对象PO的改造 一、架构改造核心思路 1.1 改造前后对比 #mermaid-svg-ziagMhNLS5fIFWrx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ziagMhNLS5fIFWrx .error-icon{fill:#5522…

将VMware上的虚拟机和当前电脑上的Wifi网卡处在同一个局域网下,实现同一个局域网下实现共享

什么是桥接模式:桥接模式(Bridging Mode)是一种网络连接模式,常用于虚拟机环境中,将虚拟机的虚拟网络适配器直接连接到主机的物理网络适配器上,使虚拟机能够像独立的物理设备一样直接与物理网络通信 1.打开…

gitee错误处理总结

背景 如上图,根据图片中的 Git 错误提示,我们遇到的问题是 ​本地分支落后于远程分支,导致 git push 被拒绝。 ​问题原因​ 远程仓库的 master 分支有其他人推送的新提交,而您的本地 master 分支未同步这些更新(即本…

如何提高独立服务器的安全性?

独立服务器相对于其它服务器来说,整体的硬件设备都是独立的同时还有着强大的服务器性能,其中CPU设备能够决定着服务器的运算能力,所以独立服务器的安全性受到企业格外的重视,严重的话会给企业造成巨大的资金损失。 那么&#xff0…

Spark,集群搭建-Standalone

以下是 Spark Standalone 集群搭建 的详细步骤(基于 Linux 系统,以伪分布式为例): 一、环境准备 1. 硬件要求 - 至少 2 台节点(1 台 Master,1 台 Worker,可扩展)。 - 每节点配置…

如何在WordPress中使用ChatGPT

ChatGPT 自 2022 年 11 月问世以来,极大地影响了我们的创作方式。ChatGPT 可以帮助您制作大纲、标题、段落或完整的博客文章,各地的数字创作者都在热衷于使用人工智能(AI)创建内容。随着人工智能的不断发展,我们看到了…

spring5-配外部文件-spEL-工厂bean-FactoryBean-注解配bean

spring配外部文件 我们先在Spring里配置一个数据源 1.导c3p0包,这里我们先学一下hibernate持久化框架&#xff0c;以后用mybites. <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.2.…

GStreamer (三)常⽤插件

常⽤插件 1、Source1.1、filesrc1.2. videotestsrc1.3. v4l2src1.4. rtspsrc和rtspclientsink 2、 Sink2.1. filesink2.2. fakesink2.3. xvimagesink2.4. kmssink2.5. waylandsink2.6. rkximagesink2.7. fpsdisplaysink 3 、视频推流/拉流3.1. 本地推流/拉流3.1.1 USB摄像头3.1…

【EDA软件】【联合Modelsim仿真使用方法】

背景 业界EDA工具仿真功能是必备的&#xff0c;例如Vivado自带仿真工具&#xff0c;且无需联合外部仿真工具&#xff0c;例如MoodelSim。 FUXI工具仿真功能需要联合Modelsim&#xff0c;才能实现仿真功能。 方法一&#xff1a;FUXI联合ModelSim 1 添加testbench文件 新建to…

国产化Excel处理组件Spire.XLS for .NET系列教程:通过 C# 将 TXT 文本转换为 Excel 表格

在数据处理和管理场景中&#xff0c;将原始文本文件&#xff08;TXT&#xff09;高效转换为结构化的 Excel 电子表格是一项常见要求。对于那些需要自动生成报表或者处理日志文件的开发人员而言&#xff0c;借助 C# 实现 TXT 到 Excel 的转换工作&#xff0c;可以简化数据组织和…