基于模型预测(MPC)的四轮转向车辆轨迹规划(Matlab代码实现)

news2024/11/17 3:56:48

    目录

💥1 概述

📚2 运行结果

🎉3 参考文献

👨‍💻4 Matlab代码

💥1 概述

在轨迹跟踪应用领域,通常 MPC 建模可根据机器人的控制方式选择基于运动学运动状态方程建模或者基于动力学运动状态方程建模。前者是根据车辆转向的几何学角度关系和速度位置关系来建立描述车辆的运动的预测模型,一般只适用于低速运动场景;后者是对被控对象进行综合受力分析,从受力平衡的角度建模,一般应用在高速运动场景,如汽车无人驾驶。

📚2 运行结果

主函数部分代码:

addpath(genpath('YALMIP-master'));
clear; close all;clc;
​
% constraints that is representing a car or a thiner road 
% final state with a higher weight to track the fianl state reference
​
%% Parameters definition
%
 model parametersparams.a_acc                = 1;                 % acceleration limit
params.a_dec                = 2;                   % decelerationlimit
params.delta_max            = 0.4;                 % maximum steering angle 
params.beta_max             = pi;                  % crabbing slip angle limit
params.beta_dot_max         = (pi/180)*(100);      % crabbing slip angle rate limit
params.l_f                  = 2;                   % distance between center of gravity and front axle
params.l_r                  = 2;                   % distance between center of gravity and rear axle
params.vehicle_width        = 2;                   % vehicle width
params.Ts                   = 0.1;                 % sampling time (both of MPC and simulated vehicle)
params.nstates              = 4;                   % number of states
params.ninputs              = 3;                   % number of inputs
​
% environment parameters
params.road                 = 'DLC';
params.activate_obstacles   = 0; 
params.obstacle_centers     = [10 -2; 20  0; 30 -2; 40 6]; % x and y coordinate of the 4 obstacles
params.obstacle_size        = [2 6];                    % size of the obstacles
switch params.road
    case 'real'
        [X,Y,X_park,Y_park]                   = data_generate(params.road);
    case 'DLC'
        [X,Y,X2,Y2]                   = data_generate(params.road);
    otherwise
        [X,Y]                   = data_generate(params.road);
end
params.X                    = X;
params.Y                    = Y;
params.lane_semiwidth       = 4;                        % semi-width of the lane
params.track_end_x          = X(end);                   % Tracking end X coordinate of the planner
params.track_end_y          = Y(end);                   % Tracking end Y coordinate of the planner
params.xlim                 = max(X);                   % x limit in the plot
params.ylim                 = max(Y);                   % y limit in the plot
​
​
​
% simulation parameters in frenet coord
params.s0                   = 0;                           % initial s coordinate
params.y0                   = params.lane_semiwidth/2;     % initial y coordinate
params.theta0               = pi/2;                        % initial relative heading angle
params.v0                   = 5;                          % initial speed
params.theta_c0             = pi/2;                        % initial heading angle of the curve
params.N_max                = 1000;                        % maximum number of simulation steps
params.vn                   = params.v0/2;                 % average speed during braking
params.vs                   = 1;                           % Stopping speed during the last stop 
​
%%% in this case, theta = theta_m (angle of the velocity vector)- theta_c (angle of the tangent vector of the curve)
​
% simulation parameters in cartesian coord %%%%% change according to
%
 different roadparams.x_c0                 = X(1)-params.y0; %initial x coordinate
params.y_c0                 = 0;                            % initial y coordinate
​
​
% plotting parameters
params.window_size          = 10;                       % plot window size for the
%during simulation, centered at the
%current position (x,y) of the vehicle
​
params.plot_full            = 1;                        % 0 for plotting only the window size,
​
​
% 1 for plotting from 0 to track_end
%% Simulation environment
%
 initializationsref         = zeros(params.N_max,1);
z            = zeros(params.N_max,params.nstates);             % z(k,j) denotes state j at step k-1(s and y)
z_cart       = zeros(params.N_max,3);                          % x,y coordinate in cartesian system and the heading angle
theta_c      = zeros(params.N_max,1);                          % initial value of theta_c
u            = zeros(params.N_max,params.ninputs);             % z(k,j) denotes input j at step k-1
z(1,:)       = [params.s0,params.y0,params.theta0,params.v0];  % definition of the intial state
z_cart(1,:)  = [params.x_c0,params.y_c0,params.theta0];
%theta_c(1)   = pi/2;    %%%%%% This value is changable according to different roads
comp_times   = zeros(params.N_max);                            % total computation time each sample
solve_times  = zeros(params.N_max);                            % optimization solver time each sample
i = 0;
N = 10;                                                 %predicted horizon length
m = params.N_max;
% formulating the reference of the system
switch params.road
    case 'real'
        path1 = [X;Y]';
        path2 = [X_park;Y_park]'
