《从0开始搭建实现apollo9.0》系列八 泊车模块解读

2024-06-01 12:36

本文主要是介绍《从0开始搭建实现apollo9.0》系列八 泊车模块解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《从0开始搭建实现apollo9.0》系列八 泊车模块解读
泊车规划模块位置

modules/planning/scenarios/valet_parking/

泊车阶段的开始条件:

  1. planning command里存在泊车命令
  2. 距离泊车点距离parking_spot_range_to_start以内

配置文件
pipeline.pb.txt可以看到泊车分为两个阶段,一个是ApproachingParking,一个是Parking。其中ApproachingParking可以当作是一个行车的过程,引导车辆沿主路行驶到泊车位,行车的终点为泊车车位。Parking为泊入车位过程,包括可行驶区域构建,轨迹生成,轨迹分类(档位切换),轨迹决策。

stage: {name: "VALET_PARKING_APPROACHING_PARKING_SPOT"type: "StageApproachingParkingSpot"enabled: true
stage: {name: "VALET_PARKING_PARKING"type: "StageParking"

scenario_conf.pb.txt中定义了参数

parking_spot_range_to_start: 20.0
max_valid_stop_distance: 1.0

一个为stage切换判断的距离,一个是stop距离。
valet_parking_scenario.h

class ValetParkingScenario : public Scenario {//继承基类Scenario   重写基类中的成员函数public:bool Init(std::shared_ptr<DependencyInjector> injector,const std::string& name) override;/*** @brief Get the scenario context.*/ValetParkingContext* GetContext() override { return &context_; }bool IsTransferable(const Scenario* const other_scenario,const Frame& frame) override;private:static bool SearchTargetParkingSpotOnPath(//不确定为何使用static类型const hdmap::Path& nearby_path, const std::string& target_parking_id,hdmap::PathOverlap* parking_space_overlap);static bool CheckDistanceToParkingSpot(const Frame& frame, const common::VehicleState& vehicle_state,const hdmap::Path& nearby_path, const double parking_start_range,const hdmap::PathOverlap& parking_space_overlap);private:bool init_ = false;ValetParkingContext context_;const hdmap::HDMap* hdmap_ = nullptr;
};

#静态成员函数知识点:

归属 : 在 C++ 类中 , 静态成员函数 是一种 特殊的函数 , 该函数属于类 , 而不是属于 类实例对象 ;
静态成员函数调用不依赖于对象 : 即使 没有创建 类 的 实例对象 , 也可以 通过 类名:: 调用 类中定义的 静态成员函数 ;
静态成员函数作用 : 静态成员函数 通常用于 执行与类本身相关的操作 , 执行该函数 不涉及到 类实例对象中的信息 , 也不能在 静态成员函数 中访问 普通的 成员变量 和 成员函数 ;
//静态函数的特点
//1.静态函数无需生成对象就可被调用
//2.静态函数不能直接调用非静态的成员变量
//3.不能使用this引用
IsTransferable函数用于判断other_scenario是否能够转移到当前的Scenario中,代码做了以下判断:

  1. planning command里存在泊车命令和车位id
  2. 距离泊车点距离parking_spot_range_to_start以内
if (!frame.local_view().planning_command->has_parking_command()) {return false;}if (other_scenario == nullptr || frame.reference_line_info().empty()) {return false;}std::string target_parking_spot_id;if (frame.local_view().planning_command->has_parking_command() &&frame.local_view().planning_command->parking_command().has_parking_spot_id()) {target_parking_spot_id = frame.local_view().planning_command->parking_command().parking_spot_id();}

SearchTargetParkingSpotOnPath函数 确定具有当前位置到车位的路径;

if (!SearchTargetParkingSpotOnPath(nearby_path, target_parking_spot_id,&parking_space_overlap)) {ADEBUG << "No such parking spot found after searching all path forward ""possible"<< target_parking_spot_id;return false;}double parking_spot_range_to_start =context_.scenario_config.parking_spot_range_to_start();if (!CheckDistanceToParkingSpot(frame, vehicle_state, nearby_path,parking_spot_range_to_start,parking_space_overlap)) {ADEBUG << "target parking spot found, but too far, distance larger than ""pre-defined distance"<< target_parking_spot_id;return false;}

CheckDistanceToParkingSpot 函数确定目标停车点距离在parking_spot_range_to_start范围内,使用delata_s来进行判断。

if (std::abs(center_point_s - vehicle_point_s) < parking_start_range) {return true;}

Stage1:StageApproachingParkingSpot

Stage2:StageParking

StageResult StageParking::Process(const common::TrajectoryPoint& planning_init_point, Frame* frame) {// Open space planning doesn't use planning_init_point from upstream because// of different stitching strategyauto scenario_context = GetContextAs<ValetParkingContext>();frame->mutable_open_space_info()->set_is_on_open_space_trajectory(true);//确保在open_space中*(frame->mutable_open_space_info()->mutable_target_parking_spot_id()) =//具有车位idscenario_context->target_parking_spot_id;StageResult result = ExecuteTaskOnOpenSpace(frame);//进行task状态机if (result.HasError()) {AERROR << "StageParking planning error";return result.SetStageStatus(StageStatusType::ERROR);}return result.SetStageStatus(StageStatusType::RUNNING);
}

这篇关于《从0开始搭建实现apollo9.0》系列八 泊车模块解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1021030

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl