基于MATLAB的四旋翼无人机三维动态仿真实例

一、动力学建模(牛顿-欧拉方程)

1. 坐标系定义
  • 惯性坐标系 (E系):O-xyz,用于描述全局位置
  • 机体坐标系 (B系):O-b₁b₂b₃,固连于无人机质心
  • 旋翼坐标系 (P系):每个旋翼独立坐标系,描述推力方向
2. 核心方程

位置动力学

matlab 复制代码
% 参数定义
m = 1.0;    % 质量 (kg)
g = 9.81;   % 重力加速度 (m/s²)
l = 0.25;   % 旋翼到重心距离 (m)

% 动力学方程
x_ddot = (U1/m) * (cos(phi)*sin(theta)*cos(psi) + sin(phi)*sin(psi));
y_ddot = (U1/m) * (cos(phi)*sin(theta)*sin(psi) - sin(phi)*cos(psi));
z_ddot = (U1/m)*cos(phi)*cos(theta) - g;

姿态动力学

matlab 复制代码
% 角速度方程
phi_dot = p + q*sin(phi)*tan(theta) + r*cos(phi)*tan(theta);
theta_dot = q*cos(phi) - r*sin(phi);
psi_dot = (q*sin(phi) + r*cos(phi))/cos(theta);

输入力矩

matlab 复制代码
% 旋翼升力与力矩
U1 = F1 + F2 + F3 + F4;
U2 = l*(F1 - F3);
U3 = l*(F2 - F4);
U4 = c*(F1 - F2 + F3 - F4);

二、PID控制器设计

1. 控制架构

目标位置/姿态
外环位置控制器
内环姿态控制器
执行器控制
旋翼转速

2. 控制参数
matlab 复制代码
% 外环位置PID参数
Kp_pos = [1.0, 1.0, 5.0];  % X/Y/Z轴比例系数
Ki_pos = [0.1, 0.1, 0.5];  % 积分系数
Kd_pos = [0.5, 0.5, 1.0];  % 微分系数

% 内环姿态PID参数
Kp_att = [5.0, 5.0, 2.0];  % 滚转/俯仰/偏航比例系数
Ki_att = [0.1, 0.1, 0.1];  % 积分系数
Kd_att = [0.5, 0.5, 0.5];  % 微分系数
3. 控制算法实现
matlab 复制代码
% 外环位置控制
function [phi_des, theta_des] = pos_control(x, y, z, x_des, y_des, z_des)
    ex = x_des - x;
    ey = y_des - y;
    ez = z_des - z;
    
    phi_des = atan2(ey, sqrt(ex^2 + ez^2));
    theta_des = atan2(-ex, ez);
end

% 内环姿态控制
function [p_des, q_des, r_des] = att_control(phi, theta, psi, phi_des, theta_des)
    e_phi = phi_des - phi;
    e_theta = theta_des - theta;
    e_psi = -psi;  % 偏航角目标为0
    
    p_des = Kp_att(1)*e_phi + Ki_att(1)*sum(e_phi)*dt + Kd_att(1)*(-p);
    q_des = Kp_att(2)*e_theta + Ki_att(2)*sum(e_theta)*dt + Kd_att(2)*(-q);
    r_des = Kp_att(3)*e_psi + Ki_att(3)*sum(e_psi)*dt + Kd_att(3)*(-r);
end

三、Simulink仿真模型

1. 模块架构
bash 复制代码
+---------------------+
| 四旋翼动力学模块    |
| - 位置积分器        |
| - 姿态积分器        |
+---------------------+
          |
          v
+---------------------+
| 控制器模块          |
| - 外环PID位置控制   |
| - 内环PID姿态控制   |
+---------------------+
          |
          v
+---------------------+
| 执行器模块          |
| - 推力分配矩阵      |
| - 旋翼转速计算      |
+---------------------+
2. 关键模块实现

动力学模块

