首页 > 编程语言 >matlab练习程序(LQR路径跟踪)

matlab练习程序(LQR路径跟踪)

时间:2024-06-01 16:55:18浏览次数:24  
标签:Bd curp 练习 LQR matlab ind path dt PN

LQR 是一种优化控制方法,设计目标是找到一组控制输入,使得线性系统的状态轨迹尽可能地接近目标,同时使控制输入尽可能小。其目标函数是一个二次型成本函数。

分为以下几个步骤:

1. 设系统动态方程为:

其中x为状态量,u为控制输入,A和B为状态转移和控制矩阵。

2. 定义一个性能指标,即控制器的优化目标。在LQR中,通常采用二次型性能指标,即系统状态和控制输入的加权和的二次型。这个性能指标可以包括状态的偏差、控制输入的幅值等,可以根据具体需求进行调整:

其中,Q和R是权重矩阵,用于调整状态偏差和控制输入的相对重要性。

3. 设计LQR控制器,通过解离散时间的Riccati方程,可以获得最优的状态反馈控制器。这个控制器以状态为输入,根据系统的状态信息来生成控制输入,以最小化性能指标。

方程如下:

 

解该方程可以参考之前的文章。

4. 最后得到最优控制器公式如下:

 

其中K为状态反馈矩阵,根据当前系统状态可以得到最终控制量u=-Kx。

matlab代码如下:

clear all;close all;clc;

v =1;
lambda = 2;
dt = 0.1;
L=2.5;

x = 0:0.1:50;
y = sin(x/5);
path = [x' y'];
for i=2:length(path)
    dx = path(i,1)-path(i-1,1);
    dy = path(i,2)-path(i-1,2);
    path(i-1,3) = atan2(dy,dx);
end
path(length(path),3) = path(length(path)-1,3);
plot(path(:,1),path(:,2),'r.');
hold on;

curp=[0 0 0];

