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

Кинематическая модель имеет следующие параметры.
- текущая ориентация автомобиля по отношению к глобальной системе отсчета.
- угол поворота рулевого управления относительно ориентации автомобиля.
- центр переднего колеса, ).
- центр заднего колеса, ).
| - длина колесной базы.
- центр кривизны автомобиля.
| - радиус кривизны автомобиля.
В этой модели ориентация заднего колеса зафиксирована и параллельна кузову автомобиля. То есть, задние колеса имеют ту же ориентацию, что и автомобиль, . Передние колеса параллельны друг другу и вращаются с углом «руля.» Угол рулевого управления ограничен в диапазоне - Для этого примера, Λ равен 30 градусам.
Центры переднего и заднего колес имеют следующее соотношение.
)
)
Кинематические уравнения для скорости центра переднего колеса и скорости ориентации автомобиля следующие, где - скорость автомобиля.
(
(
RF |
Минимальный радиус кривизны () для автомобиля зависит от длины колесной базы (). Этот минимальный радиус ограничивает движение автомобиля во время парковочных маневров.
Когда водитель-человек паркуется, он часто не может поддерживать требуемую скорость и ориентацию автомобиля при приближении к пустому парковочному месту. Чтобы успешно парковаться без столкновения, они должны компенсировать за счет переключения между движением вперед и назад при регулировке скорости и угла поворота автомобиля.
Водители-люди сознательно не выполняют геометрические вычисления на основе кинематической модели своего автомобиля. Вместо этого, основываясь на собственном опыте проб и ошибок, они используют естественные правила и рассуждения, чтобы понять ограничения своего автомобиля в условиях парковки. Для моделирования таких рассуждений на основе правил можно использовать нечеткие системы.
В этом примере для имитации лобовой парковки неголономного автомобиля используется следующая среда.

Здесь:
Среда моделирования - стоянка 45 на 15 футов.
Заштрихованная область показывает занятые парковочные места.
Пустое парковочное место - 6 на 7 футов.
Автомобиль имеет высоту 5 на 3 фута, а длина колесной базы (|) составляет 3 фута, обеспечивая смещение 1 фута от колесной базы как к передней, так и к задней части автомобиля.
В этом примере предполагается следующее.
Автомобиль оборудован интеллектуальной системой, которая может обнаружить пустое место парковки, а затем остановить автомобиль у начального края места парковки.
Автономная система парковки берет на себя управление автомобилем после его остановки. В идеале в стартовом положении автомобиль почти вертикально центрирован в дороге и параллелен дороге ( 0 град 180 град).
Из-за постоянно меняющегося характера парковки, кинематических ограничений движения и физических атрибутов автомобиля автомобиль действительно останавливается в точном нужном положении и ориентации. Поэтому система парковки предполагает, что автомобиль останавливается где-то перед пустым парковочным местом с или град и с неравным пространством на любом из сидов автомобиля.
Во избежание столкновений автомобиль оборудован датчиками дальности для предоставления данных дальности для передней, задней, левой и правой сторон автомобиля. На следующем рисунке показан пример данных диапазона, полученных от датчиков в среде моделирования.

Предполагается, что максимальный диапазон датчиков составляет , что охватывает всю среду моделирования.
Человеческие рассуждения для парковки автомобилей
Как правило, как показано на следующем рисунке, водитель-человек поддерживает соответствующую скорость и угол поворота при приближении к пустому месту стоянки. В этом случае они могут парковаться без какого-либо движения вперед и назад.

Однако иногда водителю не удается поддерживать желаемую скорость и угол поворота для парковки без колебаний. Как показано в следующем примере, драйвер должен затем компенсировать, используя движения назад и вперед.

В этом случае водитель:
Поворачивается направо и движется вперед.
Не удается войти в место стоянки, так как передняя часть автомобиля приближается к машине на занимаемом пространстве.
Поворачивает влево и назад вверх, чтобы сделать достаточно места для входа в место парковки
Перемещение вперед для входа в место парковки при регулировке ориентации автомобиля для выравнивания с направлением парковки.
Останавливается, когда передняя часть автомобиля находится на безопасном минимальном расстоянии от конца парковочного места и транспортное средство совмещено с парковочным местом (ориентация 90 ° в пределах среды моделирования).
В следующем разделе эти модели движения используются для создания нечетких систем автономной парковки.
Для настройки нечетких систем этот пример искусственно генерирует обучающие данные с использованием кинематической модели автомобиля и шаблонов движения, описанных в предыдущем разделе. В процессе формирования данных используется следующая дискретная форма кинематической модели, где составляет 0,1 секунды.
(k + 1) | RF |
|RF|⋅cosθ (k + 1)
|RF|⋅sinθ (k + 1)
Значения угла поворота рулевого управления () и скорости () генерируются на основе типичных моделей движения человека, рассмотренных ранее. Угол поворота и скорость ограничены следующими пределами.
ftsec
Для того чтобы сделать пространство для безопасного поворота, движение назад использует более высокую скорость, когда автомобиль приближается к занимаемому пространству. В качестве альтернативы автомобиль может использовать одну и ту же скорость в течение более длительных периодов времени при движении назад для создания достаточного пространства для безопасного поворота.
Загрузите структуру данных обучения.
trainingData = load('trainingData');Каждая обучающая точка данных включает в себя пять входов.
Угловое отклонение () между ориентацией автомобиля и ориентацией парковочного пятна
Минимальное расстояние до передней (), левой (), задней () и правой () части автомобиля
Каждая обучающая точка данных включает в себя два выхода.
Угол поворота рулевого управления ()
Скорость () автомобиля
Поскольку значения угловых отклонений и расстояний имеют различные единицы и масштабы, учебные данные нормализуются к диапазону [0 1]. Это устраняет любую чувствительность функции затрат к ошибкам во входах больших величин. Структура данных обучения содержит как исходные входные, так и выходные значения (x и y) и их нормированных значений (xn и yn).
Во время формирования данных достигается успешное состояние парковки, когда автомобиль достигает минимального безопасного расстояния от конца места парковки и выравнивается по направлению парковки.
В этом примере в качестве нечеткой парковочной системы используется дерево FIS. Первый этап процесса настройки состоит в построении и обучении начальных FIS, которые впоследствии будут собраны в дерево FIS. Затем улучшается производительность путем точной настройки параметров всего дерева FIS.
Для построения и настройки начальных нечетких систем в этом примере используется ANFIS, который обеспечивает более быструю сходимость по сравнению с другими методами настройки.
Структура дерева FIS и его компонентных нечетких систем учитывает следующие соображения.
Дерево FIS имеет пять входов и два выхода, которые соответствуют значениям в наборе учебных данных.
Так как ANFIS поддерживает один выход, создайте отдельные нечеткие подсистемы для угла поворота рулевого управления () и скорости ().
Для повышения производительности каждая из этих подсистем использует отдельные FIS для прямого и обратного движения.
Объедините контроллеры прямого и обратного движения для каждой подсистемы, используя дополнительную FIS.

Обучить контроллер движения вперед для рулевого управления, forwardPhiFIS, используя входные и выходные данные обучения. Для этого сначала извлеките нормализованные данные тренировки угла поворота рулевого управления.
forwardPhi = trainingData.yn(:,1);
Затем, поскольку эта система предназначена только для движения вперед, установите выходные значения угла поворота на 0 для отрицательных значений скорости.
negSpeedId = trainingData.y(:,2) < 0; forwardPhi(negSpeedId) = 0;
Создайте параметры для обучения ANFIS и настройте отображение только окончательных результатов обучения.
aoptions = anfisOptions; aoptions.DisplayANFISInformation = false; aoptions.DisplayErrorValues = false; aoptions.DisplayStepSize = false;
Используйте три MF для первого входа (), так как он имеет как положительные, так и отрицательные значения. Используйте два MF для вводов расстояния.
aoptions.InitialFIS = [3 2 2 2 2];
Поезд forwardPhiFIS.
forwardPhiFIS = anfis([trainingData.xn forwardPhi],aoptions);
Minimal training RMSE = 0.100129
Аналогичным образом тренируйте контроллер скорости вперед, forwardSpeedFIS.
forwardSpeed = trainingData.yn(:,2); forwardSpeed(negSpeedId) = 0; forwardSpeedFIS = anfis([trainingData.xn forwardSpeed],aoptions);
Minimal training RMSE = 0.161479
Затем настройте контроллеры обратного движения на угол поворота и скорость, backwardPhiFIS и backwardSpeedFISсоответственно. В этом случае для положительных значений скорости установите значение 0.
Поезд backwardPhiFIS.
backwardPhi = trainingData.yn(:,1); backwardPhi(~negSpeedId) = 0; backwardPhiFIS = anfis([trainingData.xn backwardPhi],aoptions);
Minimal training RMSE = 0.112362
Поезд backwardSpeedFIS.
backwardSpeed = trainingData.yn(:,2); backwardSpeed(~negSpeedId) = 0; backwardSpeedFIS = anfis([trainingData.xn backwardSpeed],aoptions);
Minimal training RMSE = 0.0642125
Для каждого FIS укажите соответствующее имя FIS.
forwardPhiFIS.Name = 'forwardPhiFIS'; forwardSpeedFIS.Name = 'forwardSpeedFIS'; backwardPhiFIS.Name = 'backwardPhiFIS'; backwardSpeedFIS.Name = 'backwardSpeedFIS';
Далее, поезд phiFIS, который объединяет значения угла поворота рулевого управления вперед и назад, генерируемые forwardPhiFIS и backwardPhiFIS. Создание входных учебных данных для phiFIS, оценка forwardPhiFIS и backwardPhiFIS с использованием нормированных входных обучающих данных.
eoptions = evalfisOptions; eoptions.EmptyOutputFuzzySetMessage ='none'; eoptions.NoRuleFiredMessage = 'none'; eoptions.OutOfRangeInputValueMessage = 'none'; forwardPhi = evalfis(forwardPhiFIS,trainingData.xn,eoptions); backwardPhi = evalfis(backwardPhiFIS,trainingData.xn,eoptions);
Используйте пять MF для каждого входа. В этом случае можно использовать большее количество MF, поскольку phiFIS имеет только два входа.
aoptions.InitialFIS = 5;
Поезд phiFIS использование сгенерированных входных данных и нормированных выходных обучающих данных.
phiFIS = anfis([forwardPhi backwardPhi trainingData.yn(:,1)],aoptions);
Minimal training RMSE = 0.120349
phiFIS.Name = 'phiFIS';Аналогично, поезд speedFIS, который объединяет значения скорости вперед и назад, генерируемые forwardSpeedFIS и backwardSpeedFISсоответственно. Создание входных учебных данных для speedFIS, оценка forwardSpeedFIS и backwardSpeedFIS с использованием нормированных входных обучающих данных.
forwardSpeed = evalfis(forwardSpeedFIS,trainingData.xn,eoptions); backwardSpeed = evalfis(backwardSpeedFIS,trainingData.xn,eoptions); speedFIS = anfis([forwardSpeed backwardSpeed trainingData.yn(:,2)],aoptions);
Minimal training RMSE = 0.0969036
speedFIS.Name = 'speedFIS';Следующим этапом процесса настройки является построение и настройка нечеткого дерева с использованием предварительно настроенных компонентных FIS. Чтобы создать дерево FIS, сначала определите соединения между компонентами FIS в соответствии с общей конструкцией дерева FIS.
connections = [... "forwardPhiFIS/output" "phiFIS/input1"; ... "backwardPhiFIS/output" "phiFIS/input2"; ... "forwardSpeedFIS/output" "speedFIS/input1"; ... "backwardSpeedFIS/output" "speedFIS/input2"; ... "forwardPhiFIS/input1" "backwardPhiFIS/input1"; ... "forwardPhiFIS/input1" "forwardSpeedFIS/input1"; ... "forwardPhiFIS/input1" "backwardSpeedFIS/input1"; ... "forwardPhiFIS/input2" "backwardPhiFIS/input2"; ... "forwardPhiFIS/input2" "forwardSpeedFIS/input2"; ... "forwardPhiFIS/input2" "backwardSpeedFIS/input2"; ... "forwardPhiFIS/input3" "backwardPhiFIS/input3"; ... "forwardPhiFIS/input3" "forwardSpeedFIS/input3"; ... "forwardPhiFIS/input3" "backwardSpeedFIS/input3"; ... "forwardPhiFIS/input4" "backwardPhiFIS/input4"; ... "forwardPhiFIS/input4" "forwardSpeedFIS/input4"; ... "forwardPhiFIS/input4" "backwardSpeedFIS/input4"; ... "forwardPhiFIS/input5" "backwardPhiFIS/input5"; ... "forwardPhiFIS/input5" "forwardSpeedFIS/input5"; ... "forwardPhiFIS/input5" "backwardSpeedFIS/input5"; ... ];
Создайте дерево FIS.
fuzzySystems = [forwardPhiFIS backwardPhiFIS forwardSpeedFIS backwardSpeedFIS phiFIS speedFIS]; fisT = fistree(fuzzySystems,connections);
Затем выполните точную настройку значений MF и параметра правила fisT. Для повышения производительности настройте нечеткие системные параметры для отдельных выходов.
Сначала настройте параметры FIS для угла поворота.
Во-вторых, настройте параметры FIS для скорости.
Для настройки параметров дерева FIS для одного вывода без учета другого значения вывода можно временно удалить другой вывод из дерева FIS.
Чтобы настроить дерево FIS для вывода угла поворота, удалите второй вывод из fisT и получить настраиваемые параметры из forwardPhiFIS, backwardPhiFIS, и phiFIS.
fisTin1 = fisT; fisTin1.Outputs(2) = []; [in,out,rule] = getTunableSettings(fisTin1,'FIS',... ["forwardPhiFIS" "backwardPhiFIS" "phiFIS"]);
Создайте набор параметров настройки.
toptions = tunefisOptions;
Usethe patternsearch способ точной настройки и установка максимального числа итераций равным 10. При наличии программного обеспечения Parallel Computing Toolbox™ можно повысить скорость процесса настройки, задав toptions.UseParallel кому true. Если у вас нет программного обеспечения Parallel Computing Toolbox, установите options.UseParallel кому false, которое является значением по умолчанию.
toptions.Method = 'patternsearch';
toptions.MethodOptions.MaxIterations = 10;Чтобы улучшить результаты поиска массива, задайте параметр метода UseCompletePoll кому true.
toptions.MethodOptions.UseCompletePoll = true;
Для воспроизводимости задайте начальное число генератора случайных чисел по умолчанию.
rng('default')Обучение может быть ресурсоемким и занять несколько часов. Для экономии времени загрузите предварительно подготовленное дерево FIS путем установки runtunefis кому false. Для запуска настройки можно задать runtunefis кому true.
runtunefis = false;
Настройте дерево FIS.
if runtunefis fisTout1 = tunefis(fisTin1,[in;out;rule],... trainingData.xn,trainingData.yn(:,1),toptions); else preTunedFIST = load('tunedFIST'); fisTout1 = preTunedFIST.fisTout1; end
Затем настройте другой выходной сигнал дерева FIS, предварительно удалив выходной сигнал скорости и добавив выходной сигнал угла поворота. Затем получите настраиваемые параметры из forwardSpeedFIS, backwardSpeedFIS, и speedFIS.
fisTin2 = fisTout1; fisTin2.Outputs(1) = "speedFIS/output"; [in,out,rule] = getTunableSettings(fisTin2,'FIS',... ["forwardSpeedFIS" "backwardSpeedFIS" "speedFIS"]);
Настройте дерево FIS. После обучения сбросьте выходные данные дерева FIS.
if runtunefis rng('default') fisTout = tunefis(fisTin2,[in;out;rule],... trainingData.xn,trainingData.yn(:,2),toptions); fisTout.Outputs(1) = "phiFIS/output"; fisTout.Outputs(2) = "speedFIS/output"; else fisTout = preTunedFIST.fisTout; end
Проверьте индивидуальные ошибки обучения (среднеквадратичная ошибка корня) выходов.
err = trainingData.yn - evalfis(fisTout,trainingData.xn,eoptions); err = err.*err; rmsePhi = sqrt(mean(err(:,1)))
rmsePhi = 0.1186
rmseSpeed = sqrt(mean(err(:,2)))
rmseSpeed = 0.0967
По сравнению с нечеткой системой, обученной ANFIS, производительность не лучше.
Данные обучения содержат ограниченный набор исходных условий. Поэтому настроенное дерево FIS допустимо для следующих условий.
Передняя часть автомобиля должна изначально располагаться перед парковочным местом с .
Автомобиль должен быть близко выровнен с направлением дороги, то есть начальная ориентация автомобиля должна быть или град.
Первоначально автомобиль должен находиться на расстоянии не менее фута от любого края дороги. То есть 1,5 фута 1,5 фута.
Парковка с правой стороны
Настроенная FIS обучается лобовой парковке с правой стороны ( град) дороги.
Следующий результат показывает моделирование лобовой парковки для 24 ft 4,5 ft = 180 °.
parkFromRight = true; xf = 24; yf = 4.5; theta = 180; figure simulateParking(parkFromRight,fisTout,trainingData,xf,yf,theta)
Parked

Смоделировать парковку для другого исходного состояния, где 22 ft = 5 ft, = = 170 °.
parkFromRight = true; xf = 22; yf = 5; theta = 170; figure simulateParking(parkFromRight,fisTout,trainingData,xf,yf,theta)
Parked

В обоих случаях автомобиль может автономно парковаться, используя схему движения назад и вперед. Однако автомобиль не поддерживает равные значения расстояния на левой и правой сторонах парковочного места. Такое поведение распространено для водителей-людей, которые обычно не паркуются в точной середине парковочного места. Вместо этого они используют безопасное расстояние от каждой стороны.
Парковка с левой стороны
Эту же нечеткую систему можно использовать для лобовой парковки с левой стороны ( град). Для этого установите parkFromRight на false, что приводит к simulateParking для изменения входных значений следующим образом:
Переключите знак входа углового отклонения .
Переключите входные значения расстояния для левой () и правой () сторон.
Имитировать автономную парковку с левой стороны для 22 ft= 5,5 ft start= = 0 °.
parkFromRight = false; xf = 22; yf = 5; theta = 0; figure simulateParking(parkFromRight,fisTout,trainingData,xf,yf,theta)
Parked

Смоделировать парковку для другого исходного условия, где 22 ft= 5,5 ft, start= = 0 °.
parkFromRight = false; xf = 23.8; yf = 5.2; theta = 7; figure simulateParking(parkFromRight,fisTout,trainingData,xf,yf,theta)
Parked

В этом случае, аналогично результатам парковки с правой стороны, автомобиль следует возвратно-поступательному движению для безопасной парковки автомобиля.
Текущая конструкция нечеткой системы имеет следующие недостатки:
Сгенерированные данные учитывают только два шаблона движения для автономной парковки. Поэтому автономная система парковки обладает ограниченной надежностью и не отражает всех общих навыков водителя-человека. Например, на следующем рисунке показан другой распространенный сценарий, когда водитель перемещается назад и поворачивает направо, чтобы освободить место справа от занятого пространства.

Сгенерированные данные используют предел ± 30 ° для углов поворота рулевого управления. Результирующий высокий радиус кривизны увеличивает трудность парковки без колебаний.
Сенсорная модель, используемая в этом примере, представляет собой тривиальную модель обнаружения заполняемости, где значения дальности детектируются радиально от центра автомобиля. Кроме того, когда данные дальности одинаковы из каждого угла автомобиля, нечеткая система может дать неожиданные результаты и локальную оптимизацию в процессе моделирования. Лучшей альтернативой являются данные модельного ряда, нормальные для каждой стороны автомобиля, как показано на следующем рисунке. В этом случае измерения расстояния с каждой стороны автомобиля независимы друг от друга.

ANFIS поддерживает только FIS Sugeno, которые не всегда могут создавать гладкую контрольную поверхность.
Для обновления структуры дерева FIS можно рассмотреть следующие потенциальные изменения.
Используйте FIS Mamdani, которые поддерживают дополнительные методы настройки за пределами ANFIS.
Создайте исходную базу правил нечетких систем вывода с использованием человеческих рассуждений, а затем настройте с помощью обучающих данных.
Используйте пользовательскую функцию затрат для автоматического создания данных и оптимизации траектории парковки с помощью моделирования парковки на основе вознаграждения. Пример см. в разделе Настройка нечеткой системы предотвращения препятствий робота с использованием пользовательской функции затрат.
fistree | getTunableSettings | tunefis