Carla教程三:参考线平滑理论完全解析(二次规划)

news2024/12/28 3:59:27

参考线平滑理论

决策规划流程第一步是参考线的生成,然后将障碍物进行投影到以参考线为坐标轴的frenet坐标系。参考线是很关键的一部,解决了导航路径过长,不平滑,不利于坐标转换找匹配点的问题。利用参考线,每一个规划周期,找到车在导航路径投影点,以投影点为坐标原点,往后取30米,往前取150米范围内的点,做平滑处理,平滑以后的点就是参考线。在Carla仿真器中,全局规划得到的航路点,可以以匹配点为原点,往后取10个点,往前取40个点。再对这些点进行平滑处理。

参考线平滑算法,采样了二次规划,主要定义以下损失值:

  • 平滑度
  • 长度要均匀紧凑
  • 几何相似代价

请添加图片描述

将问题转化为二次规划问题,使得损失函数最小:
1 2 x T H x    +    f T x = min ⁡ s . t    A x    ⩽ b l b    ⩽ x ⩽ u b \frac{1}{2}x^THx\,\,+\,\,f^Tx=\min \\ s.t\,\, Ax\,\,\leqslant b \\ lb\,\,\leqslant x\leqslant ub 21xTHx+fTx=mins.tAxblbxub
下面通过损失函数来进行推导。

平滑代价
( x 1 + x 3 − 2 x 2 ) 2    +    ( y 1 + y 3 − 2 y 2 ) 2 =    ( x 1    +    x 3    − 2 x 2 , y 1 + y 3 − 2 y 2 ) ( x 1 + x 3 − 2 x 2 , y 1 + y 3 − 2 y 2 ) T \left( x_1+x_3-2x_2 \right) ^2\,\,+\,\,\left( y_1+y_3-2y_2 \right) ^2 \\ =\,\,\left( x_1\,\,+\,\,x_3\,\,-2x_2, y_1+y_3-2y_2 \right) \left( x_1+x_3-2x_2, y_1+y_3-2y_2 \right) ^T (x1+x32x2)2+(y1+y32y2)2=(x1+x32x2,y1+y32y2)(x1+x32x2,y1+y32y2)T
其中有:
( x 1    +    x 3    − 2 x 2 , y 1 + y 3 − 2 y 2 )    =    ( x 1 , y 1 , x 2 , y 2 , x 3 , y 3 ) ( 1 0 0 1 − 2 0 0 − 2 1 0 0 1 ) \left( x_1\,\,+\,\,x_3\,\,-2x_2, y_1+y_3-2y_2 \right) \,\,=\,\,\left( x_1, y_1, x_2, y_2, x_3, y_3 \right) \left( \begin{array}{c} \begin{array}{c} \begin{array}{c} \begin{matrix} 1& 0\\ \end{matrix}\\ \begin{matrix} 0& 1\\ \end{matrix}\\ \begin{matrix} -2& 0\\ \end{matrix}\\ \begin{matrix} 0& -2\\ \end{matrix}\\ \end{array}\\ \begin{matrix} 1& 0\\ \end{matrix}\\ \end{array}\\ \begin{matrix} 0& 1\\ \end{matrix}\\ \end{array} \right) (x1+x32x2,y1+y32y2)=(x1,y1,x2,y2,x3,y3) 100120021001
( x 1 , y 1 , x 2 , y 2 , x 3 , y 3 ) \left( x_1, y_1, x_2, y_2, x_3, y_3 \right) (x1,y1,x2,y2,x3,y3)记作x,系数矩阵记作 A 1 A_1 A1, 然后可以得到:
( x 1 + x 3 − 2 x 2 ) 2 + ( y 1 + y 3 − 2 y 2 ) 2    =    x T A 1 T A 1 x \left( x_1+x_3-2x_2 \right) ^2+\left( y_1+y_3-2y_2 \right) ^2\,\,=\,\,x^TA_{1}^{T}A_1x (x1+x32x2)2+(y1+y32y2)2=xTA1TA1x
对于n个点的情况为:

请添加图片描述

请添加图片描述

紧凑代价:

