You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
3.5 KiB
Matlab

function [angles,ranges,partitions,values,stdx,stdw,partitionLabels]=simulate_agent(angles)
%defines parameters of simulation and simulates movement of agent
linear1d=1;
if linear1d
%simulate simple,linear, agent with 1x1d retina, and 1 dof for eye, neck, and torso movements
%defined ranges for each input variable
retina=[-80,80];%Monocular visual field measured from central fixation: 160 deg (w) x 175 deg (h)
eye=[-50,50];%eyeball rotation of about 90° (head rotation excluded, peripheral vision included)
neck=[-90,90];%Neck rotations are physically limited to between +/-90 to +/- 100 degrees in humans (Thornton and Jackson 1980) [McCluskeyCullen07]
torso=[-40,40];
if nargout>1
stdw=7.5;
step=10;
ranges.Rcentres=define_range(retina,step);
ranges.Ecentres=define_range(eye,step);
ranges.Hcentres=define_range(retina+eye,step);
ranges.Ncentres=define_range(neck,step);
ranges.Bcentres=define_range(retina+eye+neck,step);
ranges.Tcentres=define_range(torso,step);
stdx=12.5;
step=5;
values{1,1}=define_range(retina,step);
values{1,2}=define_range(eye,step);
values{1,3}=define_range(retina+eye,step);
values{2,1}=define_range(retina+eye,step);
values{2,2}=define_range(neck,step);
values{2,3}=define_range(retina+eye+neck,step);
values{3,1}=define_range(retina+eye+neck,step);
values{3,2}=define_range(torso,step);
values{3,3}=define_range(retina+eye+neck+torso,step);
partitions{1,1}=[1:length(values{1,1})];
partitions{1,2}= length(values{1,1})+[1:length(values{1,2})];
partitions{1,3}= length(values{1,1})+ length(values{1,2})+[1:length(values{1,3})];
partitions{2,1}=[1:length(values{2,1})];
partitions{2,2}= length(values{2,1})+[1:length(values{2,2})];
partitions{2,3}= length(values{2,1})+ length(values{2,2})+[1:length(values{2,3})];
partitions{3,1}=[1:length(values{3,1})];
partitions{3,2}= length(values{3,1})+[1:length(values{3,2})];
partitions{3,3}= length(values{3,1})+ length(values{3,2})+[1:length(values{3,3})];
partitionLabels{1,1}='R';
partitionLabels{1,2}='E';
partitionLabels{1,3}='H';
partitionLabels{2,1}='H';
partitionLabels{2,2}='N';
partitionLabels{2,3}='B';
partitionLabels{3,1}='B';
partitionLabels{3,2}='T';
partitionLabels{3,3}='W';
end
if nargin>0 && ~isempty(angles)
if isnan(angles.R)
%calculate the position of the target on the retina given world-centred location of target and the eye, neck and torso angles
angles.R=angles.W-angles.E-angles.N-angles.T;
elseif isnan(angles.H)
%calc position of visual target in head-centred coordinated - used for wiring up network
angles.H=angles.R+angles.E;
elseif isnan(angles.B)
%calc position of visual target in body-centred coordinated - used for wiring up network
angles.B=angles.H+angles.N;
elseif isnan(angles.W)
if isinf(angles.B)
%calculate the world-centred location of target given its retinal position and the eye, neck and torso angles
angles.W=angles.R+angles.E+angles.N+angles.T;
else
%calc position of visual target in world-centred coordinated- used for wiring up network
angles.W=angles.B+angles.T;
end
end
else
angles.R=NaN;
angles.E=NaN;
angles.N=NaN;
angles.T=NaN;
angles.H=NaN;
angles.B=NaN;
angles.W=NaN;
end
end
function values=define_range(range,step)
values=[range(1):step:range(2)];
%values=[fliplr([0:-step:range(1)]),[step:step:range(2)]]