在无人机控制领域,实现精准的三维位置跟踪一直是个极具挑战性的课题。这次我要分享的是基于6维简化线性模型设计的LQR最优控制器方案,这个方案在实际测试中表现相当出色,位置跟踪误差可以控制在厘米级。相比传统的PID控制,LQR在应对无人机这种多变量耦合系统时展现出明显优势。
这个项目的核心在于建立合理的数学模型,并通过最优控制理论设计控制器。我采用了经典的线性二次型调节器(LQR)方法,通过调节状态权重矩阵Q和控制权重矩阵R,实现了对无人机位置和姿态的协同控制。整个方案从建模到仿真验证都在Matlab环境下完成,文末会附上完整的实现代码。
无人机的完整动力学模型通常包含12个状态变量(位置、速度、姿态角、角速度),但为了简化控制器设计,我们采用6维简化模型:
code复制ẋ = vx
ẏ = vy
ż = vz
v̇x = (cosϕsinθcosψ + sinϕsinψ)U1/m
v̇y = (cosϕsinθsinψ - sinϕcosψ)U1/m
v̇z = (cosϕcosθ)U1/m - g
其中(x,y,z)表示位置,(vx,vy,vz)表示速度,ϕ、θ、ψ分别代表滚转、俯仰和偏航角,U1是总推力,m是无人机质量,g是重力加速度。
在悬停状态附近(ϕ≈0, θ≈0)对系统进行线性化:
code复制ẋ = vx
ẏ = vy
ż = vz
v̇x ≈ gθ
v̇y ≈ -gϕ
v̇z = U1/m - g
这样就得到了一个线性时不变系统,可以用状态空间表示为:
code复制ẋ = Ax + Bu
y = Cx
其中状态向量x = [x y z vx vy vz]ᵀ,控制输入u = [ϕ θ U1]ᵀ。
线性二次型调节器(LQR)通过最小化以下代价函数来设计最优控制律:
code复制J = ∫(xᵀQx + uᵀRu)dt
其中Q是状态权重矩阵,R是控制权重矩阵。通过求解Riccati方程可以得到最优反馈增益矩阵K,使控制律u = -Kx最小化代价函数。
权重矩阵的选择直接影响控制性能。经过多次调试,我采用的权重矩阵为:
matlab复制Q = diag([10 10 20 1 1 2]); % 位置权重高于速度权重
R = diag([50 50 0.1]); % 限制姿态角和推力变化
这种配置强调位置跟踪精度,同时避免过大的姿态变化和推力波动。
完整的控制结构包含内外环:
LQR控制器负责内环控制,外环采用简单的P控制:
matlab复制% 外环位置控制
v_des = Kp*(p_des - p_actual);
% 内环LQR控制
u = -K*[p_error; v_error];
在Matlab中建立仿真环境需要以下步骤:
matlab复制m = 1.2; % 无人机质量(kg)
g = 9.81; % 重力加速度
matlab复制A = [zeros(3) eye(3);
zeros(3) zeros(3)];
B = [zeros(3);
[0 g 0; -g 0 0; 0 0 1/m]];
C = eye(6);
D = zeros(6,3);
sys = ss(A,B,C,D);
matlab复制Q = diag([10 10 20 1 1 2]);
R = diag([50 50 0.1]);
K = lqr(A,B,Q,R);
对阶跃位置指令的跟踪结果如下:
响应时间约2秒,超调量<5%,表现出良好的跟踪性能。
6维简化模型忽略了姿态动力学,在实际应用中需要注意:
调节Q和R矩阵的经验:
将仿真控制器移植到实际飞控时:
matlab复制% 无人机LQR位置控制器设计
clc; clear; close all;
% 系统参数
m = 1.2; % 质量(kg)
g = 9.81; % 重力加速度
% 状态空间模型
A = [zeros(3) eye(3);
zeros(3) zeros(3)];
B = [zeros(3);
[0 g 0; -g 0 0; 0 0 1/m]];
C = eye(6);
D = zeros(6,3);
sys = ss(A,B,C,D);
% LQR设计
Q = diag([10 10 20 1 1 2]);
R = diag([50 50 0.1]);
K = lqr(A,B,Q,R);
% 闭环系统
clsys = ss(A-B*K,B,C,D);
% 仿真参数
t = 0:0.01:10;
r = [ones(size(t)); 2*ones(size(t)); 3*ones(size(t))];
% 仿真
[y,t,x] = lsim(clsys,r,t);
% 绘图
figure;
subplot(3,1,1);
plot(t,y(:,1),'b',t,r(1,:),'r--');
title('x方向位置跟踪');
legend('实际','期望');
subplot(3,1,2);
plot(t,y(:,2),'b',t,r(2,:),'r--');
title('y方向位置跟踪');
subplot(3,1,3);
plot(t,y(:,3),'b',t,r(3,:),'r--');
title('z方向位置跟踪');
这个方案在多种测试场景下都表现良好,特别是对缓慢变化的轨迹跟踪效果最佳。对于需要快速机动的场景,可以考虑将LQR与模型预测控制(MPC)结合使用。