fixed issues in sigmoid sensor model causing inverted response (annular partitions)

This commit is contained in:
2025-11-24 17:39:16 -08:00
parent 58d009c8fc
commit 779d7d2cc6
55 changed files with 44 additions and 31 deletions

View File

@@ -0,0 +1,10 @@
function x = distanceMembership(obj, d)
arguments (Input)
obj (1, 1) {mustBeA(obj, 'sigmoidSensor')};
d (:, 1) double;
end
arguments (Output)
x (:, 1) double;
end
x = 1 - (1 ./ (1 + exp(-obj.betaDist .* (abs(d) - obj.alphaDist))));
end

View File

@@ -0,0 +1,21 @@
function obj = initialize(obj, alphaDist, betaDist, alphaPan, betaPan, alphaTilt, betaTilt)
arguments (Input)
obj (1, 1) {mustBeA(obj, 'sigmoidSensor')}
alphaDist (1, 1) double;
betaDist (1, 1) double;
alphaPan (1, 1) double;
betaPan (1, 1) double;
alphaTilt (1, 1) double;
betaTilt (1, 1) double;
end
arguments (Output)
obj (1, 1) {mustBeA(obj, 'sigmoidSensor')}
end
obj.alphaDist = alphaDist;
obj.betaDist = betaDist;
obj.alphaPan = alphaPan;
obj.betaPan = betaPan;
obj.alphaTilt = alphaTilt;
obj.betaTilt = betaTilt;
end

View File

@@ -0,0 +1,42 @@
function f = plotParameters(obj)
arguments (Input)
obj (1, 1) {mustBeA(obj, 'sigmoidSensor')};
end
arguments (Output)
f (1, 1) {mustBeA(f, 'matlab.ui.Figure')};
end
% Distance and tilt sample points
d = 0:(obj.alphaDist / 100):(2*obj.alphaDist);
t = -90:1:90;
% Sample membership functions
d_x = obj.distanceMembership(d);
t_x = obj.tiltMembership(t);
% Plot resultant sigmoid curves
f = figure;
tiledlayout(f, 2, 1, "TileSpacing", "tight", "Padding", "compact");
% Distance
nexttile(1, [1, 1]);
grid("on");
title("Distance Membership Sigmoid");
xlabel("Distance (m)");
ylabel("Membership");
hold('on');
plot(d, d_x, 'LineWidth', 2);
hold('off');
ylim([0, 1]);
% Tilt
nexttile(2, [1, 1]);
grid("on");
title("Tilt Membership Sigmoid");
xlabel("Tilt (deg)");
ylabel("Membership");
hold('on');
plot(t, t_x, 'LineWidth', 2);
hold('off');
ylim([0, 1]);
end

View File

@@ -0,0 +1,21 @@
function [values, positions] = sense(obj, agent, sensingObjective, domain, partitioning)
arguments (Input)
obj (1, 1) {mustBeA(obj, 'sigmoidSensor')};
agent (1, 1) {mustBeA(agent, 'agent')};
sensingObjective (1, 1) {mustBeA(sensingObjective, 'sensingObjective')};
domain (1, 1) {mustBeGeometry};
partitioning (:, :) double;
end
arguments (Output)
values (:, 1) double;
positions (:, 3) double;
end
% Find positions for this agent's assigned partition in the domain
idx = partitioning == agent.index;
positions = [sensingObjective.X(idx), sensingObjective.Y(idx), zeros(size(sensingObjective.X(idx)))];
% Evaluate objective function at every point in this agent's
% assigned partiton
values = sensingObjective.values(idx);
end

View File

@@ -0,0 +1,22 @@
function value = sensorPerformance(obj, agentPos, agentPan, agentTilt, targetPos)
arguments (Input)
obj (1, 1) {mustBeA(obj, 'sigmoidSensor')};
agentPos (1, 3) double;
agentPan (1, 1) double;
agentTilt (1, 1) double;
targetPos (:, 3) double;
end
arguments (Output)
value (:, 1) double;
end
d = vecnorm(agentPos - targetPos, 2, 2); % distance from sensor to target
x = vecnorm(agentPos(1:2) - targetPos(:, 1:2), 2, 2); % distance from sensor nadir to target nadir (i.e. distance ignoring height difference)
tiltAngle = (180 - atan2d(x, targetPos(:, 3) - agentPos(3))) - agentTilt; % degrees
% Membership functions
mu_d = obj.distanceMembership(d);
mu_t = obj.tiltMembership(tiltAngle);
value = mu_d .* mu_t; % assume pan membership is always 1
end

View File

@@ -0,0 +1,22 @@
classdef sigmoidSensor
properties (SetAccess = private, GetAccess = public)
% Sensor parameters
alphaDist = NaN;
betaDist = NaN;
alphaPan = NaN;
betaPan = NaN;
alphaTilt = NaN; % degrees
betaTilt = NaN;
end
methods (Access = public)
[obj] = initialize(obj, alphaDist, betaDist, alphaPan, betaPan, alphaTilt, betaTilt);
[values, positions] = sense(obj, agent, sensingObjective, domain, partitioning);
[value] = sensorPerformance(obj, agentPos, agentPan, agentTilt, targetPos);
[f] = plotParameters(obj);
end
methods (Access = private)
x = distanceMembership(obj, d);
x = tiltMembership(obj, t);
end
end

View File

@@ -0,0 +1,10 @@
function x = tiltMembership(obj, t)
arguments (Input)
obj (1, 1) {mustBeA(obj, 'sigmoidSensor')};
t (:, 1) double; % degrees
end
arguments (Output)
x (:, 1) double;
end
x = (1 ./ (1 + exp(-obj.betaTilt .* (t + obj.alphaTilt)))) - (1 ./ (1 + exp(-obj.betaTilt .* (t - obj.alphaTilt))));
end