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.
224 lines
7.6 KiB
224 lines
7.6 KiB
%RobotArm Serial-link robot arm class
|
|
%
|
|
% A subclass of SerialLink than includes an interface to a physical robot.
|
|
%
|
|
% Methods::
|
|
%
|
|
% plot display graphical representation of robot
|
|
%-
|
|
% teach drive the physical and graphical robots
|
|
% mirror use the robot as a slave to drive graphics
|
|
%-
|
|
% jmove joint space motion of the physical robot
|
|
% cmove Cartesian space motion of the physical robot
|
|
%
|
|
% plus all other methods of SerialLink
|
|
%
|
|
% Properties::
|
|
%
|
|
% as per SerialLink class
|
|
%
|
|
% Note::
|
|
% - the interface to a physical robot, the machine, should be an abstract
|
|
% superclass but right now it isn't
|
|
% - RobotArm is a subclass of SerialLink.
|
|
% - RobotArm is a reference (handle subclass) object.
|
|
% - RobotArm objects can be used in vectors and arrays
|
|
%
|
|
% Reference::
|
|
% - http://www.petercorke.com/doc/robotarm.pdf
|
|
% - Robotics, Vision & Control, Chaps 7-9,
|
|
% P. Corke, Springer 2011.
|
|
% - Robot, Modeling & Control,
|
|
% M.Spong, S. Hutchinson & M. Vidyasagar, Wiley 2006.
|
|
%
|
|
% See also Machine, SerialLink, Link, DHFactor.
|
|
|
|
% Copyright (C) 1993-2015, 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
|
|
|
|
classdef RobotArm < SerialLink
|
|
|
|
properties
|
|
machine
|
|
ngripper
|
|
end
|
|
|
|
methods
|
|
function ra = RobotArm(robot, machine, varargin)
|
|
%RobotArm.RobotArm Construct a RobotArm object
|
|
%
|
|
% RA = RobotArm(L, M, OPTIONS) is a robot object defined by a vector of
|
|
% Link objects L with a physical robot interface M represented by an object
|
|
% of class Machine.
|
|
%
|
|
% Options::
|
|
%
|
|
% 'name', name set robot name property
|
|
% 'comment', comment set robot comment property
|
|
% 'manufacturer', manuf set robot manufacturer property
|
|
% 'base', base set base transformation matrix property
|
|
% 'tool', tool set tool transformation matrix property
|
|
% 'gravity', g set gravity vector property
|
|
% 'plotopt', po set plotting options property
|
|
%
|
|
% See also SerialLink.SerialLink, Arbotix.Arbotix.
|
|
|
|
ra = ra@SerialLink(robot, varargin{:});
|
|
ra.machine = machine;
|
|
|
|
ra.ngripper = machine.nservos - ra.n;
|
|
end
|
|
|
|
function delete(ra)
|
|
%RobotArm.delete Destroy the RobotArm object
|
|
%
|
|
% RA.delete() closes and destroys the machine interface object and the RobotArm
|
|
% object.
|
|
|
|
% attempt to destroy the machine interfaace
|
|
try
|
|
ra.machine.disconnect();
|
|
delete(ra.machine);
|
|
catch
|
|
end
|
|
|
|
% cleanup the parent object
|
|
delete@SerialLink(ra);
|
|
end
|
|
|
|
function jmove(ra, qf, t)
|
|
%RobotArm.jmove Joint space move
|
|
%
|
|
% RA.jmove(QD) moves the robot arm to the configuration specified by
|
|
% the joint angle vector QD (1xN).
|
|
%
|
|
% RA.jmove(QD, T) as above but the total move takes T seconds.
|
|
%
|
|
% Notes::
|
|
% - A joint-space trajectory is computed from the current configuration to QD.
|
|
%
|
|
% See also RobotArm.cmove, Arbotix.setpath.
|
|
|
|
if nargin < 3
|
|
t = 3;
|
|
end
|
|
|
|
q0 = ra.getq();
|
|
qt = jtraj(q0, qf, 20);
|
|
|
|
ra.machine.setpath(qt, t/20);
|
|
end
|
|
|
|
function cmove(ra, T, varargin)
|
|
%RobotArm.cmove Cartesian space move
|
|
%
|
|
% RA.cmove(T) moves the robot arm to the pose specified by
|
|
% the homogeneous transformation (4x4).
|
|
%
|
|
% Notes::
|
|
% - A joint-space trajectory is computed from the current configuration to
|
|
% QD using the jmove() method.
|
|
% - If the robot is 6-axis with a spherical wrist inverse kinematics are
|
|
% computed using ikine6s() otherwise numerically using ikine().
|
|
%
|
|
% See also RobotArm.jmove, Arbotix.setpath.
|
|
if ra.isspherical()
|
|
q = ra.ikine6s(T, varargin{:});
|
|
else
|
|
q = ra.ikine(T, ra.getq(), [1 1 1 1 0 0]);
|
|
end
|
|
ra.jmove(q);
|
|
end
|
|
|
|
function q = getq(ra)
|
|
%RobotArm.getq Get the robot joint angles
|
|
%
|
|
% Q = RA.getq() is a vector (1xN) of robot joint angles.
|
|
%
|
|
% Notes::
|
|
% - If the robot has a gripper, its value is not included in this vector.
|
|
|
|
q = ra.machine.getpos();
|
|
q = q(1:ra.n);
|
|
end
|
|
|
|
function mirror(ra)
|
|
%RobotArm.mirror Mirror the robot pose to graphics
|
|
%
|
|
% RA.mirror() places the robot arm in relaxed mode, and as it is moved by
|
|
% hand the graphical animation follows.
|
|
%
|
|
% See also SerialLink.teach, SerialLink.plot.
|
|
|
|
h = msgbox('The robot arm will go to relaxed mode, type q in the figure window to exit', ...
|
|
'Mirror mode', 'warn');
|
|
|
|
ra.machine.relax();
|
|
while true
|
|
if get(gcf,'CurrentCharacter') == 'q'
|
|
break
|
|
end;
|
|
|
|
q = ra.machine.getpos();
|
|
ra.plot(q(1:ra.n));
|
|
|
|
end
|
|
ra.machine.relax([], false);
|
|
|
|
delete(h);
|
|
end
|
|
|
|
function teach(ra)
|
|
%RobotArm.teach Teach the robot
|
|
%
|
|
% RA.teach() invokes a simple GUI to allow joint space motion, as well
|
|
% as showing an animation of the robot on screen.
|
|
%
|
|
% See also SerialLink.teach, SerialLink.plot.
|
|
|
|
q0 = ra.machine.getpos();
|
|
|
|
teach@SerialLink(ra, 'q0', q0(1:ra.n), ...
|
|
'callback', @(q) ra.machine.setpos([q q0(ra.n+1)]) );
|
|
end
|
|
|
|
function gripper(ra, open)
|
|
%RobotArm.gripper Control the robot gripper
|
|
%
|
|
% RA.gripper(C) sets the robot gripper according to C which is 0 for closed
|
|
% and 1 for open.
|
|
%
|
|
% Notes::
|
|
% - Not all robots have a gripper.
|
|
% - The gripper is assumed to be the last servo motor in the chain.
|
|
if open < 0 || open > 1
|
|
error('RTB:RobotArm:badarg', 'gripper control must be in range 0 to 1');
|
|
end
|
|
|
|
if ra.ngripper == 0
|
|
error('RTB:RobotArm:nofunc', 'robot has no gripper');
|
|
end
|
|
|
|
griplimits = ra.machine.gripper;
|
|
a = open*griplimits(1) + (1-open)*griplimits(2)
|
|
ra.machine.setpos(ra.n+1, a);
|
|
end
|
|
end
|
|
end
|