当前位置:首页>java>从理论到代码:一文读懂LQR控制及其在倒立摆上的实践

从理论到代码:一文读懂LQR控制及其在倒立摆上的实践

  • 2026-09-22 18:15:37
从理论到代码:一文读懂LQR控制及其在倒立摆上的实践
最优控制的数学之美,在倒立摆的平衡之舞中完美呈现
今天,我们要深入探讨一个在机器人控制领域举足轻重的算法——线性二次型调节器。无论你是控制理论的新手,还是希望巩固理解的工程师,这篇文章将带你从理论到实践,完整掌握LQR的奥秘。

PART 01

什么是LQR?为什么要用LQR?
线性二次型调节器是现代控制理论中的经典最优控制器设计方法。它的核心思想非常简单:设计一个状态反馈控制器,使得系统在满足动态约束的同时,最小化一个二次型性能指标。
对于机器人工程师而言,LQR的魅力在于:
  • 系统性设计:提供了一套完整的数学框架
  • 最优性保证:在给定权重下,控制器是最优的
  • 易于实现:最终的控制律只是状态向量的线性组合

PART 02

LQR的数学本质
考虑一个线性系统:
LQR要解决的问题是:找到控制律 u=−Kx,最小化代价函数:
其中:
  • Q矩阵:状态权重矩阵(正定或半正定)
  • R矩阵:控制权重矩阵(正定)
  • K矩阵:状态反馈增益矩阵
通过求解代数Riccati方程:
我们可以得到最优增益:
这个方程的背后是动态规划中的Bellman最优性原理,将无限时间的最优控制问题转化为代数求解问题。

PART 03

倒立摆:LQR的完美测试平台
倒立摆是控制理论中的"Hello World"。它的非线性、不稳定特性使其成为检验控制器性能的理想对象。小车上的倒立摆系统只有4个状态变量,却包含了机器人控制中的核心挑战。

PART 04

实战:MATLAB代码详细解析
以下是完整的倒立摆LQR控制代码,强烈建议你在MATLAB中运行它,亲眼见证控制的神奇!
%% 倒立摆LQR控制系统 - 详细注释版clear all; close all; clc;format compact;fprintf('=== 倒立摆LQR控制系统 ===\n');fprintf('作者:张工\n\n');%% ====================== 1. 系统参数设置 ======================M = 1.0;        % 小车质量 (kg)m = 0.1;        % 摆杆质量 (kg)l = 0.5;        % 摆杆长度 (m)g = 9.81;       % 重力加速度 (m/s^2)b = 0.1;        % 小车摩擦系数 (N·s/m)%% ====================== 2. 建立状态空间模型 ======================% 状态变量:[小车位置; 小车速度; 摆杆角度; 摆杆角速度]A = [0, 1, 0, 0;     0, -b/M, -m*g/M, 0;     0, 0, 0, 1;     0, -b/(M*l), (M+m)*g/(M*l), 0];B = [0; 1/M; 0; 1/(M*l)];  % 控制矩阵%% ====================== 3. 系统特性分析 ======================% 检查能控性 - 这是状态反馈的前提Co = ctrb(A, B);if rank(Co) == size(A, 1)    fprintf('✓ 系统完全能控,可以使用状态反馈\n');else    error('系统不能控!');end%% ====================== 4. LQR控制器设计 ======================% 关键:权重矩阵的选择Q = diag([10, 1, 100, 10]);  % 角度权重最大,因为稳定性最重要R = 0.1;                    % 允许使用一定的控制力% 一行代码求解LQR问题![K, P, E] = lqr(A, B, Q, R);fprintf('反馈增益 K = [%.3f, %.3f, %.3f, %.3f]\n', K(1), K(2), K(3), K(4));fprintf('控制律:u = -Kx = %.3f*位置 - %.3f*速度 - %.3f*角度 - %.3f*角速度\n', ...        K(1), K(2), K(3), K(4));%% ====================== 5. 系统仿真 ======================% 初始条件:摆杆倾斜50度的大扰动!theta0_deg = 50;x0 = [0; 0; theta0_deg*pi/180; 0];% 创建闭环系统A_closed = A - B*K;sys_closed = ss(A_closed, B, eye(4), 0);% 加入外部扰动,模拟真实环境t = 0:0.01:10;disturbance = zeros(size(t));disturbance(100:150) = 0.5;   % 1-1.5秒施加扰动disturbance(500:520) = -0.3;  % 5-5.2秒施加反向扰动% 运行仿真[~, t_sim, x_sim] = lsim(sys_closed, disturbance, t, x0);u_actual = -x_sim * K' + disturbance';  % 实际控制输入%% ====================== 6. 结果可视化(8个子图全面分析) ======================figure('Position', [100, 50, 1400, 900]);% 图1:状态响应subplot(3, 3, [1, 2]);plot(t_sim, x_sim(:,1), 'b-', 'LineWidth', 2); hold on;plot(t_sim, x_sim(:,3)*180/pi, 'r-', 'LineWidth', 2);xlabel('时间 (s)'); ylabel('状态值');legend('小车位置 (m)', '摆杆角度 (°)');title('主要状态响应');grid on;% 图2:控制输入subplot(3, 3, 3);plot(t_sim, u_actual, 'g-', 'LineWidth', 2);xlabel('时间 (s)'); ylabel('控制力 (N)');title('控制输入');grid on;% 图3:相平面分析subplot(3, 3, 4);plot(x_sim(:,3)*180/pi, x_sim(:,4)*180/pi, 'b-');xlabel('角度 (°)'); ylabel('角速度 (°/s)');title('角度-角速度相平面');grid on;% 图4-8:更多分析(极点配置、频率响应、代价函数、动画演示等)% ...(完整代码请见下文)
关键设计要点解析
状态空间建模的准确性
倒立摆的动力学模型是通过线性化牛顿-欧拉方程得到的。注意我们假设小角度近似(sinθ ≈ θ),这对于控制器设计是合理的,因为我们的目标就是让θ保持在0附近。
Q和R矩阵
Q和R的选择直接决定了控制器性能:
  • Q(3,3)=100(角度权重):这是最重要的权重!因为角度偏差直接导致系统不稳定
  • Q(1,1)=10(位置权重):相对较小,意味着我们允许小车移动来保持平衡
  • R=0.1:较小的R意味着我们愿意使用较大的控制力来快速稳定系统
