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

参考:

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

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

QP函数,二次规划的逻辑

Matlab 复制代码
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

Matlab 复制代码
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');

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

相关推荐
AI小白的Python之路13 分钟前
数据结构与算法-排序
数据结构·算法·排序算法
aneasystone本尊20 分钟前
学习 Coze Studio 的工作流执行逻辑
人工智能
DashVector22 分钟前
如何通过Java SDK检索Doc
后端·算法·架构
aneasystone本尊28 分钟前
再学 Coze Studio 的智能体执行逻辑
人工智能
zzz93330 分钟前
transformer实战——mask
算法
xuanwuziyou30 分钟前
LangChain 多任务应用开发
人工智能·langchain
新智元1 小时前
一句话,性能暴涨 49%!马里兰 MIT 等力作:Prompt 才是大模型终极武器
人工智能·openai
猫头虎1 小时前
猫头虎AI分享|一款Coze、Dify类开源AI应用超级智能体Agent快速构建工具:FastbuildAI
人工智能·开源·github·aigc·ai编程·ai写作·ai-native
一只鱼^_1 小时前
牛客周赛 Round 105
数据结构·c++·算法·均值算法·逻辑回归·动态规划·启发式算法
是阿建吖!1 小时前
【动态规划】斐波那契数列模型
算法·动态规划