You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
199 lines
4.1 KiB
199 lines
4.1 KiB
%LINK create a new LINK object
|
|
%
|
|
% A LINK object holds all information related to a robot link such as
|
|
% kinematics of the joint, rigid-body inertial parameters, motor and
|
|
% transmission parameters.
|
|
%
|
|
% LINK
|
|
% LINK(link)
|
|
%
|
|
% Create a default link, or a clone of the passed link.
|
|
%
|
|
% A = LINK(q)
|
|
%
|
|
% Compute the link transform matrix for the link, given the joint
|
|
% variable q.
|
|
%
|
|
% LINK([alpha A theta D sigma])
|
|
% LINK(DH_ROW) create from row of legacy DH matrix
|
|
% LINK(DYN_ROW) create from row of legacy DYN matrix
|
|
%
|
|
% Any of the last 3 forms can have an optional flag argument which is 0
|
|
% for standard D&H parameters and 1 for modified D&H parameters.
|
|
% Handling the different kinematic conventions is now hidden within the LINK
|
|
% object.
|
|
%
|
|
% Conceivably all sorts of stuff could live in the LINK object such as
|
|
% graphical models of links and so on.
|
|
|
|
% MOD HISTORY
|
|
% 3/99 modify to use on a LINK object
|
|
% 6/99 fix the number of fields inthe object, v5.3 doesn't let me change them
|
|
% mod by Francisco Javier Blanco Rodriguez <jblanco@abedul.usal.es>
|
|
|
|
|
|
% Ryan Steindl based on Robotics Toolbox for MATLAB (v6 and v9)
|
|
%
|
|
% Copyright (C) 1993-2011, by Peter I. Corke
|
|
%
|
|
% This file is part of The Robotics Toolbox for MATLAB (RTB).
|
|
%
|
|
% RTB is free software: you can redistribute it and/or modify
|
|
% it under the terms of the GNU Lesser General Public License as published by
|
|
% the Free Software Foundation, either version 3 of the License, or
|
|
% (at your option) any later version.
|
|
%
|
|
% RTB is distributed in the hope that it will be useful,
|
|
% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
% GNU Lesser General Public License for more details.
|
|
%
|
|
% You should have received a copy of the GNU Leser General Public License
|
|
% along with RTB. If not, see <http://www.gnu.org/licenses/>.
|
|
%
|
|
% http://www.petercorke.com
|
|
|
|
function l = Link(dh, convention)
|
|
|
|
% legacy DH matrix
|
|
% link([theta d a alpha])
|
|
% link([theta d a alpha sigma])
|
|
% link([theta d a alpha sigma offset])
|
|
|
|
if nargin == 0,
|
|
l.theta = 0;
|
|
l.d = 0;
|
|
l.a = 0;
|
|
l.alpha = 0;
|
|
l.sigma = 0;
|
|
l.offset = 0;
|
|
l.mdh = 0;
|
|
% it's a legacy DYN matrix
|
|
l.m = [];
|
|
l.r = [];
|
|
v = [];
|
|
l.I = [];
|
|
l.Jm = [];
|
|
l.G = [];
|
|
l.B = 0;
|
|
l.Tc = [0 0];
|
|
l.qlim = [];
|
|
l = class(l, "Link");
|
|
|
|
|
|
elseif isa(dh, 'Link')
|
|
l = dh;
|
|
elseif length(dh) < 4
|
|
error('must provide params (theta d a alpha)');
|
|
elseif length(dh) <= 6
|
|
% legacy DH matrix
|
|
l.theta = dh(1);
|
|
l.d = dh(2);
|
|
l.a = dh(3);
|
|
l.alpha = dh(4);
|
|
|
|
|
|
if length(dh) >= 5,
|
|
l.sigma = dh(5);
|
|
else
|
|
l.sigma = 0;
|
|
end
|
|
if length(dh) >= 6
|
|
l.offset = dh(6);
|
|
else
|
|
l.offset = 0;
|
|
end
|
|
l.mdh = 0;
|
|
if nargin > 1
|
|
if strncmp(convention, 'mod', 3) == 1
|
|
l.mdh = 1;
|
|
elseif strncmp(convention, 'sta', 3) == 1
|
|
l.mdh = 0;
|
|
else
|
|
error('convention must be modified or standard');
|
|
end
|
|
end
|
|
|
|
% we know nothing about the dynamics
|
|
l.m = [];
|
|
l.r = [];
|
|
v = [];
|
|
l.I = [];
|
|
l.Jm = [];
|
|
l.G = [];
|
|
l.B = 0;
|
|
l.Tc = [0 0];
|
|
l.qlim = [];
|
|
l = class(l, "Link");
|
|
|
|
|
|
else
|
|
% legacy DYN matrix
|
|
|
|
l.theta = dh(1);
|
|
l.d = dh(2);
|
|
l.a = dh(3);
|
|
l.alpha = dh(4);
|
|
if length(dh) >= 5,
|
|
l.sigma = dh(5);
|
|
else
|
|
l.sigma = 0;
|
|
end
|
|
l.offset = 0;
|
|
l.mdh = 0;
|
|
if nargin > 1
|
|
if strncmp(convention, 'mod', 3) == 1
|
|
l.mdh = 1;
|
|
elseif strncmp(convention, 'sta', 3) == 1
|
|
l.mdh = 0;
|
|
else
|
|
error('convention must be modified or standard');
|
|
end
|
|
end
|
|
% it's a legacy DYN matrix
|
|
if length(dh) >= 6,
|
|
l.m = [dh(6)];
|
|
else
|
|
l.m = [];
|
|
end
|
|
if length(dh) >= 9,
|
|
l.r = dh(7:9);
|
|
else
|
|
l.r = [];
|
|
end
|
|
if length(dh) >= 15,
|
|
v = dh(10:15);
|
|
l.I = [ v(1) v(4) v(6)
|
|
v(4) v(2) v(5)
|
|
v(6) v(5) v(3)];
|
|
else
|
|
v = [];
|
|
l.I = [];
|
|
end
|
|
if length(dh) >= 16,
|
|
l.Jm = dh(16);
|
|
else
|
|
l.Jm = [];
|
|
end
|
|
if length(dh) >= 17,
|
|
l.G = dh(17);
|
|
else
|
|
l.G = [];
|
|
end
|
|
if length(dh) >= 18,
|
|
l.B = dh(18);
|
|
else
|
|
l.B = 0;
|
|
end
|
|
if length(dh) >= 20,
|
|
l.Tc = dh(19:20);
|
|
else
|
|
l.Tc = [0 0];
|
|
end
|
|
|
|
l.qlim = [];
|
|
l = class(l, "Link");
|
|
|
|
end
|
|
|
|
endfunction
|