首页 > 编程语言 >[轨迹规划实操] 横向优化算法+纵向DP算法的python复现(2)

[轨迹规划实操] 横向优化算法+纵向DP算法的python复现(2)

时间:2024-06-04 22:59:05浏览次数:20  
标签:node 障碍物 python 算法 实操 自车 prev 代价 节点

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

本文采用基于优化的横向规划方法和基于动态规划的纵向规划方法
横向优化控制详见第一篇文章 https://blog.csdn.net/AAAndrea/article/details/139444710


纵向速度规划

本文采用基于动态规划(DP)的速度规划方法。
首先需要了解下动态规划的原理:
在这里插入图片描述

在应用动态规划处理特定的优化问题时,可以将整个问题解决过程依据特定顺序(例如时间、空间或其他逻辑顺序)划分成多个相互依赖的「阶段」。接着,依次对每个阶段进行「决策」,这些决策不仅决定了当前阶段的效益,也影响了下一阶段的起始条件。完成所有阶段的决策后,便形成了针对整个问题的决策序列。

1. 对路程和时间进行采样

首先对路程和时间进行采样。
按照Apollo的做法是对比较近的距离以较小间隔采样;对比较远的距离以较大间隔采样。
但是这个时候会出现

如果采样点过多,之后计算的cost就越多,耗时就越长。所以在选择采样点的时候就需要删选。

maxsA = prev_maxs + prev_maxv * self.delta_t + 0.5 * self.a_max * self.delta_t ** 2
minsA = prev_mins + prev_minv * self.delta_t + 0.5 * self.a_min * self.delta_t ** 2

maxs = min(maxs, maxsA)    # maxs为最大前探距离
mins = max(mins, minsA)      # mins为自车起始S0

如果循环点的s不满足 mins <= s <= maxs,后续不会进行cost 计算,直接给cost = 10000(极大值)。

2. 计算代价函数

代价函数主要分为三个部分:
① 障碍物代价
② 加速度和速度代价
③ 损失代价

1.障碍物代价

障碍物处理的部分比较复杂,所以放在下一章。

本章直接使用处理完的障碍物列表。

在这里插入图片描述

障碍物代价函数的计算公式为: (同Apollo)
在这里插入图片描述

将障碍物绘制在S-T图上可以看到,绿色点构成的是障碍物的超车安全距离;蓝色点构成的是障碍物的跟车安全距离。

在这里插入图片描述

2.加速度和速度代价

计算速度的时候需要运用到"父节点",因此在这一部分至少需要两个循环。

一个对当前节点cur_node的循环,一个是对当前节点的父节点prev_node进行循环。

在计算加速度的时候,则需要父节点的父节点,可以用父节点的’parent’属性找到pprev_node。

        v = (cur_node['s'] - prev_node['s']) / (cur_node['t'] - prev_node['t'])
        cost = (v - cv) ** 2 / 100
        # 如果前一个节点有父节点
        if prev_node['parent'] is not None:
            # 获取前一个节点所在层的上一层的所有节点
            pprev_nodes = st_node_tab[lvlnum - 1]
            # 根据前一个节点的父节点索引获取前一个节点
            pprev_node = pprev_nodes[prev_node['parent']]
            # 计算前一个节点与前前一个节点之间的速度
            prev_v = (prev_node['s'] - pprev_node['s']) / self.delta_t
            a = (v - prev_v) / (cur_node['t'] - prev_node['t'])
            cost += math.fabs(a) ** 2 / 100

3.损失代价
损失代价的设置目的是为了自车能够更快地达到最大前探距离(目的地),避免过于保守的驾驶行为。
在这里插入图片描述

3.选出最小代价的点进行回溯

如果只是将每一层的代价最小的点记录,连接起来的话,有可能出现以下情况:

在这里插入图片描述
最小点出现的位置连线会穿过障碍物,也就是在实际情况中已经发生碰撞了。

因此本文选用从最后一层开始向前回溯,以避免这种情况的发生。

大致逻辑是:

  1. 在最后一层中找到cost最小的点A
  2. 遍历倒数第二层,找出所有’parent’属性是A的点,找到其中cost最小的点B
  3. 遍历倒数第三层,找到所有’parent’属性是B的点,找到其中cost最小的点C
  4. 以此类推,找出所有delta_t间隔上的s
  5. 根据s和t,计算出v和a

