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)相关推荐

  1. 自动驾驶决策规划算法第二章——Apollo EM Planner实践篇

    前置学习内容:自动驾驶控制算法 [自动驾驶][零基础]基础自动驾驶控制算法笔记_免费教学录影带的博客-CSDN博客 自动驾驶决策规划第一章 自动驾驶决策规划算法第一章_免费教学录影带的博客-CSDN博 ...

  2. [决策规划算法]自动驾驶中的行为决策

    文章目录 前言 一.有限状态机 二.决策树 三.基于知识的推理决策 四. 基于价值的决策模型 前言 在多智能体决策的复杂环境中(存在感知不确定性情况下)进行规划这一问题一直是L4.L5级自动驾驶技术的 ...

  3. 自动驾驶决策规划算法概述

    一.自动驾驶级别分类 L0 系统无法控制横向或者纵向 L1 系统能控制横向或者纵向中的一个,但横纵向无法联合控制 L2 系统可以联合控制横向和纵向 L3 小部分场景不需要人负责监控环境 L4 大部分场 ...

  4. 自动驾驶决策规划算法第一章笔记 忠厚老实的老王

    第一章 自动驾驶决策规划算法数学基础 第一节:决策规划算法的地位和作用 该笔记来自b站up主(偶像):憨厚老实的老王视频链接主页 第二节:为什么规划中经常见到五次多项式

  5. Apollo Planning决策规划算法代码详细解析 (1):Scenario选择

    本文重点讲解Apollo代码中怎样配置Scenario以及选择当前Scenario,Scenario场景决策是Apollo规划算法的第一步,本文会对代码进行详细解析,也会梳理整个决策流程,码字不易,喜 ...

  6. 自动驾驶算法详解(8):特斯拉Tesla决策规划算法Planning解析下

    前言: 本文将介绍特斯拉Tesla 在AI Day 上提到的决策规划模块Planner. 同人类驾驶员一样,Planner在接收到经过视觉神经网络处理过的3D Vector Space后,将会在该Sp ...

  7. 自动驾驶岗位招聘——感知算法、决策规划算法、系统架构师

    感知算法工程师 工作职责: 关于机器学习和算法方向 这个方向的感知工程师负责设计并实现传感器标定,障碍物检测,分类,跟踪,和场景理解等各种模型和算法,对模型和算法进行评估和测试,并把模型和算法部署到车 ...

  8. 老王决策规划算法凸优化与非凸优化

    自动驾驶决策规划算法第一章第二节 凸优化与非凸优化 梯度下降法(按每个点一阶导的正负的反方向迭代,如果某个点的一阶导是负的,则下个点取正方向的一个点,反之则取负方向的一个点,迭代的步长取决于导数绝对值 ...

  9. 自动驾驶 决策规划算法 面经1

    欢迎关注公众号:内推君SIR,加微信:neituijunsir 加入自动驾驶交流群:聚焦 自动驾驶行业 招聘信息 /技术发展 /行业动态. Case 1 路径规划算法类: 1.Dijstra算法,算法 ...

  10. 决策规划算法四:Piecewise Jerk Path Optimizer

    一,问题分析 路径规划的本质目的:规划出一条安全(无碰撞),舒适(平滑),符合车辆运动学的轨迹. 如下图所示,决策算法开辟凸空间后,路径规划算法用数值优化的方法搜索出一条最优路径,即将问题转化为二次规 ...

最新文章

  1. Oracle定时执行存储过程
  2. SpringBoot-14-MyBatis预热篇,MySQL小结
  3. Spring入门详细教程(二)
  4. 平衡二叉树平衡因子怎么计算_平衡二叉树(AVL Tree)旋转机制分析
  5. c语言编程将图片上下翻转,C语言实现矩阵翻转(上下翻转、左右翻转)
  6. 超级计算机日记300字,真实的我日记300字
  7. 不是HR,Leader你会面试应聘者吗
  8. CGCKD2021大会报告整理(4)--风格迁移
  9. 如何为编程爱好者设计一款好玩的智能硬件(九)——LCD1602点阵字符型液晶显示模块驱动封装(下)...
  10. [荐] 微信小程序模板源码合集
  11. 升级LINUX内核(支持8G内存)的命令
  12. 微信红包系统设计方案
  13. 各种 IntelliJ IDEA 酷炫插件推荐
  14. IBC-身份标识密码技术
  15. CINTA拉格朗日定理
  16. CF949D Curfew
  17. 自然语言三兄弟NLP、NLU、NLG傻傻分不清?一文搞懂它们的区别
  18. 微信订阅通知开发 (小白教程)微擎
  19. java 对话框计算器,《Java程序设计》第16周礼拜四:GUI编程及文件对话框的使用 计算器...
  20. android 画板功能

热门文章

  1. windows的IPAM无法独立安装,需要域环境才能使用
  2. 解决android.support.multide... keeps stopping问题
  3. 第五项修炼-读书笔记
  4. 用户下订单之后15分钟支付实现_用户提交订单,30分钟后没付款取消订单功能分析...
  5. 华为S5700交换机端口聚合
  6. Android Stidio修改桌面图标
  7. 6.26 mongoDB是无法find未初始的值的,mongoose的Schema需具象化及个人商品Schema设计,租赁网登录态初次尝试,vue对对象未赋初值的监听,forEach等api深拷贝问题
  8. 并发编程之:线程池(二)
  9. 「敏捷」Stacey Matrix模型帮你确定合适的项目管理方法
  10. 老男孩教育教育46期 LIHAO