四旋翼仿真模型,路径跟踪与姿态跟踪,有pid与反步法两种控制器,精确度高(参数由工具箱算出精确到万分位),有公式和文章(与模型一模一样,仿真模型就是根据lunwen搭建)作为学习和实验依据,文件中有MATLAB画3D图形等很有学习意义

最近在研究四旋翼飞行器的控制,这里面的门道可真是让人着迷。今天就来和大家分享一下基于四旋翼仿真模型的路径跟踪与姿态跟踪实现过程,这里用到了两种控制器:PID和反步法,而且参数都是通过工具箱精确计算到万分位,精确度那是相当高。

四旋翼仿真模型基础

先说说这个仿真模型,它是依据特定文章(这里就叫它“lunwen”吧)搭建的,完完全全复刻了文章里的模型。从动力学原理来讲,四旋翼飞行器在空中的运动涉及到复杂的力与力矩平衡,用数学公式来描述就是:

\[ \begin{cases}

m\ddot{x} = -b\omega1^2\sin(\theta)\cos(\phi) - b\omega2^2\sin(\theta)\sin(\phi) + b\omega3^2\sin(\theta)\cos(\phi) + b\omega4^2\sin(\theta)\sin(\phi) \\

m\ddot{y} = b\omega1^2\cos(\theta)\sin(\phi) - b\omega2^2\cos(\theta)\cos(\phi) - b\omega3^2\cos(\theta)\sin(\phi) + b\omega4^2\cos(\theta)\cos(\phi) \\

四旋翼仿真模型,路径跟踪与姿态跟踪,有pid与反步法两种控制器,精确度高(参数由工具箱算出精确到万分位),有公式和文章(与模型一模一样,仿真模型就是根据lunwen搭建)作为学习和实验依据,文件中有MATLAB画3D图形等很有学习意义

m\ddot{z} = -mg + b\omega1^2 + b\omega2^2 + b\omega3^2 + b\omega4^2

\end{cases} \]

这里 \( m \) 是飞行器质量,\( g \) 是重力加速度,\( \omega_i \) 是各个旋翼的角速度,\( b \) 是与旋翼升力系数相关的常量,\( x, y, z \) 就是飞行器在空间中的位置坐标啦。

PID控制器实现

PID控制器大家应该都不陌生,它简单有效。在四旋翼控制中,PID用于调节飞行器的姿态和位置,让它按照我们期望的路径飞行。以位置控制为例,代码实现如下:

% 初始化参数
kp = 10; % 比例系数
ki = 0.1; % 积分系数
kd = 5; % 微分系数
dt = 0.01; % 时间步长

% 设定目标位置
target_x = 10;
target_y = 10;
target_z = 10;

% 初始位置
current_x = 0;
current_y = 0;
current_z = 0;

% 积分项初始化
integral_x = 0;
integral_y = 0;
integral_z = 0;

% 上一次误差
previous_error_x = 0;
previous_error_y = 0;
previous_error_z = 0;

for i = 1:1000 % 仿真循环
    % 计算误差
    error_x = target_x - current_x;
    error_y = target_y - current_y;
    error_z = target_z - current_z;

    % 积分项更新
    integral_x = integral_x + error_x * dt;
    integral_y = integral_y + error_y * dt;
    integral_z = integral_z + error_z * dt;

    % 微分项计算
    derivative_x = (error_x - previous_error_x) / dt;
    derivative_y = (error_y - previous_error_y) / dt;
    derivative_z = (error_z - previous_error_z) / dt;

    % 控制输出
    control_x = kp * error_x + ki * integral_x + kd * derivative_x;
    control_y = kp * error_y + ki * integral_y + kd * derivative_y;
    control_z = kp * error_z + ki * integral_z + kd * derivative_z;

    % 更新位置
    current_x = current_x + control_x * dt;
    current_y = current_y + control_y * dt;
    current_z = current_z + control_z * dt;

    % 更新上一次误差
    previous_error_x = error_x;
    previous_error_y = error_y;
    previous_error_z = error_z;
end

这段代码里,首先设定了PID的三个关键系数 kpkikd,还有时间步长 dt。然后设定目标位置和初始位置,在循环里不断计算误差,更新积分项和微分项,最后得出控制输出并更新当前位置。通过调整这些系数,能让飞行器精确地跟踪目标位置。

反步法控制器实现

反步法相对复杂一些,但它能更有效地处理非线性系统,对于四旋翼这种非线性动力学系统非常适用。下面是一个简单的反步法控制代码框架(这里简化了实际复杂的动力学部分):

% 假设一些参数
m = 1; % 质量
g = 9.81;

% 定义虚拟控制律
function [alpha, z2] = virtual_control(x, xd, xd_dot, xd_ddot, params)
    k1 = 10;
    k2 = 5;
    z1 = x - xd;
    alpha = xd_ddot + k1 * z1;
    z2 = diff(x) - alpha;
end

% 定义实际控制律
function u = actual_control(z1, z2, params)
    k3 = 15;
    u = (1/params.m) * (params.g + k3 * z2 - k1 * z1);
end

在反步法里,我们先定义虚拟控制律 virtualcontrol,通过计算状态变量与期望状态的误差来得到一个虚拟控制输入 alpha,同时计算出 z2。然后在实际控制律 actualcontrol 里,根据 z1z2 得出最终的实际控制输入 u。通过这样一步步“反推”,实现对四旋翼的精确控制。

MATLAB 3D图形绘制

最后再说说MATLAB画3D图形,这在我们分析四旋翼的飞行轨迹时非常有用。代码如下:

% 假设已经得到x, y, z轨迹数据
figure;
hold on;
grid on;
plot3(x_traj, y_traj, z_traj, 'b - o');
xlabel('X Position');
ylabel('Y Position');
ylabel('Z Position');
title('四旋翼飞行轨迹3D图');

这段代码很简单,就是利用 plot3 函数将四旋翼在空间中的轨迹绘制出来,给我们一个直观的展示。

总的来说,基于四旋翼仿真模型的路径跟踪与姿态跟踪,无论是用PID还是反步法控制器,都能实现很高的精确度。再结合MATLAB的3D图形绘制,我们可以更好地分析和优化飞行器的控制策略。希望这篇博文能给对四旋翼控制感兴趣的朋友一些启发。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