输出轨迹视频文件
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 存储了关节空间插值后的机器人关节角位姿,变量 qd 和 qdd 分别存储了关节角的速度和加速度。
在每一次循环中,使用 fkine 函数计算机器人末端执行器的位姿,并将得到的位姿数据存储在 T 变量中。
由于 T 是一个机器人位姿矩阵,包含了机器人末端执行器的位置和姿态信息,因此使用 T.T 将其转换为一个 4x4 的矩阵 nT
nT(1:3,4,:) 存储了机器人末端执行器的轨迹
然后使用 plot3 函数将机器人末端执行器的轨迹绘制在三维坐标系中。
使用 plot 函数将机器人的关节角位姿绘制在一个机器人模型上,
使用 view 函数设置视角,将绘制结果实时显示在屏幕上。
同时,使用 getframe 函数捕获当前图形窗口的画面,并将它转换成一个图像。然后,使用 rgb2ind 函数将图像转换成 GIF 动画需要的格式,并使用 imwrite 函数将这个图像加入到 GIF 动画中。
最后,这个循环会执行 50 次,每一次都会生成一个新的图像,并将其添加到 GIF 动画中。文章来源:https://www.toymoban.com/news/detail-717271.html
最终生成的 GIF 动画中,每一帧都包含了机器人末端执行器的轨迹以及机器人的运动状态。文章来源地址https://www.toymoban.com/news/detail-717271.html
读取视频文件输出为动图
记录每次程序运行的时间
在命令行创建结构体
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
到了这里,关于【MATLAB】将机械臂运动轨迹输出为avi视频或是gif动图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!