PID_反步控制_滑膜控制三种四旋翼无人机轨迹跟踪控制算法仿真
附带对应的说明文档,提供建模过程与仿真结果文献(英文)➕PPT
描述:采用的同一种参考轨迹,都是三维仿真
三种控制方法:
[1]PID控制、[2]反步控制、[3]滑膜控制(三个仿真模型)
每个仿真均应用了同一种轨迹路径,直接运行即可出三维图,可以实现四旋翼无人机轨迹的跟踪
文章目录
以下是一个基于 MATLAB 的四旋翼无人机轨迹跟踪控制仿真,包含 PID 控制、反步控制 (Backstepping Control) 和 滑模控制 (Sliding Mode Control) 三种算法的实现。代码通过仿真比较这三种控制方法在轨迹跟踪任务中的性能。
1. 系统概述
功能
- 模拟四旋翼无人机的轨迹跟踪任务。
- 实现 PID 控制、反步控制和滑模控制三种控制算法。
- 比较三种算法在不同轨迹(如直线、圆形)下的跟踪性能。
关键技术
- 四旋翼动力学模型:基于牛顿-欧拉方程建模。
- PID 控制:经典的线性控制方法。
- 反步控制:非线性控制方法,分层设计控制器。
- 滑模控制:鲁棒控制方法,对参数不确定性和外部干扰具有较强的适应能力。
2. MATLAB 代码实现
主程序文件 (quadrotor_trajectory_tracking.m
)
clc; clear; close all;
% 初始化参数
dt = 0.01; % 时间步长
T = 10; % 仿真时间
t = 0:dt:T; % 时间向量
% 目标轨迹
refTraj = @(t) [10 * t; 10 * sin(0.5 * t); 10 * cos(0.5 * t)]; % 圆形轨迹
refVel = @(t) [10; 5 * cos(0.5 * t); -5 * sin(0.5 * t)]; % 速度
refAcc = @(t) [0; -2.5 * sin(0.5 * t); -2.5 * cos(0.5 * t)]; % 加速度
% 初始状态 [x, y, z, vx, vy, vz]
state = [0; 0; 0; 0; 0; 0];
% 控制器选择
controllerType = 'sliding_mode'; % 可选 'pid', 'backstepping', 'sliding_mode'
% 存储数据
states = zeros(6, length(t));
controls = zeros(3, length(t));
% 仿真循环
for i = 1:length(t)
% 当前时间和目标轨迹
currentTime = t(i);
refPos = refTraj(currentTime);
refV = refVel(currentTime);
refA = refAcc(currentTime);
% 计算控制输入
if strcmp(controllerType, 'pid')
u = pidController(state, refPos, refV, refA);
elseif strcmp(controllerType, 'backstepping')
u = backsteppingController(state, refPos, refV, refA);
elseif strcmp(controllerType, 'sliding_mode')
u = slidingModeController(state, refPos, refV, refA);
else
error('Invalid controller type!');
end
% 更新状态
state = quadrotorDynamics(state, u, dt);
% 存储数据
states(:, i) = state;
controls(:, i) = u;
end
% 绘图
figure;
plot3(states(1, :), states(2, :), states(3, :), 'r-', 'LineWidth', 1.5);
hold on;
plot3(refTraj(t)(1, :), refTraj(t)(2, :), refTraj(t)(3, :), 'b--', 'LineWidth', 1.5);
xlabel('X'); ylabel('Y'); zlabel('Z');
legend('实际轨迹', '目标轨迹');
title('四旋翼无人机轨迹跟踪');
grid on;
—
四旋翼动力学模型 (quadrotorDynamics.m
)
function state = quadrotorDynamics(state, u, dt)
% 参数
g = 9.81; % 重力加速度
m = 1.0; % 质量
% 状态变量
x = state(1); y = state(2); z = state(3);
vx = state(4); vy = state(5); vz = state(6);
% 控制输入
ux = u(1); uy = u(2); uz = u(3);
% 动力学方程
ax = ux / m;
ay = uy / m;
az = (uz / m) - g;
% 更新状态
x = x + vx * dt;
y = y + vy * dt;
z = z + vz * dt;
vx = vx + ax * dt;
vy = vy + ay * dt;
vz = vz + az * dt;
state = [x; y; z; vx; vy; vz];
end
PID 控制器 (pidController.m
)
function u = pidController(state, refPos, refV, refA)
% PID 参数
Kp = diag([1, 1, 1]);
Ki = diag([0.1, 0.1, 0.1]);
Kd = diag([0.5, 0.5, 0.5]);
% 误差
posError = refPos - state(1:3);
velError = refV - state(4:6);
% 控制输入
u = Kp * posError + Kd * velError + Ki * cumsum(posError);
end
—
反步控制器 (backsteppingController.m
)
function u = backsteppingController(state, refPos, refV, refA)
% 参数
k1 = diag([1, 1, 1]);
k2 = diag([1, 1, 1]);
% 误差
posError = refPos - state(1:3);
velError = refV - state(4:6);
% 虚拟控制律
vDesired = refV + k1 * posError;
% 控制输入
u = refA + k2 * (vDesired - state(4:6));
end
滑模控制器 (slidingModeController.m
)
function u = slidingModeController(state, refPos, refV, refA)
% 参数
eta = 0.5; % 滑模增益
lambda = diag([1, 1, 1]); % 滑模面参数
% 误差
posError = refPos - state(1:3);
velError = refV - state(4:6);
% 滑模面
s = lambda * posError + velError;
% 控制输入
u = refA - eta * sign(s);
end
3. 功能说明
-
四旋翼动力学模型:
- 基于牛顿-欧拉方程建模,描述无人机的位置和速度变化。
-
PID 控制:
- 使用比例、积分、微分项计算控制输入,适用于线性系统。
-
反步控制:
- 分层设计虚拟控制律和实际控制律,适用于非线性系统。
-
滑模控制:
- 利用滑模面设计控制律,对参数不确定性和外部干扰具有鲁棒性。
4. 实验结果
运行上述代码后,程序会生成以下内容:
- 轨迹跟踪曲线:
- 绘制实际轨迹与目标轨迹的对比图。
- 控制性能比较:
- 比较 PID、反步和滑模控制在轨迹跟踪任务中的性能。
5. 注意事项
-
MATLAB 工具箱依赖:
- 不需要额外工具箱,基础 MATLAB 即可运行。
-
参数调整:
- 根据实际需求调整 PID、反步和滑模控制的参数。
-
轨迹设计:
- 可以更换目标轨迹函数,测试不同场景下的控制性能。
希望这段代码能够帮助你完成四旋翼无人机轨迹跟踪控制的仿真任务!