当前位置: 首页 > news >正文

Apollo9.0 Planning2.0决策规划算法代码详细解析 (4): PlanningComponent::Proc()

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

欢迎来到《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决策规划算法代码详细解析》专栏,与我们一起探索自动驾驶技术的无限可能,共同推动自动驾驶技术的未来发展!

一、PlanningComponent::Proc() 简介

PlanningComponent::Proc() 作为整个planning 模块的入口,每个planning周期都会执行一次,主要提供以下一些功能:

  1. CheckRerouting() 重新路由判断
  2. 更新local_view_,local_view_中包含一次planning需要的所有外部信息
  3. CheckInput() 检查输入
  4. 规划器进行规划,并给输出轨迹赋值
  5. 更新轨迹的时间戳,并且发布轨迹

二、PlanningComponent::CheckRerouting() 重新路由判断

PlanningComponent::CheckRerouting()函数读取 planning的结果,判断是否需要重新规划routing,如果需要重新routing,调用rerouting_client_发送rerouting请求;

void PlanningComponent::CheckRerouting() {auto* rerouting = injector_->planning_context()->mutable_planning_status()->mutable_rerouting();if (!rerouting->need_rerouting()) {return;}common::util::FillHeader(node_->Name(),rerouting->mutable_lane_follow_command());auto lane_follow_command_ptr =std::make_shared<apollo::external_command::LaneFollowCommand>(rerouting->lane_follow_command());rerouting_client_->SendRequest(lane_follow_command_ptr);rerouting->set_need_rerouting(false);
}

三、更新local_view_

local_view_中包含一次planning需要的所有外部信息:

struct LocalView {std::shared_ptr<prediction::PredictionObstacles> prediction_obstacles;std::shared_ptr<canbus::Chassis> chassis;std::shared_ptr<localization::LocalizationEstimate> localization_estimate;std::shared_ptr<perception::TrafficLightDetection> traffic_light;std::shared_ptr<relative_map::MapMsg> relative_map;std::shared_ptr<PadMessage> pad_msg;std::shared_ptr<storytelling::Stories> stories;std::shared_ptr<PlanningCommand> planning_command;std::shared_ptr<routing::LaneWaypoint> end_lane_way_point;
};

更新前:

更新后:

local_view_.planning_command为例,语法细节如下:

local_view_.planning_command =std::make_shared<PlanningCommand>(planning_command_);

在这段代码中,local_view_.planning_command 被赋予了一个新的std::shared_ptr<PlanningCommand>,该指针指向一个通过 std::make_shared<PlanningCommand> 新创建的 PlanningCommand 对象。这个新对象是通过拷贝构造函数从 planning_command_ 初始化而来的。

具体步骤如下:

  1. 内存分配和对象构造std::make_shared<PlanningCommand>(planning_command_) 调用会首先分配一块足够大的内存区域来同时存储 PlanningCommand 对象和与之关联的引用计数(以及可能的控制块,用于存储删除器等)。然后,在这块内存上构造一个 PlanningCommand 对象,作为参数传递的 planning_command_ 被用作这个新对象的拷贝源。

  2. 智能指针初始化:构造好的 PlanningCommand 对象地址被传递给 std::shared_ptr<PlanningCommand> 的构造函数,从而创建一个管理这个新对象的智能指针。此时,引用计数被初始化为1,表示有一个 std::shared_ptr 实例(即我们刚刚创建的)正在指向这个对象。

  3. 赋值操作:最后,这个新创建的 std::shared_ptr<PlanningCommand> 被赋值给 local_view_.planning_command。如果 local_view_.planning_command 之前已经指向了一个 PlanningCommand 对象,那么那个对象的引用计数会递减(如果递减到0,则对象会被自动删除)。然后,local_view_.planning_command 开始指向新创建的对象。

需要注意的是,由于 std::make_sharedstd::shared_ptr 的使用,这段代码是线程安全的(在赋值操作本身这一层面,但前提是 local_view_planning_command_ 的访问已经被适当地同步了,比如通过互斥锁)。此外,它也符合RAII(资源获取即初始化)原则,因为智能指针的构造函数会自动管理资源的获取(在这里是对象的创建和内存的分配),而析构函数则会在适当的时候(比如智能指针离开其作用域时)自动释放资源(在这里是减少引用计数并在必要时删除对象)。

还有一点很重要,就是 PlanningCommand 类必须有一个可访问的拷贝构造函数,因为 std::make_shared 在这里使用了它来从 planning_command_ 创建新对象。如果 PlanningCommand 是不可拷贝的(即它的拷贝构造函数被删除或声明为 delete),那么这段代码将无法编译。

