Apollo规划模块代码学习(2): 轨迹规划流程理论基础详解(lane follow场景为例)

news2024/12/27 13:35:10

文章目录

  • 1、轨迹规划基础
  • 2、Frenet坐标系
  • 3、路径规划和速度规划
  • 4、轨迹优化(QP过程)
  • 5、规划流程(lane follow场景为例)
    • 1、规划模块流程
    • 2、Apollo中各场景
    • 3、Lane_follow场景中task

本文以具体场景Lane follow为例梳理具体的轨迹规划算法流程。详细介绍轨迹规划重要基础:Frenet坐标系列、路径规划速度规划、轨迹平滑算法原理。

1、轨迹规划基础

对于规划问题,本质上就是在(x,y,t)这个三维空间内搜索出一条可行的序列,能够满足舒适性及安全性。Apollo中是将三维空间坐标转换到Frenet坐标系中,即规划问题解耦合成路径规划(SL)和速度规划(ST)两个一维的优化问题,对其分别进行求解。

两者思路都是先将障碍物映射到S-L/S-T二维空间,先用动态规划等方法搜索可行使的凸空间,再用二次规划或者非线性优化方法进行优化。最后将速度曲线和路径轨迹进行融合得到每一时刻的轨迹点,输入到控制模块中。

2、Frenet坐标系

给定一条平滑的参考线s(一般为道路中心线),车辆在地图框架中的运动被解耦为两个独立的一维运动,即在Frenet框架中沿引导线的纵向运动s和与引导线正交的横向运动l
在这里插入图片描述
对于道路的每个点上,横轴和纵轴都是垂直的,纵坐标表示在道路中的行驶距离,横坐标表示汽车偏离中心线的距离。

为什么要用Frenet坐标系?
笛卡尔坐标系描述世界坐标系下坐标(x,y),难以利用道路结构(不知道路在哪,车辆行驶距离、是否偏离中心线等)。大部分的道路并不是笔直的,而是具有一定弯曲度的弧线。

Frenet坐标系下,车辆只需知道所在车道位置以及与周边障碍物的横纵向距离。将优化问题(x,y,t)解耦成两个一维优化问题(SL图进行路径规划和ST图进行速度规划)。
笛卡尔坐标系和Frenet坐标系的转换过程?
详细推到公式
Apollo坐标系研究

3、路径规划和速度规划

Apollo中轨迹规划解耦为路径规划(处理静态环境:道路、静止或低速障碍物))与速度规划(处理动态环境:高速障碍物)。两部分。每个规划过程分为决策与优化(DP+QP过程)。
(1)路径规划:
路段分割成若干单元格,对每个单元格随机采样产生候选路径,重复生成多个候选路径。设置合理的cost函数(偏离车道中心距离、障碍物距离、速度和曲率变化程度等)来选择cost最小的路径。

目标是找到S(l)函数(为什么不是l(s):横向运动是由纵向运动引起的)。
在这里插入图片描述

(2)速度规划
在ST图上进行,对路程和时间进行采样,将st图离散多个单元格,更具预测和一些路径规划的信息和障碍物的决策等,将障碍物、限速等投影在ST图上。利利用全局搜索方法DP算法得到决策,在利用优化方法(二次规划和非线性规划)进行速度规划。

st图上斜率越大,速度越大。
在这里插入图片描述

采样: 速度规划在ST图进行采样,在t tt的方向上以固定的间隔进行采样,在s ss方向上以先密后疏的方式进行采样(离主车越近,所需规划的精度就需更高;离主车越远,牺牲采样精度,提升采样效率)

设计状态转移方程:
主要考虑不能与障碍物发生碰撞:障碍物安全距离之内,则cost设为无穷;如果在安全距离之外,则cost设为0;如果在安全距离与障碍物之间,则按按之间的距离计算。

4、轨迹优化(QP过程)

主要采用二次规划算法实现轨迹的平滑和拟合,平滑后的路径曲线和速度曲线进行融合生成三维度轨迹点。二次规划标准形式:
在这里插入图片描述
x是要优化的变量,是n维的向量。p是二次项系数,是正定矩阵。q是一次项系数,是n维向量。A是一个mxn的矩阵,A为约束函数的一次项系数,m为约束函数的个数。l和u分别为约束函数的下边界和上边界。Apollo中使用OSQP库对二次规划进行求解。
在这里插入图片描述

