full simulation with RF sensors
This commit is contained in:
+2
-2
@@ -50,8 +50,8 @@ classdef agent
|
||||
obj.commsGeometry = spherical;
|
||||
end
|
||||
[obj] = initialize(obj, pos, pan, tilt, collisionGeometry, sensorModel, guidanceModel, comRange, index, label);
|
||||
[obj] = run(obj, domain, partitioning, t, index, agents);
|
||||
[partitioning] = partition(obj, agents, objective)
|
||||
[obj] = run(obj, domain, partitioning, t, index, useDoubleIntegrator, dampingCoeff, dt, optimizeSensorPointing, otherAgents);
|
||||
[partitioning, agents] = partition(obj, agents, objective)
|
||||
[obj, f] = plot(obj, ind, f);
|
||||
updatePlots(obj);
|
||||
end
|
||||
|
||||
+18
-3
@@ -1,4 +1,4 @@
|
||||
function [partitioning] = partition(obj, agents, objective)
|
||||
function [partitioning, agents] = partition(obj, agents, objective)
|
||||
arguments (Input)
|
||||
obj (1, 1) {mustBeA(obj, "agent")};
|
||||
agents (:, 1) {mustBeA(agents, "cell")};
|
||||
@@ -6,6 +6,7 @@ function [partitioning] = partition(obj, agents, objective)
|
||||
end
|
||||
arguments (Output)
|
||||
partitioning (:, :) double;
|
||||
agents (:, 1) cell;
|
||||
end
|
||||
|
||||
nAgents = size(agents, 1);
|
||||
@@ -18,8 +19,22 @@ function [partitioning] = partition(obj, agents, objective)
|
||||
% minimum threshold that must be exceeded for any assignment.
|
||||
agentPerf = zeros(nPoints, nAgents + 1);
|
||||
for aa = 1:nAgents
|
||||
p = agents{aa}.sensorModel.sensorPerformance(agents{aa}.pos, ...
|
||||
[objective.X(:), objective.Y(:), zeros(nPoints, 1)]);
|
||||
if isa(agents{aa}.sensorModel, "sigmoidSensor")
|
||||
p = agents{aa}.sensorModel.sensorPerformance(agents{aa}.pos, ...
|
||||
[objective.X(:), objective.Y(:), zeros(nPoints, 1)]);
|
||||
elseif isa(agents{aa}.sensorModel, "rfSensor")
|
||||
otherSensorsIdx = [1:(aa - 1), (aa + 1):size(agents, 1)];
|
||||
otherSensors = agents(otherSensorsIdx);
|
||||
otherSensorsPos = cell2mat(cellfun(@(x) x.pos, otherSensors, "UniformOutput", false));
|
||||
otherSensors = cellfun(@(x) x.sensorModel, otherSensors, "UniformOutput", false);
|
||||
[p, ~, agents{aa}.sensorModel, otherSensors] = agents{aa}.sensorModel.sensorPerformance(agents{aa}.pos, ...
|
||||
[objective.X(:), objective.Y(:), zeros(nPoints, 1)], otherSensorsPos, otherSensors);
|
||||
for k = 1:numel(otherSensorsIdx)
|
||||
agents{otherSensorsIdx(k)}.sensorModel = otherSensors{k};
|
||||
end
|
||||
else
|
||||
error("?");
|
||||
end
|
||||
agentPerf(:, aa) = p(:);
|
||||
end
|
||||
agentPerf(:, nAgents + 1) = objective.sensorPerformanceMinimum;
|
||||
|
||||
+34
-2
@@ -1,4 +1,4 @@
|
||||
function obj = run(obj, domain, partitioning, timestepIndex, index, useDoubleIntegrator, dampingCoeff, dt, optimizeSensorPointing)
|
||||
function obj = run(obj, domain, partitioning, timestepIndex, index, useDoubleIntegrator, dampingCoeff, dt, optimizeSensorPointing, otherAgents)
|
||||
arguments (Input)
|
||||
obj (1, 1) {mustBeA(obj, "agent")};
|
||||
domain (1, 1) {mustBeGeometry};
|
||||
@@ -9,6 +9,7 @@ function obj = run(obj, domain, partitioning, timestepIndex, index, useDoubleInt
|
||||
dampingCoeff (1, 1) double = 2.0;
|
||||
dt (1, 1) double = 1.0;
|
||||
optimizeSensorPointing (1, 1) logical = false;
|
||||
otherAgents (:, 1) cell = cell();
|
||||
end
|
||||
arguments (Output)
|
||||
obj (1, 1) {mustBeA(obj, "agent")};
|
||||
@@ -33,6 +34,26 @@ function obj = run(obj, domain, partitioning, timestepIndex, index, useDoubleInt
|
||||
maskedX = domain.objective.X(partitionMask);
|
||||
maskedY = domain.objective.Y(partitionMask);
|
||||
|
||||
if isa(obj.sensorModel, "rfSensor")
|
||||
% Extract other agents' sensor models and positions once, outside the delta loop.
|
||||
% Mask the full-grid RSS caches (filled by partition()) down to this agent's
|
||||
% partition subset so sensorPerformance can reuse them for all perturbations.
|
||||
otherSensorsPos = cell2mat(cellfun(@(x) x.pos, otherAgents, "UniformOutput", false));
|
||||
otherSensors = cellfun(@(x) x.sensorModel, otherAgents, "UniformOutput", false);
|
||||
partitionIndices = find(partitionMask);
|
||||
for kk = 1:numel(otherSensors)
|
||||
if ~isempty(otherSensors{kk}.rssCache)
|
||||
otherSensors{kk}.rssCache = otherSensors{kk}.rssCache(partitionIndices);
|
||||
end
|
||||
end
|
||||
% Pre-mask this agent's own full-grid cache to the partition subset.
|
||||
% Used for ii==1 (current position, no perturbation) to avoid recomputing.
|
||||
baseSensorModel = obj.sensorModel;
|
||||
if ~isempty(obj.sensorModel.rssCache)
|
||||
baseSensorModel.rssCache = obj.sensorModel.rssCache(partitionIndices);
|
||||
end
|
||||
end
|
||||
|
||||
if optimizeSensorPointing
|
||||
% Stash actual current sensor model tilt/azimuth before messing with it
|
||||
% in these following hypotheticals
|
||||
@@ -58,7 +79,18 @@ function obj = run(obj, domain, partitioning, timestepIndex, index, useDoubleInt
|
||||
end
|
||||
|
||||
% Compute performance values on partition
|
||||
sensorValues = obj.sensorModel.sensorPerformance(pos, [maskedX, maskedY, zeros(size(maskedX))]); % S_n(omega, P_n) on W_n
|
||||
if isa(obj.sensorModel, "sigmoidSensor")
|
||||
sensorValues = obj.sensorModel.sensorPerformance(pos, [maskedX, maskedY, zeros(size(maskedX))]); % S_n(omega, P_n) on W_n
|
||||
elseif isa(obj.sensorModel, "rfSensor")
|
||||
if ii == 1
|
||||
sensorModelForDelta = baseSensorModel; % reuse partition-step cache; no recompute needed
|
||||
else
|
||||
sensorModelForDelta = obj.sensorModel.clearRssCache;
|
||||
end
|
||||
[sensorValues, ~, ~, ~] = sensorModelForDelta.sensorPerformance(pos, [maskedX, maskedY, zeros(size(maskedX))], otherSensorsPos, otherSensors);
|
||||
else
|
||||
error("?");
|
||||
end
|
||||
|
||||
% Rearrange data into image arrays
|
||||
F = NaN(size(partitionMask));
|
||||
|
||||
Reference in New Issue
Block a user