Настройка нечеткой системы предотвращения препятствий робота с помощью пользовательской функции затрат

В этом примере показано, как настроить систему нечеткого вывода (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');

Чтобы минимизировать количество правил, которое соответствует количеству комбинаций входных функций принадлежности, добавьте две функции принадлежности (MF) к каждому входу. Чтобы сгенерировать аналогичные значения принадлежности за пределами входных областей значений, используйте zmf (Z-образная функция принадлежности к кривой) и smf (S-образная функция принадлежности к кривой) MF. Процесс настройки оптимизирует входные значения параметров 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');

Добавьте два MF к выходу. Можно добавить больше MF к выходу для более мелкой гранулярности выходных значений. Однако это увеличивает количество параметров настройки. MF выхода также используют 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)

Figure contains 4 axes. Axes 1 contains 2 objects of type line. Axes 2 contains 2 objects of type line. Axes 3 contains 2 objects of type line. Axes 4 contains 3 objects of type text.

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

Figure contains 2 axes. Axes 1 with title Training Task: 1 contains 6 objects of type line, rectangle. These objects represent Obstacle, Target, Robot. Axes 2 with title Training Task: 2 contains 6 objects of type line, rectangle. These objects represent Obstacle, Target, Robot.

Задайте пользовательскую функцию стоимости с помощью указателя на функцию.

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 = false;

Настройте FIS, используя указанные окружения обучения и опции настройки.

if runtunefis
    fisout = tunefis(fisin,[in;out],costFunction,options); %#ok<UNRCH>
else
   tunedfis = load('tunedfisnavigation.mat'); 
   fisout = tunedfis.fisout;
end

Настроенная FIS производит следующие траектории робота в средах симуляции.

showNavigationTrajectories(fisout,trnObstacle,trnTarget,trnRobot)

Figure contains 2 axes. Axes 1 with title Navigation Task: 1 contains 45 objects of type line, rectangle. These objects represent Obstacle, Target, Robot. Axes 2 with title Navigation Task: 2 contains 46 objects of type line, rectangle. These objects represent Obstacle, Target, Robot.

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

Просмотрите структуру настроенной FIS, fisout.

figure
plotfis(fisout)

Figure contains 4 axes. Axes 1 contains 2 objects of type line. Axes 2 contains 2 objects of type line. Axes 3 contains 2 objects of type line. Axes 4 contains 3 objects of type text.

Процесс настройки создает набор новых правил для FIS.

fisout.Rules
ans = 
  1x5 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 = 
  1x2 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')

Figure contains 2 axes. Axes 1 with title Output surface of fisout contains an object of type surface. Axes 2 with title Output surface of fisoutpruned contains an object of type surface.

Проверяйте эффективность

Проверьте эффективность настроенной 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)

Figure contains 3 axes. Axes 1 with title Navigation Task: 1 contains 41 objects of type line, rectangle. These objects represent Obstacle, Target, Robot. Axes 2 with title Navigation Task: 2 contains 44 objects of type line, rectangle. These objects represent Obstacle, Target, Robot. Axes 3 with title Navigation Task: 3 contains 46 objects of type line, rectangle. These objects represent Obstacle, Target, Robot.

Заключение

Этот пример использует пользовательскую функцию стоимости, которая моделирует навигацию робота в различных окружениях обучения, чтобы узнать нечеткие правила и оптимизировать значения параметров 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

См. также

| |

Похожие темы