From 1fa76c70236aa08c7991b3fc60bd8358b36ad787 Mon Sep 17 00:00:00 2001 From: krdee1 Date: Tue, 23 Dec 2025 12:02:40 -0800 Subject: [PATCH] added minimum altitude constraint as obstacle --- @miSim/initialize.m | 9 ++++++++- @miSim/miSim.m | 1 + test/test_miSim.m | 13 +++++++------ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/@miSim/initialize.m b/@miSim/initialize.m index b6568d9..8378812 100644 --- a/@miSim/initialize.m +++ b/@miSim/initialize.m @@ -1,9 +1,10 @@ -function obj = initialize(obj, domain, objective, agents, timestep, partitoningFreq, maxIter, obstacles, makeVideo) +function obj = initialize(obj, domain, objective, agents, minAlt, timestep, partitoningFreq, maxIter, obstacles, makeVideo) arguments (Input) obj (1, 1) {mustBeA(obj, 'miSim')}; domain (1, 1) {mustBeGeometry}; objective (1, 1) {mustBeA(objective, 'sensingObjective')}; agents (:, 1) cell; + minAlt (1, 1) double = 1; timestep (:, 1) double = 0.05; partitoningFreq (:, 1) double = 0.25 maxIter (:, 1) double = 1000; @@ -28,6 +29,12 @@ function obj = initialize(obj, domain, objective, agents, timestep, partitoningF % Add geometries representing obstacles within the domain obj.obstacles = obstacles; + % Add an additional obstacle spanning the domain's footprint to + % represent the minimum allowable altitude + obj.minAlt = minAlt; + obj.obstacles{end + 1} = rectangularPrism; + obj.obstacles{end} = obj.obstacles{end}.initialize([obj.domain.minCorner; obj.domain.maxCorner(1:2), obj.minAlt], "OBSTACLE", "Minimum Altitude Domain Constraint"); + % Define objective obj.objective = objective; diff --git a/@miSim/miSim.m b/@miSim/miSim.m index 2fe9a25..d4bfa7d 100644 --- a/@miSim/miSim.m +++ b/@miSim/miSim.m @@ -15,6 +15,7 @@ classdef miSim partitioning = NaN; performance = 0; % cumulative sensor performance barrierGain = 100; % collision avoidance parameter + minAlt = 1; % minimum allowed altitude constraint fPerf; % performance plot figure end diff --git a/test/test_miSim.m b/test/test_miSim.m index 594b383..4ba39d0 100644 --- a/test/test_miSim.m +++ b/test/test_miSim.m @@ -14,6 +14,7 @@ classdef test_miSim < matlab.unittest.TestCase % Domain domain = rectangularPrism; % domain geometry minDimension = 10; + minAlt = 2; % minimum allowed agent altitude % Obstacles minNumObstacles = 1; % Minimum number of obstacles to be randomly generated @@ -207,7 +208,7 @@ classdef test_miSim < matlab.unittest.TestCase end % Initialize the simulation - tc.testClass = tc.testClass.initialize(tc.domain, tc.domain.objective, tc.agents, tc.timestep, tc.partitoningFreq, tc.maxIter, tc.obstacles, tc.makeVideo); + tc.testClass = tc.testClass.initialize(tc.domain, tc.domain.objective, tc.agents, tc.minAlt, tc.timestep, tc.partitoningFreq, tc.maxIter, tc.obstacles, tc.makeVideo); end function misim_run(tc) % randomly create obstacles @@ -341,7 +342,7 @@ classdef test_miSim < matlab.unittest.TestCase end % Initialize the simulation - tc.testClass = tc.testClass.initialize(tc.domain, tc.domain.objective, tc.agents, tc.timestep, tc.partitoningFreq, tc.maxIter, tc.obstacles, tc.makeVideo); + tc.testClass = tc.testClass.initialize(tc.domain, tc.domain.objective, tc.agents, tc.minAlt, tc.timestep, tc.partitoningFreq, tc.maxIter, tc.obstacles, tc.makeVideo); % Run simulation loop tc.testClass = tc.testClass.run(); @@ -385,7 +386,7 @@ classdef test_miSim < matlab.unittest.TestCase tc.agents{3} = tc.agents{3}.initialize(tc.domain.center + dh - [0, d, 0], zeros(1, 3), 0, 0, geometry3, sensor, @gradientAscent, 3*d, 3, sprintf("Agent %d", 3)); % Initialize the simulation - tc.testClass = tc.testClass.initialize(tc.domain, tc.domain.objective, tc.agents, tc.timestep, tc.partitoningFreq, tc.maxIter, tc.makeVideo); + tc.testClass = tc.testClass.initialize(tc.domain, tc.domain.objective, tc.agents, tc.minAlt, tc.timestep, tc.partitoningFreq, tc.maxIter, tc.makeVideo); close(tc.testClass.fPerf); end function test_single_partition(tc) @@ -415,7 +416,7 @@ classdef test_miSim < matlab.unittest.TestCase tc.agents{1} = tc.agents{1}.initialize([tc.domain.center(1:2), 3], zeros(1,3), 0, 0, geometry1, sensor, @gradientAscent, 3, 1, sprintf("Agent %d", 1)); % Initialize the simulation - tc.testClass = tc.testClass.initialize(tc.domain, tc.domain.objective, tc.agents, tc.timestep, tc.partitoningFreq, tc.maxIter, tc.makeVideo); + tc.testClass = tc.testClass.initialize(tc.domain, tc.domain.objective, tc.agents, tc.minAlt, tc.timestep, tc.partitoningFreq, tc.maxIter, tc.makeVideo); close(tc.testClass.fPerf); end function test_single_partition_basic_GA(tc) @@ -445,7 +446,7 @@ classdef test_miSim < matlab.unittest.TestCase tc.agents{1} = tc.agents{1}.initialize([tc.domain.center(1:2)-tc.domain.dimensions(1)/3, 3], zeros(1,3), 0, 0, geometry1, sensor, @gradientAscent, 3, 1, sprintf("Agent %d", 1), true); % Initialize the simulation - tc.testClass = tc.testClass.initialize(tc.domain, tc.domain.objective, tc.agents, tc.timestep, tc.partitoningFreq, tc.maxIter, tc.makeVideo); + tc.testClass = tc.testClass.initialize(tc.domain, tc.domain.objective, tc.agents, tc.minAlt, tc.timestep, tc.partitoningFreq, tc.maxIter, tc.makeVideo); % Run the simulation tc.testClass.run(); @@ -485,7 +486,7 @@ classdef test_miSim < matlab.unittest.TestCase tc.agents{2} = tc.agents{2}.initialize(tc.domain.center - d, zeros(1,3), 0, 0, geometry2, sensor, @gradientAscent, 3, 2, sprintf("Agent %d", 2)); % Initialize the simulation - tc.testClass = tc.testClass.initialize(tc.domain, tc.domain.objective, tc.agents, tc.timestep, tc.partitoningFreq, tc.maxIter, tc.makeVideo); + tc.testClass = tc.testClass.initialize(tc.domain, tc.domain.objective, tc.agents, tc.minAlt, tc.timestep, tc.partitoningFreq, tc.maxIter, tc.makeVideo); % Run the simulation tc.testClass.run();