4. 实验结果

第一张图中的障碍物一直是持续的,可以想象为位于自车正前方的车辆,自车处于跟车状态。

第二张图中的障碍物不是一直持续的,可以想象为若自车发生了变道,那自车原来正前方的车辆在自车有一定偏移量之后就不会在影响自车,在S-T中便也不会画出来了。

具体的处理方式详见
[轨迹规划实操] 横向优化算法+纵向DP算法的python复现(3)

在这里插入图片描述

在这里插入图片描述

标签:node,障碍物,python,算法,实操,自车,prev,代价,节点
From: https://blog.csdn.net/AAAndrea/article/details/139449844

相关文章

  • 代码随想录算法训练营第四天 |节点交换、删除倒数n个节点、交叉链表、环形链表
    24题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/description/24题代码随想录讲解:https://programmercarl.com/0024.两两交换链表中的节点.html#思路19题链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/19题代码随想录:https://programmerca......
  • 使用Venv创建Python的虚拟环境
    创建虚拟环境python3-mvenv<directory_name>激活虚拟环境source<directory_name>/bin/active检查当前使用的是哪个Python下面这条命令会输出当前使用Python环境的目录:whichpython配置好之后使用pip安装的库就会默认放在这个环境中停用当前环境deactivate重启环......
  • 【数据结构与算法 经典例题】链表的回文结构(图文详解)
                  ......
  • Python网络爬虫要清理cookies 才能再爬,有啥解决方法嘛?
    大家好,我是Python进阶者。一、前言前几天在Python钻石交流群【大写一个Y】问了一个Python基网络爬虫的问题,问题如下:大佬们请教个问题我做了个在某眼查抓地址数据的爬虫,程序中做了随机2-5秒的循环延时,现在大概爬800多个地址,就会查不出数据,要清理cookies才能再爬,有啥解决方法......
  • python学习笔记-04
    高级数据类型一组按照顺序排列的值称为序列,python中存在三种内置的序列类型:字符串、列表和元组。序列可以支持索引和切片的操作,第一个索引值为0表示从左向右找,第一个索引值为负数表示从右找。1.字符串操作1.1切片切片是指选取字符串中的某些数据,语法:字符串[开始下标:结......
  • python系列:一文读懂FastAPI:Python 开发者的福音
    一文读懂FastAPI:Python开发者的福音一文读懂FastAPI:Python开发者的福音第一步:安装FastAPI第二步:创建一个FastAPI应用第三步:定义接口第四步:运行应用第五步:查看接口文档总结一文读懂FastAPI:Python开发者的福音FastAPI是一个基于Python的现代化Web框架,它提供了快......
  • 无人机航迹规划:人工原生动物优化算法APO求解无人机路径规划MATLAB
    一、无人机模型介绍单个无人机三维路径规划问题及其建模_无人机路径规划场景建模-CSDN博客参考文献:[1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120二、人工原生动物优化算法APO求解无人机路径规划人工原生动物......
  • Python用GRU神经网络模型预测比特币价格时间序列数据2案例可视化|附代码数据
    全文链接:https://tecdat.cn/?p=36389原文出处:拓端数据部落公众号门控循环单元(GRU)是一种循环神经网络(RNN)类型,旨在有效地捕获序列数据中的长期依赖关系。它是传统RNN的扩展,与长短期记忆(LSTM)网络具有相似性。我们将简要了解GRU模型以及如何帮助客户在PyThon中使用GRU实现序列数据......
  • 【机器学习算法】降维
    降维算法是数据预处理中的一种技术,主要用于减少数据集中的特征数量,同时尽可能保留原始数据的重要信息。数模掌握线性降维方法就已经很强了。目录线性降维方法主成分分析(PCA)线性判别分析(LDA)非线性降维方法基于核函数的非线性降维方法基于特征值的非线性降维方法(流型......
  • 【机器学习算法】回归算法(下) #一文归纳众多算法,建议收藏
    本文介绍一些传统的机器学习中的有监督算法,然后讲一下集成算法,并给出一张各种算法的“谱系”图。同时,本文对很多算法都给出了示意图系列文章目录【机器学习概念】【机器学习流程】【机器学习算法】回归算法(上)【机器学习算法】回归算法(中)目录SVM(支持向量机)软边界和......