Настройте Нечеткие Системы с помощью Пользовательской Функции стоимости

Этот пример показывает, как настроить нечеткую систему вывода (FIS) с помощью пользовательской функции стоимости. Пример требует программного обеспечения Global Optimization Toolbox™.

Описание проблемы

Вы используете пользовательскую функцию стоимости, чтобы изучить навигацию робота в среде симуляции. Цель задачи навигации состоит в том, чтобы достигнуть заданной цели при предотвращении препятствий. Направление к цели представлено как модульный вектор силы (Ft) направленный от робота до целевого местоположения. Направление предотвращения препятствия представлено модульным вектором силы (Fo) направленный к роботу от самого близкого местоположения препятствия.

Робот, цель и препятствие показываются кругами с радиусом на 0,5 м в среде симуляции на 25 м x 25 м. Задача навигации состоит в том, чтобы объединиться, сила векторизовала таким образом что направление θ из результирующего вектора силы F обеспечивает направление без коллизий для робота.

F=wFo+(1-w)Ft, где 0w1

θ=F

Этот пример принимает робота с дифференциальной кинематикой для симуляции. Другими словами, робот может вращаться на его центре без любых ограничений. Однако, чтобы избежать крутых поворотов, изменение на временной шаг в направлении робота ограничивается [-π4,π4]. Поэтому, если текущее направление заголовка робота θr(k), следующее направление заголовка вычисляется как:

θr(k+1)=θr(k)+min(max (θ-θr(k),π4),-π4).

Вес w из вектора силы Fo вычисляется с помощью функции fw:

w=fw(α,θt,o)

где

  • α=dodt отношение расстояния робота к препятствию (do) и робот, чтобы предназначаться для расстояния (dt)

  • θt,o абсолютная разность между целью и направлениями препятствия относительно робота

Достигнуть задачи навигации, функции fw должен сгенерировать высоко w значения, то есть, особое внимание при предотвращении препятствия, когда:

  • И цель и направления препятствия от робота подобны (θt,o является низким),

  • Препятствие ближе к роботу, чем цель (α является низким).

В противном случае, fw должен сгенерировать низко w значения, то есть, особое внимание при достижении цели.

Цель этого примера состоит в том, чтобы разработать FIS, который изучает нечеткие правила и оптимизирует параметры FIS, чтобы смоделировать функцию fw для навигации робота без коллизий в среде симуляции.

Предположения

Следующие предположения применяются к симуляции робота:

  • Робот может отлично локализовать в среде симуляции; то есть, робот знает свое текущее положение в среде симуляции.

  • Робот оборудован совершенными датчиками, чтобы идентифицировать препятствие и определить его местоположение.

  • Робот не имеет никаких динамических ограничений; то есть, робот может вращаться и переместиться, как управляется без любых механических ограничений. Чтобы избежать крутых поворотов, мягкое ограничение наложено на вращение, которое ограничивает изменение на временной шаг в роботе, направляющемся в [-π4,π4].

  • Робот запускается с фиксированной скоростью. Можно включать дополнительные нечеткие системы, чтобы контролировать скорость робота. Для простоты этот пример использует фиксированную скорость для робота.

Создайте нечеткие системы

К образцовой функции fw, создайте FIS как показано в следующей фигуре. В данном примере используйте Mamdani FIS.

fisin = mamfis;

Добавьте следующие два входных параметров как показано в предыдущей фигуре.

  • α — Отношение расстояний, робот к препятствию / робот к цели

  • θt,o — Различие между целью и направлениями препятствия

Установите область значений первого входа к [0,2], который указывает на это α способствует предотвращению препятствия, когда расстояние препятствия меньше чем или равно дважды целевому расстоянию.

Установите область значений второго входа к [0,pi/2], который указывает на это θt,o способствует предотвращению препятствия, когда различие между целью и направлениями препятствия меньше чем или равно 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.

Для оптимизации параметров управления получите установки параметров из 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)"                   

Правила описаны можно следующим образом относительно ожидаемых поведений fw:

  • Правило 1 сопоставимо с ожидаемым поведением fw. Когда препятствие не расположено перед роботом на пути к цели (θt,o высоко), и препятствие близко (α является низким), это правило производит низкие значения веса.

  • Правило 4 также сопоставимо с ожидаемым поведением fw. Когда препятствие не расположено перед роботом на пути к цели (θt,o высоко), и препятствие более далеко (α высоко), это правило производит низкие значения веса.

  • Правило 3 генерирует низкие значения веса, когда препятствие не расположено перед роботом (θt,o высоко), независимо от расстояния препятствия. Это правило касается условий и для правила 1 и для правила 4. Поэтому правила 1 и 4 избыточны и могут быть удалены.

  • Правило 2 также сопоставимо с ожидаемым поведением fw. Когда препятствие близко к роботу (α является низким), и расположен перед роботом на пути к цели (θt,o является низким), это правило производит высокие значения веса для задачи предотвращения препятствия.

  • Правило 5 генерирует низкие значения веса, когда расстояние препятствия является низким. Это правило противоречит правилу 2 когда θt,o является низким. В этом случае вывод правила 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.

Localfunctions

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

Смотрите также

| |

Похожие темы