MATLAB将动画演示以及将过程保存为gif动态图片

平时想要做一个动画图片来演示,本人一般有两种方法:
一种是截很多张图之后,将这些图片合成为一张gif动画;
另一种就是录屏再制作成gif,我一般是录下视频之后,使用QQ影音,里面的影音工具箱有一个制作动画的功能。
这两种方法都比较繁琐,尤其是第一种需要慢慢截自己需要的图,所以这里介绍一种在MATLAB中使用代码来保存整个动画演示过程的gif图片的方法,这样就方便很多了。

1、机器人教学

依然使用p560六轴机械臂机器人来演示,首先就是加载机器人:

startup_rvc
mdl_puma560

没有下载MATLAB,想要学习的可以查阅:MatLab的下载、安装与使用(亲测有效)
需要研究机器人的,需要下载机器人工具包:MATLAB的rvctools工具箱熟悉运动学【机械臂机器人示例】

我们使用前面学过的运动学的正解确定起始位姿和目标位姿,规划出一条运动轨迹,然后画出来:

t=[0:0.05:2];%两秒完成轨迹,步长0.05
T1 = p560.fkine(qz);%起始位姿,qz零角度
%T2 = p560.fkine(qn)
T2 = p560.fkine([pi/2 pi/3 pi/6 0 0 0]);%目标位姿
J = p560.jtraj(T1,T2,t);%生成轨迹
p560.plot(J)

接下来我们就是将这个演示的动画给保存起来,制作成一个gif的动画:

%制作动画
filename = 'demo.gif';
for i = 1:length(t)
    pause(0.01)
    p560.plot(J(i,:));
    f = getframe(gcf);  %gcf获取当前图窗的句柄,getframe捕获坐标区或图窗作为影片帧
    imind = frame2im(f); %返回与影片帧关联的图像数据
    [imind,cm] = rgb2ind(imind,256); %将 RGB 图像转换为索引图像
    if i == 1
        imwrite(imind,cm,filename,'gif', 'Loopcount',inf,'DelayTime',0.1);
    else
        imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',0.1);
    end
end

制作动画的过程就是将动画的每一帧写入到gif这个动画图片里面去,原理如下:
开启动画演示,使用 gcf 函数获取当前图窗的句柄,然后通过 getframe 函数来捕获坐标区或图窗作为影片帧,再使用 frame2im 函数返回与影片帧关联的图像数据,以及使用 rgb2ind 函数将 RGB 图像转换为索引图像(此 MATLAB 函数 使用最小方差量化和抖动将 RGB 图像转换为索引图像 X。map 最多包含 n 个颜色。n 必须小于或等于 65,536。)
最后使用 imwrite 函数将图像数据写入图形文件中,这里是动画所以会一直不断的写入动态的图像数据到gif文件中。
另外这里面的for循环和if的用法,需要注意的是都需要end来匹配结束。

2、幂函数

x的一次方到x的6次方的动画演示:

x = -2:0.01:2;
n = 1:1:6;
filename = 'demo1.gif'
for i = 1:length(n)
    y = x.^(n(i));
    plot(x,y,'r','LineWidth',1)
    title(['y = x^' num2str(n(i))])
    drawnow
    frame = getframe(gcf);
    im{i} = frame2im(frame);
    [A,map] = rgb2ind(im{i},256); 
    if i == 1
        imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',1);%每帧播放时间
    else
        imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',1);
    end
end

 

3、正弦函数

filename = 'demo2.gif'
for i = 1:4
    x = 0:0.1:2*pi*i;
    y = sin(x);
    plot(x,y,'r','LineWidth',1)
    title('y = sinx')
    drawnow
    frame = getframe(gcf);
    im{i} = frame2im(frame);
    [A,map] = rgb2ind(im{i},256); 
    if i == 1
        imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',1);%每帧播放时间
    else
        imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',1);
    end
end

 

4、圆与正弦函数

圆周运动与正弦函数的关系(0到2π的一个圆也是正弦函数一个周期),所以三角函数也叫做圆函数,最初就是圆上的点做的运动而形成的轨迹吧。

theta = linspace(0,2*pi,200); 
%圆的坐标
x = cos(theta)-1;
y = sin(theta);
%正弦函数坐标
x1 = theta;
y1 = sin(x1);
 
