diff --git a/@sigmoidSensor/plotParameters.m b/@sigmoidSensor/plotParameters.m index e0f379c..757e630 100644 --- a/@sigmoidSensor/plotParameters.m +++ b/@sigmoidSensor/plotParameters.m @@ -1,22 +1,32 @@ -function f = plotParameters(obj) +function f = plotParameters(obj, f) arguments (Input) obj (1, 1) {mustBeA(obj, "sigmoidSensor")}; + f (1, 1) {mustBeA(f, "matlab.ui.Figure")} = figure; 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; + d = 0:(obj.alphaDist / 1000):(2*obj.alphaDist); + t = -90:0.1:90; % Sample membership functions d_x = obj.distanceMembership(d); t_x = obj.tiltMembership(t); + % pad ends of sampled results with zeros at +/- some big number + big = 1e6 * max(d); + d = [-big, d, big]; + t = [-big, t, big]; + d_x = [0, d_x', 0]; + t_x = [0, t_x', 0]; + % Plot resultant sigmoid curves - f = figure; - tiledlayout(f, 2, 1, "TileSpacing", "tight", "Padding", "compact"); + hold(gca(f), "on"); + if isempty(gca(f).Children) + tiledlayout(f, 2, 1, "TileSpacing", "tight", "Padding", "compact"); + end % Distance nexttile(1, [1, 1]); @@ -24,19 +34,35 @@ function f = plotParameters(obj) title("Distance Membership Sigmoid"); xlabel("Distance (m)"); ylabel("Membership"); + ld = legend(); hold("on"); plot(d, d_x, "LineWidth", 2); hold("off"); + xData = cell2mat(arrayfun(@(x) x.XData(2:(end - 1)), f.Children.Children(end).Children, 'UniformOutput', false)); + xlim([min(xData, [], "all"), max(xData, [], "all")]); ylim([0, 1]); - + % Tilt nexttile(2, [1, 1]); grid("on"); title("Tilt Membership Sigmoid"); xlabel("Tilt (deg)"); ylabel("Membership"); + lt = legend(); hold("on"); plot(t, t_x, "LineWidth", 2); hold("off"); + xlim([-90, 90]); ylim([0, 1]); + + % add legends + nexttile(1, [1, 1]); + f.Children.Children(3).String{end} = sprintf("Sensor %d", length(f.Children.Children(end).Children)); + f.Children.Children(1).String{end} = sprintf("Sensor %d", length(f.Children.Children(end).Children)); + + nexttile(2, [1, 1]); + f.Children.Children(3).String{end} = sprintf("Sensor %d", length(f.Children.Children(end).Children)); + f.Children.Children(1).String{end} = sprintf("Sensor %d", length(f.Children.Children(end).Children)); + + hold(gca(f), "off"); end \ No newline at end of file diff --git a/@sigmoidSensor/sigmoidSensor.m b/@sigmoidSensor/sigmoidSensor.m index a6fac33..05e9c73 100644 --- a/@sigmoidSensor/sigmoidSensor.m +++ b/@sigmoidSensor/sigmoidSensor.m @@ -16,7 +16,7 @@ classdef sigmoidSensor [obj] = initialize(obj, alphaDist, betaDist, alphaTilt, betaTilt, tilt, azimuth); % initialize sensor, define parameters [value] = sensorPerformance(obj, agentPos, targetPos); % determine sensor performance for a given single sensor and target geometry [value] = halfAngle(obj); % tilt angle (deg) at which sensor performance is halved - [f] = plotParameters(obj); % debug, plot sensor response as a function of distance and tilt angle + [f] = plotParameters(obj, f); % debug, plot sensor response as a function of distance and tilt angle end methods (Access = private) x = distanceMembership(obj, d); % used in computing distance factor of sensor performance diff --git a/test/test_sigmoidSensor.m b/test/test_sigmoidSensor.m index 523be69..1e6dade 100644 --- a/test/test_sigmoidSensor.m +++ b/test/test_sigmoidSensor.m @@ -57,6 +57,23 @@ classdef test_sigmoidSensor < matlab.unittest.TestCase % Performance at great tilt should be 0 tc.verifyEqual(tc.testClass.sensorPerformance([0, 0, h], [5, 5, 0]), 0, "AbsTol", 1e-9); end + function test_thesis_graphic(tc) + s = [sigmoidSensor, sigmoidSensor]; + + alphaDist = [2, 8]; + betaDist = [25, 1]; + alphaTilt = [50, 15]; % degrees + betaTilt = [0.2, 3]; + + s(1) = s(1).initialize(alphaDist(1), betaDist(1), alphaTilt(1), betaTilt(1)); + s(2) = s(2).initialize(alphaDist(2), betaDist(2), alphaTilt(2), betaTilt(2)); + + % Plot + f = s(1).plotParameters; + f = s(2).plotParameters(f); + + legend(["Sensor 1"; "Sensor 2"]); + end end end \ No newline at end of file