• 【路径规划】基于matlab卡尔曼滤波、三次插值极速赛道赛车路径规划【含Matlab源码 2158期】


    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信。
    🍎个人主页:海神之光
    🏆代码获取方式:
    海神之光Matlab王者学习之路—代码获取方式
    ⛳️座右铭:行百里者,半于九十。

    更多Matlab仿真内容点击👇
    Matlab图像处理(进阶版)
    路径规划(Matlab)
    神经网络预测与分类(Matlab)
    优化求解(Matlab)
    语音处理(Matlab)
    信号处理(Matlab)
    车间调度(Matlab)

    ⛄一、卡尔曼滤波路径追踪优化简介

    割草机器人通过比对当前t时刻位置、导航方程之间偏移角度θ和偏移距离d,确定t+1时刻的运动方向属于递推型路径追踪。割草机器人工作过程中受到地面起伏等环境因素影响,在采用上述追踪方法时会和预测值产生偏差,造成机器人偏离导航方程,称之为系统预测误差。采用图像处理规划导航路径时,同样也会产生偏差,称为检测误差。由于地形环境因素和割草边界线图像检测误差均为偶然性误差,符合高斯白噪声,因此采用卡尔曼滤波的方法对割草机器人路径追踪进行优化。其核心思想为:比对预测值和检测值协方差,进而采用递推的方式计算出下一时刻系统路径最优解。
    在这里插入图片描述
    由于机器人在运动过程中受地面起伏影响,因此噪声矩阵Wt均值为0,协方差为Q。

    机器人检测只关心当前位置,进而和导航方程进行比对,因此系统检测模型为
    在这里插入图片描述
    结合式(11)、式(12)构建卡尔曼滤波系统预测方程为
    在这里插入图片描述
    预测值与检测值协方差为
    在这里插入图片描述
    以当前协方差为判定依据,综合考虑系统预测值和图像检测值,下一时刻最优化值为
    在这里插入图片描述
    其中,Kt+1为卡尔曼滤波增益。
    在这里插入图片描述
    协方差下一时刻更新,则
    在这里插入图片描述
    至此完成t+1时刻路径追踪优化,转向t+2时刻。

    ⛄二、部分源代码

    clear;
    clc;
    load ‘track_352.mat’;%原始赛道信息
    load ‘body.mat’;%车辆信息
    load ‘dynamic_constrains.mat’;%动力学约束
    safe_dist = 2;%距离障碍物安全距离

    %% 平滑插值赛道
    tolerance = 10;%先线性插值,去掉大间隙
    [track_x,track_y] = track_smooth_linear(track_x,track_y,tolerance);
    tolerance = 3;%然后三次样条线插值,达到最终步长
    [track_x,track_y] = track_smooth_spline(track_x,track_y,tolerance);
    clear tolerance;

    %% 求得与赛道长度对应的样条线参数
    [c,~] = size(track_x);
    [spline_A] = spline_matrix_gen©;%样条线求解矩阵,要留在内存中,加速计算
    para_x = spline_A * track_x;%x三次样条参数
    para_y = spline_A * track_y;%y三次样条参数

    %% 单位切向量
    [vector] = vector_gen(para_x,para_y,c);

    %% 绘制中心线、左右边界及障碍物
    draw_track(track_x,track_y,vector,track_w,obs_x,obs_y,c);

    %% QP优化初始化
    alpha_out = zeros(c,1);%本次次迭代结果
    alpha_last = zeros(c,1);%上一次迭代结果
    [lb,ub] = init_lub(track_w,body.Wb,c);%上下界初始化
    [Aieq,bieq] = init_ieq(track_x,track_y,obs_x,obs_y,safe_dist,c);%有关障碍物的不等式约束初始化
    stop_inter_thres = c * 0.01;%每一次迭代后所有点上横向改变平方和,每一个点上差别不超过1厘米
    inter_val = 100000;%初始停止条件数值
    path_cnt = 0;%迭代次数

    %% QP优化
    %不下降时停止迭代
    tic;
    while inter_val >= stop_inter_thres
    [alpha_out,alpha_last,lb,ub,track_x,track_y,vector] = QP_optimization(spline_A,alpha_out,alpha_last,lb,ub,Aieq,bieq,track_x,track_y,vector,c);
    inter_val = sum(alpha_out.^2);
    path_cnt = path_cnt + 1;
    end
    [c_alpha,~] = size(alpha_out);
    if c_alpha == 0
    alpha_out = zeros(c,1);%以防无解
    end
    clear c_alpha;
    path_t = toc;
    clc;
    clear stop_inter_thres inter_val lb ub Aieq bieq;

    %% 生成最优路径及其信息
    draw_optimised_path(track_x,track_y,vector,alpha_out,‘m’);%绘制最优路径
    [track_x,track_y] = path_gen(track_x,track_y,vector,alpha_out);%保存最优路径
    [path_distance] = path_distance_calculate(track_x,track_y,c);%沿最优路径距离
    para_x = spline_A * track_x;
    para_y = spline_A * track_y;
    [vector] = vector_gen(para_x,para_y,c);
    [phi] = phi_accum_gen(vector,c);%参考车辆航向角
    [curvature_res] = get_curvature(para_x,para_y,c);%参考曲率
    clear obs_x obs_y obs_w safe_dist alpha_out alpha_last;

    %% 速度规划
    [apex_location,apex_cnt] = get_apex(curvature_res,c);%标记Apex点
    vmax = 40;%限制最高直线车速
    [vel_geo] = geometry_vel_calculate(curvature_res,vmax,ay_para,c);%计算几何速度限制
    [vel_forward] = forward_calculate(apex_location,apex_cnt,vel_geo,curvature_res,path_distance,acc_para,ay_para,c);%加速限制
    [vel_backward] = backward_calculate(apex_location,apex_cnt,vel_geo,curvature_res,path_distance,brk_para,ay_para,c);%减速限制
    vel_profile = min(vel_geo,min(vel_forward,vel_backward));%三种取最小值
    [vel_flying] = init_vel_calculate(vel_profile,vel_profile(end),acc_para,ay_para,path_distance,curvature_res,c);%飞驰圈速度规划
    delta_profile = atan(curvature_res * body.l / 1000);
    clear apex_location apex_cnt vel_geo vel_forward vel_backward acc_para ay_para brk_para vmax vel_profile;

    %% 绘制速度规划
    figure(2);
    clf;
    subplot(2,1,1);
    plot(path_distance,vel_flying,‘r’);%绘制速度-距离规划
    xlabel(‘S\m’);
    ylabel(‘v\m*s^-1’);
    title(‘velocity profile and history’);
    subplot(2,1,2);
    plot(path_distance,delta_profile,‘r’);%绘制方向盘转角-距离规划
    xlabel(‘S\m’);
    ylabel(‘\delta \deg’);
    title(‘steering profile and history’);

    %% 仿真参数设置
    dt = 0.1;%时间间隔
    np = 20;%预测步长
    nc = 10;%控制步长
    nx = 3;%状态量数目
    nu = 2;%控制量数目

    %% 参考量设置
    state_ref = [track_x,track_y,phi,curvature_res,vel_flying,path_distance];

    %% 物理限制设置
    u_max = [40;0.5];
    u_min = [2;-0.5];
    du_max = [0.2;0.2];
    du_min = [-0.2;-0.2];

    %% 车辆参数及状态设置
    l = body.l / 1000;
    target_v = vel_flying(1);%期望速度
    delta = 0;%当前转向角
    travel = 0;%当前里程
    control_d = [0;0];%上一时刻控制偏差
    control_act = [target_v;delta];%当前实际控制值
    control = [control_act];%储存实际控制指令
    x_d = [0;0;0];%当前状态偏差
    x_act = [track_x(1);track_y(1);phi(1)];
    x_res = [x_act];%储存实际状态
    travel_history = [travel];%里程表历史

    %% 权重矩阵及观测矩阵生成
    [Qt,Rt,Ct,rou] = weight_matrix_gen(nx,nu,np,nc);

    %%
    index = 0;
    tic;
    mpc_cnt = 0;
    while index < c - 1
    % 矩阵生成↓↓↓
    [At,Bt] = sequential_increment_matrix_gen(x_act,control_act,Ct,np,nc,body,dt);
    % 求当前点偏差↓↓↓
    [x_d,index] = find_state_ref_err(para_x,para_y,state_ref,x_act,travel,c);
    target_v = vel_flying(index);
    % 求当前约束↓↓↓
    [A_eqst,b_eqst,A_ieqst,b_ieqst,lb,ub] = get_constrains(u_max,u_min,du_max,du_min,control_act,nc,nu);
    % 求最优控制量偏差↓↓↓
    yita = [x_d;control_d];
    H = [Bt’ * Qt * Bt + Rt,zeros(size(Bt,2),1);zeros(1,size(Bt,2)),rou];
    H = H + H’;%quadprog程序是求1/2H,故将其变为二倍
    F = [2 * yita’ * At’ * Qt * Bt,0]';%最后一个对应松弛变量
    U_out = quadprog(H,F,A_ieqst,b_ieqst,A_eqst,b_eqst,lb,ub);
    % 求最优控制量↓↓↓
    delta_des = delta_profile(index);%该点处期望转向角
    control_act = [target_v;delta_des] + control_d + [U_out(1);U_out(2)];%用得到的控制偏差和上一步的控制偏差修正
    control_act(1) = min(control_act(1),target_v);
    control = [control,control_act];%储存
    control_d = [U_out(1);U_out(2)];%更新当前的控制偏差
    % 更新并储存状态↓↓↓
    [x_act,travel] = update_state(x_act,control_act,dt,l,travel);
    x_res = [x_res,x_act];%储存
    mpc_cnt = mpc_cnt + 1;
    travel_history = [travel_history;travel];%储存里程历史
    end

    ⛄三、运行结果

    在这里插入图片描述
    在这里插入图片描述

    ⛄四、matlab版本及参考文献

    1 matlab版本
    2014a

    2 参考文献
    [1]白刚.卡尔曼滤波在割草机器人路径追踪优化中应用[J].农机化研究. 2021,43(06)

    3 备注
    简介此部分摘自互联网,仅供参考,若侵权,联系删除

    🍅 仿真咨询
    1 各类智能优化算法改进及应用

    生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化

    2 机器学习和深度学习方面
    卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断

    3 图像处理方面
    图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知

    4 路径规划方面
    旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化

    5 无人机应用方面
    无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配

    6 无线传感器定位及布局方面
    传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化

    7 信号处理方面
    信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化

    8 电力系统方面
    微电网优化、无功优化、配电网重构、储能配置

    9 元胞自动机方面
    交通流 人群疏散 病毒扩散 晶体生长

    10 雷达方面
    卡尔曼滤波跟踪、航迹关联、航迹融合

  • 相关阅读:
    C++20之Concept(概念部分)
    【紧急整理】《信息资源管理》信息资源管理的标准与法规,第5章
    Linux桌面溯源
    了解ansible
    JavaScript涉及二进制的转换
    力扣每日一题2022-08-16简单题:设计有序流
    idea不识别yaml文件导致,配置文件点击跳转不了类
    Word处理控件Aspose.Words功能演示:从 Java 中的 Word 文档中提取图像
    【Unity】Unity C#基础(十四)注释
    Android12版本闹钟服务崩溃问题
  • 原文地址:https://blog.csdn.net/TIQCmatlab/article/details/127253577