基于Matlab实现多旋翼无人机航迹规划控制

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信       无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机 

⛄ 内容介绍

旋翼类无人机相对于固定翼无人机具有能够垂直起降,空中悬停等优点,而四旋翼无人机作为其中一个典型的代表,不仅结构简单还具有良好的带载能力,也易于操控,在军事领域,民用领域,都有着广泛的应用,常见的包括航天拍摄,灾害救援,物资运输等.飞行控制系统是四旋翼飞行器的关键,其中,如何控制飞行器的姿态,是整个飞行控制的核心问题.要保证四旋翼无人机在各种飞行环境下都具有良好的飞行状态,飞行控制算法极为重要.本文借助Matlab仿真平台上,使用了控制系统对四旋翼无人机进行了仿真.​

⛄ 部分代码

% ******************************************************************************************************************

% ************************************ SEGUIMIENTO DE TRAYECTORIA **************************************************

% ********************************** ROBOT MANIPULADOR AEREO DOS BRAZOS *****************************************************

% ******************************************************************************************************************

%% Inicializacion

tic

clc; clear all; close all; warning off % Inicializacion

ts = 0.1;       

tfin = 200;     

t = 0:ts:tfin;

%% Posicion de los brazos roboticos

a_1=0; 

b_1=0.18; 

c_1=-0.03;

a_2=0; 

b_2=-0.15; 

c_2=-0.03;

%% Eslabones del brazo

l1_1 = 0.15; 

l2_1 = 0.44; 

l3_1 = 0.45;

l1_2 = 0.15; 

l2_2 = 0.44; 

l3_2 = 0.45;

%% Condiciones iniciales del robot

% UAV

xu(1) = 0; 

yu(1) = 0; 

zu(1) = 5;

psi(1)= 0 * (pi/180);

% Primer brazo

q1_1(1) = 0 * (pi/180);

q2_1(1) = 0 * (pi/180);

q3_1(1) = 0 * (pi/180);

% Segundo brazo

q1_2(1) = 0 * (pi/180);

q2_2(1) = 0 * (pi/180);

q3_2(1) = 0 * (pi/180);

%% Tarea deseada

%Silla de montar  

%%Extremo Operativo 1

xd_2 = 1.9*cos(0.05*t)+1.75;      xdp_2 = -1.9*0.05*sin(0.05*t);      

yd_2 = 1.9*sin(0.05*t)+1.75;      ydp_2 =  1.9*0.05*cos(0.05*t);     

zd_2 = 0.2*sin(0.2*t)+2;          zdp_2 =  0.2*0.2*cos(0.2*t); 

    

%%Extremo Operativo 2

xd_1 = 1.6*cos(0.05*t)+1.75;      xdp_1 = -1.6*0.05*sin(0.05*t);      xdpp_1 = -1.6*0.05*0.05*cos(0.05*t);

yd_1 = 1.6*sin(0.05*t)+1.75;      ydp_1 =  1.6*0.05*cos(0.05*t);      ydpp_1 = -1.6*0.05*0.05*sin(0.05*t);

zd_1 = 0.2*sin(0.3*t)+2.3;        zdp_1 =  0.2*0.3*cos(0.3*t); 

%UAV

psid= (atan2(ydp_1,xdp_1));

psidp = (1./((ydp_1./xdp_1).^2+1)).*((ydpp_1.*xdp_1-ydp_1.*xdpp_1)./xdp_1.^2);

psidp(1)=0;

hdp = [xdp_1 ydp_1 zdp_1 xdp_2 ydp_2 zdp_2 psidp]';

%% Cinematica directa inicial de los extremos operativos

h = CDBrazo3DOF(xu(1),yu(1),zu(1),psi(1),l1_1,l2_1,l3_1,a_1,b_1,c_1,q1_1(1),q2_1(1),q3_1(1));

hx_1(1) = h(1);

hy_1(1) = h(2);

hz_1(1) = h(3);

h = CDBrazo3DOF(xu(1),yu(1),zu(1),psi(1),l1_2,l2_2,l3_2,a_2,b_2,c_2,q1_2(1),q2_2(1),q3_2(1));

hx_2(1) = h(1);

hy_2(1) = h(2);

hz_2(1) = h(3);

%******************************************************************************************************************

%***************************************** CONTROLADOR ***********************************************************

%*****************************************************************************************************************

disp('Empieza el programa')

for k=1:length(t)

    tic