for i = 1:length(theta)
    set(gcf,'outerposition',get(0,'screensize'));%全屏
    %圆和正弦函数之间的连接线
    connectLineX = linspace(x(i),x1(i),50);
    connectLineY = zeros(1,50)+y(i);

    AxisX = linspace(-2,10,50);
    AxisY = zeros(1,50);
    %圆中的箭头
    arrowX = [-1,x(i)];
    arrowY = [0,y(i)];
    
    %圆周上的点到横轴的垂线
    lineX = zeros(1,20)+x(i);
    lineY = linspace(0,y(i),20);
    %正弦函数上的点到横轴的垂线
    x3 = zeros(1,20)+x1(i);
    y3 = linspace(0,y1(i),20);
    %画图
    plot(x(1:i),y(1:i),'r',x1(1:i),y1(1:i),'g',connectLineX,connectLineY,'--',arrowX,arrowY,'-bo',lineX,lineY,'k',x3,y3,'k','LineWidth',3);
    text(x(i)+0.05,y(i),strcat(num2str(theta(i)/pi),'\pi'),'fontsize',14);
    text(x1(i)+0.05,y1(i),strcat(num2str(theta(i)/pi),'\pi'),'fontsize',14);
    grid on
    axis equal
    axis([-2.2 7 -1.2 1.2])
    set(gca,'XTick',[-2,-1,0:pi/8:2*pi]);
    set(gca,'xtickLabel',{'-2','-1','0','\pi/8','\pi/4','3\pi/8','\pi/2','5\pi/8','3\pi/4','7\pi/8','\pi','9\pi/8','5\pi/4','11\pi/8','3\pi/2','13\pi/8','7\pi/4','15\pi/8','2\pi'});
    title('圆周运动跟正弦函数','fontsize',22,'fontname','微软雅黑')
    drawnow
    f=getframe(gcf);
    imind=frame2im(f);
    [imind,cm] = rgb2ind(imind,256);
    if i == 1
        imwrite(imind,cm,'sin.gif','GIF', 'Loopcount',inf,'DelayTime',0.02);
    else
        imwrite(imind,cm,'sin.gif','GIF','WriteMode','append','DelayTime',0.02);
    end
end

由于动画超过5M,上传不过,截个图如下:

PS画圆:

t=0:0.1:2*pi
x = cos(t);
y = sin(t);
plot(x,y)
或者
ezplot('x^2+y^2=1')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/225485.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

轻松掌握接口测试!丰富你的测试技能!

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。 简答的说就是通过URL像服务器或者其他模块等&…

【EI征稿中|ACM出版】2023 人工智能、系统与网络安全国际学术会议 (AISNS 2023)

