«Недопустимый дескриптор объекта» при нанесении 2 фигур Matlab - PullRequest
1 голос
/ 10 мая 2010

Мне трудно понять парадигму классов Matlab по сравнению с c ++. Я написал код на днях, и я подумал, что он должен работать. Это не ... пока я не добавил

<handle 

после определения класса.

Итак, у меня есть два класса, ориентиры и робот, оба они вызываются из класса симуляции. Это основной цикл obj.simulation.animate (), и он работает, пока я не попытаюсь построить две вещи одновременно.

DATA.path - это запись всех мест, где робот находился на карте, и он обновляется каждый раз, когда позиция обновляется.

Когда я пытаюсь построить его, раскомментировав две отмеченные строки ниже, я получаю эту ошибку:

??? Ошибка при использовании ==> set Неверный дескриптор объекта.

Ошибка в ==> имитация> имитация. Оживить в 45 набор (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

Это 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

Для меня это то, как я понимаю вещи. Я создал фигуру l.lm, которая имеет около 100 xy точек. Я могу повернуть эту цифру с помощью

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

Когда я это делаю, все работает. Когда я пытаюсь построить вторую группу точек XY, сохраненную в DATA.path, она вылетает, и я не могу понять, почему.

Мне нужно построить путь роботов, сохраненный в DATA.path, и позиции ориентиров. Идеи о том, как это сделать?

Jonas: Я не говорю, что вы не правы, потому что я не знаю ответа, но у меня есть код из другого приложения, которое отображает этот путь без вызова осей ('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 Ответ

3 голосов
/ 10 мая 2010

Когда вы вызываете график несколько раз на одном и том же рисунке, предыдущий график по умолчанию стирается, а указатель на предыдущий график ничего не указывает. Таким образом, ошибка.

Чтобы исправить это, вам нужно установить свойство 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,...), чтобы убедиться, что вы строите правильный набор осей, а не где-то странно, если вы случайно нажмете другое окно рисунка между фигура открывается и выдается команда сюжета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...