MATLAB模拟四旋翼无人机飞行,机翼可独立旋转

bash 复制代码
clear; clc; close all;

f = figure('Color','w','Position',[100 100 900 700]);
ax = axes('DataAspectRatio',[1 1 1],'Color',[0.98 0.98 1]);
hold on; grid on; box on;
xlabel('X'); ylabel('Y'); zlabel('Z');
title('无人机','FontSize',12,'FontWeight','bold');
view(60,25); lighting gouraud; material shiny;
axis([-15 15 -15 15 -5 20]);

% 轨迹
traj = plot3(0,0,0,'r-','LineWidth',2);
traj_x = []; traj_y = []; traj_z = [];

% ===================== 固定绘制无人机(本地坐标)=====================
% 机身(永远不会消失)
[x,y,z] = ellipsoid(0,0,0, 2,1.2,0.5);
body = surf(x,y,z,'FaceColor',[0.05 0.08 0.15],'EdgeColor','none');

% 机臂
arm_L = 3.5;
arm_R = 0.12;
motors = [arm_L,arm_L,0; -arm_L,arm_L,0; arm_L,-arm_L,0; -arm_L,-arm_L,0];
for i = 1:4
    cylinder3d([0,0,0], motors(i,:), arm_R, [0.1 0.1 0.13]);
end

% 电机
for i = 1:4
    [xm,ym,zm] = cylinder(0.25,50); zm = zm*0.2-0.1;
    xm = xm+motors(i,1); ym = ym+motors(i,2);
    surf(xm,ym,zm,'FaceColor',[0 0 0],'EdgeColor','none');
end

% 起落架
plot3([1.3,1.3],[1.3,1.3],[0,-1.2],'Color',[0.07 0.07 0.09],'LineWidth',4);
plot3([-1.3,-1.3],[1.3,1.3],[0,-1.2],'Color',[0.07 0.07 0.09],'LineWidth',4);
plot3([1.3,1.3],[-1.3,-1.3],[0,-1.2],'Color',[0.07 0.07 0.09],'LineWidth',4);
plot3([-1.3,-1.3],[-1.3,-1.3],[0,-1.2],'Color',[0.07 0.07 0.09],'LineWidth',4);

% 4叶旋翼
blades = [];
prop_R = 1.2;
blade_w = 0.1;
for m = 1:4
    ox = motors(m,1); oy = motors(m,2); oz = 0.15;
    for k = 0:3
        ang = k*pi/2;
        bx = [ox, ox+prop_R*cos(ang)-blade_w*sin(ang), ox+prop_R*cos(ang)+blade_w*sin(ang), ox];
        by = [oy, oy+prop_R*sin(ang)+blade_w*cos(ang), oy+prop_R*sin(ang)-blade_w*cos(ang), oy];
        bz = [oz, oz+0.02, oz+0.02, oz];
        p = patch(bx,by,bz,[0.93 0.93 0.96],'EdgeColor',[0.1 0.1 0.12]);
        blades = [blades, p];
    end
end

light('Position',[6,6,8]); light('Position',[-6,-6,6]);

% ===================== 核心:整体飞行(绝对不消失)=====================
angle = 0; t = 0;
while ishandle(f)
    % 飞行路径
    t = t + 0.08;
    cx = 12*sin(0.3*t);
    cy = 12*cos(0.4*t);
    cz = 10 + 4*sin(0.5*t);
    yaw = sin(0.2*t);

    % 记录轨迹
    traj_x = [traj_x, cx];
    traj_y = [traj_y, cy];
    traj_z = [traj_z, cz];
%     plot3(traj_x,traj_y,traj_z,'r-')
%     hold on
%     set(traj,'XData',traj_x,'YData',traj_y,'ZData',traj_z);

    % 旋翼旋转
    angle = angle + 6;
    for m = 1:4
        ox = motors(m,1); oy = motors(m,2); oz = 0.15;
        for k = 0:3
            a = angle + k*90;
            idx = (m-1)*4 + k + 1;
            bx = [ox, ox+prop_R*cosd(a)-blade_w*sind(a), ox+prop_R*cosd(a)+blade_w*sind(a), ox];
            by = [oy, oy+prop_R*sind(a)+blade_w*cosd(a), oy+prop_R*sind(a)-blade_w*cosd(a), oy];
            bz = [oz, oz+0.02, oz+0.02, oz];
            set(blades(idx),'XData',bx,'YData',by,'ZData',bz);
        end
    end

    % ==================== 关键修复:整体移动,不修改原始数据!永不消失!====================
    % 把【整个无人机】当作一个整体,直接整体平移+旋转
    hg = hgtransform;
    set(body,'Parent',hg);
    set(findobj('Type','surf'),'Parent',hg);
    set(findobj('Type','patch'),'Parent',hg);
    set(findobj('Type','line'),'Parent',hg);
    
    R = makehgtform('translate',[yaw yaw yaw]);
    T = makehgtform('translate',[cx cy cz]);
    set(hg,'Matrix',T*R);
xlim([-20 20])
ylim([-20 20])
zlim([-20 20])
    drawnow;
end

% 圆柱体函数
function cylinder3d(startPos,endPos,r,color)
    dir = endPos - startPos; L = norm(dir); dir = dir/L;
    [X,Y,Z] = cylinder(r,50); Z = Z*L;
    R = rotMatrix([0,0,1],dir);
    for i = 1:size(X,1)
        for j = 1:size(X,2)
            v = R * [X(i,j);Y(i,j);Z(i,j)];
            X(i,j)=v(1)+startPos(1); Y(i,j)=v(2)+startPos(2); Z(i,j)=v(3)+startPos(3);
        end
    end
    surf(X,Y,Z,'FaceColor',color,'EdgeColor','none');
end

function R = rotMatrix(v1,v2)
    v = cross(v1,v2); s = norm(v); c = dot(v1,v2);
    vx = [0,-v(3),v(2);v(3),0,-v(1);-v(2),v(1),0];
    R = eye(3) + vx + vx^2*(1-c)/(c+1);
end




相关推荐
灯澜忆梦9 小时前
GO_并发编程---定时器
开发语言·后端·golang
-银雾鸢尾-9 小时前
C#中的StringBuilder相关方法
开发语言·c#
-银雾鸢尾-10 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
xuanshang_yutou10 小时前
无人机调试起飞遇到的问题及注意事项
无人机
大模型码小白11 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
段一凡-华北理工大学12 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
Ljwuhe13 小时前
C++——多态
开发语言·c++
延凡科技13 小时前
多场景落地复盘:端边云架构无人机智能巡检系统设计与实践
大数据·数据结构·人工智能·科技·架构·无人机·能源
心平气和量大福大13 小时前
C#-WPF-Window主窗体
开发语言·c#·wpf
从零开始的代码生活_15 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法