Search
moon
sun

How to Create Animation Videos in MATLAB: Robotic Arm

Category
Tools & Utils
Kewords
MATLAB
Animation
Video
Robotic Arm
3 more properties
Table of Contents

1. Importance of Visualization

1.1 In Your Journal Paper and Presentation …

•
Fancy visualization of research products can be as important as attractive plating in food.
•
Even if the content is the same, how you organize and present the material can significantly influence your audience’s interest level.

1.2 Common Features of the Prestigious Journals’ Paper

•
Papers published in prestigious journals like Science and Nature feature at least one fancy representative image.
•
In fact, using fancy images can have the effect of making your research product look more high-quality.

2. How to Create Animation Videos in MATLAB

2.1 Visualization of Kinematics Results: 4-Link Robotic Arm

•
Basic Simulation Parameters
◦
Basic initialization procedures
◦
I usually keep all my MATLAB sub-functions in the “MATLAB_Function” folder and use “addpathh(genpath(’MATLAB_Function\’))” to add the folder path.
◦
By creating the time variable “t” using “Video Frame” and “Total Simulation Time”, we can easily determine the length of the final animation video.
%% Robot Arm Simulation % H.-H. Yang (2024.08.01) %% Initialization close all; fclose all; clear all; clc; rng('default'); format long; addpath(genpath('MATLAB_Function\')); %% Simulation Parameters videoFrame = 30; % [fps] Video Frame simTime = 10; % [sec] Total Simulation Time t = linspace(0, 10, simTime*videoFrame + 1); % [sec] t_num = length(t);
MATLAB
복사
%% Robot Arm Parameters % Link Length link_num = 4; L = [500, 1000, 500, 250]; % [mm] linkColor = {[0.1, 0.1, 0.1], [0.4, 0.4, 0.92], [0.92, 0.4, 0.4], [0.2, 0.84, 0.2]};
MATLAB
복사
•
A simple robotic arm with 4-DOF: spatial working space
•
After the kinematic or dnamic analysis, we can obtain the kinematics data of each link over time.
◦
Follwing joint kinematics is assumed as the obtained kinematics results from the analysis.
%% Arbitrarily Assumed Results of the Robotic Arms' Kinematics % Link Joint Angle theta1 = deg2rad(60.*sin(2.*pi.*(1/t(end)).*t)); % [rad] del_theta1 = [0, diff(theta1)]; % [rad/s] theta2 = deg2rad(50.*sin(2.*pi.*(0.5/t(end)).*t)); % [rad] del_theta2 = [0, diff(theta2)]; % [rad/s] theta3 = deg2rad(60.*sin(2.*pi.*(0.75/t(end)).*t)); % [rad] del_theta3 = [0, diff(theta3)]; % [rad/s] theta4 = deg2rad(-90.*sin(2.*pi.*(0.75/t(end)).*t)); % [rad] del_theta4 = [0, diff(theta4)]; % [rad/s] del_theta = [del_theta1; del_theta2; del_theta3; del_theta4]; % [rad] % Plot Kinematics [Fig, Axes] = PlotSetting(1000, 800); xlabel('Time [ sec ]', 'FontWeight', 'bold'); ylabel('\theta [ deg ]', 'FontWeight', 'bold'); plot(t, rad2deg(theta1), '-', 'LineWidth', 3, 'Color', linkColor{1}); plot(t, rad2deg(theta2), '-', 'LineWidth', 3, 'Color', linkColor{2}); plot(t, rad2deg(theta3), '-', 'LineWidth', 3, 'Color', linkColor{3}); plot(t, rad2deg(theta4), '-', 'LineWidth', 3, 'Color', linkColor{4}); legend({'Link #1', 'Link #2', 'Link #3', 'Link #4'}, ... 'FontSize', 15, 'Location', 'none' , 'Orientation', 'horizontal', 'NumColumns', 4); axis([0, 10, -90, 90]); Axes.XTick = 0:1:10; Axes.YTick = -90:30:90;
MATLAB
복사

2.2 Kinematic Animation Using “Line Geometry”

•
Line Geometry
◦
A two-point line geometry is particularly effective for visualizing simple conceptual models.
◦
Useful to show the operating process of a link mechanism
◦
The simplest way / Not suitable for perspective view
◦
Examples: Bi-Stable Gripper, Flapping Mechanism, Robotic Arm …
•
Create Animation Video
%% Kinematic Animation: Line % Plot Setting [Fig1, ~] = PlotSetting(1000, 800); axis equal; axis([-2500, 2500, -2500, 2500, -1000, 3000]); xlabel('X [ mm ]', 'FontWeight', 'bold'); ylabel('Y [ mm ]', 'FontWeight', 'bold'); zlabel('Z [ mm ]', 'FontWeight', 'bold'); view([20, 15]); % Link Entity (Initial Position) linkLine{1}.geo = line([0, 0], [0, 0], [0, L(1)], 'LineWidth', 10, 'Color', linkColor{1}, 'Marker', 'o', 'MarkerSize', 10, 'MarkerFaceColor', [0.8, 0.8, 0.2]); linkLine{2}.geo = line([0, L(2)], [0, 0], [L(1), L(1)], 'LineWidth', 5, 'Color', linkColor{2}, 'Marker', 'o', 'MarkerSize', 10, 'MarkerFaceColor', [0.8, 0.8, 0.2]); linkLine{3}.geo = line([L(2), sum(L(2:3))], [0, 0], [L(1), L(1)], 'LineWidth', 5, 'Color', linkColor{3}, 'Marker', 'o', 'MarkerSize', 10, 'MarkerFaceColor', [0.8, 0.8, 0.2]); linkLine{4}.geo = line([sum(L(2:3)), sum(L(2:4))], [0, 0], [L(1), L(1)], 'LineWidth', 5, 'Color', linkColor{4}, 'Marker', 'o', 'MarkerSize', 10, 'MarkerFaceColor', [0.8, 0.8, 0.2]); % Animation Setting video = VideoWriter('01_MATLAB\MATLAB_Line_Animation.mp4', 'MPEG-4'); video.FrameRate = videoFrame; video.Quality = 100; % Position Analysis & Make Animation Video open(video); for t_idx = 1:t_num % Link 1 Rotation for link_idx = 1:link_num rotate(linkLine{link_idx}.geo, [0, 0, 1], rad2deg(del_theta1(t_idx)), ... [0, 0, 0]); end linkLine{1}.rotAngX(t_idx) = 0.0; linkLine{1}.rotAngY(t_idx) = theta1(t_idx); linkLine{1}.rotAngZ(t_idx) = 0.0; % Link 2 Rotation rotMat2 = rotvec2mat3d(theta2(t_idx)*[0 1, 0]); for link_idx = 2:link_num rotate(linkLine{link_idx}.geo, [sin(theta1(t_idx)), -cos(theta1(t_idx)), 0], rad2deg(del_theta2(t_idx)), ... [linkLine{2}.geo.XData(1), linkLine{2}.geo.YData(1), linkLine{2}.geo.ZData(1)]); end linkLine{2}.rotAngX(t_idx) = theta2(t_idx); linkLine{2}.rotAngY(t_idx) = 0.0; linkLine{2}.rotAngZ(t_idx) = theta1(t_idx); % Link 3 Rotation for link_idx = 3:link_num rotate(linkLine{link_idx}.geo, [sin(theta1(t_idx)), -cos(theta1(t_idx)), 0], rad2deg(del_theta3(t_idx)), ... [linkLine{3}.geo.XData(1), linkLine{3}.geo.YData(1), linkLine{3}.geo.ZData(1)]); end linkLine{3}.rotAngX(t_idx) = theta2(t_idx) + theta3(t_idx); linkLine{3}.rotAngY(t_idx) = 0.0; linkLine{3}.rotAngZ(t_idx) = theta1(t_idx); % Link 4 Rotation rotate(linkLine{link_idx}.geo, [sin(theta1(t_idx)), -cos(theta1(t_idx)), 0], rad2deg(del_theta4(t_idx)), ... [linkLine{4}.geo.XData(1), linkLine{4}.geo.YData(1), linkLine{4}.geo.ZData(1)]); linkLine{4}.rotAngX(t_idx) = theta2(t_idx) + theta3(t_idx) + theta4(t_idx); linkLine{4}.rotAngY(t_idx) = 0.0; linkLine{4}.rotAngZ(t_idx) = theta1(t_idx); % Position of the Links for link_idx = 1:link_num linkLine{link_idx}.x(:,t_idx) = linkLine{link_idx}.geo.XData; linkLine{link_idx}.y(:,t_idx) = linkLine{link_idx}.geo.YData; linkLine{link_idx}.z(:,t_idx) = linkLine{link_idx}.geo.ZData; end % Position Vectors for link_idx = 1:link_num linkLine{link_idx}.r(:,t_idx) = [linkLine{link_idx}.geo.XData(2); linkLine{link_idx}.geo.YData(2); linkLine{link_idx}.geo.ZData(2)] ... - [linkLine{link_idx}.geo.XData(1); linkLine{link_idx}.geo.YData(1); linkLine{link_idx}.geo.ZData(1)]; end % Write Video drawnow; frame = getframe(Fig1); writeVideo(video, frame); end close(video);
MATLAB
복사
•
Results
◦
We can roughly understand the motion of the robotic arm.
◦
It shows a lack of perspective in 3D animation due to the limitation of MATLAB line geometry.

2.3 Kinematic Animation Using “Simple Patch Geometry”

•
Simple Patch Geometry
◦
The patch geometry is typically used to visualize a general surface structure by defining the faces and vertices of the patch.
◦
The best way to visualize the conceptual model
◦
A little tricky pre-processing to create patch geometry
◦
Examples: Wake Pattern, Origami Structure, Deployable Structure …
•
Simple Patch of 4-Link Robotic Arm
◦
Assume all link shapes are rectangular
function [Patch_Faces, Patch_Vertices] = ImportRobotArmPatchData % Link 1 w = 200; l = 500; offset = [0, 0, 0]; Patch_Faces{1} = [1, 2, 3, 4; 1, 5, 6, 2; 2, 6, 7, 3; 3, 7, 8, 4; 4, 8, 5, 1; 5, 6, 7, 8]; Patch_Vertices{1} = [-0.5*w, -0.5*w, 0; -0.5*w, 0.5*w, 0; 0.5*w, 0.5*w, 0; 0.5*w, -0.5*w, 0; ... -0.5*w, -0.5*w, l; -0.5*w, 0.5*w, l; 0.5*w, 0.5*w, l; 0.5*w, -0.5*w, l;]; Patch_Vertices{1} = Patch_Vertices{1} + repmat(offset, 8, 1); % Link 2 w = 100; l = 1000; offset = [0, 0, 500]; Patch_Faces{2} = [1, 2, 3, 4; 1, 5, 6, 2; 2, 6, 7, 3; 3, 7, 8, 4; 4, 8, 5, 1; 5, 6, 7, 8]; Patch_Vertices{2} = [0, -0.5*w, -0.5*w; 0, 0.5*w, -0.5*w; l, 0.5*w, -0.5*w; l, -0.5*w, -0.5*w; ... 0, -0.5*w, 0.5*w; 0, 0.5*w, 0.5*w; l, 0.5*w, 0.5*w; l, -0.5*w, 0.5*w]; Patch_Vertices{2} = Patch_Vertices{2} + repmat(offset, 8, 1); % Link 3 w = 150; l = 500; offset = [1000, 0, 500]; Patch_Faces{3} = [1, 2, 3, 4; 1, 5, 6, 2; 2, 6, 7, 3; 3, 7, 8, 4; 4, 8, 5, 1; 5, 6, 7, 8]; Patch_Vertices{3} = [0, -0.5*w, -0.5*w; 0, 0.5*w, -0.5*w; l, 0.5*w, -0.5*w; l, -0.5*w, -0.5*w; ... 0, -0.5*w, 0.5*w; 0, 0.5*w, 0.5*w; l, 0.5*w, 0.5*w; l, -0.5*w, 0.5*w]; Patch_Vertices{3} = Patch_Vertices{3} + repmat(offset, 8, 1); % Link 4 w = 200; l = 250; offset = [1500, 0, 500]; Patch_Faces{4} = [1, 2, 3, 4; 1, 5, 6, 2; 2, 6, 7, 3; 3, 7, 8, 4; 4, 8, 5, 1; 5, 6, 7, 8]; Patch_Vertices{4} = [0, -0.5*w, -0.5*w; 0, 0.5*w, -0.5*w; l, 0.5*w, -0.5*w; l, -0.5*w, -0.5*w; ... 0, -0.5*w, 0.5*w; 0, 0.5*w, 0.5*w; l, 0.5*w, 0.5*w; l, -0.5*w, 0.5*w]; Patch_Vertices{4} = Patch_Vertices{4} + repmat(offset, 8, 1);
MATLAB
복사
•
Create Animation Video
%% Kinematicc Animation: Simple Patch % Robotic Arm's Patch Data (User Defined Simple Patch Data) [Patch_Faces, Patch_Vertices] = ImportRobotArmPatchData; % Plot Setting [Fig2, Axes2] = PlotSetting(1000, 800); axis equal; axis([-2500, 2500, -2500, 2500, -1000, 3000]); xlabel('X [ mm ]', 'FontWeight', 'bold'); ylabel('Y [ mm ]', 'FontWeight', 'bold'); zlabel('Z [ mm ]', 'FontWeight', 'bold'); view([20, 15]); % link Entity (Initial Position): Low-Quality linkPatch = cell(1,link_num); for link_idx = 1:link_num linkPatch{link_idx}.geo = patch('Faces', Patch_Faces{link_idx}, 'Vertices', Patch_Vertices{link_idx}, ... 'FaceColor', linkColor{link_idx}, 'EdgeColor', [0, 0, 0], 'FaceAlpha', 1.0); end % Animation Setting video = VideoWriter('01_MATLAB\MATLAB_Patch_Animation.mp4', 'MPEG-4'); video.FrameRate = videoFrame; % Position Analysis & Make Animation Video open(video); for t_idx = 1:t_num % Link 1 Rotation for link_idx = 1:link_num rotate(linkPatch{link_idx}.geo, [0, 0, 1], rad2deg(del_theta1(t_idx)), ... [linkLine{1}.x(1,t_idx), linkLine{1}.y(1,t_idx), linkLine{1}.z(1,t_idx)]); end % Link 2 Rotation for link_idx = 2:link_num rotate(linkPatch{link_idx}.geo, [sin(theta1(t_idx)), -cos(theta1(t_idx)), 0], rad2deg(del_theta2(t_idx)), ... [linkLine{2}.x(1,t_idx), linkLine{2}.y(1,t_idx), linkLine{2}.z(1,t_idx)]); end % Link 3 Rotation for link_idx = 3:link_num rotate(linkPatch{link_idx}.geo, [sin(theta1(t_idx)), -cos(theta1(t_idx)), 0], rad2deg(del_theta3(t_idx)), ... [linkLine{3}.x(1,t_idx), linkLine{3}.y(1,t_idx), linkLine{3}.z(1,t_idx)]); end % Link 4 Rotation rotate(linkPatch{link_idx}.geo, [sin(theta1(t_idx)), -cos(theta1(t_idx)), 0], rad2deg(del_theta4(t_idx)), ... [linkLine{4}.x(1,t_idx), linkLine{4}.y(1,t_idx), linkLine{4}.z(1,t_idx)]); % Write Video drawnow; frame = getframe(Fig2); writeVideo(video, frame); end close(video);
MATLAB
복사
•
Results
◦
By using the patch geometry, we can create a more intuitive animation video for the robotic arm.

2.4 Kinematic Animation Using “CAD Patch Geometry”

•
CAD Patch Geometry
◦
We can import the CAD model geometry into MATLAB as patch data if you have a CAD model.
◦
The animation video with CAD patch geometry give you a complete understadning of the model’s behavior.
•
How to Import the CAD Model
◦
The “importGeometry“ function is used to get the CAD model geometry data, and the “scale” function is used to match the unit scale properly.
◦
The “pdegplot” function plots the CAD geometry.
◦
The geometry data, such as faces, vertices, and lines, are stored in other variables to utilize for the animation video.
function [CADGeo_Faces, CADGeo_Vertices, CADGeo_Lines] = ImportRobotArmCAD(link_num) % Pre-Allocation CADGeo_Faces = cell(1,link_num); CADGeo_Vertices = cell(1,link_num); CADGeo_Lines = cell(1,link_num); % CAD Model (STEP File) [Fig, ~] = PlotSetting(100, 100); for link_idx = 1:link_num CADModelPath = ['Input\Link', num2str(link_idx), '.stp']; CADModel = importGeometry(CADModelPath); % [m] CADModel = scale(CADModel, [1000, 1000, 1000]); % [mm] CADGeo = pdegplot(CADModel); CADGeo_Faces{link_idx} = CADGeo(1).Faces; CADGeo_Vertices{link_idx} = CADGeo(1).Vertices; CADGeo_Lines{link_idx}.XData = CADGeo(2).XData; CADGeo_Lines{link_idx}.YData = CADGeo(2).YData; CADGeo_Lines{link_idx}.ZData = CADGeo(2).ZData; end close(Fig);
MATLAB
복사
•
Create Animation Video
%% Kinematic Animation: CAD Patch Geometry % Robotic Arm's Patch Data (CAD Model Data) [CADGeo_Faces, CADGeo_Vertices, CADGeo_Lines] = ImportRobotArmCAD(link_num); % Plot Setting 1 [Fig3, Axes3] = PlotSetting(1000, 800); axis equal; axis([-2500, 2500, -2500, 2500, -1000, 3000]); xlabel('X [ mm ]', 'FontWeight', 'bold'); ylabel('Y [ mm ]', 'FontWeight', 'bold'); zlabel('Z [ mm ]', 'FontWeight', 'bold'); view([20, 15]); % link Entity (Initial Position): Low-Quality linkCAD1 = cell(1,link_num); for link_idx = 1:link_num linkCAD1{link_idx}.geo = patch('Faces', CADGeo_Faces{link_idx}, 'Vertices', CADGeo_Vertices{link_idx}, ... 'FaceColor', linkColor{link_idx}, 'EdgeColor', 'none', 'FaceAlpha', 1.0); linkCAD1{link_idx}.line = line(CADGeo_Lines{link_idx}.XData, CADGeo_Lines{link_idx}.YData, CADGeo_Lines{link_idx}.ZData, ... 'LineWidth', 0.1, 'Color', [0, 0, 0]); end % Animation Setting video = VideoWriter('01_MATLAB\MATLAB_CAD_Animation_Default.mp4', 'MPEG-4'); video.FrameRate = videoFrame; % Position Analysis & Make Animation Video open(video); for t_idx = 1:t_num % Link 1 Rotation for link_idx = 1:link_num rotate(linkCAD1{link_idx}.geo, [0, 0, 1], rad2deg(del_theta1(t_idx)), ... [linkLine{1}.x(1,t_idx), linkLine{1}.y(1,t_idx), linkLine{1}.z(1,t_idx)]); rotate(linkCAD1{link_idx}.line, [0, 0, 1], rad2deg(del_theta1(t_idx)), ... [linkLine{1}.x(1,t_idx), linkLine{1}.y(1,t_idx), linkLine{1}.z(1,t_idx)]); end % Link 2 Rotation for link_idx = 2:link_num rotate(linkCAD1{link_idx}.geo, [sin(theta1(t_idx)), -cos(theta1(t_idx)), 0], rad2deg(del_theta2(t_idx)), ... [linkLine{2}.x(1,t_idx), linkLine{2}.y(1,t_idx), linkLine{2}.z(1,t_idx)]); rotate(linkCAD1{link_idx}.line, [sin(theta1(t_idx)), -cos(theta1(t_idx)), 0], rad2deg(del_theta2(t_idx)), ... [linkLine{2}.x(1,t_idx), linkLine{2}.y(1,t_idx), linkLine{2}.z(1,t_idx)]); end % Link 3 Rotation for link_idx = 3:link_num rotate(linkCAD1{link_idx}.geo, [sin(theta1(t_idx)), -cos(theta1(t_idx)), 0], rad2deg(del_theta3(t_idx)), ... [linkLine{3}.x(1,t_idx), linkLine{3}.y(1,t_idx), linkLine{3}.z(1,t_idx)]); rotate(linkCAD1{link_idx}.line, [sin(theta1(t_idx)), -cos(theta1(t_idx)), 0], rad2deg(del_theta3(t_idx)), ... [linkLine{3}.x(1,t_idx), linkLine{3}.y(1,t_idx), linkLine{3}.z(1,t_idx)]); end % Link 4 Rotation rotate(linkCAD1{link_idx}.geo, [sin(theta1(t_idx)), -cos(theta1(t_idx)), 0], rad2deg(del_theta4(t_idx)), ... [linkLine{4}.x(1,t_idx), linkLine{4}.y(1,t_idx), linkLine{4}.z(1,t_idx)]); rotate(linkCAD1{link_idx}.line, [sin(theta1(t_idx)), -cos(theta1(t_idx)), 0], rad2deg(del_theta4(t_idx)), ... [linkLine{4}.x(1,t_idx), linkLine{4}.y(1,t_idx), linkLine{4}.z(1,t_idx)]); % Write Video drawnow; frame = getframe(Fig3); writeVideo(video, frame); end close(video); % Plot Setting 2 [Fig4, Axes4] = PlotSetting(1000, 800); axis equal; axis([-2500, 2500, -2500, 2500, -1000, 3000]); xlabel('X [ mm ]', 'FontWeight', 'bold'); ylabel('Y [ mm ]', 'FontWeight', 'bold'); zlabel('Z [ mm ]', 'FontWeight', 'bold'); % Light Option light('Style', 'local', 'Position', [0, 0, 5000]); light('Style', 'local', 'Position', [5000, -5000, 5000]); % View Option view([80, 25]); view_t1_idxSet = 1:round(0.5*t_num); view_t1_num = length(view_t1_idxSet); view_t2_idxSet = round(0.5*t_num):t_num; view_t2_num = length(view_t2_idxSet); view_az(view_t1_idxSet) = linspace(80, 60, view_t1_num); view_az(view_t2_idxSet) = linspace(60, 20, view_t2_num); view_el(view_t1_idxSet) = linspace(25, 25, view_t1_num); view_el(view_t2_idxSet) = linspace(25, 15, view_t2_num); % Axes Tick Option axesTick = -5000:1000:5000; Axes4.XTick = axesTick; Axes4.YTick = axesTick; Axes4.ZTick = axesTick; Axes4.XTickLabelRotation = 0; Axes4.YTickLabelRotation = 0; Axes4.ZTickLabelRotation = 0; Axes4.TickDir = 'in'; Axes4.TickLength = [0.01, 0.01]; % Ground ground_Faces = [1, 2, 3, 4; 1, 5, 6, 2; 2, 6, 7, 3; 3, 7, 8, 4; 4, 8, 5, 1; 5, 6, 7, 8]; ground_Vertices = [-1000, -1000, 0; -1000, 1000, 0; 1000, 1000, 0; 1000, -1000, 0; ... -1000, -1000, -1000; -1000, 1000, -1000; 1000, 1000, -1000; 1000, -1000, -1000;]; ground = patch('Faces', ground_Faces, 'Vertices', ground_Vertices, ... 'FaceColor', [0.25, 0.25, 0.25], 'EdgeColor', [0.0, 0.0, 0.0], 'FaceAlpha', 0.9); % link Entity (Initial Position): High-Quality linkCAD2 = cell(1,link_num); for link_idx = 1:link_num linkCAD2{link_idx}.geo = patch('Faces', CADGeo_Faces{link_idx}, 'Vertices', CADGeo_Vertices{link_idx}, ... 'FaceColor', linkColor{link_idx}, 'EdgeColor', 'none', 'FaceAlpha', 1.0); linkCAD2{link_idx}.geo.FaceLighting = 'gouraud'; % flat / gouraud / none linkCAD2{link_idx}.geo.BackFaceLighting = 'reverselit'; % reverselit / unlit / lit linkCAD2{link_idx}.geo.AmbientStrength = 0.4; % 0.3 [0, 1] linkCAD2{link_idx}.geo.DiffuseStrength = 0.8; % 0.6 [0, 1] linkCAD2{link_idx}.geo.SpecularStrength = 0.8; % 0.9 [0, 1] linkCAD2{link_idx}.geo.SpecularExponent = 20; % 10 [5, 20] linkCAD2{link_idx}.line = line(CADGeo_Lines{link_idx}.XData, CADGeo_Lines{link_idx}.YData, CADGeo_Lines{link_idx}.ZData, ... 'LineWidth', 0.1, 'Color', [0, 0, 0]); end % Animation Setting video = VideoWriter('01_MATLAB\MATLAB_CAD_Animation_Rev.mp4', 'MPEG-4'); video.FrameRate = videoFrame; video.Quality = 100; % Position Analysis & Make Animation Video open(video); for t_idx = 1:t_num % Link 1 Rotation for link_idx = 1:link_num rotate(linkCAD2{link_idx}.geo, [0, 0, 1], rad2deg(del_theta1(t_idx)), ... [linkLine{1}.x(1,t_idx), linkLine{1}.y(1,t_idx), linkLine{1}.z(1,t_idx)]); rotate(linkCAD2{link_idx}.line, [0, 0, 1], rad2deg(del_theta1(t_idx)), ... [linkLine{1}.x(1,t_idx), linkLine{1}.y(1,t_idx), linkLine{1}.z(1,t_idx)]); end % Link 2 Rotation for link_idx = 2:link_num rotate(linkCAD2{link_idx}.geo, [sin(theta1(t_idx)), -cos(theta1(t_idx)), 0], rad2deg(del_theta2(t_idx)), ... [linkLine{2}.x(1,t_idx), linkLine{2}.y(1,t_idx), linkLine{2}.z(1,t_idx)]); rotate(linkCAD2{link_idx}.line, [sin(theta1(t_idx)), -cos(theta1(t_idx)), 0], rad2deg(del_theta2(t_idx)), ... [linkLine{2}.x(1,t_idx), linkLine{2}.y(1,t_idx), linkLine{2}.z(1,t_idx)]); end % Link 3 Rotation for link_idx = 3:link_num rotate(linkCAD2{link_idx}.geo, [sin(theta1(t_idx)), -cos(theta1(t_idx)), 0], rad2deg(del_theta3(t_idx)), ... [linkLine{3}.x(1,t_idx), linkLine{3}.y(1,t_idx), linkLine{3}.z(1,t_idx)]); rotate(linkCAD2{link_idx}.line, [sin(theta1(t_idx)), -cos(theta1(t_idx)), 0], rad2deg(del_theta3(t_idx)), ... [linkLine{3}.x(1,t_idx), linkLine{3}.y(1,t_idx), linkLine{3}.z(1,t_idx)]); end % Link 4 Rotation rotate(linkCAD2{link_idx}.geo, [sin(theta1(t_idx)), -cos(theta1(t_idx)), 0], rad2deg(del_theta4(t_idx)), ... [linkLine{4}.x(1,t_idx), linkLine{4}.y(1,t_idx), linkLine{4}.z(1,t_idx)]); rotate(linkCAD2{link_idx}.line, [sin(theta1(t_idx)), -cos(theta1(t_idx)), 0], rad2deg(del_theta4(t_idx)), ... [linkLine{4}.x(1,t_idx), linkLine{4}.y(1,t_idx), linkLine{4}.z(1,t_idx)]); % Change View view(view_az(t_idx), view_el(t_idx)); % Write Video drawnow; frame = getframe(Fig4); writeVideo(video, frame); end close(video);
MATLAB
복사
•
Results
◦
By using the CAD patch geometry, we can clearly understand the robotic arm’s motion during the simulation time.
◦
In addition, we can also create a more dynamic animation by adjusting the light and view control options.
Whole MATLAB scripts are attached in “Robotic_Arm_MATLAB_Animation.zip”.
Robotic_Arm_MATLAB_Animation.zip
255.0KB

3. Other Visualization Tools

3.1 Blender

•
Blender Animation Using Python Script & Prescribed Kinematic Input Data
◦
We can automate all tasks in Blender via Python script: importing CAD model, applying materials …
◦
We can apply the kinematics data obtained from MATLAB to the importing CAD models by writing proper input files.

3.2 KeyShot

•
KeyShot Animation for Promotion Video
◦
We can create a fancy animation video using KeyShot
If you’d like to learn more about how to use the other visualization tools (Blender, KeyShot, Unreal Engine), feel free to contact me!