我有4个文件,代码“按预期工作”。
我尝试清理所有内容,将代码放入函数中等等......一切看起来都很好......但它不起作用。有人可以解释为什么MatLab如此古怪......还是我只是愚蠢?
通常,我输入
terminator = simulation(100,20,0,0,0,1);
terminator.animate();
它应该产生一张树木地图,终结者在森林里四处走动。一切都转向他的观点。
当我把它分解成函数时...一切都停止工作。
我真的只改变了几行代码,显示在评论中。
有效的代码:
classdef simulation
properties
landmarks
robot
end
methods
function obj = simulation(mapSize, trees, x,y,heading,velocity)
obj.landmarks = landmarks(mapSize, trees);
obj.robot = robot(x,y,heading,velocity);
end
function animate(obj)
%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=scatter([0],[0],'bo');
axis([xymin xymax xymin xymax]);
obj.landmarks.apparentPositions
%Simulation Loop THIS WAS ORGANIZED
for n = 1:720,
%Calculate and Set Heading/Location
obj.robot.headingChange = navigate(n);
%Update Position
obj.robot.heading = obj.robot.heading + obj.robot.headingChange;
obj.landmarks.heading = obj.robot.heading;
y = cosd(obj.robot.heading);
x = sind(obj.robot.heading);
obj.robot.x = obj.robot.x + (x*obj.robot.velocity);
obj.robot.y = obj.robot.y + (y*obj.robot.velocity);
obj.landmarks.x = obj.robot.x;
obj.landmarks.y = obj.robot.y;
%Animate
set(l,'XData',obj.landmarks.apparentPositions(:,1),'YData',obj.landmarks.apparentPositions(:,2));
rectangle('Position',[-2,-2,4,4]);
drawnow
end
end
end
end
-----------
classdef landmarks
properties
fixedPositions %# positions in a fixed coordinate system. [ x, y ]
mapSize = 10; %Map Size. Value is side of square
x=0;
y=0;
heading=0;
headingChange=0;
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)
%-STILL ROTATES AROUND ORIGINAL ORIGIN
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
end
end
----------
classdef robot
properties
x
y
heading
velocity
headingChange
end
methods
function obj = robot(x,y,heading,velocity)
obj.x = x;
obj.y = y;
obj.heading = heading;
obj.velocity = velocity;
end
end
end
----------
function headingChange = navigate(n)
%steeringChange = 5 * rand(1) * sign(rand(1) - 0.5); Most chaotic shit
%Draw an S
if n <270
headingChange=1;
elseif n<540
headingChange=-1;
elseif n<720
headingChange=1;
else
headingChange=1;
end
end
不起作用的代码......
classdef simulation
properties
landmarks
robot
end
methods
function obj = simulation(mapSize, trees, x,y,heading,velocity)
obj.landmarks = landmarks(mapSize, trees);
obj.robot = robot(x,y,heading,velocity);
end
function animate(obj)
%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=scatter([0],[0],'bo');
axis([xymin xymax xymin xymax]);
obj.landmarks.apparentPositions
%Simulation Loop
for n = 1:720,
%Calculate and Set Heading/Location
%Update Position
headingChange = navigate(n);
obj.robot.updatePosition(headingChange);
obj.landmarks.updatePerspective(obj.robot.heading, obj.robot.x, obj.robot.y);
%Animate
set(l,'XData',obj.landmarks.apparentPositions(:,1),'YData',obj.landmarks.apparentPositions(:,2));
rectangle('Position',[-2,-2,4,4]);
drawnow
end
end
end
end
-----------------
classdef landmarks
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 = createLandmarks(mapSize, numberOfTrees)
obj.mapSize = mapSize;
obj.fixedPositions = obj.mapSize * rand([numberOfTrees, 2]) .* sign(rand([numberOfTrees, 2]) - 0.5);
end
function apparent = get.apparentPositions(obj)
%-STILL ROTATES AROUND ORIGINAL ORIGIN
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
-----------------
classdef robot
properties
x
y
heading
velocity
end
methods
function obj = robot(x,y,heading,velocity)
obj.x = x;
obj.y = y;
obj.heading = heading;
obj.velocity = velocity;
end
function updatePosition(obj,headingChange)
obj.heading = obj.heading + headingChange;
tempy = cosd(obj.heading);
tempx = sind(obj.heading);
obj.x = obj.x + (tempx*obj.velocity);
obj.y = obj.y + (tempy*obj.velocity);
end
end
end
导航功能是相同的......
如果事情不起作用,我将不胜感激。
我所做的只是从评论中的第一部分获取代码:%Simulation Loop这是有组织的并将其分解为2个函数。一个在机器人中,一个在地标中。
每次都会创建一个新实例,因为它在机器人类中不断为此行打印相同的标题 obj.heading = obj.heading + headingChange;
答案 0 :(得分:1)
用以下内容替换您的定义:
classdef landmarks <handle
classdef robots <handle
然后看一下:http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_oop/brfylq3.html
答案 1 :(得分:1)
我会给你一个解释。
默认情况下,当您在MATLAB对象上调用方法时,框架会创建该对象的副本并在此副本上调用该方法。这是与C ++完全不同的范例。在C ++中,当您调用对象的方法时,您将在对该对象实例的引用上调用该方法。
所以,当你打电话
obj.robot.updatePosition(headingChange);
它正在创建机器人对象的新副本,并在此副本上调用updatePosition。原始机器人的状态保持不变。
使用句柄的另一种方法是编码如下:
obj.robot = obj.robot.updatePosition(headingChange);
另一种方法是使che类继承自handle。在这种情况下,每个复制操作都复制对类的引用,而不是实例,这就是更新函数更改实际对象状态的原因。