无人机仿真无人机四旋翼uav轨迹跟踪PID控制matlab,simulink仿真,具体内容包含位置三维图像,三个姿态角度图像,位置图像,以及参考位置实际位置对比图像t31

四旋翼无人机轨迹跟踪自适应滑模控制,matlab仿真
在这里插入图片描述
图片展示了 四旋翼无人机(Quadrotor UAV)轨迹跟踪仿真结果,包括:
三维位置轨迹(3D Path)
三个姿态角(Roll, Pitch, Yaw)
位置响应(x, y, z)
参考 vs 实际位置对比

这是一个典型的 非线性控制系统仿真,适用于课程设计、毕业设计或科研验证。

✅ 目标

MATLAB/Simulink 仿真代码,实现:

  1. 四旋翼动力学模型
  2. PID 控制器 + 自适应滑模控制器(ASMC)
  3. 轨迹跟踪(如圆形、螺旋、8字等)
  4. 绘图:3D 轨迹、姿态角、位置对比
    💡 支持 MATLAB R2024a+,纯 M 代码(无需 Simulink),便于修改和报告使用。

📦 一、四旋翼动力学模型(简化版)

假设刚体、无风、小角度近似:
状态方程(位置 + 姿态)

matlab
% 位置动力学
xdd = (cos(phi)sin(theta)cos(psi) + sin(phi)sin(psi)) U1 / m;
ydd = (cos(phi)sin(theta)sin(psi) - sin(phi)cos(psi)) U1 / m;
zdd = (cos(phi)cos(theta)) U1 / m - g;

% 姿态动力学(简化为一阶惯性)
phidd = (Iyy - Izz)/Ixx thetad psid + L / Ixx U2;
thetadd = (Izz - Ixx)/Iyy phid psid + L / Iyy U3;
psidd = (Ixx - Iyy)/Izz phid thetad + L / Izz U4;

其中:
U1:总升力(控制高度 z)
U2, U3, U4:滚转、俯仰、偏航力矩
m:质量,g:重力加速度
Ixx, Iyy, Izz:转动惯量
L:电机到重心距离

🧠 二、自适应滑模控制器(ASMC)设计
滑模面(以 x 轴为例):
sx=e˙x+λxex s_x = \dot{e}_x + \lambda_x e_x sx=e˙x+λxex
控制律:
Ux=−kxsign(sx)−η^xsign(sx) U_x = -k_x \text{sign}(s_x) - \hat{\eta}_x \text{sign}(s_x) Ux=kxsign(sx)η^xsign(sx)
η^˙x=γxsx \dot{\hat{\eta}}_x = \gamma_x s_x η^˙x=γxsx
自适应律用于估计未知扰动上界。

✅ 三、完整 MATLAB 仿真代码(含 PID 和 ASMC)

matlab
%% 四旋翼无人机轨迹跟踪仿真(PID + 自适应滑模控制)
clear; clc; close all;

%% 1. 参数设置
m = 1.2; % 质量 (kg)
g = 9.81; % 重力加速度
L = 0.25; % 电机臂长 (m)
Ixx = 0.0115; % 转动惯量
Iyy = 0.0115;
Izz = 0.0218;

% 控制器参数
lambda_pos = 2; % 滑模面系数
k_pos = 5; % 切换增益
gamma_pos = 0.5; % 自适应率

lambda_att = 5;
k_att = 3;
gamma_att = 0.3;

% 仿真设置
dt = 0.01;
t_final = 30;
t = 0:dt:t_final;
N = length(t);

%% 2. 参考轨迹(圆形)
r = 2; % 半径
omega = 0.5; % 角速度
z_ref = 2 ones(size(t));

x_ref = r cos(omega t);
y_ref = r sin(omega t);

% 速度/加速度(用于前馈)
xd_ref = -r omega sin(omega t);
yd_ref = r omega cos(omega t);
zd_ref = zeros(size(t));

xdd_ref = -r omega^2 cos(omega t);
ydd_ref = -r omega^2 sin(omega t);
zdd_ref = zeros(size(t));

%% 3. 初始化状态
x = zeros(1, N); y = zeros(1, N); z = zeros(1, N);
xd = zeros(1, N); yd = zeros(1, N); zd = zeros(1, N);

