"Invalid Handle Object" when plotting 2 figures Matlab

Posted by pinnacler on Stack Overflow See other posts from Stack Overflow or by pinnacler
Published on 2010-05-10T18:19:50Z Indexed on 2010/05/10 18:24 UTC
Read the original article Hit count: 363

Filed under:
|
|
|
|

I'm having a difficult time understanding the paradigm of Matlab classes vs compared to c++. I wrote code the other day, and I thought it should work. It did not... until I added

<handle 

after the classdef.

So I have two classes, landmarks and robot, both are called from within the simulation class. This is the main loop of obj.simulation.animate() and it works, until I try to plot two things at once.

DATA.path is a record of all the places a robot has been on the map, and it's updated every time the position is updated.

When I try to plot it, by uncommenting the two marked lines below, I get this error:

??? Error using ==> set Invalid handle object.

Error in ==> simulation>simulation.animate at 45 set(l.lm,'XData',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

This is the classdef for landmarks

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

To me, this is how I understand things. I created a figure l.lm that has about 100 xy points. I can rotate this figure by using

set(l.lm,'XData',obj.landmarks.apparentPositions(:,1),'YData',obj.landmarks.apparentPositions(:,2));

When I do that, things work. When I try to plot a second group of XY points, stored in DATA.path, it craps out and I can't figure out why.

© Stack Overflow or respective owner

Related posts about matlab

Related posts about graph