В этом примере показано, как настроить систему нечеткого вывода (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');
Чтобы минимизировать количество правил, которое соответствует количеству комбинаций входных функций принадлежности, добавьте две функции принадлежности (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)
Поскольку у вас нет обучающих данных для этого примера, вы симулируете навигацию робота с помощью пользовательской функции затрат. Процесс настройки использует эту пользовательскую функцию затрат при оптимизации параметров 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 = 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)
В первом случае робот достигает цели с минимальным расстоянием, так как препятствие не находится на пути к цели. Во втором случае робот успешно избегает препятствия и достигает цели.
Просмотрите структуру настроенной FIS, fisout
.
figure plotfis(fisout)
Процесс настройки создает набор новых правил для 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)"
Правила описаны следующим образом относительно ожидаемого поведения :
Правило 1 соответствует ожидаемому поведению . Когда препятствие не расположено перед роботом на пути к цели ( высоко) и препятствие близко ( низкая), это правило создает низкие значения веса.
Правило 4 также соответствует ожидаемому поведению . Когда препятствие не расположено перед роботом на пути к цели ( высоко) и препятствие дальше ( является высоким), это правило производит низкие значения веса.
Правило 3 генерирует низкие значения веса, когда препятствие не расположено перед роботом ( является высоким), независимо от расстояния препятствия. Это правило охватывает условия как для правила 1, так и для правила 4. Поэтому правила 1 и 4 являются избыточными и могут быть удалены.
Правило 2 также соответствует ожидаемому поведению . Когда препятствие близко к роботу ( низкая) и расположена перед роботом на пути к цели ( является низким), это правило создает высокие значения веса для задачи предотвращения препятствий.
Правило 5 генерирует низкие значения веса, когда расстояние препятствий мало. Это правило противоречит правилу 2, когда низкая. В этом случае выход правила 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')
Проверьте эффективность настроенной 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