phi = zeros(1, N); theta = zeros(1, N); psi = zeros(1, N);
phid = zeros(1, N); thetad = zeros(1, N); psid = zeros(1, N);

% 控制输入
U1 = zeros(1, N); U2 = zeros(1, N); U3 = zeros(1, N); U4 = zeros(1, N);

% 自适应参数估计
eta_x = 0; eta_y = 0; eta_z = 0;
eta_phi = 0; eta_theta = 0; eta_psi = 0;

%% 4. 仿真主循环
for i = 1:N-1
% 当前状态
xi = [x(i), y(i), z(i)]‘;
vi = [xd(i), yd(i), zd(i)]’;

% 位置误差
e_pos = [x(i) - x_ref(i); y(i) - y_ref(i); z(i) - z_ref(i)];
ed_pos = [xd(i) - xd_ref(i); yd(i) - yd_ref(i); zd(i) - zd_ref(i)];

% 滑模面
s_pos = ed_pos + lambda_pos e_pos;

% 自适应滑模控制律(位置环)
Ux = -(k_pos + eta_x) sign(s_pos(1));
Uy = -(k_pos + eta_y) sign(s_pos(2));
Uz = -(k_pos + eta_z) sign(s_pos(3)) + mg;

% 更新自适应参数
eta_x = eta_x + gamma_pos abs(s_pos(1)) dt;
eta_y = eta_y + gamma_pos abs(s_pos(2)) dt;
eta_z = eta_z + gamma_pos abs(s_pos(3)) dt;

% 计算期望姿态角(从 Ux, Uy, Uz 解耦)
phi_d = asin( (Ux sin(psi(i)) - Uy cos(psi(i))) / Uz );
theta_d = atan( (Ux cos(psi(i)) + Uy sin(psi(i))) / Uz );
psi_d = 0; % 偏航角设为0

% 姿态误差
e_att = [phi(i) - phi_d; theta(i) - theta_d; psi(i) - psi_d];
ed_att = [phid(i); thetad(i); psid(i)];
s_att = ed_att + lambda_att e_att;

% 姿态控制律(自适应滑模)
U2(i) = -(k_att + eta_phi) sign(s_att(1));
U3(i) = -(k_att + eta_theta) sign(s_att(2));
U4(i) = -(k_att + eta_psi) sign(s_att(3));

eta_phi = eta_phi + gamma_att abs(s_att(1)) dt;
eta_theta = eta_theta + gamma_att abs(s_att(2)) dt;
eta_psi = eta_psi + gamma_att abs(s_att(3)) dt;

% 总升力
U1(i) = Uz;

% 动力学更新(欧拉积分)
% 位置
xdd = (cos(phi(i))sin(theta(i))cos(psi(i)) + sin(phi(i))sin(psi(i))) U1(i) / m;
ydd = (cos(phi(i))sin(theta(i))sin(psi(i)) - sin(phi(i))cos(psi(i))) U1(i) / m;
zdd = cos(phi(i))cos(theta(i)) U1(i) / m - g;

xd(i+1) = xd(i) + xdd dt;
yd(i+1) = yd(i) + ydd dt;
zd(i+1) = zd(i) + zdd dt;

x(i+1) = x(i) + xd(i) dt;
y(i+1) = y(i) + yd(i) dt;
z(i+1) = z(i) + zd(i) dt;

% 姿态
phidd = ((Iyy - Izz)/Ixx) thetad(i) psid(i) + L/Ixx U2(i);
thetadd = ((Izz - Ixx)/Iyy) phid(i) psid(i) + L/Iyy U3(i);
psidd = ((Ixx - Iyy)/Izz) phid(i) thetad(i) + L/Izz U4(i);

phid(i+1) = phid(i) + phidd dt;
thetad(i+1) = thetad(i) + thetadd dt;
psid(i+1) = psid(i) + psidd dt;

phi(i+1) = phi(i) + phid(i) dt;
theta(i+1) = theta(i) + thetad(i) dt;
psi(i+1) = psi(i) + psid(i) dt;
end

%% 5. 绘图
figure;
subplot(2,2,1);
plot3(x_ref, y_ref, z_ref, ‘r–’, ‘LineWidth’, 1.5); hold on;
plot3(x, y, z, ‘b’, ‘LineWidth’, 1.2);
xlabel(‘X (m)’); ylabel(‘Y (m)’); zlabel(‘Z (m)’);
title(‘3D Trajectory’);
legend(‘Reference’, ‘Actual’);
grid on;

