👨🎓个人主页
💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
💥1 概述
随着科技的飞速发展,几乎各项技术的发展都涉及到了人工智能技术领域。无人机作为新时代人工智能技术的产物应运而生,在国防、农业、植保、交通运输等领域得到了广泛的应用。四轴无人机,又称四旋翼飞行器。四轴无人机稳定性高、便于控制、使用难度不大。随着微机电控制技术的
发展,常用于监控、航空摄影、测量地形等,四轴无人机在民用无人机领域受到了广泛的关注与认可。
PID 算法是指“比例”“积分”“微分”三个元素。P指当无人机收到外界的干扰后,机身对产生姿态偏移回到稳定的时间,即用来控制从不稳定到稳定的响应时间,P 越大响应越快;I 指当无人机从不稳定回到稳定状态一段时间内积累的误差,只修正 P 是无法达到的期望姿态值,也叫静态差值;D 是为了加强对机体变化的快速响应,对 P 有抑制作用,二者具有互斥性。
一、引言
随着科技的飞速发展,无人机(UAV)作为新时代人工智能技术的产物应运而生,在国防、农业、植保、交通运输等领域得到了广泛的应用。四轴无人机(又称四旋翼飞行器)因其稳定性高、便于控制、使用难度不大等优点,常用于监控、航空摄影、测量地形等,在民用无人机领域受到了广泛的关注与认可。PID控制算法作为最常用的控制策略之一,通过调整比例、积分和微分参数,实现对无人机姿态和位置的精确控制。本文将对基于PID控制的无人机巡航进行仿真研究。
二、PID控制算法概述
PID控制器通过三种控制策略的组合来提高控制系统的性能:
- 比例控制(P):与当前误差成正比,可以快速响应。
- 积分控制(I):根据历史误差的积分,消除静态误差。
- 微分控制(D):预测误差的变化趋势,提高系统的稳定性。
在无人机的飞行控制中,PID控制器通过调节输入信号来控制每个电机的转速,从而实现姿态和位置的控制。
三、无人机模型与PID控制器设计
- 无人机模型
无人机的动力学模型可以通过牛顿-欧拉方程建立。模型考虑了系统的非线性和耦合特性,包括俯仰、滚转、偏航和高度控制四个通道。
- PID控制器设计
PID控制器的设计包括确定PID参数(Kp、Ki、Kd)和设置控制器的输入与输出。在仿真中,PID参数需要根据无人机的实际性能和需求进行调整。控制器的输入为无人机的当前姿态和位置与目标姿态和位置之间的误差,输出为控制电机的转速。
四、仿真设置与结果分析
- 仿真设置
使用Matlab或Simulink进行仿真。设置仿真时间为一定时长(如20秒),并设置仿真步长。在仿真中,无人机的初始姿态和位置为已知值,目标姿态和位置为预设值。通过调整PID参数,观察无人机的响应性能和稳定性。
- 结果分析
仿真结果展示了系统在不同控制器参数下的响应性能。通过观察无人机的姿态角度响应、位置响应以及系统稳态误差等指标,可以评估PID控制器的有效性。在适当的PID参数下,无人机能够快速稳定地达到目标位置,并且在受到外部干扰时能够快速恢复平衡。
五、结论与展望
本研究基于PID控制算法对无人机巡航进行了仿真研究。通过调整PID参数,实现了对无人机姿态和位置的精确控制。仿真结果表明,PID控制器在无人机巡航控制中具有良好的稳定性和响应速度。未来,可以进一步探索更加先进的控制算法和优化方法,以提高无人机的性能和智能化水平。同时,加强与其他智能设备和技术的集成应用,也将为实现更加高效、可靠的无人机巡航提供有力支持。
📚2 运行结果
起点和终点可以任意设置。
部分代码:
function [t_out, s_out] = simulation_3d(trajhandle, controlhandle)
% NOTE: This srcipt will not run as expected unless you fill in proper
% code in trajhandle and controlhandle
% You should not modify any part of this script except for the
% visualization part
%
% ***************** QUADROTOR SIMULATION *****************
% *********** YOU SHOULDN'T NEED TO CHANGE ANYTHING BELOW **********
addpath('utils');
% real-time
real_time = true;
% max time
max_time = 20;
% parameters for simulation
params = sys_params;
%% **************************** FIGURES *****************************
disp('Initializing figures...');
h_fig = figure;
h_3d = gca;
axis equal
grid on
%view(3);
view(48.8, 25.8);
xlabel('x [m]'); ylabel('y [m]'); zlabel('z [m]')
quadcolors = lines(1);
set(gcf,'Renderer','OpenGL')
%% *********************** INITIAL CONDITIONS ***********************
disp('Setting initial conditions...');
tstep = 0.01; % this determines the time step at which the solution is given
cstep = 0.05; % image capture time interval
max_iter = max_time/cstep; % max iteration
nstep = cstep/tstep;
time = 0; % current time
err = []; % runtime errors
% Get start and stop position
des_start = trajhandle(0, []);
des_stop = trajhandle(inf, []);
stop_pos = des_stop.pos;
x0 = init_state(des_start.pos, 0);
xtraj = zeros(max_iter*nstep, length(x0));
ttraj = zeros(max_iter*nstep, 1);
x = x0; % state
pos_tol = 0.01;
vel_tol = 0.01;
%% ************************* RUN SIMULATION *************************
disp('Simulation Running....');
% Main loop
for iter = 1:max_iter
timeint = time:tstep:time+cstep;
tic;
% Initialize quad plot
if iter == 1
QP = QuadPlot(1, x0, 0.1, 0.04, quadcolors(1,:), max_iter, h_3d);
current_state = stateToQd(x);
desired_state = trajhandle(time, current_state);
QP.UpdateQuadPlot(x, [desired_state.pos; desired_state.vel], time);
h_title = title(sprintf('iteration: %d, time: %4.2f', iter, time));
end
% Run simulation
[tsave, xsave] = ode45(@(t,s) quadEOM(t, s, controlhandle, trajhandle, params), timeint, x);
x = xsave(end, :)';
% Save to traj
xtraj((iter-1)*nstep+1:iter*nstep,:) = xsave(1:end-1,:);
ttraj((iter-1)*nstep+1:iter*nstep) = tsave(1:end-1);
% Update quad plot
current_state = stateToQd(x);
desired_state = trajhandle(time + cstep, current_state);
QP.UpdateQuadPlot(x, [desired_state.pos; desired_state.vel], time + cstep);
set(h_title, 'String', sprintf('iteration: %d, time: %4.2f', iter, time + cstep))
time = time + cstep; % Update simulation time
t = toc;
% Check to make sure ode45 is not timing out
if(t> cstep*50)
err = 'Ode45 Unstable';
break;
end
% Pause to make real-time
if real_time && (t < cstep)
pause(cstep - t);
end
% Check termination criteria
if terminate_check(x, time, stop_pos, pos_tol, vel_tol, max_time)
break
end
end
%% ************************* POST PROCESSING *************************
% Truncate xtraj and ttraj
xtraj = xtraj(1:iter*nstep,:);
ttraj = ttraj(1:iter*nstep);
% Truncate saved variables
QP.TruncateHist();
% Plot position
h_pos = figure('Name', ['Quad position']);
plot_state(h_pos, QP.state_hist(1:3,:), QP.time_hist, 'pos', 'vic');
plot_state(h_pos, QP.state_des_hist(1:3,:), QP.time_hist, 'pos', 'des');
% Plot velocity
h_vel = figure('Name', ['Quad velocity']);
plot_state(h_vel, QP.state_hist(4:6,:), QP.time_hist, 'vel', 'vic');
plot_state(h_vel, QP.state_des_hist(4:6,:), QP.time_hist, 'vel', 'des');
if(~isempty(err))
error(err);
end
disp('finished.')
t_out = ttraj;
s_out = xtraj;
end
🎉3 参考文献
部分理论来源于网络,如有侵权请联系删除。
[1]Phill Weston,JOUAV.
[2]刘新宇,桑晨,李媛媛,游璧铭,刘畅.基于PID算法的巡逻无人机[J].现代信息科技,2022,6(20):141-145+151.DOI:10.19850/j.cnki.2096-4706.2022.20.033.