for i=1:length(path)
    
    d = path(:,1:2) - curp(1:2);
    dis = d(:,1).^2 + d(:,2).^2;
    [~,ind] = min(dis);                                     %找路径最近点索引

    dx = curp(1) - path(ind,1);
    dy = curp(2) - path(ind,2);
    dyaw = curp(3) - path(ind,3);  
    xstate = [dx;dy;sin(dyaw)];                                  %状态变量
        
    Ad=[1    0   -v*sin(path(ind,3))*dt;
        0    1   v*cos(path(ind,3))*dt;
        0    0    1];                                      %线性离散后的系统矩阵
    
    Bd=[cos(path(ind,3))*dt     0;
        sin(path(ind,3))*dt     0;
        0 dt];         %线性离散后的控制矩阵
  
    Q = [10 0 0;
        0 10 0;
        0 0 1];     %初始化LQR的权重矩阵
    R =[1 0;
        0 1];       %初始化LQR的权重矩阵
    
    %*********黎卡提方程求解**********%  
    PN =Q;
    err =1e-5;     
    error = 1;
    k=1;
    while(error>err)
        PN_1 = Q + Ad'*PN*Ad - Ad'*PN*Bd*inv(R+Bd'*PN*Bd)*(Bd'*PN*Ad);
        error = norm(PN-PN_1);
        PN = PN_1;
        k = k+1;
        if k>400 
            break;
        end
    end
    P =PN_1;
    K = (R+Bd'*P*Bd)\Bd'*P*Ad;                                  %计算状态反馈增益K
    %***************************************%
    
    U  = - K * xstate;                                          %线性反馈控制量
    deltav = U(1);
    deltastr = U(2);
    
    curp(1) = curp(1) + dt*v*cos(curp(3));
    curp(2) = curp(2) + dt*v*sin(curp(3));
    curp(3) = curp(3) + dt*v*tan(deltastr)/L;
    
    plot(curp(1),curp(2),'g.');
end
%axis equal;

结果如下:

 

标签:Bd,curp,练习,LQR,matlab,ind,path,dt,PN
From: https://www.cnblogs.com/tiandsp/p/18144285

相关文章

  • 基于Matlab彩色图像分割聚类
    欢迎大家点赞、收藏、关注、评论啦,由于篇幅有限,只展示了部分核心代码。文章目录一项目简介二、功能三、系统四.总结一项目简介  一、项目背景与意义在数字图像处理和分析中,图像分割是一项基本且重要的任务,它旨在将图像划分为多个有意义的区域或对象。彩色......
  • 基于Matlab多算法去雾系统
    欢迎大家点赞、收藏、关注、评论啦,由于篇幅有限,只展示了部分核心代码。文章目录一项目简介二、功能三、系统四.总结一项目简介  一、项目背景与意义在图像处理和计算机视觉领域,图像去雾是一个重要的研究方向。由于雾天或其他恶劣天气条件,户外图像往往会出......
  • 基于Matlab编写的EAN-13条形码识别系统
    欢迎大家点赞、收藏、关注、评论啦,由于篇幅有限,只展示了部分核心代码。文章目录一项目简介二、功能三、系统四.总结一项目简介  一、项目背景与意义EAN-13条形码,作为全球广泛使用的商品识别标准,在自动化仓储、零售、物流等领域扮演着至关重要的角色。它能......
  • C语言练习题之——从简单到烧脑(12)(每日两道)
    题目1:找出1到99之间的全部同构数, 同构数:它出现在平方数的右边,例如:5是25右边的数,25是625右边的数,5和25都是同构数。#include<stdio.h>intmain(){ intsum=0,left=0,right=0; printf("1-99之间的同构数:\n"); for(inti=1;i<100;i++) { inta=i*i;......
  • C语言练习题之——从简单到烧脑(10)(每日两道)
    题目1:二位数组的应用:输入一个3X5的整数矩阵,输出其中的最大值,最小值,和他们的下标#include<stdio.h>intmain(){ inta[3][5],max,min,maxi,maxj,mini,minj; //最大值最小值,和下标分别定义变量存储 inti,j; for(i=0;i<3;i++) for(j=0;j<5;j++)......
  • 基于CNN+LSTM深度学习网络的时间序列预测matlab仿真,并对比CNN+GRU网络
    1.算法运行效果图预览  2.算法运行软件版本MATLAB2022A  3.算法理论概述      时间序列预测是数据分析中的一个重要分支,它涉及到对未来事件的预测,基于历史数据中的模式和趋势。在深度学习领域,卷积神经网络(CNN)和循环神经网络(RNN)的组合,特别是结合长短时记忆......
  • Java练习(综合运用继承性、多态性、接口)
    在这个练习中,我们定义了一个接口`Animal`,其中包含一个方法`sound()`。之后,我们创建了一个基类`Mammal`,实现了`Animal`接口,并提供了一个默认的`sound()`方法实现。接着,我们定义了两个继承自`Mammal`的子类`Dog`和`Cat`,分别重写了`sound()`方法。在`main`方法中,我们创建了一个......
  • 字典课后练习题 多加练习呀!
    info_dict={"王":{"部门":"科技部","工资":3000,"级别":1},"周":{"部门":"市场部","工资":5000,......
  • 系统编程练习题----利用条件量和互斥锁,实现两个线程之间的同步与互斥
    目录题目解析代码结果展示题目解析​ 该题主要依靠条件量和互斥锁来实现线程之间的同步与互斥,分析主线程、线程A和线程B的任务如下:主线程:打开LCD屏和触摸屏的硬件文件,并分别存储两个文件的文件描述符,方便后面进行条件判断。开启线程A和线程B。定义并初始化条件量和互斥......
  • java期末练习题,设计一个学生类,包括公开的学号、私有的成绩及其题目所要求的条件进行打
    (1)Student类中包含公开的学号、私有的成绩两个属性;(2)分别给这两个属性分别定义设置值与获取值的方法;1)在学号设置方法中,如果学号长度大于12位,提示用户并截取前12位。2)在分数设置方法中,如果分数不在0-100范围内,提示用户并默认60分。(3)Student类中定义一个无参的......