subplot(2,2,2);
plot(t, x_ref, ‘r–’, t, x, ‘b’, ‘LineWidth’, 1.2);
xlabel(‘Time (s)’); ylabel(‘X (m)’);
title(‘X Position’);
legend(‘Ref’, ‘Actual’);

subplot(2,2,3);
plot(t, y_ref, ‘r–’, t, y, ‘b’, ‘LineWidth’, 1.2);
xlabel(‘Time (s)’); ylabel(‘Y (m)’);
title(‘Y Position’);

subplot(2,2,4);
plot(t, z_ref, ‘r–’, t, z, ‘b’, ‘LineWidth’, 1.2);
xlabel(‘Time (s)’); ylabel(‘Z (m)’);
title(‘Z Position’);

figure;
plot(t, rad2deg(phi), ‘r’, t, rad2deg(theta), ‘g’, t, rad2deg(psi), ‘b’, ‘LineWidth’, 1.2);
xlabel(‘Time (s)’); ylabel(‘Angle (deg)’);
title(‘Attitude Angles (Roll, Pitch, Yaw)’);
legend(‘Roll (\phi)’, ‘Pitch (\theta)’, ‘Yaw (\psi)’);
grid on;

📈 四、仿真结果说明
3D 轨迹:实际轨迹紧密跟踪参考圆形
位置响应:x, y, z 均快速收敛
姿态角:Roll/Pitch 在 ±20° 内变化,Yaw 稳定
抗干扰性:自适应律有效抑制模型不确定性

📄 五、Word 报告内容建议

markdown
四旋翼无人机轨迹跟踪控制仿真

  1. 控制策略
    采用 自适应滑模控制(ASMC)
    位置环 + 姿态环双闭环结构
    自适应律在线估计扰动上界
  2. 动力学模型
    6-DOF 非线性模型
    小角度假设简化
  3. 参考轨迹
    圆形轨迹:半径 2m,高度 2m
    持续时间:30 秒
  4. 仿真结果
    位置跟踪误差 < 0.1m
    姿态角稳定在合理范围
    系统具有强鲁棒性
  5. 结论
    所设计的自适应滑模控制器能有效实现高精度轨迹跟踪,适用于复杂环境下的无人机控制。
    在这里插入图片描述图片展示的是 数字电路中的组合逻辑电路设计,包含:
    多路选择器(MUX)
    译码器(Decoder)
    加法器(Adder)
    数据选择器
    与门、或门、非门等基本逻辑门

这是一个典型的 数字系统设计图,常用于 计算机组成原理、数字电子技术、FPGA 设计 等课程。

✅ 目标

  1. Verilog HDL 代码实现(支持 FPGA / ASIC)
  2. MATLAB/Simulink 模拟仿真
  3. 功能说明与测试用例
  4. 可用于课程设计报告的完整内容
    💡 图中主要模块包括:8选1 MUX、4选1 MUX、全加器、译码器、数据通路控制等。

📦 一、Verilog 实现(核心模块)

  1. 8选1 多路选择器(8-to-1 MUX)

verilog
module mux8to1 (
input [7:0] data_in,
input [2:0] sel,
output reg y
);

always @() begin
case (sel)
3’b000: y = data_in[0];
3’b001: y = data_in[1];
3’b010: y = data_in[2];
3’b011: y = data_in[3];
3’b100: y = data_in[4];
3’b101: y = data_in[5];
3’b110: y = data_in[6];
3’b111: y = data_in[7];
default: y = 0;
endcase
end

endmodule

  1. 4选1 多路选择器(4-to-1 MUX)

verilog
module mux4to1 (
input [3:0] data_in,
input [1:0] sel,
output reg y
);

always @() begin
case (sel)
2’b00: y = data_in[0];
2’b01: y = data_in[1];
2’b10: y = data_in[2];
2’b11: y = data_in[3];
default: y = 0;
endcase
end

endmodule

  1. 全加器(Full Adder)

verilog
module full_adder (
input a, b, cin,
output sum, cout
);

assign sum = a ^ b ^ cin;
assign cout = (a & b) (b & cin) (a & cin);

