我有 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 THIS WAS ORGANIZED 并将其分解为 2 个函数。一个在机器人中,一个在地标中。
每次都会创建一个新实例,因为它在机器人类中不断为该行打印相同的标题 obj.heading = obj.heading + headingChange;