路径规划之基于二次规划的路径平滑Matlab代码

参考:

自动驾驶决策规划算法第二章第二节(上) 参考线模块_哔哩哔哩_bilibili

自动驾驶决策规划算法第二章第二节(下) 参考线代码实践_哔哩哔哩_bilibili

QP函数,二次规划的逻辑

function [smooth_path_x,smooth_path_y] = QP(path_x, path_y, w_cost_smooth, w_cost_length, w_cost_ref, x_lb, x_ub, y_lb, y_ub)

%   采用二次规划平滑路径
%   0.5X'Hx + f'x = min
%   lb <= x <= ub

% 输入:
% path_x, path_y: 待平滑路径
%  w_cost_smooth, w_cost_length, w_cost_re:平滑代价,紧凑代价,几何相似代价权重系数
% x_lb, x_ub, y_lb, y_ub:允许x, y变化的上下界(约束条件)

% 输出:
% smooth_path_x,smooth_path_y:平滑后路径

% 分析二次规划的形式
% H = 2 * (w_cost_smooth * A1' * A1 + w_cost_length * A2' * A2 + w_cost_ref * A3' * A3)
% f = -2 * w_cost_ref * path(待优化路径的xy组合)
% A1 = [1, 0, -2, 0, 1, 0              
%          1, 0, -2, 0, 1, 0
%             1, 0, -2, 0, 1, 0
%                1, 0, -2, 0, 1, 0
%                    .............]
% A2 = [1, 0, -1, 0,              
%          1, 0, -1, 0,
%             1, 0, -1, 0,
%                1, 0, -1, 0,
%                    .............]
% A3 为2n*2n的单位矩阵,n为平滑点的个数

n = length(path_x);

% 初始化平滑路径
smooth_path_x = zeros(n,1);
smooth_path_y = zeros(n,1);

% 初始化损失函数相关信息
A1 = zeros(2*n-4, 2*n);
A2 = zeros(2*n-2, 2*n);
A3 = eye(2*n, 2*n);
path = zeros(2*n, 1);

% 初始化不等式约束
lb = zeros(2*n, 1);
ub = zeros(2*n, 1);

% 初始化等式约束(起点和终点必须一致)
Aeq = zeros(2*n, 2*n);
beq = zeros(2*n, 1);

%计算f、lb、ub
for i = 1:n
    path(2*i-1) = path_x(i);
    path(2*i) = path_y(i);

    lb(2*i-1) = path_x(i) - x_lb;
    lb(2*i) = path_y(i) - y_lb;

    ub(2*i-1) = path_x(i) + x_ub;
    ub(2*i) = path_y(i) + y_ub;
end

% 计算A1
for i = 1:2*n-5
    A1(i, i) = 1;
    A1(i, i+2) = -2;
    A1(i, i+4) = 1;
    A1(i+1, i+1) = 1;
    A1(i+1, i+3) = -2;
    A1(i+1, i+5) = 1;
end

% 计算A2
for i = 1:2*n-3
    A2(i,i) = 1;
    A2(i,i+2) = -1;
    A2(i+1,i+1) = 1;
    A2(i+1,i+3) = -1;
end

H = 2 * (w_cost_smooth * (A1' * A1) + w_cost_length * (A2' * A2) + w_cost_ref * (A3' * A3));
f = -2 * w_cost_ref * path;

% 计算Aeq、beq
Aeq(1,1) = 1;
Aeq(2,2) = 1;
Aeq(2*n-1,2*n-1) = 1;
Aeq(2*n,2*n) = 1;
beq(1,1) = path(1,1);
beq(2,1) = path(2,1);
beq(2*n-1,1) = path(2*n-1,1);
beq(2*n,1) = path(2*n,1);

%起点
X0 = path;

% 进行二次规划
X = quadprog(H,f,[],[],Aeq,beq,lb,ub,X0);

for i = 1:n
    smooth_path_x(i) = X(2*i-1);
    smooth_path_y(i) = X(2*i);
end
 

end

main函数,运行QP

clear;
clc;

path_x = [0, 1, 2, 4, 5, 5, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 14, 14];
path_y = [0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 12, 13, 14, 14];
w_cost_smooth = 3;
w_cost_length = 2;
w_cost_ref = 1; 
x_lb = 1;
x_ub = 1;
y_lb = 1;
y_ub = 1;

[smooth_path_x, smooth_path_y] = QP(path_x, path_y, w_cost_smooth, w_cost_length, w_cost_ref, x_lb, x_ub, y_lb, y_ub);

hold on;
plot(path_x, path_y,'Color','red');
plot(smooth_path_x, smooth_path_y,'Color','blue');

运行结果:蓝色为原路径,红色为平滑路径

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java方法入门(006)

♦️方法的概念 什么是方法&#xff1f; 方法是将一组完成特定功能的代码整合在一起&#xff0c;以达到简化开发&#xff0c;减少代码耦合&#xff0c;提高代码复用性的结构&#xff0c;类似与C语言中的函数。方法是程序中最小的执行单元&#xff0c;可降低代码的重复性。 如用…

Python 100道基础入门练习题!附解析

看书&#xff0c;看视频都可以帮助你学习代码&#xff0c;但都只是辅助作用&#xff0c;学好 Python&#xff0c;最重要的还是 多敲代码&#xff0c;多刷题。 不知道怎么找题刷题的小伙伴&#xff0c;可以看看这里今天带来了100道练习题。覆盖了基本语法&#xff0c;数据结构&…

【Docker-compose】搭建php 环境

文章目录 Docker-compose容器编排1. 是什么2. 能干嘛3. 去哪下4. Compose 核心概念5. 实战 &#xff1a;linux 配置dns 服务器&#xff0c;搭建lemp环境&#xff08;Nginx MySQL (MariaDB) PHP &#xff09;要求6. 配置dns解析配置 lemp Docker-compose容器编排 1. 是什么 …

从零开学C++:类和对象(上)

引言&#xff1a;在学习了C的入门级知识之后&#xff0c;现在就让我们一起进入类和对象的学习吧&#xff0c;该知识点我将分为上&#xff0c;中&#xff0c;下三个部分对其进行讲解。 更多有关C语言和数据结构的知识详解可前往个人主页&#xff1a;计信猫 目录 一&#xff0c;类…

MySql性能调优01-[数据结构和索引]

数据结构和索引 什么是索引索引的种类常见索引数据结构和区别二叉树 红黑树 什么是索引 索引的种类 在Mysql中索引是在存储引擎层实现的&#xff0c;而不是在服务层实现的 按数据结构分&#xff1a;Btree索引、Hash索引、Full-text索引按存储结构分&#xff1a;聚簇索引、非聚…

51单片机:电脑通过串口控制LED亮灭(附溢出率和波特率详解)

一、功能实现 1.电脑通过串口发送数据&#xff1a;0F 2.点亮4个LED 二、注意事项 1.发送和接受数据的文本模式 2.串口要对应 3.注意串口的波特率要和程序中的波特率保持一致 4.有无校验位和停止位 三、如何使用串口波特率计算器 1.以本程序为例 2.生成代码如下 void Uar…

d3dcompiler_43.dll文件是什么?如何快速有效的解决d3dcompiler_43.dll文件丢失问题

dcompiler_43.dll 是一个Windows系统中的系统文件&#xff0c;属于DirectX软件的一部分。这个dcompiler_43.dll&#xff08;动态链接库&#xff09;文件主要用于处理与3D图形编程有关的任务&#xff0c;是运行许多游戏和高级图形程序必需的组件之一。那么如果电脑丢失d3dcompil…

Qt/QML学习-PathView

QML学习 PathView例程视频讲解代码 main.qml import QtQuick 2.15 import QtQuick.Window 2.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")color: "black"PathView {id: pathViewanchors.fill: parentmodel: ListModel {List…

scipy库中,不同应用滤波函数的区别,以及FIR滤波器和IIR滤波器的区别

一、在 Python 中&#xff0c;有多种函数可以用于应用 FIR/IIR 滤波器&#xff0c;每个函数的使用场景和特点各不相同。以下是一些常用的 FIR /IIR滤波器应用函数及其区别&#xff1a; from scipy.signal import lfiltery lfilter(fir_coeff, 1.0, x)from scipy.signal impo…

轻松搭建RAG:澳鹏RAG开发工具

我们很高兴地宣布推出RAG开发工具&#xff0c;这是澳鹏大模型智能开发平台的一项新功能。此功能可帮助团队轻松创建高质量的检索增强生成 (RAG) 模型。 什么是 RAG&#xff1f; 检索增强生成 (RAG) 通过利用大量外部数据源&#xff08;例如企业的知识库&#xff09;显著增强了…

springboot篮球馆管理系统-计算机毕业设计源码21945

目 录 摘要 1 绪论 1.1选题背景 1.2研究意义 1.3论文结构与章节安排 2 篮球馆管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 …

Python 爬虫与 Java 爬虫:相似之处、不同之处和选项

在信息时代&#xff0c;网络上可用的数据量巨大且不断增长。为了从这些数据中提取有用的信息&#xff0c;爬虫已成为一种重要的技术。Python 和 Java 都是流行的编程语言&#xff0c;都具有强大的爬虫功能。本文将深入探讨 Python 爬虫和 Java 爬虫之间的差异&#xff0c;以帮助…

「媒体邀约」上海请媒体的费用

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 上海无疑是最具活动的城市之一&#xff0c;各种大大小小的论坛、发布会、展览展会应接不暇&#xff0c;那么在上海做活动想邀请媒体进行宣传报道&#xff0c;需要多少费用呢&#xff1a;…

C++ 【 PCL 】点云添加随机均匀噪声及源代码

PCL向点云添加均匀随机噪声&#xff1a; #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/common/random.h>int main() {// 加载点云文件pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::Poi…

深入剖析数据库索引

写在前面&#xff1a; 此博客内容已经同步到我的博客网站&#xff0c;如需要获得更优的阅读体验请前往https://mainjaylai.github.io/Blog/blog/database 文章目录 如何验证我们正在使用InnoDB引擎 主键如果你没有自己创建任何主键会发生什么&#xff1f;关键字和索引之间的区别…

【HarmonyOS NEXT】鸿蒙 代码混淆

代码混淆简介 针对工程源码的混淆可以降低工程被破解攻击的风险&#xff0c;缩短代码的类与成员的名称&#xff0c;减小应用的大小。 DevEco Studio提供代码混淆的能力并默认开启&#xff0c;API 10及以上版本的Stage模型、编译模式为release时自动进行代码混淆。 使用约束 …

MD5加密和注册页面的编写

MD5加密 1.导入包 npm install --save ts-md5 2.使用方式 import { Md5 } from ts-md5; //md5加密后的密码 const md5PwdMd5.hashStr("123456").toUpperCase(); 遇见的问题及用到的技术 注册页面 register.vue代码 <template><div class"wappe…

GBPC5010-ASEMI逆变箱专用GBPC5010

编辑&#xff1a;ll GBPC5010-ASEMI逆变箱专用GBPC5010 型号&#xff1a;GBPC5010 品牌&#xff1a;ASEMI 封装&#xff1a;GBPC-4 批号&#xff1a;2024 现货&#xff1a;50000 最大重复峰值反向电压&#xff1a;1000V 最大正向平均整流电流(Vdss)&#xff1a;50A 功…

越南语是一门什么样的语言?如何学好越南语?

越南语是一种南亚语系越芒语族的语言&#xff0c;具有丰富的汉语借词&#xff0c;尤其在抽象概念的表达上&#xff0c;汉越词汇占有很大比例。作为一种声调语言&#xff0c;越南语拥有六个声调&#xff0c;这使得其发音具有音乐性和节奏感。它是一种孤立语&#xff0c;依赖于语…

Xshell配置ssh免密码登录(密钥登陆)

文章目录 一、Xshell登陆步骤 一、Xshell登陆步骤 1.生成客户端的公钥私钥 2.生成公钥文件 3.生成私钥文件 4.将公钥传输进要登录的服务器中 5.修改公钥文件名为authorized_keys (authorized_keys是用于存储公钥的特殊文件,如果已经有了这份文件,可以在末尾追加) 6.连…