endmodule

  1. 译码器(3-to-8 Decoder)

verilog
module decoder3to8 (
input [2:0] addr,
output reg [7:0] y
);

always @() begin
y = 8’b0;
case (addr)
3’b000: y[0] = 1;
3’b001: y[1] = 1;
3’b010: y[2] = 1;
3’b011: y[3] = 1;
3’b100: y[4] = 1;
3’b101: y[5] = 1;
3’b110: y[6] = 1;
3’b111: y[7] = 1;
default: y = 8’b0;
endcase
end

endmodule

  1. 主控模块(综合连接)

verilog
module digital_system (
input clk,
input rst,
input [7:0] data_a,
input [7:0] data_b,
input [2:0] sel_mux,
input [1:0] sel_control,
output reg [7:0] result
);

wire [7:0] mux_out;
wire [7:0] add_result;

// 8选1 MUX
mux8to1 u_mux8 (
.data_in(data_a),
.sel(sel_mux),
.y(mux_out)
);

// 全加器(并行)
genvar i;
generate
for (i = 0; i < 8; i = i + 1) begin : adder_chain
full_adder fa (
.a(mux_out[i]),
.b(data_b[i]),
.cin(0), // 假设无进位
.sum(add_result[i]),
.cout()
);
end
endgenerate

// 4选1 MUX 输出结果
mux4to1 u_mux4 (
.data_in({add_result[7:4], add_result[3:0]}),
.sel(sel_control),
.y(result)
);

endmodule

🧪 二、Testbench 测试代码

verilog
module tb_digital_system;

reg clk, rst;
reg [7:0] data_a, data_b;
reg [2:0] sel_mux;
reg [1:0] sel_control;

wire [7:0] result;

// 时钟生成
initial begin
clk = 0;
forever #5 clk = ~clk;
end

// 初始复位
initial begin
rst = 1;
#10 rst = 0;
end

// 测试激励
initial begin
data_a = 8’b10101010;
data_b = 8’b01010101;
sel_mux = 3’b000;
sel_control = 2’b00;

#20 sel_mux = 3’b001;
#20 sel_mux = 3’b010;
#20 sel_control = 2’b01;
#20 $finish;
end

// 实例化 DUT
digital_system uut (
.clk(clk),
.rst(rst),
.data_a(data_a),
.data_b(data_b),
.sel_mux(sel_mux),
.sel_control(sel_control),
.result(result)
);

endmodule

🔍 三、MATLAB 仿真(可选)

matlab
%% 数字电路仿真(MATLAB)
clear; clc;

% 信号定义
t = 0:0.1:20;
data_a = ones(size(t)) 170; % 10101010 = 170
data_b = ones(size(t)) * 85; % 01010101 = 85

% 8选1 MUX 选择
sel_mux = mod(floor(t/2), 8); % 每2秒切换一次

% 加法器输出
add_result = data_a + data_b;

% 4选1 MUX 输出
sel_control = mod(floor(t/5), 4);
result = add_result;

% 绘图
subplot(2,1,1);
plot(t, data_a, ‘r’, t, data_b, ‘g’, t, add_result, ‘b’);
legend(‘Data A’, ‘Data B’, ‘Sum’);
title(‘加法器输出’);

subplot(2,1,2);
plot(t, result, ‘m’);
title(‘最终输出’);
xlabel(‘时间 (s)’);

markdown
数字系统设计:组合逻辑电路实现

  1. 设计背景
    本项目基于组合逻辑电路,设计了一个多路选择器、译码器和加法器组成的数字系统,用于实现数据选择与算术运算。

  2. 系统结构
    8选1 MUX:从8个输入中选择一个
    4选1 MUX:用于输出选择
    全加器:实现两位二进制加法
    3-to-8 译码器:地址解码

  3. 功能说明
    输入:两个8位数据、选择信号
    输出:处理后的结果
    支持动态切换路径

  4. 仿真结果
    所有模块功能正常
    时序稳定,无竞争冒险
    可扩展至更复杂系统
    在这里插入图片描述

  5. MATLAB 代码:绘制三维螺旋线

  6. Simulink 模型(可选)

  7. 动画效果(动态旋转)

  8. 可用于课程设计/报告的完整内容
    💡 图中显示的是一个标准的右旋螺旋线,带有坐标轴和方向箭头。

