Этот пример показывает, как настроить нечеткую систему вывода (FIS) с помощью пользовательской функции стоимости. Пример требует программного обеспечения Global Optimization Toolbox™.
Вы используете пользовательскую функцию стоимости, чтобы изучить навигацию робота в среде симуляции. Цель задачи навигации состоит в том, чтобы достигнуть заданной цели при предотвращении препятствий. Направление к цели представлено как модульный вектор силы () направленный от робота до целевого местоположения. Направление предотвращения препятствия представлено модульным вектором силы () направленный к роботу от самого близкого местоположения препятствия.
Робот, цель и препятствие показываются кругами с радиусом на 0,5 м в среде симуляции на 25 м x 25 м. Задача навигации состоит в том, чтобы объединиться, сила векторизовала таким образом что направление из результирующего вектора силы обеспечивает направление без коллизий для робота.
, где
Этот пример принимает робота с дифференциальной кинематикой для симуляции. Другими словами, робот может вращаться на его центре без любых ограничений. Однако, чтобы избежать крутых поворотов, изменение на временной шаг в направлении робота ограничивается . Поэтому, если текущее направление заголовка робота , следующее направление заголовка вычисляется как:
.
Вес из вектора силы вычисляется с помощью функции :
где
отношение расстояния робота к препятствию () и робот, чтобы предназначаться для расстояния ()
абсолютная разность между целью и направлениями препятствия относительно робота
Достигнуть задачи навигации, функции должен сгенерировать высоко значения, то есть, особое внимание при предотвращении препятствия, когда:
И цель и направления препятствия от робота подобны ( является низким),
Препятствие ближе к роботу, чем цель ( является низким).
В противном случае, должен сгенерировать низко значения, то есть, особое внимание при достижении цели.
Цель этого примера состоит в том, чтобы разработать FIS, который изучает нечеткие правила и оптимизирует параметры FIS, чтобы смоделировать функцию для навигации робота без коллизий в среде симуляции.
Предположения
Следующие предположения применяются к симуляции робота:
Робот может отлично локализовать в среде симуляции; то есть, робот знает свое текущее положение в среде симуляции.
Робот оборудован совершенными датчиками, чтобы идентифицировать препятствие и определить его местоположение.
Робот не имеет никаких динамических ограничений; то есть, робот может вращаться и переместиться, как управляется без любых механических ограничений. Чтобы избежать крутых поворотов, мягкое ограничение наложено на вращение, которое ограничивает изменение на временной шаг в роботе, направляющемся в .
Робот запускается с фиксированной скоростью. Можно включать дополнительные нечеткие системы, чтобы контролировать скорость робота. Для простоты этот пример использует фиксированную скорость для робота.
К образцовой функции , создайте FIS как показано в следующей фигуре. В данном примере используйте Mamdani FIS.
fisin = mamfis;
Добавьте следующие два входных параметров как показано в предыдущей фигуре.
— Отношение расстояний, робот к препятствию / робот к цели
— Различие между целью и направлениями препятствия
Установите область значений первого входа к [0,2]
, который указывает на это способствует предотвращению препятствия, когда расстояние препятствия меньше чем или равно дважды целевому расстоянию.
Установите область значений второго входа к [0,pi/2]
, который указывает на это способствует предотвращению препятствия, когда различие между целью и направлениями препятствия меньше чем или равно pi/2
.
fisin = addInput(fisin,[0 2],'Name','alpha'); fisin = addInput(fisin,[0 pi/2],'Name','theta_t_o');
Чтобы минимизировать количество правил, которое соответствует количеству комбинаций входных функций принадлежности, добавляют, две функции принадлежности (MFS) к каждому входу. Чтобы сгенерировать подобные значения членства вне входных диапазонов, используйте zmf
(Z-образная функция принадлежности кривой) и smf
(S-образная функция принадлежности кривой) MFS. Настраивающий процесс оптимизирует значения параметров входа MF.
Добавьте функции принадлежности в первый вход.
fisin = addMF(fisin,'alpha','zmf',[0 2],'Name','low'); fisin = addMF(fisin,'alpha','smf',[0 2],'Name','high');
Добавьте функции принадлежности во второй вход.
fisin = addMF(fisin,'theta_t_o','zmf',[0 pi/2],'Name','low'); fisin = addMF(fisin,'theta_t_o','smf',[0 pi/2],'Name','high');
Добавьте вывод в FIS или силу препятствия векторный вес, ограничив значения веса областью значений [0,1]
.
fisin = addOutput(fisin,[0 1],'Name','w');
Добавьте два MFS в вывод. Можно добавить больше MFS в вывод для более прекрасной гранулярности выходных значений. Однако выполнение так увеличивает число настраивающихся параметров. Вывод MFs также использует zmf
и smf
, чтобы сгенерировать подобные значения членства вне входных диапазонов. Настраивающий процесс оптимизирует значения параметров вывода MF.
fisin = addMF(fisin,'w','zmf',[0 1],'Name','low'); fisin = addMF(fisin,'w','smf',[0 1],'Name','high');
Просмотрите структуру FIS. Первоначально, FIS имеет нулевые правила. Настраивающий процесс находит правила для нечеткой системы.
figure plotfis(fisin)
Поскольку у вас нет данных тренировки для этого примера, вы моделируете навигацию робота с помощью пользовательской функции стоимости. Настраивающий процесс использует эту пользовательскую функцию стоимости при оптимизации параметров FIS.
Для оптимизации параметров управления получите установки параметров из FIS.
[in,out] = getTunableSettings(fisin);
Затем, создайте настраивающиеся опции с набором OptimizationType
к learning
. Этот пример использует генетический алгоритм (ga
) метод оптимизации для настраивающего процесса. Чтобы улучшить скорость настраивающего процесса, установите опцию UseParallel
на true
, который требует программного обеспечения Parallel Computing Toolbox™. Если у вас нет программного обеспечения Parallel Computing Toolbox, установите UseParallel
на false
.
options = tunefisOptions('Method','ga','OptimizationType','learning');
Установите численность населения генетического алгоритма для 200. Большая численность населения увеличивает вероятность генерации лучшего решения в меньшем количестве поколений.
options.MethodOptions.PopulationSize = 200;
Определите максимальный номер поколений к 25. Чтобы настроить параметры далее, можно определить более высокий номер поколений. Однако выполнение так увеличивает длительность настраивающего процесса и может сверхнастроить значения параметров.
options.MethodOptions.MaxGenerations = 25;
Установите местоположения препятствия, цели и робота для учебных сред. Установите первоначальный заголовок робота к pi/2
для учебной среды. Чтобы изучить навигацию и с и без предотвращения препятствия на пути к целевому местоположению, используйте две учебных задачи с различными местоположениями препятствия.
trnObstacle = [3 12;13 18]; trnTarget = [13 22;13 22]; trnRobot = [13 2 pi/2;13 2 pi/2;]; showSimulationEnvironmentsForTraining(trnObstacle,trnTarget,trnRobot)
Задайте пользовательскую функцию стоимости с помощью указателя на функцию.
costFunction = @(fis)navigationCostFcn(fis,trnObstacle,trnTarget,trnRobot);
В функции стоимости навигация робота моделируется в учебных средах с помощью каждого FIS от генеральной совокупности. Каждая задача навигации запущена для 100 итераций, где каждая итерация эквивалентна циклу решения длины 1 с. Робот использует фиксированную скорость 0,5 м/с в задаче навигации. Для получения дополнительной информации симуляции смотрите, что getNavigationResults
функционирует.
function cost = navigationCostFcn(fis,obstacle,target,robot)
cost = 0;
for i = 1:size(obstacle,1)
results = getNavigationResults(fis,obstacle(i,:),target(i,:),robot(i,:));
cost = cost + getNavigationCost(results);
end
end
Стоимость каждой задачи навигации является общим расстоянием, путешествовавшим роботом. Если робот не достигает цели или сталкивается с препятствием, дорогостоящее значение (200) присвоено для симуляции.
function cost = getNavigationCost(results)
if results.notSafe || ~results.reachedTarget
cost = 200;
else
cost = results.travelledDistance;
end
end
Поскольку оптимизация генетического алгоритма использует случайный поиск, чтобы получить восстанавливаемые результаты, инициализировать генератор случайных чисел к его настройке по умолчанию.
rng('default')
Изучение правил с помощью функции tunefis
занимает приблизительно 10 минут. В данном примере позвольте настроиться установкой runtunefis
на true
. Чтобы загрузить предварительно обученные результаты, не запуская tunefis
, можно установить runtunefis
на false
.
runtunefis = true;
Настройте FIS использование заданных учебных сред и настройка опций.
if runtunefis fisout = tunefis(fisin,[in;out],costFunction,options); else tunedfis = load('tunedfisnavigation.mat'); %#ok<UNRCH> fisout = tunedfis.fisout; end
Best Mean Stall Generation Func-count f(x) f(x) Generations 1 400 219.5 389.5 0 2 600 219.5 368.4 1 3 800 49.5 350.3 0 4 1000 48.5 322.7 0 5 1200 48.5 289 1 6 1400 45.5 259.8 0 7 1600 40.5 243.1 0 8 1800 40.5 224.3 1 9 2000 40 205.5 0 10 2200 40 187 1 11 2400 40 176.1 2 12 2600 40 180.8 0 13 2800 40 189.3 1 14 3000 40 167.5 2 15 3200 39.5 167 0 16 3400 39.5 137.4 1 17 3600 39.5 125.5 2 18 3800 39.5 109.9 3 19 4000 39.5 92.45 0 20 4200 39.5 95.89 1 21 4400 39.5 96.73 0 22 4600 39.5 95.67 1 23 4800 39.5 110 2 24 5000 39.5 107.4 3 25 5200 39.5 100.2 0 Optimization terminated: maximum number of generations exceeded.
Настроенный FIS производит следующие траектории робота в средах симуляции.
showNavigationTrajectories(fisout,trnObstacle,trnTarget,trnRobot)
В первом случае робот достигает цели с минимальным расстоянием, поскольку препятствие не находится на пути к цели. Во втором случае робот успешно избегает препятствия и достигает цели.
Просмотрите структуру настроенного FIS, fisout
.
figure,plotfis(fisout)
Настраивающий процесс производит набор новых правил для FIS.
fisout.Rules
ans = 1×5 fisrule array with properties: Description Antecedent Consequent Weight Connection Details: Description ____________________________________________ 1 "alpha==low & theta_t_o==high => w=low (1)" 2 "alpha==low & theta_t_o==low => w=high (1)" 3 "theta_t_o==high => w=low (1)" 4 "alpha==high & theta_t_o==high => w=low (1)" 5 "alpha==low => w=low (1)"
Правила описаны можно следующим образом относительно ожидаемых поведений :
Правило 1 сопоставимо с ожидаемым поведением . Когда препятствие не расположено перед роботом на пути к цели ( высоко), и препятствие близко ( является низким), это правило производит низкие значения веса.
Правило 4 также сопоставимо с ожидаемым поведением . Когда препятствие не расположено перед роботом на пути к цели ( высоко), и препятствие более далеко ( высоко), это правило производит низкие значения веса.
Правило 3 генерирует низкие значения веса, когда препятствие не расположено перед роботом ( высоко), независимо от расстояния препятствия. Это правило касается условий и для правила 1 и для правила 4. Поэтому правила 1 и 4 избыточны и могут быть удалены.
Правило 2 также сопоставимо с ожидаемым поведением . Когда препятствие близко к роботу ( является низким), и расположен перед роботом на пути к цели ( является низким), это правило производит высокие значения веса для задачи предотвращения препятствия.
Правило 5 генерирует низкие значения веса, когда расстояние препятствия является низким. Это правило противоречит правилу 2 когда является низким. В этом случае вывод правила 5 не способствует окончательному результату из-за значений высокой производительности правила 2. Поэтому правило 5 может также быть удалено.
Удалите избыточные правила.
fisoutpruned = fisout; fisoutpruned.Rules([1 4 5]) = []; fisoutpruned.Rules
ans = 1×2 fisrule array with properties: Description Antecedent Consequent Weight Connection Details: Description ___________________________________________ 1 "alpha==low & theta_t_o==low => w=high (1)" 2 "theta_t_o==high => w=low (1)"
fisout
и fisoutpruned
генерируют подобные поверхности управления. Поэтому только два правила необходимы для предотвращения препятствия в среде симуляции.
figure subplot(1,2,1) gensurf(fisout) title('Output surface of fisout') subplot(1,2,2) gensurf(fisoutpruned) title('Output surface of fisoutpruned')
Подтвердите производительность настроенного FIS с различными положениями препятствия, робота и цели. В следующих случаях валидации робот успешно избегает препятствия, чтобы достигнуть целевого положения с помощью настроенного FIS.
vldObstacle = [13 5;10 10;8 8]; vldRobot = [5 12 0;5 20 -pi/2;19 19 -pi]; vldTarget = [23 12;15 4;5 5]; showNavigationTrajectories(fisoutpruned,vldObstacle,vldTarget,vldRobot)
Этот пример использует пользовательскую функцию стоимости, которая моделирует навигацию робота в различных учебных средах, чтобы изучить нечеткие правила и оптимизировать значения параметров FIS для навигации без коллизий. Можно Включать больше учебных сред, чтобы изучить предотвращение препятствия в других сценариях, например, узкий коридор и препятствия U-формы. В этих сценариях роботу, возможно, понадобятся дополнительные подзадачи навигации, такие как стена после и подцель (промежуточный ориентир) достижение, для успешной навигации без коллизий к цели. Сложные среды также требуют дополнительных условий в расчете стоимости для безопасности плавания. Например, в узком коридоре робот должен остаться в середине; то есть, расстояния до препятствий слева и права должны быть тем же самым.
Используя пользовательскую функцию стоимости с tunefis
обеспечивает гибкость симуляции пользовательской системы с пользовательским расчетом стоимости. Однако компромисс является долгим настраивающим процессом из-за количества требуемых симуляций (для каждого набора оптимизированных значений параметров). Поэтому, если это возможно, чтобы ускорить настраивающий процесс, данные тренировки использования. Например, настраивающий процесс в этом примере запустился бы быстрее, если бы данные о решении ввода/вывода человеческого оператора были доступны для настройки FIS.
function showSimulationEnvironment(obstacle,target,robot,navigationResults) % Show the robot trajectory in the simulation environment. % Radius of the robot, target, and obstacle. radius = 1; % 1m % Use 25mx25m simulation environment. axis([0 25 0 25]); % Set equal aspect ratio. pbaspect([1 1 1]) % Temporary plots to enable legends. hold on plot(robot(1),robot(2)+radius,'ob','LineWidth',radius*1,'MarkerFaceColor','b') plot(robot(1),robot(2)+radius,'or','LineWidth',radius*1,'MarkerFaceColor','r') plot(robot(1),robot(2)+radius,'og','LineWidth',radius*1,'MarkerFaceColor','g') hold off % Draw obstacle. rectangle('Position',[obstacle(1)-0.5*radius obstacle(2)+0.5*radius radius radius],'Curvature',[1 1], ... 'FaceColor','b','EdgeColor','b') % Draw target. rectangle('Position',[target(1)-0.5*radius target(2)+0.5*radius radius radius],'Curvature',[1 1], ... 'FaceColor','r','EdgeColor','r') % Draw robot. rectangle('Position',[robot(1)-0.5*radius robot(2)+0.5*radius radius radius],'Curvature',[1 1], ... 'FaceColor','g','EdgeColor','g') % Add labels, title, and legends. xlabel('x (m)'),ylabel('y (m)') title('Simulation Environment for Robot Navigation') legend(["Obstacle" "Target" "Robot"]) % Plot the robot trajectory if specified. if nargin == 4 x = navigationResults.x; y = navigationResults.y; for i = 1:numel(x) rectangle('Position',[x(i)-0.5*radius y(i)+0.5*radius radius radius], ... 'Curvature',[1 1],'FaceColor','g','EdgeColor','g') end end end function showSimulationEnvironmentsForTraining(obstacle,target,robot) % Show simulation environments for training. drawEnvironmentAndShowTrajectory(obstacle,target,robot,'Training Task') end function showNavigationTrajectories(fis,obstacle,target,robot) % Show robot trajectories in the simulation environments. drawEnvironmentAndShowTrajectory(obstacle,target,robot,'Navigation Task',fis) end function drawEnvironmentAndShowTrajectory(obstacle,target,robot,plotTitle,varargin) % Expand figure horizontally to tile the simulation environments. h = figure; h.Position = [h.Position(1:2) 3*h.Position(3) h.Position(4)]; numTasks = size(target,1); % Draw each simulation environment. for i = 1:numTasks o = obstacle(i,:); t = target(i,:); r = robot(i,:); subplot(1,numTasks,i) if ~isempty(varargin) results = getNavigationResults(varargin{1},o,t,r); showSimulationEnvironment(o,t,r,results) else showSimulationEnvironment(o,t,r) end title([plotTitle ': ' num2str(i)]) end end
getTunableSettings
| mamfis
| tunefis