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 == 1imwrite(imind,cm,filename,'gif', 'Loopcount',inf,'DelayTime',0.1);elseimwrite(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))])drawnowframe = getframe(gcf);im{i} = frame2im(frame);[A,map] = rgb2ind(im{i},256); if i == 1imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',1);%每帧播放时间elseimwrite(A,map,filename,'gif','WriteMode','append','DelayTime',1);end
end

 

3、正弦函数

filename = 'demo2.gif'
for i = 1:4x = 0:0.1:2*pi*i;y = sin(x);plot(x,y,'r','LineWidth',1)title('y = sinx')drawnowframe = getframe(gcf);im{i} = frame2im(frame);[A,map] = rgb2ind(im{i},256); if i == 1imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',1);%每帧播放时间elseimwrite(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 onaxis equalaxis([-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','微软雅黑')drawnowf=getframe(gcf);imind=frame2im(f);[imind,cm] = rgb2ind(imind,256);if i == 1imwrite(imind,cm,'sin.gif','GIF', 'Loopcount',inf,'DelayTime',0.02);elseimwrite(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')

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021年度大题:灰太狼的密码

分析:本题主要使用的是素数进行输出,然后难点是如何按照题目要求格式输出。 思路: 第一:我们可以先让素数存给一个一维数组,至于存多少个素数,是矩阵n*n个,控制数量用计数器count即可&#xf…

汽车电子 -- CAN文件格式ASC

Vector提供了两种记录数据格式的格式规范:BLF和ASC。 先讲讲ASC。 参看:图文详解CAN Log文件 - ASC文件格式 一、ASC文件格式 在Vector提供的 CAN_LOG_TRIGGER_ASC_Format.pdf 提取码:ltjv 文件中,规定了CANoe/CANalyzer ASC记…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之linux存储管理(3)》(19)

《Linux操作系统原理分析之linux存储管理(3)》(19) 6 Linux存储管理6.4 Linux 的分段和分页结构6.4.1Linux 的分段结构6.4.2 Linux 的三级分页结构6.4.3 内核页表和进程页表 6 Linux存储管理 6.4 Linux 的分段和分页结构 本节主…

微服务实战系列之Redis

前言 云淡天高,落木萧萧,一阵西北风掠过,似寒刀。冬天渐渐变得更名副其实了,“暖冬”的说法有点言过其实了。——碎碎念 微服务实战系列之Cache微服务实战系列之Nginx(技巧篇)微服务实战系列之Nginx微服务实…

多屏模式输入法可以正确切换屏幕展示原理剖析

背景 hi,粉丝朋友们: 近期有个学员问到了一个输入法相关问题。刚好梳理了一下输入法相关的在多屏模式的一个展示流程,这里做个记录,也相当于深入理解窗口相关的一篇干货blog。 如上面两幅图展示,输入法可以自由自在显…

谁登榜? 2023数据安全平台神兽企业

在数字经济的浪潮中,数据安全已成为企业发展的关键支撑。2023年8月,CSA大中华区启动数据安全平台神兽企业调研,得到了众多网络安全综合厂商、数据安全专业厂商、云服务提供商、用户单位的广泛关注和积极参与。 历时4个月,CSA大中…

Java 线程池到底是如何复用线程的

原理概述 其实 Java 线程池的实现原理很简单,说白了就是一个线程集合 workerSet 和一个阻塞队列 workQueue。 当用户向线程池提交一个任务时,线程池会先将任务放入 workQueue 中。workerSet 中的线程会不断的从 workQueue 中获取线程然后执行。当 work…

多人聊天Java

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{ public static ServerSocket server_socket; public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []ar…

性能调优入门

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、性能定律和数理基础 1.三个定律法则 (1)帕累托法则 我它也被称为 80/20 法则、关键少数法则&#xff0c;或者八二法则。人们在生活中发现很多…

Ubuntur编译ROS报错:error PCL requires C++14 or above

ubuntu20.04 编译ROS包 报错&#xff1a; error&#xff1a; PCL requires C14 or above&#xff1a; 修改Cmakelists.txt文件&#xff1a; set&#xff08;CMAKE_CXX_STANDARD 14&#xff09; 再次编译成功.

用 Bytebase 做数据库 schema 迁移

数据库 schema 迁移指修改管理数据库结构的变更&#xff0c;包括为数据库添加视图或表、更改字段类型或定义新约束。Bytebase 提供了可视化 GUI 方便迁移数据库 schema&#xff0c;本教程将展示如何使用 Bytebase 为 schema 迁移配上 SQL 审核&#xff0c;自定义审批流&#xf…

改造python3中的http.server为简单的文件上传下载服务

改造 修改python3中的http.server.SimpleHTTPRequestHandler&#xff0c;实现简单的文件上传下载服务 simple_http_file_server.py&#xff1a; # !/usr/bin/env python3import datetime import email import html import http.server import io import mimetypes import os …

UDP协议实现群聊

服务端 package ydd;import java.io.*; import java.net.*; import java.util.ArrayList; public class A2{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []a…

【C++】如何优雅地把二维数组初始化为0

2023年12月7日&#xff0c;周四上午 目录 为什么要初始化二维数组不优雅的初始化方式&#xff1a;使用两个for循环优雅的初始化方式一&#xff1a;使用初始化列表优雅的初始化方式二&#xff1a;使用memset函数 为什么要初始化二维数组 如果不初始化二维数组&#xff0c;那么…

点评项目——短信登陆模块

2023.12.6 短信登陆如果基于session来实现&#xff0c;会存在session共享问题&#xff1a;多台Tomcat不能共享session存储空间&#xff0c;这会导致当请求切换到不同服务器时出现数据丢失的问题。 早期的解决办法是让session提供一个数据拷贝的功能&#xff0c;即让各个Tomcat的…

【Python】流畅!一个非常好用的网络数据采集工具!

文章目录 前言一、注册二、初窥三 数据集四 自定义网站网络爬虫总结 前言 你是否曾为获取重要数据而感到困扰&#xff1f;是否因为数据封锁而无法获取所需信息&#xff1f;是否因为数据格式混乱而头疼&#xff1f;现在&#xff0c;所有这些问题都可以迎刃而解。让我为大家介绍…

【数据结构】——二叉树简答题模板

目录 一、树和二叉树的概念&#xff08;一&#xff09;二叉树的定义和性质&#xff08;二&#xff09;树和二叉树的区别 二、完全二叉树和满二叉树三、二叉树的遍历&#xff08;一&#xff09;由序列确定二叉树&#xff08;二&#xff09;不同遍历序列的关系 四、二叉树的性质&…

智能井盖传感器产品介绍,井盖传感器推荐

智能井盖传感器是一种先进的设备&#xff0c;能够提高城市管理的智能化水平。该传感器作为城市生命线建设的核心组成部分&#xff0c;为智慧城市的正常建设提供了有力的保障&#xff0c;能够提高城市管理的智能化水平。这种设备通过高度灵敏的传感器网络&#xff0c;实时监测井…

智能优化算法应用:基于野马算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于野马算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于野马算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.野马算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

通过Powershell远程控制windows服务器

1、被测服务器5985、5986端口开启&#xff0c;在网络设置中&#xff0c;点击“更改连接属性”。 2、网络配置文件中选择“专用”。 3、以管理员权限运行Powershell&#xff0c; 4.通过powershell命令在本地电脑上添加远端信任主机 winrm set winrm/config/client {TrustedHos…