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




相关推荐
代龙涛2 小时前
WordPress 主题开发指南:模板文件、函数与页面选型规则
开发语言·后端·php·wordpress
代码探秘者2 小时前
【大模型应用】6.RAG 场景下的向量+关键词混合检索
java·开发语言·人工智能·python·spring
RFCEO2 小时前
JavaScript基础课程十四、原型与原型链(JS 核心底层)
开发语言·原型模式·prototype原型详解·javascript基础课·构造函数原型方法定义与使用·js原型链继承机制入门·t原型链顶层null原理
liuyao_xianhui2 小时前
优选算法_位运算_只出现一次的数字3_C++
开发语言·数据结构·c++·算法·leetcode·链表·动态规划
Sylvia33.3 小时前
体育数据API实战:用火星数据实现NBA赛事实时比分与状态同步
java·linux·开发语言·前端·python
GIS数据转换器3 小时前
小龙虾(OpenClaw) 在低空经济领域的应用
大数据·人工智能·无人机·智慧城市·制造
遗憾随她而去.3 小时前
js 插件 Clipboard.js 与原生 Clipboard API 全方位对比
开发语言·前端·javascript
人道领域3 小时前
Day | 07 【苍穹外卖 :用户端添加购物车】
java·开发语言·数据库·后端·苍穹外卖