From 35b15db5d3f760207912c80aa6ebb9b937fd6a3e Mon Sep 17 00:00:00 2001 From: Kevin D Date: Mon, 17 Nov 2025 11:35:48 -0800 Subject: [PATCH] Added plotting of sigmoid sensor parameters --- .../Xa8LYoHW6o1icagNgoJY5eYksJ0d.xml | 6 +++ .../Xa8LYoHW6o1icagNgoJY5eYksJ0p.xml | 2 + .../ryNm0kOvTMRy3DefgdmGp1GqV-Yd.xml | 6 +++ .../ryNm0kOvTMRy3DefgdmGp1GqV-Yp.xml | 2 + .../wiELvAwZYF03DX0eRNI7i1vkqXkd.xml | 6 +++ .../wiELvAwZYF03DX0eRNI7i1vkqXkp.xml | 2 + .../@sigmoidSensor/distanceMembership.m | 10 +++++ sensingModels/@sigmoidSensor/plotParameters.m | 44 +++++++++++++++++++ .../@sigmoidSensor/sensorPerformance.m | 7 ++- sensingModels/@sigmoidSensor/sigmoidSensor.m | 5 +++ sensingModels/@sigmoidSensor/tiltMembership.m | 10 +++++ test/test_sigmoidSensor.m | 3 ++ 12 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/Xa8LYoHW6o1icagNgoJY5eYksJ0d.xml create mode 100644 resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/Xa8LYoHW6o1icagNgoJY5eYksJ0p.xml create mode 100644 resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/ryNm0kOvTMRy3DefgdmGp1GqV-Yd.xml create mode 100644 resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/ryNm0kOvTMRy3DefgdmGp1GqV-Yp.xml create mode 100644 resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/wiELvAwZYF03DX0eRNI7i1vkqXkd.xml create mode 100644 resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/wiELvAwZYF03DX0eRNI7i1vkqXkp.xml create mode 100644 sensingModels/@sigmoidSensor/distanceMembership.m create mode 100644 sensingModels/@sigmoidSensor/plotParameters.m create mode 100644 sensingModels/@sigmoidSensor/tiltMembership.m diff --git a/resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/Xa8LYoHW6o1icagNgoJY5eYksJ0d.xml b/resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/Xa8LYoHW6o1icagNgoJY5eYksJ0d.xml new file mode 100644 index 0000000..99772b4 --- /dev/null +++ b/resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/Xa8LYoHW6o1icagNgoJY5eYksJ0d.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/Xa8LYoHW6o1icagNgoJY5eYksJ0p.xml b/resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/Xa8LYoHW6o1icagNgoJY5eYksJ0p.xml new file mode 100644 index 0000000..a6d7c3c --- /dev/null +++ b/resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/Xa8LYoHW6o1icagNgoJY5eYksJ0p.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/ryNm0kOvTMRy3DefgdmGp1GqV-Yd.xml b/resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/ryNm0kOvTMRy3DefgdmGp1GqV-Yd.xml new file mode 100644 index 0000000..99772b4 --- /dev/null +++ b/resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/ryNm0kOvTMRy3DefgdmGp1GqV-Yd.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/ryNm0kOvTMRy3DefgdmGp1GqV-Yp.xml b/resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/ryNm0kOvTMRy3DefgdmGp1GqV-Yp.xml new file mode 100644 index 0000000..35868a2 --- /dev/null +++ b/resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/ryNm0kOvTMRy3DefgdmGp1GqV-Yp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/wiELvAwZYF03DX0eRNI7i1vkqXkd.xml b/resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/wiELvAwZYF03DX0eRNI7i1vkqXkd.xml new file mode 100644 index 0000000..99772b4 --- /dev/null +++ b/resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/wiELvAwZYF03DX0eRNI7i1vkqXkd.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/wiELvAwZYF03DX0eRNI7i1vkqXkp.xml b/resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/wiELvAwZYF03DX0eRNI7i1vkqXkp.xml new file mode 100644 index 0000000..54fb3b1 --- /dev/null +++ b/resources/project/LMc5a8ETDcRip3rYsQxn56S6obM/wiELvAwZYF03DX0eRNI7i1vkqXkp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/sensingModels/@sigmoidSensor/distanceMembership.m b/sensingModels/@sigmoidSensor/distanceMembership.m new file mode 100644 index 0000000..a36e2cc --- /dev/null +++ b/sensingModels/@sigmoidSensor/distanceMembership.m @@ -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 \ No newline at end of file diff --git a/sensingModels/@sigmoidSensor/plotParameters.m b/sensingModels/@sigmoidSensor/plotParameters.m new file mode 100644 index 0000000..e59f64d --- /dev/null +++ b/sensingModels/@sigmoidSensor/plotParameters.m @@ -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 \ No newline at end of file diff --git a/sensingModels/@sigmoidSensor/sensorPerformance.m b/sensingModels/@sigmoidSensor/sensorPerformance.m index f48ff99..882959c 100644 --- a/sensingModels/@sigmoidSensor/sensorPerformance.m +++ b/sensingModels/@sigmoidSensor/sensorPerformance.m @@ -15,9 +15,8 @@ function value = sensorPerformance(obj, agentPos, agentPan, agentTilt, targetPos tiltAngle = atan2(targetPos(:, 3) - agentPos(3), x) - agentTilt; % Membership functions - mu_d = 1 - (1 ./ (1 + exp(-obj.betaDist .* (d - obj.alphaDist)))); % distance - mu_p = 1; % pan - mu_t = (1 ./ (1 + exp(-obj.betaTilt .* (tiltAngle + obj.alphaTilt)))) - (1 ./ (1 + exp(-obj.betaTilt .* (tiltAngle - obj.alphaTilt)))); % tilt + mu_d = obj.distanceMembership(d); + mu_t = obj.tiltMembership(tiltAngle); - value = mu_d .* mu_p .* mu_t; + value = mu_d .* mu_t; % assume pan membership is always 1 end \ No newline at end of file diff --git a/sensingModels/@sigmoidSensor/sigmoidSensor.m b/sensingModels/@sigmoidSensor/sigmoidSensor.m index 577d12c..ab50816 100644 --- a/sensingModels/@sigmoidSensor/sigmoidSensor.m +++ b/sensingModels/@sigmoidSensor/sigmoidSensor.m @@ -13,5 +13,10 @@ classdef sigmoidSensor [obj] = initialize(obj, alphaDist, betaDist, alphaPan, betaPan, alphaTilt, betaTilt); [values, positions] = sense(obj, agent, sensingObjective, domain, partitioning); [value] = sensorPerformance(obj, agentPos, agentPan, agentTilt, targetPos); + plotParameters(obj); + end + methods (Access = private) + x = distanceMembership(obj, d); + x = tiltMembership(obj, t); end end \ No newline at end of file diff --git a/sensingModels/@sigmoidSensor/tiltMembership.m b/sensingModels/@sigmoidSensor/tiltMembership.m new file mode 100644 index 0000000..0551aa2 --- /dev/null +++ b/sensingModels/@sigmoidSensor/tiltMembership.m @@ -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 \ No newline at end of file diff --git a/test/test_sigmoidSensor.m b/test/test_sigmoidSensor.m index 676aac7..d5e3862 100644 --- a/test/test_sigmoidSensor.m +++ b/test/test_sigmoidSensor.m @@ -34,6 +34,9 @@ classdef test_sigmoidSensor < matlab.unittest.TestCase alphaTilt = deg2rad(15); betaTilt = 3; tc.testClass = tc.testClass.initialize(alphaDist, betaDist, NaN, NaN, alphaTilt, betaTilt); + + % Plot + tc.testClass.plotParameters(); % Performance at current position should be maximized (1) % some wiggle room is needed for certain parameter conditions,