四、PlanningComponent::CheckInput() 检查输入

bool PlanningComponent::CheckInput() {ADCTrajectory trajectory_pb;auto* not_ready = trajectory_pb.mutable_decision()->mutable_main_decision()->mutable_not_ready();if (local_view_.localization_estimate == nullptr) {not_ready->set_reason("localization not ready");} else if (local_view_.chassis == nullptr) {not_ready->set_reason("chassis not ready");} else if (HDMapUtil::BaseMapPtr() == nullptr) {not_ready->set_reason("map not ready");} else {// nothing}if (FLAGS_use_navigation_mode) {if (!local_view_.relative_map->has_header()) {not_ready->set_reason("relative map not ready");}} else {if (!local_view_.planning_command ||!local_view_.planning_command->has_header()) {not_ready->set_reason("planning_command not ready");}}if (not_ready->has_reason()) {AINFO << not_ready->reason() << "; skip the planning cycle.";common::util::FillHeader(node_->Name(), &trajectory_pb);planning_writer_->Write(trajectory_pb);return false;}return true;
}

五、调用规划器进行规划,并给输出轨迹赋值

  ADCTrajectory adc_trajectory_pb;planning_base_->RunOnce(local_view_, &adc_trajectory_pb);auto start_time = adc_trajectory_pb.header().timestamp_sec();common::util::FillHeader(node_->Name(), &adc_trajectory_pb);

 默认的planning_base_是OnLanePlanning,数据结构如下:

六、更新轨迹的时间戳,并且发布轨迹

  const double dt = start_time - adc_trajectory_pb.header().timestamp_sec();for (auto& p : *adc_trajectory_pb.mutable_trajectory_point()) {p.set_relative_time(p.relative_time() + dt);}planning_writer_->Write(adc_trajectory_pb);

相关文章:

Apollo9.0 Planning2.0决策规划算法代码详细解析 (4): PlanningComponent::Proc()

&#x1f31f; 面向自动驾驶规划算法工程师的专属指南 &#x1f31f; 欢迎来到《Apollo9.0 Planning2.0决策规划算法代码详细解析》专栏&#xff01;本专栏专为自动驾驶规划算法工程师量身打造&#xff0c;旨在通过深入剖析Apollo9.0开源自动驾驶软件栈中的Planning2.0模块&am…...

AAA Redis的过期删除策略+缓存雪崩+缓存一致性问题

目录 一、三种删除策略比较 二、缓存雪崩缓存击穿缓存穿透 三、缓存一致性 Redis学习笔记 一、三种删除策略比较 内存占用CPU占用特征定时删除节约内存&#xff0c;无占用不分时段占用CPU资源&#xff0c;频度高时间换空间惰性删除内存占用严重延时执行&#xff0c;CPU利用…...

成都跃享未来教育咨询有限公司抖音小店:引领教育咨询新风尚

在数字化浪潮席卷全球的今天&#xff0c;教育咨询行业正经历着前所未有的变革。成都跃享未来教育咨询有限公司&#xff0c;作为教育行业的一颗璀璨新星&#xff0c;凭借其前瞻性的教育理念与创新的运营模式&#xff0c;在抖音平台上开设了小店&#xff0c;不仅为广大学子及家长…...

【堆排】为何使用向下调整法建堆比向上调整法建堆更好呢?

文章目录 前言一、堆排代码一、计算使用向上调整法建堆的时间复杂度二、计算使用向下调整法插入的时间复杂度总结 前言 在博主的上一篇博客堆排(链接在这里点击即可)的总结中提出啦使用向下调整法建堆比使用向上调整法建堆更好&#xff0c;是因为使用向上调整法建堆的时间复杂…...

在Stable Diffusion WebUI中安装SadTalker插件时几种错误提示的处理方法

SD中的插件一般安装比较简单&#xff0c;但也有一些插件安装会比较难。比如我在安装SadTalker时&#xff0c;就遇到很多问题&#xff0c;一度放弃了&#xff0c;后来查了一些网上攻略&#xff0c;自己也反复查看日志&#xff0c;终于解决&#xff0c;不吐不快。 一、在Stable …...

使用ffmpeg合并视频和音频

使用ffmpeg合并视频和音频 - 哔哩哔哩 简介 FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec&#xff0…...

周末总结(2024/10/05)

工作 人际关系核心实践&#xff1a; 要学会随时回应别人的善意&#xff0c;执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己&#xff0c;抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内&#xff0c;职场社交不要放在5min以外 职场的人际关系在面对利…...

在Ubuntu中自动挂载SMB/CIFS共享

文章目录 0. 引言1. 使用credentials文件存储认证信息2. 挂载点的准备3. 必要软件的安装4. 调整挂载参数5. 测试挂载6. 日志调试 0. 引言 本文是自己挂载共享磁盘的实践记录&#xff0c;将详细介绍如何在Linux系统中配置自动挂载SMB/CIFS共享&#xff0c;并提供一些常见问题的…...

pWnOS2.0 靶机渗透( cms 渗透,php+mysql 网站渗透,密码碰撞)

pWnOS2.0 靶机渗透( ) 靶机介绍 vulnhub 靶机 本地搭建 由于靶机特性&#xff0c;靶机网卡位nat模式扫不到&#xff0c;原来需要改 nat 的地址 参考方法 https://blog.csdn.net/Bossfrank/article/details/131415257 作者主页 https://blog.csdn.net/Bossfrank?typeblog P…...

【AI】AIOT简介

随着技术的快速发展&#xff0c;人工智能AI和物联网IoT已经成为当今最热门的技术领域。AIOT是人工智能和物联网的结合&#xff0c;使物联网设备更加智能化&#xff0c;能够进行自主决策和学习的技术。 通过物联网产生、收集来自不同维度的、海量的数据存储于云端、边缘端&#…...

picgo + typora + gitee图床

Picgo打造个人图床&#xff0c;稳定又安全 解决Typora笔记上传到CSDN图片无法显示的问题 typora中...

【路径规划】多机器人路径规划

摘要 多机器人路径规划在现代自动化、仓储管理及智能交通系统中有着广泛的应用。本文提出了一种基于A*算法的多机器人路径规划方法&#xff0c;旨在解决多机器人在同一环境中的路径冲突问题。通过采用启发式搜索和路径优化策略&#xff0c;机器人能够在保持避障的前提下实现最…...

深度学习Day-35:One-hot独热编码

&#x1f368; 本文为&#xff1a;[&#x1f517;365天深度学习训练营] 中的学习记录博客 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制] 一、 独热编码原理 独热编码&#xff08;One-Hot Encoding&#xff09;是一种将分类数据转换为二进制向量的方法&#…...

Streamlit 实现登录注册验证

在开发基于 Streamlit 的应用时&#xff0c;用户认证功能是一个常见需求。本文将介绍如何通过两种方式来实现登录注册功能&#xff1a;手动实现 和 使用 Streamlit-Authenticator 库。手动实现虽然灵活&#xff0c;但需要自行处理密码加密、验证等细节&#xff1b;而 Streamlit…...

ASP.NET Zero 多租户介绍

ASP.NET Zero 是一个基于 ASP.NET Core 的应用程序框架&#xff0c;它提供了多租户支持&#xff0c;以下是关于 ASP.NET Zero 多租户的介绍&#xff1a; 一、多租户概念 多租户是一种软件架构模式&#xff0c;允许多个客户&#xff08;租户&#xff09;共享同一套软件应用程序…...

【60天备战2024年11月软考高级系统架构设计师——第29天:微服务架构——微服务的优缺点】

微服务架构通过将大型单体应用拆分为多个独立的小型服务&#xff0c;使系统具备灵活性、可扩展性和独立部署的优势。但与此相伴的是复杂的运维和开发管理挑战。因此&#xff0c;在选择微服务架构时&#xff0c;架构师需仔细权衡其优势与劣势。 微服务架构的优点 独立部署&…...

读论文、学习时 零碎知识点记录01

1.入侵检测技术 2.深度学习、机器学习相关的概念 ❶注意力机制 ❷池化 ❸全连接层 ❹Dropout层 ❺全局平均池化 3.神经网络中常见的层...

图解C#高级教程(一):委托

什么是委托 可以认为委托是持有一个或多个方法的对象。但它与对象不同&#xff0c;因为委托可以被执行。当执行委托时&#xff0c;委托会执行它所“持有”的方法。先看一个完整的使用示例。 // See https://aka.ms/new-console-template for more informationdelegate void M…...

CMSIS-RTOS V2封装层专题视频,一期视频将常用配置和用法梳理清楚,适用于RTX5和FreeRTOS(2024-09-28)

【前言】 本期视频就一个任务&#xff0c;通过ARM官方的CMSIS RTOS文档&#xff0c;将常用配置和用法给大家梳理清楚。 对于初次使用CMSIS-RTOS的用户来说&#xff0c;通过梳理官方文档&#xff0c;可以系统的了解各种用法&#xff0c;方便大家再进一步的自学或者应用&#x…...

渗透测试入门学习——使用python脚本自动识别图片验证码,OCR技术初体验

写在前面 由于验证码在服务端生成后存储在服务器的session中&#xff0c;而标用于标识用户身份的sessionid存在于用户cookie中 所以本次识别验证码时需要用requests.session()创建会话对象&#xff0c;模拟真实的浏览器行为&#xff0c;保持与服务器的会话才能获取登录时服务…...

Nano-vLLM 源码解读 - 9. 抢占机制

nano-vllm 用千行代码拆解 vLLM 核心,是读懂大模型推理最快的捷径。 L07 第 5 节讲过 schedule() 的 decode 分支大致结构,其中提到一句:“decode 在块边界处可能装不下,装不下就走 preempt”,当时把细节明确推迟到本节。 那段代码不到 10 行,却同时回答三个问题:decode 在什么…...

# 040、实战项目五:多 Agent 协作系统 —— 项目经理、开发者、测试者角色模拟

从一次凌晨三点的事故说起 去年做智能客服系统重构&#xff0c;我犯了个低级错误——让单个Agent既写代码又自测。结果上线当天&#xff0c;它把“用户退款”的SQL写成了DELETE FROM orders WHERE status‘refund’&#xff0c;还自信满满地标注“测试通过”。凌晨三点被运维电…...

语义搜索实战:从关键词到向量检索

本文面向&#xff1a;想深入理解语义搜索实现原理的开发者。 预计阅读时间&#xff1a;10 分钟 关键词搜索已经够用了&#xff1f;试试搜"怎么解决数据库死锁"——你可能漏掉所有标题写"SQLite WAL mode"、"并发写入冲突"的笔记。语义搜索能跨越…...

HLS行为差异测试:挑战与LLM驱动的解决方案

1. 高层次综合(HLS)行为差异测试的挑战与机遇在AI计算和边缘计算快速发展的今天&#xff0c;FPGA因其可重构性和并行计算能力&#xff0c;成为硬件加速的重要选择。高层次综合(High-Level Synthesis, HLS)技术允许开发者使用C/C等高级语言编写算法&#xff0c;然后自动转换为硬…...

给Hadoop初学者的环境搭建备忘录:为什么你的JDK配置总在重启后‘消失’?(Linux基础解惑)

Hadoop环境搭建中的Linux系统原理&#xff1a;为什么你的配置总在重启后"消失"&#xff1f; 很多Hadoop初学者在搭建开发环境时&#xff0c;都会遇到一个令人困惑的问题&#xff1a;明明按照教程一步步配置好了JDK和Hadoop&#xff0c;为什么重启后环境变量就"消…...

告别Minecraft模组英文界面:MASA全家桶汉化包完全指南

告别Minecraft模组英文界面&#xff1a;MASA全家桶汉化包完全指南 【免费下载链接】masa-mods-chinese 一个masa mods的汉化资源包 项目地址: https://gitcode.com/gh_mirrors/ma/masa-mods-chinese 你是否曾经在Minecraft中面对满屏的英文模组界面感到困惑&#xff1f;…...

从飞思卡尔智能车竞赛视频拆解嵌入式系统设计:感知、控制与工程实践

1. 项目概述&#xff1a;从一场竞赛视频看智能车设计的核心逻辑最近在整理资料时&#xff0c;翻到了当年飞思卡尔智能车竞赛&#xff08;现为全国大学生智能汽车竞赛&#xff09;中湖南大学参赛队伍的一些视频资料。这些视频&#xff0c;无论是官方发布的比赛实录&#xff0c;还…...

使用openclaw配置taotoken实现自动化agent工作流的实践指南

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用OpenClaw配置Taotoken实现自动化Agent工作流的实践指南 1. 概述&#xff1a;OpenClaw与Taotoken的集成价值 OpenClaw是一个用…...

从零构建Sora 2-DaVinci双引擎协同工作站:Intel Xeon W9-3400系列+RTX 6000 Ada专属散热/供电/PCIe拓扑配置清单(附实测带宽衰减曲线)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Sora 2与DaVinci整合的架构演进与协同范式 Sora 2作为新一代多模态时序生成引擎&#xff0c;其核心能力已从单向视频合成跃迁至具备物理感知、因果推理与跨模态对齐的闭环生成范式。DaVinci则持续强化其在专业…...

别再只用默认配置了!GaussDB密码安全策略的这8个参数,DBA必须知道怎么调

GaussDB密码安全策略深度实战&#xff1a;8个关键参数配置指南 在数据库安全管理中&#xff0c;密码策略往往是最容易被忽视却又最常被攻击利用的薄弱环节。许多DBA习惯性地沿用数据库默认配置&#xff0c;殊不知这些默认值可能无法满足企业实际安全需求。GaussDB作为企业级分布…...