added sensor tilting and rf sensor sim test cases
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
function value = halfAngle(obj)
|
||||
arguments (Input)
|
||||
obj (1, 1) {mustBeA(obj, "sigmoidSensor")};
|
||||
end
|
||||
arguments (Output)
|
||||
value (1, 1) double;
|
||||
end
|
||||
value = obj.alphaTilt;
|
||||
end
|
||||
@@ -1,17 +1,24 @@
|
||||
function obj = initialize(obj, alphaDist, betaDist, alphaTilt, betaTilt)
|
||||
function obj = initialize(obj, alphaDist, betaDist, alphaTilt, betaTilt, tilt, azimuth)
|
||||
arguments (Input)
|
||||
obj (1, 1) {mustBeA(obj, "sigmoidSensor")}
|
||||
alphaDist (1, 1) double;
|
||||
betaDist (1, 1) double;
|
||||
alphaTilt (1, 1) double;
|
||||
betaTilt (1, 1) double;
|
||||
tilt (1, 1) double = 0;
|
||||
azimuth (1, 1) double = 0;
|
||||
end
|
||||
arguments (Output)
|
||||
obj (1, 1) {mustBeA(obj, "sigmoidSensor")}
|
||||
end
|
||||
|
||||
% Sensor performance parameters
|
||||
obj.alphaDist = alphaDist;
|
||||
obj.betaDist = betaDist;
|
||||
obj.alphaTilt = alphaTilt;
|
||||
obj.betaTilt = betaTilt;
|
||||
|
||||
% Sensor pointing parameters
|
||||
obj.tilt = tilt;
|
||||
obj.azimuth = azimuth;
|
||||
end
|
||||
@@ -8,16 +8,20 @@ function value = sensorPerformance(obj, agentPos, targetPos)
|
||||
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)
|
||||
% Unit vectors from agent to each target
|
||||
diffs = targetPos - agentPos;
|
||||
d = vecnorm(diffs, 2, 2);
|
||||
dirs = diffs ./ d;
|
||||
|
||||
% compute tilt angle
|
||||
tiltAngle = (180 - atan2d(x, targetPos(:, 3) - agentPos(3))); % degrees
|
||||
% Boresight unit vector: tilt=0 → nadir [0,0,-1]; azimuth 0=+Y, 90=+X clockwise
|
||||
boresight = [sind(obj.tilt)*sind(obj.azimuth), sind(obj.tilt)*cosd(obj.azimuth), -cosd(obj.tilt)];
|
||||
|
||||
% Angular offset from boresight to each target direction
|
||||
angularOffset = acosd(dirs * boresight');
|
||||
|
||||
% Membership functions
|
||||
mu_d = obj.distanceMembership(d);
|
||||
mu_t = obj.tiltMembership(tiltAngle);
|
||||
mu_t = obj.tiltMembership(angularOffset);
|
||||
|
||||
value = mu_d .* mu_t; % assume pan membership is always 1
|
||||
end
|
||||
@@ -12,8 +12,9 @@ classdef sigmoidSensor
|
||||
end
|
||||
|
||||
methods (Access = public)
|
||||
[obj] = initialize(obj, alphaDist, betaDist, alphaTilt, betaTilt); % initialize sensor, define parameters
|
||||
[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
|
||||
end
|
||||
methods (Access = private)
|
||||
|
||||
Reference in New Issue
Block a user