基于LQR算法跟踪圆形轨迹,MATLAB 代码

希望做一个分享者

轨迹跟踪效果图

位姿误差图

 

参考博文

LQR 的直观推导及简单应用_白巧克力亦唯心的博客-CSDN博客_lqr算法

关键词:泰勒展开;黎卡提方程求解;状态反馈


clear all;
close all;
clc;

%% 参数
ts=0.1;
t=30;
d=1.45;

%% 初始状态
x(1)=0;
y(1)=0;
xita(1)=0;
v=3;
w=0.2;
u=[v;w];
Z(:,1)=[-3;-3;0.2];
for k=1:1:t/ts
    times(k+1)=k*ts;
    X(:,k)=[cos(xita(k)) -d*sin(xita(k));sin(xita(k)) d*cos(xita(k));0 1]*u;
    %% 状态更新
    x(k+1)=x(k)+X(1,k)*ts;
    y(k+1)=y(k)+X(2,k)*ts;
    xita(k+1)=xita(k)+X(3,k)*ts;
    
    
    A=[0 0 -v*sin(xita(k))-d*w*cos(xita(k));0 0 v*cos(xita(k))-d*w*sin(xita(k));0 0 0];
    B=[cos(xita(k)) -d*sin(xita(k));sin(xita(k)) d*cos(xita(k));0 1];
    Q=[2 0 0;0 2 0;0 0 2];
    R=[1 0; 0 1];
    K=lqr(A,B,Q,R);
    Z_=(A-B*K)*Z(:,k);%每秒变化率
    Z(:,k+1)=Z(:,k)+Z_*ts;%每步变化率
    xc(k)=Z(1,k)+x(k);
    yc(k)=Z(2,k)+y(k);
end


figure(1)
for k=1:1:length(xc)
plot(x,y,'r','Linewidth',2);
hold on;
plot(xc(k),yc(k),'sb','MarkerSize',10);
pause(0.1);
end
figure(2)
plot(times,Z(1,:),'r');
figure(3)
plot(times,Z(2,:),'r');
figure(4);
plot(times,Z(3,:),'r');

  • 6
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,下面是基于LQR算法的倒立摆MATLAB代码: ```matlab % 倒立摆系统的动态方程 % m - 摆杆的质量,M - 小车的质量,l - 摆杆的长度,g - 重力加速度 % x1 - 小车的位置, x2 - 小车的速度, x3 - 摆杆的角度, x4 - 摆杆的角速度 % u - 控制力,f - 摩擦力 function dx = pendcart(x, m, M, l, g, u) % 摆杆的角度 theta = x(3); % 摆杆的角速度 thetadot = x(4); % 小车的位置 xdot = x(2); % 小车的速度 xddot = (u + m*sin(theta)*(l*thetadot^2 + g*cos(theta))) / (M + m*sin(theta)^2); % 摆杆的角加速度 thetaddot = (-u*cos(theta) - (M+m)*g*sin(theta) - m*l*thetadot^2*sin(theta)*cos(theta)) / (l*(M+m*sin(theta)^2)); % 摩擦力 f = 0.1*sign(xdot); % 系统状态的变化 dx = [xdot; xddot; thetadot; thetaddot] + [0; -f/M; 0; 0]; end % 倒立摆系统的状态空间模型 function [A,B,C,D] = pendcart_ss(m, M, l, g) % 状态向量:x=[x1; x2; x3; x4],u=控制力 % 状态空间模型:dx/dt = A*x + B*u, y = C*x + D*u A = [0 1 0 0; 0 0 -m*g/M 0; 0 0 0 1; 0 0 (M+m)*g/(M*l) 0]; B = [0; 1/M; 0; -1/(M*l)]; C = [1 0 0 0; 0 0 1 0]; D = [0; 0]; end % LQR控制器设计 function [K, S, e] = lqr_design(A, B, Q, R) % 求解Riccati方程 [S,e,~] = care(A,B,Q,R); % 计算控制器增益矩阵K K = -inv(R)*B'*S; end % 主程序 % 摆杆的质量 m = 1; % 小车的质量 M = 5; % 摆杆的长度 l = 2; % 重力加速度 g = 9.81; % 状态空间模型 [A,B,C,D] = pendcart_ss(m, M, l, g); % 选择Q和R矩阵 Q = diag([1, 1, 10, 10]); R = 0.01; % LQR控制器设计 [K, S, e] = lqr_design(A, B, Q, R); % 模拟系统响应 tspan = 0:0.01:10; x0 = [0; 0; pi/4; 0]; [t,x] = ode45(@(t,x)pendcart(x, m, M, l, g, K*(x-[0; 0; pi; 0])), tspan, x0); % 绘制小车和摆杆的轨迹 figure; for i = 1:length(t) plot([-5,5],[0,0],'k','LineWidth',2); hold on; plot([x(i,1)-0.5,x(i,1)+0.5],[0,0],'b','LineWidth',10); hold on; plot([x(i,1),x(i,1)+l*sin(x(i,3))],[0,l*cos(x(i,3))],'r','LineWidth',2); hold off; axis([-5 5 -3 3]); axis equal; drawnow; end ``` 执行上述代码将会得到倒立摆系统的模拟响应结果。需要注意的是,这是一段简单的代码,实际应用中可能需要根据实际情况对代码进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值