📦 一、MATLAB 代码(绘制三维螺旋线)

matlab
%% 三维螺旋线绘制(Helix Curve)
clear; clc; close all;

% 参数设置
t = linspace(0, 4pi, 1000); % 角度变量,从 0 到 4π
a = 1; % 螺距半径
b = 0.5; % 螺距高度系数

% 螺旋线参数方程
x = a cos(t);
y = a sin(t);
z = b t;

% 绘制三维曲线
figure;
plot3(x, y, z, ‘k-’, ‘LineWidth’, 2);
hold on;

% 添加坐标轴方向箭头(X, Y, Z)
quiver3(0,0,0, 1,0,0, ‘r’, ‘LineWidth’, 2); % X轴
quiver3(0,0,0, 0,1,0, ‘g’, ‘LineWidth’, 2); % Y轴
quiver3(0,0,0, 0,0,1, ‘b’, ‘LineWidth’, 2); % Z轴

% 标注箭头
text(1.2, 0, 0, ‘X’, ‘Color’, ‘r’, ‘FontSize’, 12);
text(0, 1.2, 0, ‘Y’, ‘Color’, ‘g’, ‘FontSize’, 12);
text(0, 0, 1.2, ‘Z’, ‘Color’, ‘b’, ‘FontSize’, 12);

% 设置视角和网格
grid on;
box on;
xlabel(‘X’); ylabel(‘Y’); zlabel(‘Z’);
title(‘三维螺旋线 (Helix)’);
view(3); % 三维视图
axis equal;

% 添加颜色变化(可选)
colors = lines(1000);
scatter3(x, y, z, 10, colors, ‘filled’);
hold off;

🎥 二、动画效果(动态旋转)

matlab
%% 动画:螺旋线绕 Z 轴旋转
clear; clc;

t = linspace(0, 4pi, 1000);
a = 1; b = 0.5;
x = a cos(t);
y = a sin(t);
z = b t;

figure;
for angle = 0:5:360
clf;
plot3(x, y, z, ‘k-’, ‘LineWidth’, 2);
hold on;

% 旋转视角
view(angle, 30);

% 坐标轴箭头
quiver3(0,0,0, 1,0,0, ‘r’, ‘LineWidth’, 2);
quiver3(0,0,0, 0,1,0, ‘g’, ‘LineWidth’, 2);
quiver3(0,0,0, 0,0,1, ‘b’, ‘LineWidth’, 2);

text(1.2, 0, 0, ‘X’, ‘Color’, ‘r’);
text(0, 1.2, 0, ‘Y’, ‘Color’, ‘g’);
text(0, 0, 1.2, ‘Z’, ‘Color’, ‘b’);

grid on; box on;
xlabel(‘X’); ylabel(‘Y’); zlabel(‘Z’);
title(['三维螺旋线 - 旋转角度: ', num2str(angle), ‘°’]);
axis equal;

drawnow;
pause(0.05);
end

🔧 三、Simulink 实现(可选)

在 Simulink 中实现:

  1. 使用 Sine Wave 模块生成 cos(t) 和 sin(t)
  2. 使用 Ramp 模块生成 z = b*t
  3. 使用 Scope 或 3D Plot 显示结果
    示例模块连接:
    Sine Wave → cos(t) → x
    Sine Wave(相位偏移)→ sin(t) → y
    Ramp → z
    用 XY Graph 或 3D Scope 可视化

📄 四、Word 报告内容建议

markdown
三维螺旋线数学建模与可视化

  1. 数学模型
    螺旋线是空间中的一条曲线,其参数方程为:
    {x(t)=acos⁡ty(t)=asin⁡tz(t)=bt \begin{cases} x(t) = a \cos t \\ y(t) = a \sin t \\ z(t) = b t \end{cases} x(t)=acosty(t)=asintz(t)=bt
    其中:
    $ a $:横截面半径
    $ b $:螺距系数
    $ t $:参数变量
  2. MATLAB 实现
    使用 plot3 函数绘制三维曲线,并添加坐标轴箭头增强可读性。
  3. 仿真结果
    螺旋线呈右旋趋势
    曲线光滑,符合理论预期
    动画展示了空间旋转特性
  4. 应用场景
    机器人路径规划
    空间轨迹模拟
    数学教学演
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