(1)路径规划优化: 优化变量 x为横向距离和其一阶、二阶导数: l l l, l ′ l' l, l ′ ′ l'' l′′目标函数的设计主要考虑:安全、靠近车道中心线、舒适度、尽可能降低加速度、接近终点。约束主要考虑不能与障碍物碰撞、加速度满足车辆运动学限制。目标函数如下:
在这里插入图片描述
Apollo中使用OSQP库对二次规划进行求解,具体包括:设定OSQP求解参数、计算QP系数矩阵、构造OSQP求解器、获取优化结果。

详细原理参考:基于二次规划的路径规划。

速度规划优化: 优化变量x为横向距离和其一阶、二阶导数: s s s, s ′ s' s, s ′ ′ s'' s′′。目标函数的设计主要考虑:转弯时减速行驶, 曲率越大,速度越小; 舒适度、尽可能降低加速度; 决策时制定的st曲线; 接近参考速度。约束主要考虑不能与障碍物碰撞、加速度满足车辆运动学限制。目标函数如下:
在这里插入图片描述
详细原理参考:Em planer算法解析

5、规划流程(lane follow场景为例)

1、规划模块流程

让我们回顾一下,规划模块运行流程如下:
入口函数PlanningComponent::Proc() -> 主要逻辑函数OnLanePlanning::RunOnce() ->
选择规划模式OnLanePlanning::Plan()-> 选择规划器PublicRoadPlanner::Plan() ->
分scenario处理Scenario::Process() ->分stage处理 LaneFollowStage::Process() ->顺序执行stage中的任务

2、Apollo中各场景

Apollo默认从lane follow场景开始判断,而且场景之间的跳转必须经过lanefollow这个场景。

