exponenta event banner

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

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

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

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

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

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

θ=∠F→

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

startr (k + 1) = startr (k) + min (max (start-startr (k), § 4), -security4).

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

w = fw (α, startt, o)

где

  • α = dodt - отношение расстояния между роботом и препятствием (do) и расстояния между роботом и целью (dt);

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

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

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

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

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

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

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

Для моделирования робота применяются следующие допущения:

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

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

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

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

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

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

fisin = mamfis;

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

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

  • startt, o - Разница между целевыми направлениями и направлениями препятствий

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

Установите диапазон второго входа в [0,pi/2], что указывает на то, что startt, 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. Когда препятствие не расположено перед роботом на пути к цели (startt, o высоко) и препятствие близко (α низко), это правило выдает низкие значения веса.

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

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

  • Правило 2 также согласуется с ожидаемым поведением fw. Когда препятствие близко к роботу (α находится на низком уровне) и расположено перед роботом на пути к цели (

  • Правило 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

См. также

| |

Связанные темы