Added plotting of sigmoid sensor parameters

This commit is contained in:
2025-11-17 11:35:48 -08:00
parent 8b0fc11998
commit bf4fc83749
12 changed files with 99 additions and 4 deletions

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info>
<Category UUID="FileClassCategory">
<Label UUID="design"/>
</Category>
</Info>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="plotParameters.m" type="File"/>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info>
<Category UUID="FileClassCategory">
<Label UUID="design"/>
</Category>
</Info>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="tiltMembership.m" type="File"/>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info>
<Category UUID="FileClassCategory">
<Label UUID="design"/>
</Category>
</Info>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="distanceMembership.m" type="File"/>

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,44 @@
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(deg2rad(t));
% Plot resultant sigmoid curves
f = figure;
tiledlayout(f, 2, 1, "TileSpacing", "tight", "Padding", "compact");
% Distance
nexttile(1, [1, 1]);
grid(f.Children(1).Children(1), "on");
title(f.Children(1).Children(1), "Distance Membership Sigmoid");
xlabel(f.Children(1).Children(1), "Distance (m)");
ylabel(f.Children(1).Children(1), "Membership");
hold(f.Children(1).Children(1), 'on');
plot(f.Children(1).Children(1), d, d_x, 'LineWidth', 2);
hold(f.Children(1).Children(1), 'off');
ylim([0, 1]);
% Tilt
nexttile(2, [1, 1]);
grid(f.Children(1).Children(1), "on");
title(f.Children(1).Children(1), "Tilt Membership Sigmoid");
xlabel(f.Children(1).Children(1), "Tilt (deg)");
ylabel(f.Children(1).Children(1), "Membership");
hold(f.Children(1).Children(1), 'on');
plot(f.Children(1).Children(1), t, t_x, 'LineWidth', 2);
hold(f.Children(1).Children(1), 'off');
keyboard
end

View File

@@ -15,9 +15,8 @@ function value = sensorPerformance(obj, agentPos, agentPan, agentTilt, targetPos
tiltAngle = atan2(targetPos(:, 3) - agentPos(3), x) - agentTilt; tiltAngle = atan2(targetPos(:, 3) - agentPos(3), x) - agentTilt;
% Membership functions % Membership functions
mu_d = 1 - (1 ./ (1 + exp(-obj.betaDist .* (d - obj.alphaDist)))); % distance mu_d = obj.distanceMembership(d);
mu_p = 1; % pan mu_t = obj.tiltMembership(tiltAngle);
mu_t = (1 ./ (1 + exp(-obj.betaTilt .* (tiltAngle + obj.alphaTilt)))) - (1 ./ (1 + exp(-obj.betaTilt .* (tiltAngle - obj.alphaTilt)))); % tilt
value = mu_d .* mu_p .* mu_t; value = mu_d .* mu_t; % assume pan membership is always 1
end end

View File

@@ -13,5 +13,10 @@ classdef sigmoidSensor
[obj] = initialize(obj, alphaDist, betaDist, alphaPan, betaPan, alphaTilt, betaTilt); [obj] = initialize(obj, alphaDist, betaDist, alphaPan, betaPan, alphaTilt, betaTilt);
[values, positions] = sense(obj, agent, sensingObjective, domain, partitioning); [values, positions] = sense(obj, agent, sensingObjective, domain, partitioning);
[value] = sensorPerformance(obj, agentPos, agentPan, agentTilt, targetPos); [value] = sensorPerformance(obj, agentPos, agentPan, agentTilt, targetPos);
plotParameters(obj);
end
methods (Access = private)
x = distanceMembership(obj, d);
x = tiltMembership(obj, t);
end end
end end

View File

@@ -0,0 +1,10 @@
function x = tiltMembership(obj, t)
arguments (Input)
obj (1, 1) {mustBeA(obj, 'sigmoidSensor')};
t (:, 1) double;
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

View File

@@ -34,6 +34,9 @@ classdef test_sigmoidSensor < matlab.unittest.TestCase
alphaTilt = deg2rad(15); alphaTilt = deg2rad(15);
betaTilt = 3; betaTilt = 3;
tc.testClass = tc.testClass.initialize(alphaDist, betaDist, NaN, NaN, alphaTilt, betaTilt); tc.testClass = tc.testClass.initialize(alphaDist, betaDist, NaN, NaN, alphaTilt, betaTilt);
% Plot
tc.testClass.plotParameters();
% Performance at current position should be maximized (1) % Performance at current position should be maximized (1)
% some wiggle room is needed for certain parameter conditions, % some wiggle room is needed for certain parameter conditions,