同理可以推出紧凑型代价,建议用手写一篇加深印象。
请添加图片描述

几何相似性代价:

请添加图片描述

综上可得,统一得向量表达的代价函数为:
cos ⁡ t    f u n c t i o n    =    x T ( W s m o o t h ⋅ A 1 T A 1    +    W l e n g t h A 2 T A 2 + W r e f A 3 T A 3 ) x T    +    W r e f ⋅ h T x \cos t\,\,function\,\,=\,\,x^T\left( W_{smooth}\cdot A_{1}^{T}A_1\,\,+\,\,W_{length}A_{2}^{T}A_2+W_{ref}A_{3}^{T}A_3 \right) x^T\,\,+\,\,W_{ref}\cdot h^Tx costfunction=xT(WsmoothA1TA1+WlengthA2TA2+WrefA3TA3)xT+WrefhTx
注意h是表示参考点的列向量。

对比二次规划的模板:

公式
1 2 x T H x    +    f T x = min ⁡ s . t    A x    ⩽ b l b    ⩽ x ⩽ u b \frac{1}{2}x^THx\,\,+\,\,f^Tx=\min \\s.t\,\, Ax\,\,\leqslant b\\lb\,\,\leqslant x\leqslant ub 21xTHx+fTx=mins.tAxblbxub
可以有:
H    =    2 ( W s m o o t h ⋅ A 1 T A 1    +    W l e n g t h A 2 T A 2 + W r e f A 3 T A 3 ) H\,\,=\,\,2\left( W_{smooth}\cdot A_{1}^{T}A_1\,\,+\,\,W_{length}A_{2}^{T}A_2+W_{ref}A_{3}^{T}A_3 \right) H=2(WsmoothA1TA1+WlengthA2TA2+WrefA3TA3)
然后: f T    =    W r e f ⋅ h T f^T\,\,=\,\,W_{ref}\cdot h^T fT=WrefhT

约束就是向量x的约束:
x    =    ( x 1 , y 1 , ⋯   , x n , y n ) T x r e f    =    ( x 1 r , y 1 r , ⋯   , x n r , y n r ) x\,\,=\,\,\left( x_1, y_1, \cdots , x_n, y_n \right) ^T \\ x_{ref}\,\,=\,\, \left( x_{1r}, y_{1r}, \cdots , x_{nr}, y_{nr} \right) x=(x1,y1,,xn,yn)Txref=(x1r,y1r,,xnr,ynr)
这两者不能够差距太远,因此要求:
∣ x    −    x r e f ∣ ⩽ b u f f    \left| x\,\,-\,\,x_{ref} \right|\leqslant buff\,\, xxrefbuff
总结一下步骤:

  1. 构建x向量。
  2. 构建 A 1 A_1 A1矩阵 A 2 A_2 A2 A 3 A_3 A3矩阵,其中A1代表平滑代价,大小为(2n-4, 2n)。A2代表紧凑代价,大小为(2n-2, 2n)。A3表示几何相似代价,是一个单位矩阵,大小为(2n, 2n)
  3. 计算 H    =    2 ( W s m o o t h ⋅ A 1 T A 1    +    W l e n g t h A 2 T A 2 + W r e f A 3 T A 3 ) H\,\,=\,\,2\left( W_{smooth}\cdot A_{1}^{T}A_1\,\,+\,\,W_{length}A_{2}^{T}A_2+W_{ref}A_{3}^{T}A_3 \right) H=2(WsmoothA1TA1+WlengthA2TA2+WrefA3TA3)
  4. 根据参考点计算: f T    =    W r e f ⋅ h T f^T\,\,=\,\,W_{ref}\cdot h^T fT=WrefhT
  5. 二次规划求解。

下面逐一对上述步骤进行代码分析。

参考线理论代码实践

1、构建x向量

