2
$\begingroup$

I have seen this example ( http://in.mathworks.com/matlabcentral/fileexchange/14932-3d-puma-robot-demo/content/puma3d.m) in file exchange and want to do similar thing with 4 dof rootic arm. I follow below steps. 1. Create a very simple 4 dof roots links using Solid Works and convert it into .stl file (ASCII) by using cad2matdemo.m file and store all data manually. 2. Alter the code according to my requirements. But I'm unable to create 3d model in Matlab GUI. My code is given below.

function rob3d
    loaddata
    InitHome
        function InitHome
            % Use forward kinematics to place the robot in a specified
            % configuration.
            % Figure setup data, create a new figure for the GUI
            set(0,'Units','pixels')
            dim = get(0,'ScreenSize');
            % fig_1 = figure('doublebuffer','on','Position',[0,35,dim(3)-200,dim(4)-110],...
            % 'MenuBar','none','Name',' 3D Puma Robot Graphical Demo',...
            % 'NumberTitle','off','CloseRequestFcn',@del_app);
            fig_1 = figure('doublebuffer','on','Position',[0,35,dim(3)-200,dim(4)-110],...
                'MenuBar','figure','Name',' 3D Puma Robot Graphical Demo',...
                'NumberTitle','off');
            hold on;
            %light('Position',[-1 0 0]);
            light                               % add a default light
            daspect([1 1 1])                    % Setting the aspect ratio
            view(135,25)
            xlabel('X'),ylabel('Y'),zlabel('Z');
            title('Robot');
            axis([-1000 1000 -1000 1000 -1000 1000]);
            plot3([-1500,1500],[-1500,-1500],[-1120,-1120],'k')
            plot3([-1500,-1500],[-1500,1500],[-1120,-1120],'k')
            plot3([-1500,-1500],[-1500,-1500],[-1120,1500],'k')
            plot3([-1500,-1500],[1500,1500],[-1120,1500],'k')
            plot3([-1500,1500],[-1500,-1500],[1500,1500],'k')
            plot3([-1500,-1500],[-1500,1500],[1500,1500],'k')
            s1 = getappdata(0,'Link1_data');
            s2 = getappdata(0,'Link2_data');
            s3 = getappdata(0,'Link3_data');
            s4 = getappdata(0,'Link4_data');
            s5 = getappdata(0,'Link5_data');
            a2 = 300;
            a3 = 300;
            a4 = 300;
            d1 = 300;
            d2 = 50;
            d3 = 50;
            d4 = 50;
            %The 'home' position, for init.
            t1 = 0;
            t2 = 0;
            t3 = 0;
            t4 = 0;
            % Forward Kinematics
            % tmat(alpha, a, d, theta)
            T_01 = tmat(90, 0, d1, t1);
            T_12 = tmat(0, a2, d2, t2);
            T_23 = tmat(0, a3, d3, t3);
            T_34 = tmat(0, a4, d4, t4);
            % Each link fram to base frame transformation
            T_02 = T_01*T_12;
            T_03 = T_02*T_23;
            T_04 = T_03*T_34;
            % Actual vertex data of robot links
            Link1 = s1.V1;
            Link2 = (T_01*s2.V2')';
            Link3 = (T_02*s3.V3')';
            Link4 = (T_03*s4.V4')';
            Link5 = (T_04*s5.V5')';
            % points are no fun to watch, make it look 3d.
            L1 = patch('faces', s1.F1, 'vertices' ,Link1(:,1:3));
            L2 = patch('faces', s2.F2, 'vertices' ,Link2(:,1:3));
            L3 = patch('faces', s3.F3, 'vertices' ,Link3(:,1:3));
            L4 = patch('faces', s4.F4, 'vertices' ,Link4(:,1:3));
            L5 = patch('faces', s5.F5, 'vertices' ,Link5(:,1:3));
            Tr = plot3(0,0,0,'b.'); % holder for trail paths
            setappdata(0,'patch_h',[L1,L2,L3,L4,L5,Tr]);
            %
            set(L1, 'facec', [0.717,0.116,0.123]);
            set(L1, 'EdgeColor','none');
            set(L2, 'facec', [0.216,1,.583]);
            set(L2, 'EdgeColor','none');
            set(L3, 'facec', [0.306,0.733,1]);
            set(L3, 'EdgeColor','none');
            set(L4, 'facec', [1,0.542,0.493]);
            set(L4, 'EdgeColor','none');
            set(L5, 'facec', [0.216,1,.583]);
            set(L5, 'EdgeColor','none');
            %
            setappdata(0,'ThetaOld',[0,0,0,0]);
            %
        end
        function T = tmat(alpha, a, d, theta)
            % tmat(alpha, a, d, theta) (T-Matrix used in Robotics)
            % The homogeneous transformation called the "T-MATRIX"
            % as used in the Kinematic Equations for robotic type
            % systems (or equivalent).
            %
            % This is equation 3.6 in Craig's "Introduction to Robotics."
            % alpha, a, d, theta are the Denavit-Hartenberg parameters.
            %
            % (NOTE: ALL ANGLES MUST BE IN DEGREES.)
            %
            alpha = alpha*pi/180;    %Note: alpha is in radians.
            theta = theta*pi/180;    %Note: theta is in radians.
            c = cos(theta);
            s = sin(theta);
            ca = cos(alpha);
            sa = sin(alpha);
            T = [c -s*ca s*sa a*c; s c*ca -c*sa a*s; 0 sa ca d; 0 0 0 1];
        end
        function del_app(varargin)
            delete(fig_1);
        end
        function loaddata
            % Loads all the link data from file linksdata.mat.
            % This data comes from a Pro/E 3D CAD model and was made with cad2matdemo.m
            % from the file exchange.  All link data manually stored in linksdata.mat
            [linkdata1]=load('linksdata.mat','s1','s2','s3','s4','s5');
            %Place the robot link 'data' in a storage area
            setappdata(0,'Link1_data',linkdata1.s1);
            setappdata(0,'Link2_data',linkdata1.s2);
            setappdata(0,'Link3_data',linkdata1.s3);
            setappdata(0,'Link4_data',linkdata1.s4);
            setappdata(0,'Link5_data',linkdata1.s5);
        end
    end

Below figure shows desired and actual comes out model.

enter image description here

All others thing, which may be useful (like linksdata file, sw model etc.) I shared on dropbox. Anybody can accesss from there. Dropox link: https://www.dropbox.com/sh/llwa0chsjuc1iju/AACrOTqCRBmDShGgJKpEVAlOa?dl=0

I want to know to connect two components in 3d model in Matla gui. Any study about this will be very helpful. Thanks.

$\endgroup$
  • $\begingroup$ He is just transforming the links using transformation matrices. I think there might be a problem with your transformation matrices. Use D-H to find transformation matrices for each link. $\endgroup$ – the_parzival Mar 29 '17 at 9:38
  • $\begingroup$ Thanks for reply @the_parzival. I solved inverse kinematics and forward kinematics using same DH parameters as I used in above case. So, I think my DH parameters are correct. Can you please suggest me what should be DH parameters acc. to you. It will help me a lot. By watching above image (desired pose) you can drive DH parameters. All are revolute joints. Thanks. $\endgroup$ – Naseeb Gill Mar 29 '17 at 10:23
1
$\begingroup$

STL Files have an internal coordinate system relative to which the vertices of the mesh are expressed. You are transforming these vertices with the transformation matrix that is correct, however only in the case when the origin coordinate system of the STL file (the coordinate system relative to which the vertice coordinates are expressed correspond to the DH coordinate system attached to the linkage.

Make sure to define a coordinate system in SolidWorks which has the same origin point and orientation relative to the linkage as the Dh coordinate system has. In other words, orient the z axis towards the motion axis, etc. After this, when you export the STL file, make sure to select this coordinate system as the origin. Furthermore, make sure not to select the translate all vertices to positive option. (SolidWorks offers both these option and AFAIK the default options are not the required ones.)

$\endgroup$
  • $\begingroup$ I believe this is the correct answer. Constraining CAD models to the drafting origin is part of "best practices" for general CAD development (in general, your parts should always be fully constrained; assemblies should be fully constrained unless you intend for there to be motion). As 50k4 mentions, you need to be sure that part is oriented in CAD the same as you have it imagined, which may mean that you need separate part files for the column and arms even though they're dimensional equivalents (or you need to pre-transform the column). Be sure also that your units are the same in both. $\endgroup$ – Chuck May 16 at 13:15

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.