决策规划算法二:生成参考线(FEM_POS_DEVIATION_SMOOTHING)
Apollo的的规划算法基于Frenet坐标系,因此道路中心线的平滑性控制着车辆是否左右频繁晃动,而高精地图的道路中心线往往不够平滑。
离散点平滑法,包括
1,FEM_POS_DEVIATION_SMOOTHING有限元位置差异
2,COS_THETA_SMOOTHING余弦)
3,QpSplineReferenceLineSmoother(三次样条插值法)
4,SpiralReferenceLineSmoother(螺旋曲线法)
本文只讲解FEM_POS_DEVIATION_SMOOTHING有限元位置差异的方法。
一,为什么需要重新生成参考线
导航路径存在的问题:1,导航路径过长;2,不平滑
导致的结果:
1,不利于主车以及障碍物寻找投影点,甚至出现多个投影点。
2,原本的导航路径不平滑,车辆无法直接进行轨迹跟踪。
解决方案:根据导航路径,生成参考线。
二,生成参考线的具体步骤与方法
1,找到匹配点以及投影点
2,以匹配点或者投影点为原点,往后取30个点,往前取150个点。对这180个点进行平滑处理,生成符合要求的参考线,作为该规划周期内的参考线,并以此参考线为Frenet坐标系。
三,参考线平滑方法:QP
方法步骤:
1,设计Cost:平滑程度,与原路径的偏离程度,路径点距离分布的均匀程度。
2,整理Cost目标函数,使其符合QP的表达形式。
3,考虑约束条件,并整理为QP的约束表达式形式。
4,运用合适的QP求解器进行求解,获取优化后的结果。
四,设计Cost:平滑程度,与原路径的偏离程度,路径点距离分布的均匀程度(长度代价)
1,平滑程度
衡量指标:。其值越小, 路径越平滑。
2,与原路径的偏离程度
如上图所示,平滑前的点记为,平滑后的点记为。
虽然路径平滑了,但与原路径距离偏差太大,不符合要求。
衡量指标:
3,路径点距离分布的均匀程度(长度代价)
衡量指标:。其值越小,分布越均匀。
五,实例讲解
1,以3个点为例求解目标函数
如上图所示,已知变量:原路径点为:,未知变量:优化后的路径点为: ,求优化后的路径点坐标。
2,二次规划的一般形式
3,n个点的代价函数求解(重点):
平滑性代价:
其中:
令
则
均匀性代价(长度代价):
其中,
令
则
与原路径的距离偏差代价:
由于是常数,对目标函数的变化没有影响,故可以删除,以简化表达。
令,
则:
综述所述:
一般情况下,平滑的权重系数远远大于其他2项的权重系数
二次规划的标准形式为:
则
求解约束条件:
至此,参考线平滑问题转化为二次规划的标准形式,采用成熟的求解器求解即可获得,从而实现导航轨迹的平滑,获得符合要求的参考线轨迹点。
import osqp
import numpy as np
import matplotlib.pyplot as plt
from scipy import sparse#计算kappa用来评价曲线
def calcKappa(x_array,y_array):s_array = []k_array = []if(len(x_array) != len(y_array)):return(s_array , k_array)length = len(x_array)temp_s = 0.0s_array.append(temp_s)for i in range(1 , length):temp_s += np.sqrt(np.square(y_array[i] - y_array[i - 1]) + np.square(x_array[i] - x_array[i - 1]))s_array.append(temp_s)xds,yds,xdds,ydds = [],[],[],[]for i in range(length):if i == 0:xds.append((x_array[i + 1] - x_array[i]) / (s_array[i + 1] - s_array[i]))yds.append((y_array[i + 1] - y_array[i]) / (s_array[i + 1] - s_array[i]))elif i == length - 1:xds.append((x_array[i] - x_array[i-1]) / (s_array[i] - s_array[i-1]))yds.append((y_array[i] - y_array[i-1]) / (s_array[i] - s_array[i-1]))else:xds.append((x_array[i+1] - x_array[i-1]) / (s_array[i+1] - s_array[i-1]))yds.append((y_array[i+1] - y_array[i-1]) / (s_array[i+1] - s_array[i-1]))for i in range(length):if i == 0:xdds.append((xds[i + 1] - xds[i]) / (s_array[i + 1] - s_array[i]))ydds.append((yds[i + 1] - yds[i]) / (s_array[i + 1] - s_array[i]))elif i == length - 1:xdds.append((xds[i] - xds[i-1]) / (s_array[i] - s_array[i-1]))ydds.append((yds[i] - yds[i-1]) / (s_array[i] - s_array[i-1]))else:xdds.append((xds[i+1] - xds[i-1]) / (s_array[i+1] - s_array[i-1]))ydds.append((yds[i+1] - yds[i-1]) / (s_array[i+1] - s_array[i-1]))for i in range(length):k_array.append((xds[i] * ydds[i] - yds[i] * xdds[i]) / (np.sqrt(xds[i] * xds[i] + yds[i] * yds[i]) * (xds[i] * xds[i] + yds[i] * yds[i]) + 1e-6));return(s_array,k_array)def referenceline():#add some data for testx_array = [0.5,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0]y_array = [0.1,0.3,0.2,0.4,0.3,-0.2,-0.1,0,0.5,0,0.1,0.3,0.2,0.4,0.3,-0.2,-0.1,0,0.5,0]length = len(x_array)#weight , from configweight_fem_pos_deviation_ = 1e10 #cost1 - xweight_path_length = 1 #cost2 - yweight_ref_deviation = 1 #cost3 - zP = np.zeros((length,length))#set P matrix,from calculateKernel#add cost1P[0,0] = 1 * weight_fem_pos_deviation_P[0,1] = -2 * weight_fem_pos_deviation_P[1,1] = 5 * weight_fem_pos_deviation_P[length - 1 , length - 1] = 1 * weight_fem_pos_deviation_P[length - 2 , length - 1] = -2 * weight_fem_pos_deviation_P[length - 2 , length - 2] = 5 * weight_fem_pos_deviation_for i in range(2 , length - 2):P[i , i] = 6 * weight_fem_pos_deviation_for i in range(2 , length - 1):P[i - 1, i] = -4 * weight_fem_pos_deviation_for i in range(2 , length):P[i - 2, i] = 1 * weight_fem_pos_deviation_with np.printoptions(precision=0):print(P)P = P / weight_fem_pos_deviation_P = sparse.csc_matrix(P)#set q matrix , from calculateOffsetq = np.zeros(length)#set Bound(upper/lower bound) matrix , add constraints for x#from CalculateAffineConstraint#In apollo , Bound is from road boundary,#Config limit with (0.1,0.5) , Here I set a constant 0.2bound = 0.2A = np.zeros((length,length))for i in range(length):A[i, i] = 1A = sparse.csc_matrix(A)lx = np.array(x_array) - boundux = np.array(x_array) + boundly = np.array(y_array) - bounduy = np.array(y_array) + bound#solveprob = osqp.OSQP()prob.setup(P,q,A,lx,ux)res = prob.solve()opt_x = res.xprob.update(l=ly, u=uy)res = prob.solve()opt_y = res.x#plot x - y , opt_x - opt_y , lb - ubfig1 = plt.figure(dpi = 100 , figsize=(12, 8))ax1_1 = fig1.add_subplot(2,1,1)ax1_1.plot(x_array,y_array , ".--", color = "grey", label="orig x-y")ax1_1.plot(opt_x, opt_y,".-",label = "opt x-y")# ax1_1.plot(x_array,ly,".--r",label = "bound")# ax1_1.plot(x_array,uy,".--r")ax1_1.legend()ax1_1.grid(axis="y",ls='--')#plot kappaax1_2 = fig1.add_subplot(2,1,2)s_orig,k_orig = calcKappa(x_array,y_array)s_opt ,k_opt = calcKappa(opt_x,opt_y)ax1_2.plot(s_orig , k_orig , ".--", color = "grey", label="orig s-kappa")ax1_2.plot(s_opt,k_opt,".-",label="opt s-kappa")ax1_2.legend()ax1_2.grid(axis="y",ls='--')plt.show()if __name__ == '__main__':referenceline()
平滑前后的坐标和曲率对比:
决策规划算法二:生成参考线(FEM_POS_DEVIATION_SMOOTHING)相关推荐
- 自动驾驶决策规划算法第二章——Apollo EM Planner实践篇
前置学习内容:自动驾驶控制算法 [自动驾驶][零基础]基础自动驾驶控制算法笔记_免费教学录影带的博客-CSDN博客 自动驾驶决策规划第一章 自动驾驶决策规划算法第一章_免费教学录影带的博客-CSDN博 ...
- [决策规划算法]自动驾驶中的行为决策
文章目录 前言 一.有限状态机 二.决策树 三.基于知识的推理决策 四. 基于价值的决策模型 前言 在多智能体决策的复杂环境中(存在感知不确定性情况下)进行规划这一问题一直是L4.L5级自动驾驶技术的 ...
- 自动驾驶决策规划算法概述
一.自动驾驶级别分类 L0 系统无法控制横向或者纵向 L1 系统能控制横向或者纵向中的一个,但横纵向无法联合控制 L2 系统可以联合控制横向和纵向 L3 小部分场景不需要人负责监控环境 L4 大部分场 ...
- 自动驾驶决策规划算法第一章笔记 忠厚老实的老王
第一章 自动驾驶决策规划算法数学基础 第一节:决策规划算法的地位和作用 该笔记来自b站up主(偶像):憨厚老实的老王视频链接主页 第二节:为什么规划中经常见到五次多项式
- Apollo Planning决策规划算法代码详细解析 (1):Scenario选择
本文重点讲解Apollo代码中怎样配置Scenario以及选择当前Scenario,Scenario场景决策是Apollo规划算法的第一步,本文会对代码进行详细解析,也会梳理整个决策流程,码字不易,喜 ...
- 自动驾驶算法详解(8):特斯拉Tesla决策规划算法Planning解析下
前言: 本文将介绍特斯拉Tesla 在AI Day 上提到的决策规划模块Planner. 同人类驾驶员一样,Planner在接收到经过视觉神经网络处理过的3D Vector Space后,将会在该Sp ...
- 自动驾驶岗位招聘——感知算法、决策规划算法、系统架构师
感知算法工程师 工作职责: 关于机器学习和算法方向 这个方向的感知工程师负责设计并实现传感器标定,障碍物检测,分类,跟踪,和场景理解等各种模型和算法,对模型和算法进行评估和测试,并把模型和算法部署到车 ...
- 老王决策规划算法凸优化与非凸优化
自动驾驶决策规划算法第一章第二节 凸优化与非凸优化 梯度下降法(按每个点一阶导的正负的反方向迭代,如果某个点的一阶导是负的,则下个点取正方向的一个点,反之则取负方向的一个点,迭代的步长取决于导数绝对值 ...
- 自动驾驶 决策规划算法 面经1
欢迎关注公众号:内推君SIR,加微信:neituijunsir 加入自动驾驶交流群:聚焦 自动驾驶行业 招聘信息 /技术发展 /行业动态. Case 1 路径规划算法类: 1.Dijstra算法,算法 ...
- 决策规划算法四:Piecewise Jerk Path Optimizer
一,问题分析 路径规划的本质目的:规划出一条安全(无碰撞),舒适(平滑),符合车辆运动学的轨迹. 如下图所示,决策算法开辟凸空间后,路径规划算法用数值优化的方法搜索出一条最优路径,即将问题转化为二次规 ...
最新文章
- Oracle定时执行存储过程
- SpringBoot-14-MyBatis预热篇,MySQL小结
- Spring入门详细教程(二)
- 平衡二叉树平衡因子怎么计算_平衡二叉树(AVL Tree)旋转机制分析
- c语言编程将图片上下翻转,C语言实现矩阵翻转(上下翻转、左右翻转)
- 超级计算机日记300字,真实的我日记300字
- 不是HR,Leader你会面试应聘者吗
- CGCKD2021大会报告整理(4)--风格迁移
- 如何为编程爱好者设计一款好玩的智能硬件(九)——LCD1602点阵字符型液晶显示模块驱动封装(下)...
- [荐] 微信小程序模板源码合集
- 升级LINUX内核(支持8G内存)的命令
- 微信红包系统设计方案
- 各种 IntelliJ IDEA 酷炫插件推荐
- IBC-身份标识密码技术
- CINTA拉格朗日定理
- CF949D Curfew
- 自然语言三兄弟NLP、NLU、NLG傻傻分不清?一文搞懂它们的区别
- 微信订阅通知开发 (小白教程)微擎
- java 对话框计算器,《Java程序设计》第16周礼拜四:GUI编程及文件对话框的使用 计算器...
- android 画板功能
热门文章
- windows的IPAM无法独立安装,需要域环境才能使用
- 解决android.support.multide... keeps stopping问题
- 第五项修炼-读书笔记
- 用户下订单之后15分钟支付实现_用户提交订单,30分钟后没付款取消订单功能分析...
- 华为S5700交换机端口聚合
- Android Stidio修改桌面图标
- 6.26 mongoDB是无法find未初始的值的,mongoose的Schema需具象化及个人商品Schema设计,租赁网登录态初次尝试,vue对对象未赋初值的监听,forEach等api深拷贝问题
- 并发编程之:线程池(二)
- 「敏捷」Stacey Matrix模型帮你确定合适的项目管理方法
- 老男孩教育教育46期 LIHAO