%% 1) LEY DE CONTROL DEL MANIPULADOR AEREO

    u = Control_Jacob(l2_1,l3_1,l2_2,l3_2,a_1,b_1,a_2,b_2,q1_1(k),q2_1(k),q3_1(k),q1_2(k),q2_2(k),q3_2(k),psi(k),hx_1(k),hy_1(k),hz_1(k),hx_2(k),hy_2(k),hz_2(k),xd_1(k),yd_1(k),zd_1(k),xd_2(k),yd_2(k),zd_2(k),psid(k),xdp_1(k),ydp_1(k),zdp_1(k),xdp_2(k),ydp_2(k),zdp_2(k),psidp(k));

    ul(k)  = u(1);

    um(k)  = u(2);

    un(k)  = u(3);

    w(k)   = u(4);

    qp1_1(k)= u(5);

    qp2_1(k)= u(6);

    qp3_1(k)= u(7);

    qp1_2(k)= u(8);

    qp2_2(k)= u(9);

    qp3_2(k)= u(10);

       

%% 2) CINEMATICA DEL UAV

    xu_p(k) = ul(k) * cos(psi(k)) - um(k) * sin(psi(k));

    yu_p(k) = ul(k) * sin(psi(k)) + um(k) * cos(psi(k));

    zu_p(k) = un(k);

  

%% 3) Posicion del UAV en k+1 (Integracion Euler)

    xu(k+1) = xu_p(k)*ts + xu(k);

    yu(k+1) = yu_p(k)*ts + yu(k);

    zu(k+1) = zu_p(k)*ts + zu(k);      

    psi(k+1) = Angulo(w(k)*ts + psi(k));

%% 4) Posicion de las articulaciones en k+1 (Integracion Euler)

    % Brazo 1

    q1_1(k+1)= q1_1(k) + qp1_1(k)*ts;

    q2_1(k+1)= q2_1(k) + qp2_1(k)*ts;

    q3_1(k+1)= q3_1(k) + qp3_1(k)*ts;

    % Brazo 2

    q1_2(k+1)= q1_2(k) + qp1_2(k)*ts;

    q2_2(k+1)= q2_2(k) + qp2_2(k)*ts;

    q3_2(k+1)= q3_2(k) + qp3_2(k)*ts;

    

%% 5) Posicion de los extremo operativos

    h_1 = CDBrazo3DOF(xu(k+1),yu(k+1),zu(k+1),psi(k+1),l1_1,l2_1,l3_1,a_1,b_1,c_1,q1_1(k+1),q2_1(k+1),q3_1(k+1));

    hx_1(k+1) = h_1(1);

    hy_1(k+1) = h_1(2);

    hz_1(k+1) = h_1(3);

    h_2 = CDBrazo3DOF(xu(k+1),yu(k+1),zu(k+1),psi(k+1),l1_2,l2_2,l3_2,a_2,b_2,c_2,q1_2(k+1),q2_2(k+1),q3_2(k+1));

    hx_2(k+1) = h_2(1);

    hy_2(k+1) = h_2(2);

    hz_2(k+1) = h_2(3);

%% 6) Tiempo de Maquina 

     dt(k) = toc;

end

disp('Fin de los calculos')

%******************************************************************************************************************

%********************************* ANIMACION SEGUIMIENTO DE TRAYECTORIA ******************************************

%% ******************************************************************************************************************

  disp('Play Animacion de Simulacion ')

  figure(1)

  axis equal

  view(-15,15) % Angulo de vista

  cameratoolbar

  title ("Simulacion Cinematica")

%% Configuracion del Manipulador Aereo

  DimensionesManipulador(0,l1_1,l2_1,l3_1-0.2,1);

  Hexacoptero(0.05,[1 0 0]);

%% Dibujo del Manipulador Aereo

  %) a) Manipulador 1

  M_1=Manipulador3D(xu(1),yu(1),zu(1),psi(1),a_1,b_1,c_1,q1_1(1),q2_1(1),q3_1(1),0); % Gráfica el brazo por encima el UAV

  rotate(M_1,[1 0 0],180,[xu(1),yu(1),zu(1)])

  hold on

  % b) Manipulador 2

  M_2=Manipulador3D(xu(1),yu(1),zu(1),psi(1),a_2,b_2,c_2,q1_2(1),q2_2(1),q3_2(1),0); % Gráfica el brazo por encima el UAV

  rotate(M_2,[1 0 0],180,[xu(1),yu(1),zu(1)])

  hold on

  % c) UAV

  UAV= Hexacoptero(xu(1),yu(1),zu(1),psi(1));

%% Plot punto deseado

    plot3(xd_1,yd_1,zd_1)

    plot3(xd_2,yd_2,zd_2)

    H1 = plot3(hx_1(1),hy_1(1),hz_1(1),'r');

    H2 = plot3(hx_2(1),hy_2(1),hz_2(1),'b');

    xlabel('X [m]'); ylabel('Y [m]'); zlabel('Z [m]');

  