"""
	local_frenet_path_xy: 可以是[(x_ref0, y_ref0), (x_ref1, y_ref1), ...],
    也可以是[(x_ref0, y_ref0,theta0, kappa0), (x_ref1, y_ref1, theta1, kappa1), ...],
"""
	n = len(local_frenet_path_xy)  # 待平滑的点。
    # 需要构成x向量为(x1,y1, x2,y2,....xn,yn)的参考点。
    x_ref = np.zeros(shape=(2 * n, 1))  # 【x_ref0, y_ref0, x_ref1, y_ref1, ...]' 输入坐标构成的坐标矩阵, (2*n, 1)
    lb = np.zeros(shape=(2 * n, 1))  # low bound 下边界
    ub = np.zeros(shape=(2 * n, 1))  # up bound 上边界
    for i in range(n):
        x_ref[2 * i] = local_frenet_path_xy[i][0]
        x_ref[2 * i + 1] = local_frenet_path_xy[i][1]
        # 确定上下边界
        # 平滑后点移动不能超过x_thre的范围。
        lb[2 * i] = local_frenet_path_xy[i][0] - x_thre
        lb[2 * i + 1] = local_frenet_path_xy[i][1] - y_thre
        ub[2 * i] = local_frenet_path_xy[i][0] + x_thre
        ub[2 * i + 1] = local_frenet_path_xy[i][1] + y_thre

2、构建三个A矩阵。

	A1 = np.zeros(shape=(2 * n - 4, 2 * n))
    for i in range(n - 2):
        A1[2 * i][2 * i + 0] = 1
        # A1[2 * i][2 * i + 1] = 0
        A1[2 * i][2 * i + 2] = -2
        # A1[2 * i][2 * i + 3] = 0
        A1[2 * i][2 * i + 4] = 1
        # A1[2 * i][2 * i + 5] = 0

        # A1[2 * i + 1][2 * i + 0] = 0
        A1[2 * i + 1][2 * i + 1] = 1
        # A1[2 * i + 1][2 * i + 2] = 0
        A1[2 * i + 1][2 * i + 3] = -2
        # A1[2 * i + 1][2 * i + 4] = 0
        A1[2 * i + 1][2 * i + 5] = 1

    A2 = np.zeros(shape=(2 * n - 2, 2 * n))
    for i in range(n - 1):
        A2[2 * i][2 * i + 0] = 1
        # A2[2 * i][2 * i + 1] = 0
        A2[2 * i][2 * i + 2] = -1
        # A2[2 * i][2 * i + 3] = 0

        # A2[2 * i + 1][2 * i + 0] = 0
        A2[2 * i + 1][2 * i + 1] = 1
        # A2[2 * i + 1][2 * i + 2] = 0
        A2[2 * i + 1][2 * i + 3] = -1

    A3 = np.identity(2 * n)

3、计算H矩阵

H = 2 * (w_cost_smooth * np.dot(A1.transpose(), A1) +
             w_cost_length * np.dot(A2.transpose(), A2) +
             w_cost_ref * A3)

4、计算f

f = -2 * w_cost_ref * x_ref

5、二次规划求解

在进行二次规划求解之前有必要先了解一下Python中的QP求解器。

minimize  1 2 x T P x + q T x subject to  G x ≤ h A x = b \begin{align*} \text{minimize} \ &\frac{1}{2} x^T P x + q^T x \\ \text{subject to} \ & G x \leq h \\ & A x = b \end{align*} minimize subject to 21xTPx+qTxGxhAx=b

上面这个函数为二次规划QP问题的标准格式,最上面的公式为最小化目标函数,P是一个对称矩阵,代表二次项系数,q是列向量,表示线性项系数。 x是列向量,表示的是优化问题的变量,也就是求解的目标。

subject to 对应的是等式约束和不等式约束,其中G表示不等式约束的系数矩阵,h为不等式约束右边值。A代表等式约束系数。b是一个列向量,表示等式约束的右边值。

在python中可以采用cvxopt来对这个二次规划问题进行求解,它通过内部的优化算法来找到问题的最优解。参数说明:

  • P:二次项矩阵,是一个n x n的对称矩阵。
  • q:线性项矩阵,是一个长度为n的列向量。
  • G:不等式约束的系数矩阵,是一个m x n的矩阵。
  • h:不等式约束的右边值,是一个长度为m的列向量。
  • A:等式约束的系数矩阵,是一个p x n的矩阵。
  • b:等式约束的右边值,是一个长度为p的列向量。