能控性检查
必须检查rank(ctrb(A,B)) == n,这是LQR能够工作的前提。如果不能控,需要重新设计系统或使用输出反馈。
深入分析:从结果中看到什么?
运行代码后,你会看到8个子图的综合可视化:
响应曲线解读
  • 角度快速收敛:即使从-50度开始,角度也在2秒内收敛到0
  • 小车位置漂移:为了保持平衡,小车需要移动,最终停在非零位置
  • 控制力平滑:没有剧烈的震荡,说明增益设计合理
相平面分析
角度-角速度的相轨迹从初始点螺旋收敛到原点,这是典型的稳定系统行为。
极点配置
闭环极点全部在左半平面,保证了系统的指数稳定。相比开环系统有一个右半平面极点(不稳定极点),LQR成功地"拉回"了所有极点。

PART 05

LQR在机器人领域的实际应用
  • 人形机器人平衡控制:如Boston Dynamics的早期版本Atlas使用类LQR算法处理平衡(作者说:后续将陆续开展MPC WBC 阻抗控制 强化学习等系列内容,关注公众号,一起学习进步!)
  • 无人机姿态控制:四旋翼的姿态控制器常基于LQR设计
  • 机械臂末端镇定:将末端执行器稳定在期望位置

PART 06

LQR的局限性
  • 需要全状态反馈:实际中所有状态可能不可测,需要状态观测器
  • 线性假设:只在平衡点附近有效,大范围运动需要增益调度或非线性控制
  • 固定权重:实际系统可能需要根据任务调整权重

PART 07

动手实验建议
尝试修改代码中的参数,观察系统行为变化:
  1. 将Q(3,3)改为10:观察角度收敛是否变慢
  2. 将R改为10:观察控制力是否大幅减小,但响应变慢
  3. 修改初始角度为-60度:测试控制器的稳定区域

PART 08

总结
LQR的强大之处在于它提供了一个系统化的设计框架,将工程师的直觉(通过Q、R矩阵表达)转化为数学上的最优解。倒立摆的例子完美展示了如何通过状态反馈将一个不稳定系统变为稳定系统。
LQR不是万能的,但在线性系统的最优控制中,它几乎是完美的。理解LQR,是深入现代控制理论和机器人控制的重要一步。
代码获取:完整MATLAB代码关注公众号回复"LQR"获取,复制到MATLAB即可运行。建议逐步调试,观察每个变量的变化,这是理解控制理论的最佳方式!
如果你对某个细节有疑问,或者想了解其他控制算法,欢迎在评论区留言。

最新文章

随机文章