Мне трудно понять парадигму классов 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
Вышеуказанный код работает с другим кодом, но не с моим. Я постараюсь реализовать ваше предложение и дам вам знать.