求解以后的返回值为一个字典类型,其中包括以下内容:

  • 'x':最优解的列向量。
  • 'primal objective':优化后的目标函数值。
  • 'dual objective':对偶问题的目标函数值。
  • 'status':优化求解的状态,例如’optimal’表示求解成功。

下面举例说明通过cvxopt求解的一个简单过程:

import numpy as np
import cvxopt

# 定义二次规划问题的矩阵
P = np.array([[1.0, 0.5], [0.5, 1.0]])
q = np.array([-2.0, -3.0])
G = np.array([[-1.0, 0.0], [0.0, -1.0]])
h = np.array([0.0, 0.0])
A = np.array([[1.0, 1.0]])
b = np.array([1.0])

# 求解二次规划问题
res = cvxopt.solvers.qp(cvxopt.matrix(P), cvxopt.matrix(q), cvxopt.matrix(G), cvxopt.matrix(h), cvxopt.matrix(A), cvxopt.matrix(b))

# 提取优化结果
optimal_solution = np.array(res['x'])

print("Optimal Solution:")
print(optimal_solution)

print("Optimal Objective Value:")
print(res['primal objective'])

接下来回到Carla代码中参考线平滑的求解过程,已经求得了H系数,和f系数。其次还有不等式约束:
∣ x    −    x r e f ∣ ⩽ b u f f    \left| x\,\,-\,\,x_{ref} \right|\leqslant buff\,\, xxrefbuff
接下来构造cvxopt求解器的系数,由于目标函数已经构建出来了,其中H就是G,f就是q。因此只需要把不等式约束的系数构建好就可以求解了。

G = np.concatenate((np.identity(2 * n), -np.identity(2 * n)))  # (4n, 2n) identity创建2n*2n的单位矩阵。
h = np.concatenate((ub, -lb))  # (4n, 1)

解释以下,这里的G和h,因为有上界和下界约束,也就是有两个不等式约束条件。需要将G和h构造成为矩阵形式。
G = [ I 2 n − I 2 n ] h    =    [ u b − l b ] G=\left[ \begin{array}{c} I_{2n}\\ -I_{2n}\\ \end{array} \right] \\ h\,\,=\,\,\left[ \begin{array}{c} ub\\ -lb\\ \end{array} \right] G=[I2nI2n]h=[ublb]
其中ub和lb如下:
u b    =    [ x 1 + b u f f y 1 + b u f f ⋮ ⋮ x n + b u f f y n + b u f f ]    l b    =    [ x 1 − b u f f y 1 − b u f f ⋮ ⋮ x n − b u f f y n − b u f f ] ub\,\,=\,\,\left[ \begin{array}{c} x_1+buff\\ y_1+buff\\ \vdots\\ \vdots\\ x_n+buff\\ y_n+buff\\ \end{array} \right] \,\, lb\,\,=\,\,\left[ \begin{array}{c} x_1-buff\\ y_1-buff\\ \vdots\\ \vdots\\ x_n-buff\\ y_n-buff\\ \end{array} \right] ub= x1+buffy1+buffxn+buffyn+buff lb= x1buffy1buffxnbuffynbuff
接下来就可以对二次规划求解了:

cvxopt.solvers.options['show_progress'] = False  # 程序没有问题之后不再输出中间过程
# 计算时要将输入转化为cvxopt.matrix
# 该方法返回值是一个字典类型,包含了很多的参数,其中x关键字对应的是优化后的解
res = cvxopt.solvers.qp(cvxopt.matrix(H), cvxopt.matrix(f), G=cvxopt.matrix(G), h=cvxopt.matrix(h))

因为得到的x还是$\left( x_{1,}y_1, \cdots x_n,y_n \right) $的格式,因此还要进行一定的改造。将其变成:包含点坐标的列表 [(x1, y1), (x2, y2), ...]

local_path_xy_opt = []
for i in range(0, len(res['x']), 2):
    local_path_xy_opt.append((res['x'][i], res['x'][i + 1]))

还需要计算平滑后的坐标点的航向角和曲率:

