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.
187 lines
5.2 KiB
187 lines
5.2 KiB
%TRPLOT2 Plot a planar transformation
|
|
%
|
|
% TRPLOT2(T, OPTIONS) draws a 2D coordinate frame represented by the SE(2)
|
|
% homogeneous transform T (3x3).
|
|
%
|
|
% H = TRPLOT2(T, OPTIONS) as above but returns a handle.
|
|
%
|
|
% TRPLOT2(H, T) moves the coordinate frame described by the handle H to
|
|
% the SE(2) pose T (3x3).
|
|
%
|
|
% Options::
|
|
% 'axis',A Set dimensions of the MATLAB axes to A=[xmin xmax ymin ymax]
|
|
% 'color', c The color to draw the axes, MATLAB colorspec
|
|
% 'noaxes' Don't display axes on the plot
|
|
% 'frame',F The frame is named {F} and the subscript on the axis labels is F.
|
|
% 'text_opts', opt A cell array of Matlab text properties
|
|
% 'handle', h Draw in the MATLAB axes specified by h
|
|
% 'view',V Set plot view parameters V=[az el] angles, or 'auto'
|
|
% for view toward origin of coordinate frame
|
|
% 'arrow' Use arrows rather than line segments for the axes
|
|
% 'width', w Width of arrow tips
|
|
%
|
|
% Examples::
|
|
%
|
|
% trplot(T, 'frame', 'A')
|
|
% trplot(T, 'frame', 'A', 'color', 'b')
|
|
% trplot(T1, 'frame', 'A', 'text_opts', {'FontSize', 10, 'FontWeight', 'bold'})
|
|
%
|
|
% Notes::
|
|
% - The arrow option requires the third party package arrow3.
|
|
% - Generally it is best to set the axis bounds
|
|
%
|
|
% See also TRPLOT.
|
|
|
|
|
|
% 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/>.
|
|
|
|
% 'frame', name name of the frame, used for axis subscripts and origin
|
|
% 'color', color Matlab color specificication for the frame and annotations
|
|
% 'noaxes' show the frame but no Matlab axes
|
|
% 'arrow' use the contributed arrow3 function to draw the frame axes
|
|
% 'width', width width of lines to draw if using arrow3
|
|
|
|
function hout = trplot2(T, varargin)
|
|
|
|
if isscalar(T) && ishandle(T)
|
|
% trplot(H, T)
|
|
H = T; T = varargin{1};
|
|
set(H, 'Matrix', se2t3(T));
|
|
return;
|
|
end
|
|
|
|
opt.color = 'b';
|
|
opt.axes = true;
|
|
opt.axis = [];
|
|
opt.frame = [];
|
|
opt.text_opts = [];
|
|
opt.view = [];
|
|
opt.width = 1;
|
|
opt.arrow = false;
|
|
opt.handle = [];
|
|
|
|
opt = tb_optparse(opt, varargin);
|
|
|
|
if isempty(opt.text_opts)
|
|
opt.text_opts = {};
|
|
end
|
|
if isempty(opt.axis)
|
|
if all(size(T) == [3 3]) || norm(transl(T)) < eps
|
|
c = transl(T);
|
|
d = 1.2;
|
|
opt.axis = [c(1)-d c(1)+d c(2)-d c(2)+d];
|
|
end
|
|
end
|
|
|
|
if ~isempty(opt.handle)
|
|
hax = opt.handle;
|
|
hold(hax);
|
|
else
|
|
ih = ishold;
|
|
if ~ih
|
|
% if hold is not on, then clear the axes and set scaling
|
|
cla
|
|
if ~isempty(opt.axis)
|
|
axis(opt.axis);
|
|
end
|
|
%axis equal
|
|
|
|
if opt.axes
|
|
xlabel( 'X');
|
|
ylabel( 'Y');
|
|
end
|
|
end
|
|
hax = gca;
|
|
hold on
|
|
end
|
|
|
|
% create unit vectors
|
|
o = [0 0 1]'; o = o(1:2);
|
|
x1 = [1 0 1]'; x1 = x1(1:2);
|
|
y1 = [0 1 1]'; y1 = y1(1:2);
|
|
|
|
% draw the axes
|
|
|
|
mstart = [o o]';
|
|
mend = [x1 y1]';
|
|
|
|
hg = hgtransform('Parent', hax);
|
|
if opt.arrow
|
|
% draw the 2 arrows
|
|
S = [opt.color num2str(opt.width)];
|
|
ha = arrow3(mstart, mend, S);
|
|
for h=ha'
|
|
set(h, 'Parent', hg);
|
|
end
|
|
else
|
|
for i=1:2
|
|
plot2([mstart(i,1:2); mend(i,1:2)], 'Color', opt.color, 'Parent', hg);
|
|
end
|
|
end
|
|
|
|
% label the axes
|
|
if isempty(opt.frame)
|
|
fmt = '%c';
|
|
else
|
|
fmt = sprintf('%%c_{%s}', opt.frame);
|
|
end
|
|
|
|
% add the labels to each axis
|
|
h = text(x1(1), x1(2), sprintf(fmt, 'X'), 'Parent', hg);
|
|
if ~isempty(opt.text_opts)
|
|
set(h, opt.text_opts{:});
|
|
end
|
|
if opt.arrow
|
|
set(h, 'Parent', hg);
|
|
end
|
|
|
|
h = text(y1(1), y1(2), sprintf(fmt, 'Y'), 'Parent', hg);
|
|
if ~isempty(opt.text_opts)
|
|
set(h, opt.text_opts{:});
|
|
end
|
|
if opt.arrow
|
|
set(h, 'Parent', hg);
|
|
end
|
|
|
|
% label the frame
|
|
if ~isempty(opt.frame)
|
|
h = text(o(1)-0.04*x1(1), o(2)-0.04*y1(2), ...
|
|
['\{' opt.frame '\}'], 'Parent', hg);
|
|
set(h, 'VerticalAlignment', 'middle', ...
|
|
'HorizontalAlignment', 'center', opt.text_opts{:});
|
|
end
|
|
|
|
if ~opt.axes
|
|
set(gca, 'visible', 'off');
|
|
end
|
|
grid on
|
|
if ~ih
|
|
hold off
|
|
end
|
|
|
|
% now place the frame in the desired pose
|
|
set(hg, 'Matrix', se2t3(T));
|
|
|
|
if nargout > 0
|
|
hout = hg;
|
|
end
|
|
end
|
|
|
|
function T3 = se2t3(T2)
|
|
T3 = [T2(1:2,1:2) zeros(2,1) T2(1:2,3); 0 0 1 0; 0 0 0 1];
|
|
end
|