switch (current_scenario_->scenario_type()) {
      case ScenarioConfig::LANE_FOLLOW: // 车道线保持
      case ScenarioConfig::PULL_OVER: // 靠边停车
        break;
      case ScenarioConfig::BARE_INTERSECTION_UNPROTECTED: //无保护十字路口
      case ScenarioConfig::EMERGENCY_PULL_OVER: // 紧急靠边
      case ScenarioConfig::PARK_AND_GO: // 停车和启动
      case ScenarioConfig::STOP_SIGN_PROTECTED: // 停止标志
      case ScenarioConfig::STOP_SIGN_UNPROTECTED:// 停止
      case ScenarioConfig::TRAFFIC_LIGHT_PROTECTED: // 信号灯
      case ScenarioConfig::TRAFFIC_LIGHT_UNPROTECTED_LEFT_TURN: //信号灯无保护左转
      case ScenarioConfig::TRAFFIC_LIGHT_UNPROTECTED_RIGHT_TURN:
      case ScenarioConfig::VALET_PARKING: // 代客泊车
      case ScenarioConfig::DEADEND_TURNAROUND: //Apollo7.0中新增 路头调头

3、Lane_follow场景中task

Lane_follow场景中task以实际的场景为例,执行具体的路径规划算法和速度规划算法,各task功能如下:

 stage_type: LANE_FOLLOW_DEFAULT_STAGE
 enabled: true

// 路径规划
 task_type: LANE_CHANGE_DECIDER // 判断当前是否进行变道,以及变道的状态
  task_type: PATH_REUSE_DECIDER  // 换道时:
								// 根据横纵向跟踪偏差,来决策是否需要重新规划轨迹;
								// 如果横纵向跟踪偏差,则根据上一时刻的轨迹生成当前周期的轨迹,以尽量保持轨迹的一致性
  task_type: PATH_LANE_BORROW_DECIDER // 只是判断是否满足借道条件,具体的轨迹是否借道,是由后面的task决定
  task_type: PATH_BOUNDS_DECIDER // 根据借道信息、道路宽度生成FallbackPathBound
								 // 根据借道信息、道路宽度生成、障碍物边界生成PullOverPathBound、LaneChangePathBound、		
					             RegularPathBound中的一种
					             // 将车道线和障碍物转为上图中的边界
  task_type: PIECEWISE_JERK_PATH_OPTIMIZER // 根据之前decider决策的reference line和path bound,
                                // 以及横向约束,将最优路径求解问题转化为二次型规划问题;
                                 // 调用osqp库求解最优路径;
  task_type: PATH_ASSESSMENT_DECIDER  //选出之前规划的备选路径中排序最靠前的路径;
								// 添加一些必要信息到路径中
  task_type: PATH_DECIDER	    // 在上一个任务中获得了最优的路径,
                             // PathDecider的功能是根据静态障碍物做出自车的决策,对于前方的静态障碍物是忽略、stop还是nudge
  task_type: RULE_BASED_STOP_DECIDER    // 根据一些规则设定停止标志
  
  //速度规划
  task_type: ST_BOUNDS_DECIDER 
  task_type: SPEED_BOUNDS_PRIORI_DECIDER  // 将规划路径上障碍物的st bounds加载到路径对应的st图上
										  // 计算并生成路径上的限速信息
  task_type: SPEED_HEURISTIC_OPTIMIZER  // 使用DP求解一条最优路径
  task_type: SPEED_DECIDER //
  task_type: SPEED_BOUNDS_FINAL_DECIDER //
  #task_type: PIECEWISE_JERK_SPEED_OPTIMIZER //
  task_type: PIECEWISE_JERK_NONLINEAR_SPEED_OPTIMIZER //
  task_type: RSS_DECIDER //

本文初步了解了规划模块的原理和流程,后续将详细讲解相关代码。

参考链接:
星火计划路径规划学习笔记
星火计划速度规划学习笔记

速度规划论文:
[1] Qian X , Altche F , Bender P , et al. Optimal Trajectory Planning for Autonomous Driving Integrating Logical Constraints: An MIQP Perspective[C]// IEEE International Conference on Intelligent Transportation Systems. IEEE, 2016.

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

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

相关文章

关于selenium的等待

目录 隐式等待 显式等待 注意事项 隐式等待 简单来说:在规定的时间范围内,轮询等待元素出现之后就立即结束。 如果在规定的时间范围内,元素仍然没有出现,则会抛出一个异常【NoSuchElementException】,脚本停止运行…

【Linux学习笔记】2.Linux 系统启动过程及系统目录结构

前言 本章介绍Linux的系统启动过程和系统目录结构。 Linux 系统启动过程 linux启动时我们会看到许多启动信息。 Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导。运行 init。系统初始化。建立终端 。用户登录系…

【ARM架构】armv8 系统安全概述

ARMv8-A 系统中的安全 一个安全或可信的操作系统保护着系统中敏感的信息,例如,可以保护用户存储的密码,信用卡等认证信息免受攻击。 安全由以下原则定义: 保密性:保护设备上的敏感信息,防止未经授权的访问…

C#值传递、引用传递、输出传递详解

C#值传递、引用传递、输出传递详解1、值传递2、引用传递3、输出传递4、ref 和 out导读: 1,值传递时,为什么被调用的方法中的形参值的改变不会影响到相应的实参? 答:因为按值传递时,系统首先为被调用的方法的…

高级信息系统项目管理(高项 软考)原创论文——风险管理(2)

1、如果您想了解如何高分通过高级信息系统项目管理师(高项)你可以点击一下链接: 高级信息系统项目管理师(高项)高分通过经验分享_高项经验 2、如果您想了解更多的高级信息系统项目管理(高项 软考)原创论文,您可以点击以下链接: 高级信息系统项目管理(高项 软考)原创论文…

mqtt协议1- 简介和报文格式

文章目录1.mqtt协议1: 简介和报文格式1.1.MQTT概念1.2.数据2.控制报文格式2.1.MQTT数据包结构2.2.固定头2.2.1.控制报文类型2.2.2.标志FLag2.2.3.剩余长度2.3.可变头2.4.有效载荷Payload消息体安全QoS(Quality of Service levels)ref:1.mqtt协议1: 简介和报文格式 Message Que…

c语言机试练习

1.打印日期 给出年分m和一年中的第n天&#xff0c;算出第n天是几月几号。 输入描述&#xff1a; 输入包括两个整数y(1<y<3000)&#xff0c;n(1<n<366)。 输出描述&#xff1a; 可能有多组测试数据&#xff0c;对于每组数据&#xff0c; 按 yyyy-mm-dd的格式将输入中…

51单片机入门 - 驱动多位数码管

我使用的是普中51单片机开发板A2套件&#xff08;2022&#xff09;&#xff0c;驱动数码管可能需要参考电路原理图。开发环境的搭建教程在本专栏的 51单片机开发环境搭建 - VS Code 从编写到烧录 有过介绍。 关于我的软硬件环境信息&#xff1a; Windows 10STC89C52RCSDCC &am…

HTML 基础【快速掌握知识点】

目录 一、什么是HTML&#xff1f; 二、HTML的发展史 三、HTML5的优势 四、HTML基本结构 五、DOCTYPE声明 六、title标签 七、meta标签 八、标题标签 九、段落标签 十、换行标签 十一、水平线标签 十二、字体样式标签 十三、特殊符号 十四、图像标签 十五、链接标…

JavaScript 进阶--charater3

文章目录前言一、编程思想1.1 面向过程介绍1.2 面向对象编程 (oop)对比二、构造函数三、原型3.1原型3.2 constructor 属性3.3 对象原型3.4 原型继承3.5 原型链总结前言 &#x1f191;学习目标 理解面向对象思想&#xff0c;掌握函数原型对象运用面向对象封装继承特点&#xf…

腾讯开源的 hel 提供了加载远程模块的能力,谈谈它的实现原理

腾讯开源的 hel&#xff0c;提供了一种运行时引入远程模块的能力&#xff0c;模块部署在 CDN&#xff0c;远程模块发布后&#xff0c;不需要重新构建发布&#xff0c;就能生效。 个人觉得它的实现原理非常的不错&#xff0c;因此分享给大家。 远程模块可以作为微模块&#xf…

Jenkins利用docker部署vue项目

Jenkins利用docker部署vue项目一、环境准备1、安装docker2、安装nodejs3、安装cnpm与配置淘宝镜像4、jenkins安装nodejs插件二、jenkins以vue项目1、全局参数配置2、源码配置3、构建环境4、构建三、构建项目四、访问一、环境准备 本次jenkins与部署vue项目在同一台机器&#x…

RocketMQ5.0.0的Broker主从同步机制

目录 一、主从同步工作原理 1. 主从配置 2. 启动HA 二、主从同步实现机制 1. 从Broker发送连接事件 2. 主Broker接收连接事件 3. 从Broker反馈复制进度 4. ReadSocketService线程读取从Broker复制进度 5. WriteSocketService传输同步消息 6. GroupTransferService线程…

【每日一题Day127】LC1238循环码排列 | 格雷码构造 位运算

格雷码 看到题目就想到了格雷码 然后就疯狂搜索格雷码 手动构造了一波格雷码 看了题解 emmm 有点亏 理论基础 n 位格雷码序列 是一个由 2n 个整数组成的序列&#xff0c;其中&#xff1a; 每个整数都在范围 [0, 2n - 1] 内&#xff08;含 0 和 2n - 1&#xff09;第一个整数是…

深度学习之“制作自定义数据”--torch.utils.data.DataLoader重写构造方法。

深度学习之“制作自定义数据”–torch.utils.data.DataLoader重写构造方法。 前言&#xff1a; ​ 本文讲述重写torch.utils.data.DataLoader类的构造方法&#xff0c;对自定义图片制作类似MNIST数据集格式&#xff08;image, label&#xff09;&#xff0c;用于自己的Pytorc…

大数据Hadoop教程-学习笔记04【数据仓库基础与Apache Hive入门】

视频教程&#xff1a;哔哩哔哩网站&#xff1a;黑马大数据Hadoop入门视频教程 总时长&#xff1a;14:22:04教程资源: https://pan.baidu.com/s/1WYgyI3KgbzKzFD639lA-_g 提取码: 6666【P001-P017】大数据Hadoop教程-学习笔记01【大数据导论与Linux基础】【17p】【P018-P037】大…

Spring boot开启定时任务的三种方式(内含源代码+sql文件)

Spring boot开启定时任务的三种方式&#xff08;内含源代码sql文件&#xff09; 源代码sql文件下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87486580 目录Spring boot开启定时任务的三种方式&#xff08;内含源代码sql文件&#xff09;源代码…

【无人机】回波状态网络(ESN)在固定翼无人机非线性控制中的应用(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

前端常见手写面试题集锦

实现迭代器生成函数 我们说迭代器对象全凭迭代器生成函数帮我们生成。在ES6中&#xff0c;实现一个迭代器生成函数并不是什么难事儿&#xff0c;因为ES6早帮我们考虑好了全套的解决方案&#xff0c;内置了贴心的 生成器 &#xff08;Generator&#xff09;供我们使用&#xff…

java面试题-IO流

基础IO1.如何从数据传输方式理解IO流&#xff1f;IO流根据处理数据的类型可以分为字节流和字符流。字节流字节流以字节&#xff08;8位&#xff09;为单位读写数据。字节流主要用于读写二进制文件&#xff0c;如图片、音频、视频等。Java中的InputStream和OutputStream就是字节…