theta_list, k_list = cal_heading_kappa(local_path_xy_opt)  # 计算坐标点的航向角和曲率。
x_y_theta_kappa_list = []
for i in range(len(local_path_xy_opt)):
    x_y_theta_kappa_list.append(local_path_xy_opt[i] + (theta_list[i], k_list[i]))
    return x_y_theta_kappa_list

计算航向角和曲率的方法在LQR的章节中有描述,主要利用中点欧拉法来实现。

这样就完成了对参考线轨迹点的平滑处理。

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

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

相关文章

LeetCode 2050. Parallel Courses III【记忆化搜索,动态规划,拓扑排序】困难

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

适用于 Windows 10/11 的 10 款最佳免费 PDF 阅读器软件

PDF 文档非常受欢迎,因为它们可以在任何操作系统上打开,并且很容易附加到电子邮件、消息或网站中。PDF 文档还具有不易更改的优点。因此,它被个人和组织广泛用于简历、学习材料、文档以及外围设备和设备手册的数字副本。 PDF 阅读器软件可帮…

【JavaEE初阶】Servlet (三)MessageWall

在我们之前博客中写到的留言墙页面,有很严重的问题:(留言墙博客) 如果刷新页面/关闭页面重开,之前输入的消息就不见了.如果一个机器上输入了数据,第二个机器上是看不到的. 针对以上问题,我们的解决思如如下: 让服务器来存储用户提交的数据,由服务器保存. 当有新的浏览器打开页…

Python 基础(十七):库

❤️ 博客主页:水滴技术 🌸 订阅专栏:Python 入门核心技术 🚀 支持水滴:点赞👍 + 收藏⭐ + 留言💬 文章目录 一、Python库的概念二、常用标准库2.1、数字和数学2.2、文件和目录操作2.3、时间和日期2.4、网络通信2.5、并发和多线程2.6、数据压缩和归档2.7、数据序列化…

深度专访盖国强丨《TVP技术指针:共创国产数据库的“中国时刻”》

日前,腾讯云《TVP技术指针》栏目对云和恩墨创始人盖国强进行了深度专访。从专业DBA到创立云和恩墨公司,从 Oracle ACE 国内第一人到国产数据库的践行者,伴随中国数据库成长的二十年,他有哪些思考、判断、行动和远见?在…

苍穹外卖-day05

苍穹外卖-day05 本项目学自黑马程序员的《苍穹外卖》项目,是瑞吉外卖的Plus版本 功能更多,更加丰富。 结合资料,和自己对学习过程中的一些看法和问题解决情况上传课件笔记 视频:https://www.bilibili.com/video/BV1TP411v7v6/?sp…

深入浅出对话系统——可控文本生成

引言 主要是介绍一篇引用800的论文 CTRL: A Conditional Transformer Language Model for Controllable Generation 它的Pytorch源码在 https://huggingface.co/transformers/v3.1.0/_modules/transformers/modeling_ctrl.html 主要思想是通过加入控制代码(control code)来控…

空中出租车运营公司【Flewber Global】申请纳斯达克IPO上市

猛兽财经获悉,总部位于美国纽约的空中出租车运营公司Flewber Global Inc,近期已向美国证券交易委员会(SEC)提交招股书,申请在纳斯达克IPO上市,股票代码为(FLYF),Flewber Global计划通…

[语义分割] DeepLab v2(膨胀卷积、空洞卷积、多尺度信息融合、MSc、ASPP、空洞空间金字塔池化、Step学习率策略、Poly学习率策略)

DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs 论文地址:DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs源码地址&…

大数据的兴起