%% Animacion de movimiento

  for k=1:50:length(t)  

    tic

    drawnow

    delete(M_1);

    delete(M_2);

    delete(UAV);

    delete(H1);

    delete(H2);

    

    H1 = plot3(hx_1(1:k),hy_1(1:k),hz_1(1:k),'r');

    H2 = plot3(hx_2(1:k),hy_2(1:k),hz_2(1:k),'b');

        

    % a) Manipulador 1

    M_1=Manipulador3D(xu(k),yu(k),zu(k),psi(k),a_1,b_1,c_1,q1_1(k),q2_1(k),q3_1(k),0); % Gráfica el brazo por encima el UAV

    rotate(M_1,[1 0 0],180,[xu(k),yu(k),zu(k)])

    hold on

    % b) Manipulador 2

    M_2=Manipulador3D(xu(k),yu(k),zu(k),psi(k),a_2,b_2,c_2,q1_2(k),q2_2(k),q3_2(k),0); % Gráfica el brazo por encima el UAV

    rotate(M_2,[1 0 0],180,[xu(k),yu(k),zu(k)])

    hold on

    % c) UAV

    UAV= Hexacoptero(xu(k),yu(k),zu(k),psi(k));

    toc

    pause(0.0)

  end

%%

%******************************************************************************************************************

%********************************************* GRÃ?FICAS ***********************************************************

%% ****************************************************************************************************************

% 1) Igualar columnas de los vectores creados

%   hx(:,end)=[];

%   hy(:,end)=[];

%   hz(:,end)=[];

%   psi(:,end)=[];

  %%

% 2) Cálculos del Error

  figure(2)

  hxe= xd_1 - hx_1(1:end-1);

  hye= yd_1 - hy_1(1:end-1);

  hze= zd_1 - hz_1(1:end-1);

  psie= Angulo(psid-psi(:,end-1));

  plot(hxe), hold on, grid on

  plot(hye)

  plot(hze)

%   plot(psie)

  legend("hxe","hye","hze","psie")

  title ("Errores de posición")

  %%

% % 3) Posiciones deseadas vs posiciones reales del extremo operativo del manipulador aéreo

  figure(3)

  

  subplot(4,1,1)

  plot(xd)

  hold on

  plot(hx)

  legend("xd","hx")

  ylabel('x [m]'); xlabel('s [ms]');

  title ("Posiciones deseadas y reales del extremo operativo del manipulador aéreo")

  

  subplot(4,1,2)

  plot(yd)

  hold on

  plot(hy)

  legend("yd","hy")

  ylabel('y [m]'); xlabel('s [ms]');

  subplot(4,1,3)

  plot(zd)

  hold on

  plot(hz)

  grid on

  legend("zd","hz")

  ylabel('z [m]'); xlabel('s [ms]');

  subplot(4,1,4)

  plot(Angulo(psid))

  hold on

  plot(psi)

  legend("psid","psi")

  ylabel('psi [rad]'); xlabel('s [ms]');

⛄ 运行结果

⛄ 参考文献

[1] 王者思, 李瑞贤, 张健,等. 基于Matlab的无人机自主飞行航迹规划与仿真[C]// 全国第二届信号处理与应用学术会议. 0.

[2] 陈平辉. 小型多旋翼无人机飞行控制器的研制[D]. 贵州大学, 2015.

[3] 魏家辉, 姜春波, 陈浩,等. 基于Matlab的四旋翼无人机控制仿真[J]. 数码世界, 2018.

⛳️ 代码获取关注我

❤️部分理论引用网络文献,若有侵权联系博主删除

❤️ 关注我领取海量matlab电子书和数学建模资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
基于改进差分的三维多无人机协同航迹规划主要涉及到无人机路径优化和协同控制。下面将详细介绍在Matlab实现算法的源码。 首先,在Matlab中,我们可以利用已有的无人机模型和传感器模型来进行仿真实验。假设我们有三架无人机,每架无人机的初始位置、速度和目标点分别为(p1, v1, goal1),(p2, v2, goal2)和(p3, v3, goal3)。 接下来,我们需要定义无人机的动力学模型,以及考虑到差分约束的路径规划算法。在改进差分算法中,我们可以利用优化方法(如梯度下降法)来求解路径规划问题。具体来说,我们可以定义一个代价函数,将路径规划问题转化为优化问题。代价函数的目标是最小化无人机的总体路径长度,并考虑到约束条件(如避障、最小飞行时间等)。 在具体实现中,我们可以使用MATLAB的优化工具箱中的函数,如fmincon或fminunc,来进行优化求解。这些函数可以通过提供定义好的代价函数,指定约束条件等来进行调用。在调用时,我们需要将无人机的初始位置、速度和目标点作为输入,作为优化问题的起点。 最后,通过迭代优化算法,我们可以获取到使得代价函数最小化的最佳路径。将优化结果以及相关参数可视化展示,便于进一步分析和实验结果的验证。 以上就是基于改进差分实现三维多无人机协同航迹规划的大致思路,具体的实现细节可以根据具体的项目需求进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值