;        [S1, ~, ~, ~, ~] = getPathProperties(path1);
        num        = S1(end)/(params.v0*params.Ts);
        n_step1    = round(num);
        [S2, ~, ~, ~, ~] = getPathProperties(path2);
        num        = S2(end)/(params.vn*params.Ts);
        n_step2    = round(num);
        n_steps    = n_step1+n_step2;
        vq1         = linspace(Y(1),Y(end),n_step1);    % this need to be the 'variable' of the path function
        centerX1    = interp1(Y,X,vq1,'pchip');      % initialize the centerline y coordinate
        centerY1    = vq1;
        path_new_1   = [centerX1;centerY1]';
        vq2         = linspace(X_park(1),X_park(end),n_step2);
        centerY2    = interp1(X_park,Y_park,vq2,'
pchip
');      % initialize the centerline y coordinate
        centerX2    = vq2;
        path_new_2   = [centerX2;centerY2]'
;        path_new     = [path_new_1;path_new_2];
        [S, dX, dY, theta_c, C_c] = getPathProperties(path_new);
        theta_c_ref    = zeros(n_steps+N,1);
        C_c_ref        = zeros(n_steps+N,1);
        v_ref          = zeros(n_steps+N,1);
        for ii = 1:length(theta_c_ref)
            if ii<n_steps
                theta_c_ref(ii) = theta_c(ii);
                C_c_ref(ii)     = C_c(ii);
            else
                theta_c_ref(ii) = theta_c(end);
                C_c_ref(ii)     = C_c(end);
            end
        end
​

🎉3 参考文献

​[1]张鑫,吴伊凡,崔永琪.基于改进MPC算法的四旋翼无人机轨迹跟踪控制[J].电子技术与软件工程,2023,No.245(03):148-153.

部分理论引用网络文献,若有侵权联系博主删除。

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

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

相关文章

深入探讨车载CAN协议的工作原理和应用场景

CAN概述 CAN&#xff08;Controller Area Network&#xff09;总线协议是一种数据通信协议&#xff0c;最初是由Bosch公司开发&#xff0c;用于汽车领域中的内部通讯。 CAN总线协议是一种串行通信协议&#xff0c;支持多主机和多从机之间的通讯&#xff0c;可以在不同的控制单…

典型的高可用设计(一):MinIO

为了更好的了解高可用设计&#xff0c;将各类常用服务关于高可用的设计原理汇总到一起&#xff0c;通过横向对比的方式去发现这些典型设计的共同之处和差异点。 一、部署方式 MinIO 有单机单硬盘、单机多硬盘、多机多硬盘三种部署模式。单机单硬盘存在单点风险&#xff0c;数据…

ElasticSearch 部署及安装ik分词器

ansiable playbook链接&#xff1a; https://download.csdn.net/download/weixin_43798031/87719490 需要注意的点&#xff1a;公司es集群现以三个角色部署分别为 Gateway、Master、Data 简单的理解可以理解为在每台机器上部署了三个es&#xff0c;以端口和配置文件来区分这三…

itop-3568 开发板系统编程学习笔记(18)LED 应用编程

【北京迅为】嵌入式学习之Linux系统编程篇 https://www.bilibili.com/video/BV1zV411e7Cy/ 个人学习笔记 文章目录 应用层操作 LED 的两种方式sysfs 方式控制 LED控制方法原理简介 编写 LED 应用程序 应用层操作 LED 的两种方式 应用层操作底层硬件有两种方法&#xff0c;分别…

数据治理与数据中台架构

随着工业 4.0 时代的到来&#xff0c;传统行业的数字化转型是大势所趋&#xff1b;将数据提高到数据要素层面&#xff0c;让传统的技术在新的场景下发挥出新的作用&#xff0c;是近期研究和探讨的焦点话题。数语科技支持和服务传统行业多年&#xff0c;聚焦于传统数据建模和数据…

PostgreSQL中的复制延迟

PostgreSQL是一个流行的开源关系数据库管理系统&#xff0c;PostgreSQL中可能遇到的一个常见问题是复制延迟。 在这篇博客中&#xff0c;我们将讨论什么是复制延迟&#xff0c;它为什么会发生&#xff0c;以及如何在PostgreSQL中减轻它。 什么是复制延迟&#xff1f; 复制延迟…

Flink系列-9、Flink DataStream的输入数据集Data Source

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 大数据系列文章目录 官方网址&#xff1a;https://flink.apache.org/ 学习资料&#xff1a;https://flink-learning.org.cn/ 目录 addSource方…

【A component required a bean of type ‘xxx‘ that could not be found.】

在学谷粒商城项目的时候出现了以下问题&#xff1a; *************************** APPLICATION FAILED TO START *************************** Description: A component required a bean of type org.redisson.Redisson that could not be found. Action: Consider defining a…

React-Router详解

React-Router详解 简介React-Router React-Router是一款用于构建单页面应用&#xff08;SPA&#xff09;中处理路由的JavaScript库。在现代的Web应用中&#xff0c;SPA已经成为了一种常见的应用架构模式&#xff0c;它允许在不刷新整个页面的情况下进行交互式的用户体验。而Re…

GPT能给审计带来什么

ChatGPT的出现&#xff0c;让人工智能再次站在了聚光灯下&#xff0c;引发持续性的热议和关注。GPT模型作为重要的支撑&#xff0c;国内外近段时间密集性地发布了众多的大语言模型&#xff0c;OpenAI推出GPT-4、谷歌推出LaMDA和PaLM等大模型、Meta推出开源大模型LLaMA&#xff…

2023-04-23 学习记录--C/C++-邂逅C/C++(中)

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 上一篇&#xff1a;邂逅C/C&#xff08;上&#xff09; 一、if语句 ⭐️ &#xff08;一&#xff09;、格式 &#x1f36d; if…

6.1 欧拉方法与改进欧拉方法

6.1.1 欧拉方法 欧拉方法是一种数值解常微分方程&#xff08;ODE&#xff09;的方法&#xff0c;可以用于近似求解给定的初值问题。它是以欧拉命名的瑞士数学家莱昂哈德欧拉所发明的&#xff0c;因此得名。 欧拉方法的基本思路是将连续的常微分方程转化为离散的形式。具体而言…

全功能药效团图谱(Full-feature pharmacophore map)是什么?怎么绘制?

药效团和全功能药效团图谱是什么&#xff1f; 药效团是指与靶点相互作用并导致生物活性的化学基团或者分子结构片段。【药效团通常包括氢键受体/供体、疏水部位、离子化部位等关键成分】 "全功能药效团图谱" &#xff08;Full-feature pharmacophore map&#xff0…

.net6 core web项目发布部署到Linux,以守护进程服务的形式部署启动,nginx实现转发

一、发布项目 1、以文件夹形式 2、目标运行时选对应的平台&#xff08;Linux-x64&#xff09; 3、文件夹选项&#xff1a;在发布前删除所有现有文件 二、部署项目&#xff08;安装.net6环境&#xff1a;参考Linux安装 dotnet sdk 6.0&#xff09; &#xff08;1&#xff09;…

toRef

toRef就是把什么东西变成ref 用这个页面来讲解 改成这样就用不了&#xff0c;失去了响应的功能 为什么会这样&#xff1f; 看这个页面&#xff0c;其实这个Proxy的实现就响应式的原理&#xff0c;但是let namep.name实际上就是let name张三&#xff0c;只是把这个值给了name&…

Android 日志框架使用

在实际开发中&#xff0c;经常会遇到需要打印日志并保存到文件中&#xff0c;便于后面取日志分析代码运行情况&#xff0c;当然如果只是打印日志不需要记录文件&#xff0c;使用android自带的log工具就完全够了&#xff0c; Log打印日志会记录到系统日志中&#xff0c;可以取出…

光敏电阻传感器模块资料

实物项目案例 实物图&#xff1a; PCB图&#xff1a; 原理图&#xff1a; 用途&#xff1a; 光线亮度检测,光线亮度传感器&#xff0c;智能小车寻光模块 模块特色&#xff1a; 1、采用灵敏型光敏电阻传感器 2、比较器输出&#xff0c;信号干净&#xff0c;波形好&#x…

【Leetcode】10. 正则表达式匹配

10. 正则表达式匹配&#xff08;困难&#xff09; 题解 如果从左向右进行匹配的话&#xff0c;需要考虑字符后是否有 * 。 因此选择从右向左扫描更为简单。 *前面肯定有一个字符&#xff0c;它像是一个拷贝器&#xff0c;能够复制前面的单个字符&#xff0c;甚至也可以把这个…

Java 1.8新特性

接口的默认方法 Java 8允许给接口添加一个非抽象的方法实现&#xff0c;只需要使用default关键字即可&#xff0c;这个特征又叫做扩展方法 interface Formula {double calculate(int a);default double sqrt(int a) {return Math.sqrt(a);} }Formula接口在拥有calculate方法之…

【Linux初阶】进程的相关概念 | 进程管理 查看进程 获取进程标识符 fork进程创建

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;进程的概念&#xff0c;进程管理初识&#xff08;描述、管理进程&#xff09;&#xff0c;查看进程的基础方法…