绘制2个数字Matlab时“无效的句柄对象”

时间:2010-05-10 18:19:50

标签: c++ matlab animation graph plot

我很难理解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

上面的代码适用于其他代码,但不适用于我的代码。我会尝试实施你的建议并告诉你。

1 个答案:

答案 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,...)确保绘制到正确的轴组中,如果碰巧点击不同的图形窗口之间,则不会出现奇怪的情况打开图形并发出绘图命令的时间。