【MATLAB】将机械臂运动轨迹输出为avi视频或是gif动图

输出轨迹视频文件

figure
%将轨迹创建生成视频
out=VideoWriter('直线轨迹.avi');
out.FrameRate=10;
open(out);
robot0.plot([17,15,15,15,15,15]./180*pi)
plot3(squeeze(Tc(1,4,:)),squeeze(Tc(2,4,:)),squeeze(Tc(3,4,:)));
hold on
for K=1:50
    robot0.plot(q(K,:))%The trajectory outputs have one row per time step, and one column per axis.每一行为每个时间点的六轴角度
    F=getframe(gcf);
    writeVideo(out,F);
end

将机器人的轨迹动态展示,并将其保存为一个视频文件。

使用 VideoWriter 函数创建一个名为“直线轨迹.avi”的视频文件,并设置视频的帧率为 10 帧每秒。

使用 robot0.plot 函数绘制初始关节角度为 [17, 15, 15, 15, 15, 15] 的机器人,并使用 plot3 函数绘制机器人的轨迹

在绘制轨迹时,需要使用 squeeze 函数将机器人末端执行器的位姿矩阵 Tc 中的 x、y、z 轴轨迹提取出来,并分别作为 plot3 函数的输入参数。

然后,循环 50 次,使用 robot0.plot 函数绘制每个时间点上机器人的关节角度,并使用 getframe 函数获取当前图像的帧数据

最后,使用 writeVideo 函数将每个时间点上的图像帧写入到视频文件中。这样,就可以将机器人的轨迹动态展示,并将其保存为一个视频文件,以便后续查看和分析。

输出轨迹动图

%% gif制图原理:每次画图,只画一张,截取下来,组合成为gif。
%轨迹规划方法,根据关节角位姿进行调整
[q,qd,qdd] = jtraj(init_ang,targ_ang,step);
for n = 1:1:50   
    figure(1);
    grid on
    T=robot0.fkine(q);%根据插值,得到末端执行器位姿T
    nT=T.T;
    plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
    robot0.plot(q(n,:));
    view(15,27);%view([Azimuth,Elevation])
    drawnow; 
    % Capture the plot as an image 
    F=getframe(gcf);
    I=frame2im(F);
    [I,map]=rgb2ind(I,256);
    % Write to the GIF File 
    if n == 1
        imwrite(I,map,'五次多项式轨迹.gif','gif', 'Loopcount',inf,'DelayTime',0.2);
    else
        imwrite(I,map,'五次多项式轨迹.gif','gif','WriteMode','append','DelayTime',0.2);
    end
 end

使用关节空间插值方法生成机器人末端执行器的轨迹,并将生成的轨迹动态地绘制在三维坐标系中,同时将每一帧绘制的结果保存下来,最终生成一个 GIF 动画。

其中,变量 q 存储了关节空间插值后的机器人关节角位姿,变量 qdqdd 分别存储了关节角的速度和加速度。

在每一次循环中,使用 fkine 函数计算机器人末端执行器的位姿,并将得到的位姿数据存储在 T 变量中。

由于 T 是一个机器人位姿矩阵,包含了机器人末端执行器的位置和姿态信息,因此使用 T.T 将其转换为一个 4x4 的矩阵 nT

nT(1:3,4,:) 存储了机器人末端执行器的轨迹

然后使用 plot3 函数将机器人末端执行器的轨迹绘制在三维坐标系中。

使用 plot 函数将机器人的关节角位姿绘制在一个机器人模型上,

使用 view 函数设置视角,将绘制结果实时显示在屏幕上。

同时,使用 getframe 函数捕获当前图形窗口的画面,并将它转换成一个图像。然后,使用 rgb2ind 函数将图像转换成 GIF 动画需要的格式,并使用 imwrite 函数将这个图像加入到 GIF 动画中。

最后,这个循环会执行 50 次,每一次都会生成一个新的图像,并将其添加到 GIF 动画中。

最终生成的 GIF 动画中,每一帧都包含了机器人末端执行器的轨迹以及机器人的运动状态

读取视频文件输出为动图

记录每次程序运行的时间

在命令行创建结构体

t_history= struct('Time', {});

运行程序文件

tic

close all
clearvars -except t_history
clc

%使用VideoReader函数读取视频文件
video = VideoReader('直线轨迹.avi');

%获取视频的帧率
frame_rate = video.FrameRate;

%每一帧的显示时间
delay_time = 1/frame_rate;

%获取视频的总帧数
num_frames = video.NumFrames;

%预分配一个与视频大小和帧数相匹配的四维数组,用于存储缩放后的帧图像
%通过预分配内存,可以避免在循环中重复分配内存的问题,提高程序的运行效率。
frames = imresize(zeros([video.Height video.Width 3 num_frames], 'uint8'),0.5);

%使用while循环遍历视频的每一帧,将每一帧转换为图像格式,并使用imresize函数将其缩放为合适的大小
i = 1;
while hasFrame(video)
   frame = readFrame(video);
   resized_frame = imresize(frame, 0.5);%将视频中的每一帧读取,并将其缩放为原图的一半大小
   frames(:,:,:,i) = resized_frame;%遍历视频的每一帧,将其缩放后存储在预分配的数组中
   i = i+1;
end

%将所有缩放后的帧保存为gif动图,其中DelayTime参数设置为每一帧的显示时间,使得动图的播放速度和视频的帧率一致。

filename = '直线规划.gif';
for i = 1:size(frames,4)
    image = frames(:,:,:,i);
    [imind,cm] = rgb2ind(image,256);
    if i == 1
        %使用imwrite函数将缩放后的帧保存为gif动图
        %DelayTime参数控制每一帧的显示时间,LoopCount参数控制动图的循环次数。
        imwrite(imind,cm,filename,'gif','LoopCount',inf,'DelayTime',delay_time);
    else
        imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',delay_time);
    end
end

t_history(end+1).Time=toc

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值