我很难理解Matlab类与c ++相比的范例。我前几天编写了代码,我认为它应该可行。它没有...直到我添加
<handle
在classdef之后。
所以我有两个类,地标和机器人,都是从模拟类中调用的。这是obj.simulation.animate()的主循环,它可以工作,直到我尝试一次绘制两个东西。
DATA.path是机器人在地图上所有位置的记录,每次更新位置时都会更新。
当我尝试绘制它时,通过取消注释下面两条标记的行,我收到此错误:
???使用==&gt;时出错组 句柄对象无效。
==&gt;中的错误模拟&gt; simulation.animate at 45 集(l.lm, '扩展数据',obj.landmarks.apparentPositions(:,1), 'YDATA',obj.landmarks.apparentPositions(:,2));
%INITIALIZE GLOBALS
global DATA XX
XX = [obj.robot.x ; obj.robot.y];
DATA.i=1;
DATA.path = XX;
%Setup Plots
fig=figure;
xlabel('meters'), ylabel('meters')
set(fig, 'name', 'Phil''s AWESOME 80''s Robot Simulator')
xymax = obj.landmarks.mapSize*3;
xymin = -(obj.landmarks.mapSize*3);
l.lm=scatter([0],[0],'b+');
%"UNCOMMENT ME"l.pth= plot(0,0,'k.','markersize',2,'erasemode','background'); % vehicle path
axis([xymin xymax xymin xymax]);
%Simulation Loop
for n = 1:720,
%Calculate and Set Heading/Location
XX = [obj.robot.x;obj.robot.y];
store_data(XX);
if n == 120,
DATA.path
end
%Update Position
headingChange = navigate(n);
obj.robot.updatePosition(headingChange);
obj.landmarks.updatePerspective(obj.robot.heading, obj.robot.x, obj.robot.y);
%Animate
%"UNCOMMENT ME" set(l.pth, 'xdata', DATA.path(1,1:DATA.i), 'ydata', DATA.path(2,1:DATA.i));
set(l.lm,'XData',obj.landmarks.apparentPositions(:,1),'YData',obj.landmarks.apparentPositions(:,2));
rectangle('Position',[-2,-2,4,4]);
drawnow
这是地标的classdef
classdef landmarks <handle
properties
fixedPositions; %# positions in a fixed coordinate system. [ x, y ]
mapSize; %Map Size. Value is side of square
x;
y;
heading;
headingChange;
end
properties (Dependent)
apparentPositions
end
methods
function obj = landmarks(mapSize, numberOfTrees)
obj.mapSize = mapSize;
obj.fixedPositions = obj.mapSize * rand([numberOfTrees, 2]) .* sign(rand([numberOfTrees, 2]) - 0.5);
end
function apparent = get.apparentPositions(obj)
currentPosition = [obj.x ; obj.y];
apparent = bsxfun(@minus,(obj.fixedPositions)',currentPosition)';
apparent = ([cosd(obj.heading) -sind(obj.heading) ; sind(obj.heading) cosd(obj.heading)] * (apparent)')';
end
function updatePerspective(obj,tempHeading,tempX,tempY)
obj.heading = tempHeading;
obj.x = tempX;
obj.y = tempY;
end
end
end
对我而言,这就是我理解事物的方式。我创建了一个大约100 xy点的数字l.lm。我可以使用
旋转这个数字set(l.lm,'XData',obj.landmarks.apparentPositions(:,1),'YData',obj.landmarks.apparentPositions(:,2));
当我这样做时,事情有效。当我尝试绘制存储在DATA.path中的第二组XY点时,它会扯掉,我无法找出原因。
我需要绘制存储在DATA.path中的机器人路径和地标位置。关于如何做到这一点的想法?
乔纳斯: 我不是说你错了,因为我不知道答案,但是我有另一个应用程序的代码,这种方式不需要调用轴('NextPlot','add');
if dtsum==0 & ~isempty(z) % plots related to observations
set(h.xf, 'xdata', XX(4:2:end), 'ydata', XX(5:2:end))
plines= make_laser_lines (z,XX(1:3));
set(h.obs, 'xdata', plines(1,:), 'ydata', plines(2,:))
pfcov= make_feature_covariance_ellipses(XX,PX);
set(h.fcov, 'xdata', pfcov(1,:), 'ydata', pfcov(2,:))
end
drawnow
上面的代码适用于其他代码,但不适用于我的代码。我会尝试实施你的建议并告诉你。
答案 0 :(得分:3)
当您在同一个图形上多次调用绘图时,默认情况下会删除上一个绘图,并且前一个绘图的句柄指向任何内容。因此错误。
要解决此问题,您需要将轴的NextPlot
属性设置为add
。您可以通过调用hold on
来执行此操作(如果您从命令行进行绘图,那就是您要执行的操作),或者您可以编写
fig=figure;
%# create a set of axes where additional plots will be added on top of each other
%# without erasing
axes('NextPlot','add');
如果需要,您也可以存储轴手柄,并使用plot(ah,x,y,...)
确保绘制到正确的轴组中,如果碰巧点击不同的图形窗口之间,则不会出现奇怪的情况打开图形并发出绘图命令的时间。