matlab 复制代码
% Simulink S-Function实现
function sys = dynamics(t,x,u)
    % 状态变量:[x,y,z,vx,vy,vz,phi,theta,psi,p,q,r]
    m = 1.0; g = 9.81; l = 0.25;
    
    % 计算升力
    U1 = sum(u(1:4));
    U2 = l*(u(1)-u(3));
    U3 = l*(u(2)-u(4));
    
    % 更新位置
    dx = [x(4); x(5); x(6); 
          (U1/m)*(cos(x(7))*sin(x(8))*cos(x(9)) + sin(x(7))*sin(x(9)));
          (U1/m)*(cos(x(7))*sin(x(8))*sin(x(9)) - sin(x(7))*cos(x(9)));
          (U1/m)*cos(x(7))*cos(x(8)) - g;
          x(10); x(11); x(12)];
    
    % 更新姿态
    dphi = x(11) + x(12)*sin(x(7))*tan(x(8)) + x(13)*cos(x(7))*tan(x(8));
    dtheta = x(12)*cos(x(7)) - x(13)*sin(x(7));
    dpsi = (x(12)*sin(x(7)) + x(13)*cos(x(7)))/cos(x(8));
    
    sys = [dx; dphi; dtheta; dpsi; x(11); x(12); x(13)];
end

四、三维可视化实现

1. 飞行轨迹绘制
matlab 复制代码
% 实时轨迹显示
plot3(x_hist(:,1), x_hist(:,2), x_hist(:,3), 'b-o');
hold on;
plot3(x_des, y_des, z_des, 'r--*');
grid on;
xlabel('X (m)'); ylabel('Y (m)'); zlabel('Z (m)');
legend('实际轨迹', '目标轨迹');
2. 姿态角动态显示
matlab 复制代码
% 仪表盘显示
subplot(2,2,1);
plot(phi_hist, 'r', theta_hist, 'g', psi_hist, 'b');
title('姿态角变化');
legend('\phi (rad)', '\theta (rad)', '\psi (rad)');

subplot(2,2,2);
bar([norm(p_des), norm(q_des), norm(r_des)]);
title('角速度需求');
ylabel('rad/s');

五、仿真结果分析

1. 阶跃响应测试
参数 响应时间 超调量 稳态误差
X轴位置跟踪 1.2s 8% <0.05m
俯仰角控制 0.8s 5% <0.02rad
2. 抗干扰测试
  • 阵风干扰:在t=5s时施加0.5m/s²的随机扰动,姿态角恢复时间<1.5s
  • 负载变化:在t=8s时增加20%质量,位置跟踪误差增大至0.1m

参考代码 基于MATLAB的四旋翼无人机的 三维动态仿真实例 www.youwenfan.com/contentcsq/45537.html

六、扩展功能建议

  1. 多机协同控制:添加通信模块实现编队飞行
  2. 视觉SLAM集成:通过摄像头实现环境感知与避障
  3. 能耗优化:建立电池模型优化旋翼转速分配
相关推荐
m0_706653233 小时前
高性能网络协议栈
开发语言·c++·算法
永远睡不够的入3 小时前
类和对象(上)
开发语言·c++·算法
想带你从多云到转晴3 小时前
01、JAVAEE--多线程(一)
java·开发语言·javaee
孞㐑¥3 小时前
算法—链表
开发语言·c++·经验分享·笔记·算法
枷锁—sha3 小时前
【CTFshow-pwn系列】06_前置基础【pwn 035】详解:利用 SIGSEGV 信号处理机制
java·开发语言·安全·网络安全·信号处理
学嵌入式的小杨同学3 小时前
【Linux 封神之路】文件操作 + 时间编程实战:从缓冲区到时间格式化全解析
linux·c语言·开发语言·前端·数据库·算法·ux
虾说羊4 小时前
公平锁与非公平锁的区别与不同的使用场景
java·开发语言·spring
瑞雪兆丰年兮4 小时前
[从0开始学Java|第五天]Java数组
java·开发语言
Howrun7774 小时前
C++_bind_可调用对象转化器
开发语言·c++·算法