2023 人工智能、系统与网络安全国际学术会议 (AISNS 2023) 2023 International Conference on Artificial Intelligence, Systems and Network Security 由西南科技大学计算机科学与技术学院主办的2023人工智能、系统与网络安全国际学术会议 (AISNS 2023&#xff…

离线数仓构建案例一

数据采集 日志数据(文件)到Kafka 自己写个程序模拟一些用户的行为数据,这些数据存在一个文件夹中。 接着使用flume监控采集这些文件,然后发送给kafka中待消费。 1、flume采集配置文件 监控文件将数据发给kafka的flume配置文件…

系统架构设计面试题

十大经典系统架构设计面试题_架构_程序员石磊_InfoQ写作社区翻译自:https://medium.com/geekculture/top-10-system-design-interview-questions-10f7b5ea123d在我作为微软和Facebhttps://xie.infoq.cn/article/4c0c9328a725a76922f6547ad 任何 SDI 问题的提示 通过…

【PyTorch】softmax回归

文章目录 1. 模型与代码实现1.1. 模型1.2. 代码实现 2. Q&A2.1. 运行过程中出现以下警告:2.2. 定义的神经网络中的nn.Flatten()的作用是什么?2.3. num_workers有什么作用?它的值怎么确定? 1. 模型与代码实现 1.1. 模型 背景…

用C语言实现链栈的基本操作

#include <stdio.h> #include <malloc.h> #define ElemType char//相当于ElemType等同于char类型 //链式结构 数据域指针域 typedef struct LinkStackNode//定义一个链栈的结构体类型 {ElemType data;//ElemType是链栈的元素类型&#xff0c;代表数据域struct Lin…

Let‘s Encrypt安全证书的步骤及使用-基于centos9, 包括工具certbot安装及使用,获取apache、nginx、iis等服务器安全证书

Lets Encrypt 介绍 Lets Encrypt 是一个免费、自动化的证书颁发机构&#xff08;CA&#xff0c;Certificate Authority&#xff09;&#xff0c;致力于为网站提供免费的SSL/TLS证书。以下是关于Lets Encrypt安全证书的详细介绍&#xff1a; 特点和背景&#xff1a; 免费&#…

zedbox 实现配置 yolov5

Stereolabs 的 ZED Box 是一款由 NVIDIA Jetson™ 提供支持的紧凑型网关&#xff0c;用于在移动和现场情况下挑战 AIoT&#xff08;物联网&#xff09;。它旨在将空间感知和理解带到边缘&#xff0c;并聚合、处理和分析来自 3D 传感器和设备的数据。 相关内容 1.win10下 cud…

超声波清洗机有用吗,超声波清洗机怎么选?热门超声波清洗机测评

用过超声波清洗机的朋友都知道&#xff0c;超声波清洗机比自己手动清洗眼镜的好处在于&#xff0c;它能够更加快速、高效的清洗干净眼镜等物件&#xff01;通过超声波振频的工作原理对物体的污渍进行一个脱离剥落&#xff0c;不接触物件的清洗方式也保证了物件清洗的安全性&…

leetcode刷题:611.有效三角形的个数(双指针实现)

题目地址&#xff1a;有效三角形的个数 解决此题时&#xff0c;首先需要知道的是如何判断三个数字是否能够构成三角形。 我们知道&#xff0c;三角形任意两边之和都大于第三边。所以判断三个数字是否能构成三角形需要进行三次比较&#xff08;最基础的思路&#xff09; 方法一…

LangChain的函数,工具和代理(五):Tools Routing

关于langchain的函数、工具、代理系列的博客我之前已经写了四篇&#xff0c;还没有看过的朋友请先看一下&#xff0c;这样便于对后续博客内容的理解&#xff1a; LangChain的函数&#xff0c;工具和代理(一)&#xff1a;OpenAI的函数调用 LangChain的函数&#xff0c;工具和代…

【改进YOLOv8】融合Gold-YOLO的车辆未礼让行人检测系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着交通工具的普及和道路交通量的增加&#xff0c;交通安全问题日益凸显。尤其是车辆未礼让行人的情况频繁发生&#xff0c;给行人的生命安全带来了严重威胁。因…

从零开始:同城O2O外卖APP的技术开发指南

随着互联网的迅速发展&#xff0c;O2O&#xff08;OnlinetoOffline&#xff09;模式在各个行业都取得了巨大成功&#xff0c;而同城外卖APP更是成为人们生活中不可或缺的一部分。本文将从零开始&#xff0c;为您提供一份同城O2O外卖APP的技术开发指南&#xff0c;让您能够深入了…

OpenCV交叉编译

1.下载代码解压 tar -zxvf opencv-4.8.1.tar.gz cd cd opencv-4.8.1 sudo mkdir chmod 777 build cd build 2.配置交叉编译工具 根据自己的板子进行修改 -D CMAKE_C_COMPILERaarch64-mix210-linux-gcc -D CMAKE_CXX_COMPILERaarch64-mix210-linux-g 3.cmake生成makefi…

1.4 场景设计精要

一、场景主题确定 设计游戏场景首先明确游戏发生的时间地点等时代背景。通过对玩家动线的设计&#xff0c;功能模型的合理布局构建出场景的基本骨架。利用光影效果和色彩变化烘托场景氛围。 市场上常见的主题场景&#xff1a;剑侠、科幻、废墟、魔幻等 二、场景风格确定 大类分…

C51汇编程序

目录 一.C51的数据类型和存储类型 1.数据类型&#xff1a; 2.C51的扩展数据类型&#xff1a; 3.数据存储类型 4.数据存储模式 二.特殊功能寄存器及其位变量定义 1.特殊功能寄存器的C51定义 2.位变量的C51定义 三.C51语言的绝对地址访问 1.绝对宏 2._at_关键字 一.C5…

Linux CentOS本地部署SQL Server数据库结合cpolar内网穿透实现公网访问

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 安装sql server二. 局域网测试连接三. 安装cpolar内网穿透四. 将sqlserver映射…

创业6个月裤衩都赔掉了;2023生成式AI年度大事表;AI工程师的自我修养;LLM开发者成长计划;OpenAI LLM入门课程 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f440; 黄家驹AI演唱「直到世界尽头」&#xff0c;是科技前进也是青春回望~ https://www.bilibili.com/video/BV1CG411i7MV 最近几天&#xf…

2022 RedisDays 内容揭秘

上个月&#xff0c;Redis举办了3场线上会议&#xff0c;分别介绍了即将正式发布的Redis 7中包括的重要更新的内容&#xff0c;还有Redis完全重写的RedisJSON 2.0模块&#xff0c;和新发布的Redis Stack模块。除此之外&#xff0c;在此次线上会议中还介绍了现代化的软件架构与Re…

pyside6详细笔记

文章目录 主要模组简介绍安装与环境配置安装配置QtDesignerPyUICPyRCC基础了解元对象系统对象模型重要的类Qt 对象:身份?值?对象树与所有状态概述QObjects 的构造/销毁顺序继承关系图Qt 命名空间模块简介QWidget窗口的创建在PyQt中使用qrc/rcc资源系统Qt 资源系统简介qrc 文件…