lots of cleanup and simplification in test case construction
This commit is contained in:
10
@sigmoidSensor/distanceMembership.m
Normal file
10
@sigmoidSensor/distanceMembership.m
Normal 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
|
||||
17
@sigmoidSensor/initialize.m
Normal file
17
@sigmoidSensor/initialize.m
Normal file
@@ -0,0 +1,17 @@
|
||||
function obj = initialize(obj, alphaDist, betaDist, alphaTilt, betaTilt)
|
||||
arguments (Input)
|
||||
obj (1, 1) {mustBeA(obj, 'sigmoidSensor')}
|
||||
alphaDist (1, 1) double;
|
||||
betaDist (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.alphaTilt = alphaTilt;
|
||||
obj.betaTilt = betaTilt;
|
||||
end
|
||||
42
@sigmoidSensor/plotParameters.m
Normal file
42
@sigmoidSensor/plotParameters.m
Normal 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
|
||||
23
@sigmoidSensor/sensorPerformance.m
Normal file
23
@sigmoidSensor/sensorPerformance.m
Normal file
@@ -0,0 +1,23 @@
|
||||
function value = sensorPerformance(obj, agentPos, targetPos)
|
||||
arguments (Input)
|
||||
obj (1, 1) {mustBeA(obj, 'sigmoidSensor')};
|
||||
agentPos (1, 3) double;
|
||||
targetPos (:, 3) double;
|
||||
end
|
||||
arguments (Output)
|
||||
value (:, 1) double;
|
||||
end
|
||||
|
||||
% compute direct distance and distance projected onto the ground
|
||||
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)
|
||||
|
||||
% compute tilt angle
|
||||
tiltAngle = (180 - atan2d(x, targetPos(:, 3) - agentPos(3))); % 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
|
||||
19
@sigmoidSensor/sigmoidSensor.m
Normal file
19
@sigmoidSensor/sigmoidSensor.m
Normal file
@@ -0,0 +1,19 @@
|
||||
classdef sigmoidSensor
|
||||
properties (SetAccess = private, GetAccess = public)
|
||||
% Sensor parameters
|
||||
alphaDist = NaN;
|
||||
betaDist = NaN;
|
||||
alphaTilt = NaN; % degrees
|
||||
betaTilt = NaN;
|
||||
end
|
||||
|
||||
methods (Access = public)
|
||||
[obj] = initialize(obj, alphaDist, betaDist, alphaTilt, betaTilt);
|
||||
[value] = sensorPerformance(obj, agentPos, agentPan, agentTilt, targetPos);
|
||||
[f] = plotParameters(obj);
|
||||
end
|
||||
methods (Access = private)
|
||||
x = distanceMembership(obj, d);
|
||||
x = tiltMembership(obj, t);
|
||||
end
|
||||
end
|
||||
10
@sigmoidSensor/tiltMembership.m
Normal file
10
@sigmoidSensor/tiltMembership.m
Normal 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
|
||||
Reference in New Issue
Block a user