From 771575560f3d75377e8b52fdfacd52ccc1a82da8 Mon Sep 17 00:00:00 2001 From: Kevin D Date: Fri, 13 Mar 2026 16:18:12 -0700 Subject: [PATCH] added static network option --- @miSim/initialize.m | 12 +++++++++--- @miSim/initializeFromCsv.m | 7 ++++++- @miSim/miSim.m | 1 + @miSim/run.m | 4 +++- @miSim/teardown.m | 4 +++- aerpaw/config/scenario.csv | 4 ++-- test/parametricTestSuite.m | 2 +- 7 files changed, 25 insertions(+), 9 deletions(-) diff --git a/@miSim/initialize.m b/@miSim/initialize.m index 6f4c460..f50798e 100644 --- a/@miSim/initialize.m +++ b/@miSim/initialize.m @@ -1,4 +1,4 @@ -function [obj] = initialize(obj, domain, agents, barrierGain, barrierExponent, minAlt, timestep, maxIter, obstacles, makePlots, makeVideo, useDoubleIntegrator, dampingCoeff) +function [obj] = initialize(obj, domain, agents, barrierGain, barrierExponent, minAlt, timestep, maxIter, obstacles, makePlots, makeVideo, useDoubleIntegrator, dampingCoeff, useFixedTopology) arguments (Input) obj (1, 1) {mustBeA(obj, "miSim")}; domain (1, 1) {mustBeGeometry}; @@ -13,6 +13,7 @@ function [obj] = initialize(obj, domain, agents, barrierGain, barrierExponent, m makeVideo (1, 1) logical = true; useDoubleIntegrator (1, 1) logical = false; dampingCoeff (1, 1) double = 2.0; + useFixedTopology (1, 1) logical = false; end arguments (Output) obj (1, 1) {mustBeA(obj, "miSim")}; @@ -91,10 +92,15 @@ function [obj] = initialize(obj, domain, agents, barrierGain, barrierExponent, m % Set dynamics model obj.useDoubleIntegrator = useDoubleIntegrator; obj.dampingCoeff = dampingCoeff; + obj.useFixedTopology = useFixedTopology; - % Compute adjacency matrix and lesser neighbors + % Compute adjacency matrix and network topology obj = obj.updateAdjacency(); - obj = obj.lesserNeighbor(); + if obj.useFixedTopology + obj.constraintAdjacencyMatrix = obj.adjacency; + else + obj = obj.lesserNeighbor(); + end % Set up times to iterate over obj.times = linspace(0, obj.timestep * obj.maxIter, obj.maxIter+1)'; diff --git a/@miSim/initializeFromCsv.m b/@miSim/initializeFromCsv.m index 682ae64..e787bf0 100644 --- a/@miSim/initializeFromCsv.m +++ b/@miSim/initializeFromCsv.m @@ -90,6 +90,11 @@ if isfield(scenario, 'dampingCoeff') else DAMPING_COEFF = 2.0; end +if isfield(scenario, 'useFixedTopology') + USE_FIXED_TOPOLOGY = logical(scenario.useFixedTopology); +else + USE_FIXED_TOPOLOGY = false; +end % ---- Build domain -------------------------------------------------------- dom = rectangularPrism; @@ -137,6 +142,6 @@ end % ---- Initialise simulation (plots and video disabled) -------------------- obj = obj.initialize(dom, agentList, BARRIER_GAIN, BARRIER_EXPONENT, ... MIN_ALT, TIMESTEP, MAX_ITER, obstacleList, false, false, ... - USE_DOUBLE_INTEGRATOR, DAMPING_COEFF); + USE_DOUBLE_INTEGRATOR, DAMPING_COEFF, USE_FIXED_TOPOLOGY); end diff --git a/@miSim/miSim.m b/@miSim/miSim.m index 769cc2c..3432e90 100644 --- a/@miSim/miSim.m +++ b/@miSim/miSim.m @@ -20,6 +20,7 @@ classdef miSim minAlt = 0; % minimum allowable altitude (m) useDoubleIntegrator = false; % false = single-integrator, true = double-integrator dynamics dampingCoeff = 2.0; % velocity-proportional damping for double-integrator mode + useFixedTopology = false; % false = lesser neighbor (dynamic), true = fixed initial topology artifactName = ""; f; % main plotting tiled layout figure fPerf; % performance plot figure diff --git a/@miSim/run.m b/@miSim/run.m index ae5b734..5fb8658 100644 --- a/@miSim/run.m +++ b/@miSim/run.m @@ -30,7 +30,9 @@ function [obj] = run(obj) obj.partitioning = obj.agents{1}.partition(obj.agents, obj.domain.objective); % Determine desired communications links - obj = obj.lesserNeighbor(); + if ~obj.useFixedTopology + obj = obj.lesserNeighbor(); + end % Moving % Iterate over agents to simulate their unconstrained motion diff --git a/@miSim/teardown.m b/@miSim/teardown.m index 358f62b..f4c26d0 100644 --- a/@miSim/teardown.m +++ b/@miSim/teardown.m @@ -13,12 +13,13 @@ function obj = teardown(obj) % Log results into matfile histPath = fullfile(matlab.project.rootProject().RootFolder, "sandbox", strcat(obj.artifactName, "_miSimHist.mat")); - out = struct("agent", repmat(struct("pos", [], "vel", [], "perf", [], "sensor", struct("alphaDist", [], "betaDist", [], "alphaTilt", [], "betaTilt", []), "collisionRadius", [], "commsRadius", []), size(obj.agents)), "perf", [], "barriers", [], "useDoubleIntegrator", [], "dampingCoeff", []); + out = struct("agent", repmat(struct("pos", [], "vel", [], "perf", [], "sensor", struct("alphaDist", [], "betaDist", [], "alphaTilt", [], "betaTilt", []), "collisionRadius", [], "commsRadius", []), size(obj.agents)), "perf", [], "barriers", [], "useDoubleIntegrator", [], "dampingCoeff", [], "useFixedTopology", []); out.perf = obj.performance(1:(end - 1)); out.barriers = [zeros(size(obj.barriers(1:end, 1), 1), 1), obj.barriers(1:end, 1:(end - 1))]; out.dampingCoeff = obj.dampingCoeff; out.useDoubleIntegrator = obj.useDoubleIntegrator; + out.useFixedTopology = obj.useFixedTopology; for ii = 1:size(obj.agents, 1) out.agent(ii).pos = squeeze(obj.posHist(ii, 1:(end - 1), 1:3)); out.agent(ii).vel = squeeze(obj.velHist(ii, 1:(end - 1), 1:3)); @@ -49,6 +50,7 @@ function obj = teardown(obj) obj.barrierExponent = NaN; obj.useDoubleIntegrator = false; obj.dampingCoeff = 2.0; + obj.useFixedTopology = false; obj.artifactName = ""; end \ No newline at end of file diff --git a/aerpaw/config/scenario.csv b/aerpaw/config/scenario.csv index cd244c6..9e6242d 100644 --- a/aerpaw/config/scenario.csv +++ b/aerpaw/config/scenario.csv @@ -1,2 +1,2 @@ -timestep, maxIter, minAlt, discretizationStep, protectedRange, initialStepSize, barrierGain, barrierExponent, collisionRadius, comRange, alphaDist, betaDist, alphaTilt, betaTilt, domainMin, domainMax, objectivePos, objectiveVar, sensorPerformanceMinimum, initialPositions, numObstacles, obstacleMin, obstacleMax, useDoubleIntegrator, dampingCoeff -5, 100, 30.0, 0.1, 2.0, 2.0, 100, 3, "5.0, 5.0", "25.0, 25.0", "80.0, 80.0", "0.25, 0.25", "5.0, 5.0", "0.1, 0.1", "0.0, 0.0, 0.0", "80.0, 80.0, 80.0", "55.0, 55.0", "40, 25, 25, 40", 0.15, "15.0, 10.0, 40.0, 5.0, 10.0, 45.0", 1, "1.0, 25.0, 0.0", "30.0, 30.0, 50.0", 1, 2.0 \ No newline at end of file +timestep, maxIter, minAlt, discretizationStep, protectedRange, initialStepSize, barrierGain, barrierExponent, collisionRadius, comRange, alphaDist, betaDist, alphaTilt, betaTilt, domainMin, domainMax, objectivePos, objectiveVar, sensorPerformanceMinimum, initialPositions, numObstacles, obstacleMin, obstacleMax, useDoubleIntegrator, dampingCoeff, useFixedTopology +5, 100, 30.0, 0.1, 2.0, 2.0, 100, 3, "5.0, 5.0", "25.0, 25.0", "80.0, 80.0", "0.25, 0.25", "5.0, 5.0", "0.1, 0.1", "0.0, 0.0, 0.0", "80.0, 80.0, 80.0", "55.0, 55.0", "40, 25, 25, 40", 0.15, "15.0, 10.0, 40.0, 5.0, 10.0, 45.0", 1, "1.0, 25.0, 0.0", "30.0, 30.0, 50.0", 1, 2.0, 0 \ No newline at end of file diff --git a/test/parametricTestSuite.m b/test/parametricTestSuite.m index cf8e8fb..d714c0a 100644 --- a/test/parametricTestSuite.m +++ b/test/parametricTestSuite.m @@ -57,7 +57,7 @@ classdef parametricTestSuite < matlab.unittest.TestCase end % Set up simulation - tc.testClass = tc.testClass.initialize(tc.domain, agents, params.barrierGain, params.barrierExponent, params.minAlt, params.timestep, params.maxIter, obstacles, tc.makePlots, tc.makeVideo, logical(params.useDoubleIntegrator), params.dampingCoeff); + tc.testClass = tc.testClass.initialize(tc.domain, agents, params.barrierGain, params.barrierExponent, params.minAlt, params.timestep, params.maxIter, obstacles, tc.makePlots, tc.makeVideo, logical(params.useDoubleIntegrator), params.dampingCoeff, logical(params.useFixedTopology)); % Save simulation parameters to output file tc.testClass.writeInits();