目录 1.什么是大数据 2.大数据的具体应用 3.大数据的便利性 4.大数据的危害 1.什么是大数据 大数据是指规模庞大、复杂多样的数据集合,无法用传统的处理方法进行管理、处理和分析的一种数据类型。这些数据集合通常包括结构化数据(如数据库中的表格&am…

CEC2022代码(Matlab代码)及多种智能优化算法求解CEC2022

一、CEC2022测试函数 CEC2022测试集共有12个单目标测试函数,每个测试函数可选择的维度分别为10维、20维。该测试集合也是目前高质量论文应用最广泛的测试集,CEC2022测试集函数复杂,非常具有挑战力。 CEC2022测试函数与理论最优值 二、多种智…

Vcenter安全加固-防火墙-只允许特定的IP地址访问Vcenter

一、场景 1.只允许特定的IP地址访问Vcenter。 2、其余全部拒绝。 二、操作步骤 1、登录Vcenter管理界面 https://<Vcenter-ip>:5480 2、点击防火墙-添加 3、添加规则 1、先添加允许访问的IP地址和掩码。 1、先放你的Esxi主机管理地址&#xff0c;不然会托管。 2、…

CTF —— 网络安全大赛

前言 随着大数据、人工智能的发展&#xff0c;人们步入了新的时代&#xff0c;逐渐走上科技的巅峰。 \ ⚔科技是一把双刃剑&#xff0c;网络安全不容忽视&#xff0c;人们的隐私在大数据面前暴露无遗&#xff0c;账户被盗、资金损失、网络诈骗、隐私泄露&#xff0c;种种迹象…

Redhat7/CentOS7 网络配置与管理(nmtui、nmcli、GNOME GUI、ifcfg文件、IP命令)

背景&#xff1a;作为系统管理员&#xff0c;需要经常处理主机网络问题&#xff0c;而配置与管理网络的方法和工具也有好几种&#xff0c;这里整理分享一下网络配置与管理的几种方式。 1、NetworkManager 概述 在 Red Hat Enterprise Linux 7 中&#xff0c;默认网络服务由 N…

LightGlue论文翻译

LightGlue:光速下的局部特征匹配 摘要 - 我们介绍 LightGlue&#xff0c;一个深度神经网络&#xff0c;学习匹配图像中的局部特征。我们重新审视 SuperGlue 的多重设计决策&#xff0c;稀疏匹配的最新技术&#xff0c;并得出简单而有效的改进。累积起来&#xff0c;它们使 Lig…

KafKa脚本操作

所有操作位于/usr/local/kafka_2.12-3.5.1/bin。 rootubuntu2203:/usr/local/kafka_2.12-3.5.1/bin# pwd /usr/local/kafka_2.12-3.5.1/bin rootubuntu2203:/usr/local/kafka_2.12-3.5.1/bin# ls connect-distributed.sh kafka-delegation-tokens.sh kafka-mirror-mak…

PHP使用Redis实战实录1:宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案

宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案 前言一、Redis安装部署1.安装Redis2.php安装Redis扩展3.启动Redis 二、避坑指南1.6379端口配置2.Redis服务启动&#xff08;1&#xff09;Redis服务启动失败&#xff08;2&#xff09;Redis启动日志排查&#xff08;3&a…

使用云服务器和Frp(快速反向代理)框架快速部署实现内网穿透

目录 一. 背景1.1 内网穿透1.2 Frp介绍1.3 Frp配置流程 二. 云服务器配置2.1 配置安全组2.2 编写frps.ini 三. 内网主机配置3.1 编辑frpc.ini文件3.2 启动服务并配置开机自启动 四. 参考文献 一. 背景 现在有一台ubuntu云服务器&#xff0c;我想通过内网穿透将一台内网的主机当…

PS软件打开闪退是什么原因?怎么处理闪退的问题?

Photoshop简称PS&#xff0c;它作为图像处理专家&#xff0c;具有相当强大的功能&#xff0c;但是有小伙伴说不好用&#xff0c;因为打开后会闪退&#xff0c;那该怎么办呢&#xff1f; PS软件闪退的处理方法&#xff1a; 1.下载并安装Adobe Creative Cloud&#xff0c;再登录…

专利背后的故事 | 一种安全访问控制方法

Part 01 专利发明的初衷 在互联网中&#xff0c;不可避免地存在一些具有风险或者异常的数据访问行为&#xff0c;会对企业管理系统、政府管理系统等系统的安全造成威胁。为了保障数据访问的安全&#xff0c;企业需要设置访问控制策略。访问控制策略通常是由一条或多条规则组成…