В этом примере показано, как настроить нечеткую систему вывода (FIS) для автономного приложения парковки с неголономными ограничениями.
Автономная парковка является существенной возможностью интеллектуальных транспортных средств (автономные автомобили). Неголономная кинематика налагает дополнительные ограничения на автономную парковку, куда автомобиль не может переместиться боком и вместо этого использует изгибающееся движение.
Следующий рисунок показывает кинематику неголономного автомобиля со стандартом рулевой механизм Акерманна.
Кинематическая модель имеет следующие параметры.
текущая ориентация автомобиля относительно глобальной системы координат.
держащийся угол относительно автомобильной ориентации.
передний центр колеса, .
задний центр колеса, .
длина колесной базы.
центр искривления для автомобиля.
радиус искривления для автомобиля.
В этой модели задняя ориентация колеса фиксируется и параллельна кузову автомобиля. Таким образом, задние колеса имеют ту же ориентацию как автомобиль, . Передние колеса параллельны друг другу и вращаются с держащимся углом . Держащийся угол ограничивается быть между и . В данном примере 30 градусов.
Передние и задние центры колеса имеют следующее отношение.
Кинематические уравнения для передней скорости центра колеса и автомобильной скорости ориентации можно следующим образом, где скорость автомобиля.
Минимальный радиус искривления () поскольку автомобиль зависит от длины с колесной базой (). Этот минимальный радиус ограничивает движение автомобиля во время парковки маневров.
Когда человеческий драйвер паркуется, им часто не удается обеспечить необходимую автомобильную скорость и ориентацию при приближении к пустому парковочному месту. Чтобы успешно припарковаться без столкновения, они должны компенсировать путем переключения между прямым и обратным движением при корректировке скорости и регулировании угла автомобиля.
Человеческие драйверы сознательно не выполняют геометрические расчеты на основе кинематической модели их автомобиля. Вместо этого на основе их собственного эмпирического опыта они используют естественные правила и обоснование, чтобы изучить ограничения их автомобиля в ситуации с парковкой. Можно использовать нечеткие системы, чтобы смоделировать такое основанное на правилах обоснование.
Этот пример использует следующую среду, чтобы симулировать передней частью парковку неголономного автомобиля.
Здесь:
Среда симуляции 45 15 парковка ноги.
Заштрихованная область показывает занятые места для парковки.
Пустое место для парковки имеет 6 7 ноги.
Автомобиль является 5 3 футами и длиной колесной базы () 3 фута, обеспечивая 1-футовое смещение от колесной базы и до передней стороны и до задней части автомобиля.
Этот пример принимает следующее.
Автомобиль оборудован интеллектуальной системой, которая может обнаружить пустое место для парковки и затем остановить автомобиль около стартового ребра места для парковки.
Автономная система парковки берет под свой контроль автомобиль после того, как это остановится. Идеально, в стартовой позиции, автомобиль почти вертикально сосредоточен на дороге и параллельный дороге ( градус или градус).
Из-за постоянно изменяющейся природы парковки, кинематических ограничений движения и физических автомобильных атрибутов, автомобиль действительно останавливается в точном желаемом положении и ориентации. Поэтому система парковки принимает, что автомобиль останавливается где-нибудь перед пустым местом для парковки с или градус и с неравным пробелом по обе стороны от автомобиля.
Чтобы избежать столкновений, автомобиль оборудован датчиками области значений, чтобы обеспечить данные об области значений для передней стороны, задней части, покинутой, и правые стороны автомобиля. Следующий рисунок показывает пример данных об области значений, полученных из датчиков в среде симуляции.
Максимальная область значений датчика принята, чтобы быть , который покрывает целую среду симуляции.
Человеческое мышление для автомобильной парковки
Обычно как показано в следующем рисунке, человеческий драйвер обеспечивает соответствующую скорость и держащийся угол при приближении к пустому лобовому месту для парковки. В этом случае они могут припарковаться без любых прямых и обратных колеблющихся движений.
Однако иногда драйверу не удается обеспечить желаемую скорость и держащийся угол для парковки без колебаний. Как показано в следующем примере, драйвер должен затем компенсировать использование назад и вперед движения.
В этом случае, драйвер:
Поворачивает направо и продвигается.
Сбои, чтобы ввести место для парковки, поскольку передняя сторона автомобиля приближается к автомобилю на занятом месте.
Поворачивает налево и отходит назад, чтобы потесниться, чтобы ввести место для парковки
Продвигается, чтобы ввести место для парковки при корректировке автомобильной ориентации, чтобы выровняться с направлением парковки.
Остановки, когда передняя сторона автомобиля является безопасным минимальным расстоянием от конца места для парковки и транспортного средства, выравниваются с местом для парковки (ориентация на 90 градусов в среде симуляции).
Следующий раздел использует эти шаблоны движения, чтобы создать нечеткие системы для автономной парковки.
Для настройки нечетких систем этот пример искусственно генерирует обучающие данные с помощью кинематической модели автомобиля и шаблонов движения, описанных в предыдущем разделе. Процесс генерации данных использует следующую дискретную форму кинематической модели, где 0,1 секунды.
Держащийся угол () и скорость () значения сгенерированы на основе типичных человеческих ведущих шаблонов, обсужденных ранее. Держащийся угол и скорость ограничиваются к следующим пределам.
Для того, чтобы сделать пробел для безопасного превращения, обратное движение использует более высокую скорость, когда автомобиль становится ближе к занятому месту. В качестве альтернативы автомобиль может использовать ту же скорость для более длинных периодов при попытке назад делать соответствующий пробел для безопасного превращения.
Загрузите структуру обучающих данных.
trainingData = load('trainingData');
Каждая точка обучающих данных включает пять входных параметров.
Угловое отклонение () между автомобильной ориентацией и ориентацией места для парковки
Минимальные расстояния до передней стороны (), оставленный (), задняя часть (), и право () из автомобиля
Каждая точка обучающих данных включает два выходных параметров.
Регулирование угла ()
Скорость () из автомобиля
Поскольку угловое отклонение и значения расстояния имеют различные модули и шкалы, обучающие данные нормирован к области значений [0 1]. Выполнение так удаляет любую чувствительность функции стоимости к ошибкам в больших входных параметрах величины. Структура обучающих данных содержит обоих исходные значения ввода и вывода (x
и y
) и их нормированные значения (xn
и yn
).
Во время генерации данных достигается успешное условие парковки, когда автомобиль достигает минимального безопасного расстояния от конца места для парковки и выравнивается с направлением парковки.
Этот пример использует дерево FIS в качестве нечеткой системы парковки. Первая стадия настраивающего процесса должна создать и обучить начальный ФИСС, который вы позже собираете в дерево FIS. Вы затем улучшаете производительность путем точной настройки мелодии параметры целого дерева FIS.
Чтобы создать и настроить начальные нечеткие системы, этот пример использует ANFIS, который обеспечивает более быструю сходимость по сравнению с другими настраивающими методами.
Проект дерева FIS и его нечетких систем компонента обращается к следующим факторам.
Дерево FIS имеет пять входных параметров и два выходных параметров, которые совпадают со значениями в обучающем наборе данных.
Поскольку ANFIS поддерживает один выход, создайте отдельные нечеткие подсистемы для регулирования угла () и скорость ().
Для лучшей эффективности каждое это использование подсистем разделяет ФИСС для прямого и обратного движения.
Объедините прямые и обратные контроллеры движения для каждой подсистемы с помощью дополнительного 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;
Используйте три MFS для первого входа (), поскольку это имеет и положительные и отрицательные величины. Используйте два MFS для входных параметров расстояния.
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);
Используйте пять MFS для каждого входа. В этом случае можно использовать более высокое количество MFS, начиная с 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.
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;
Используйте 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 допустимо для следующих условий.
Передняя сторона автомобиля должна быть первоначально расположена перед местом для парковки с .
Автомобиль должен быть практически выровнен с дорожным направлением, то есть, начальная автомобильная ориентация должна быть или градус.
Автомобиль должен первоначально быть, по крайней мере, ft от любого дорожного ребра. Таким образом, ft и ft.
Парковка с правой стороны
Настроенный FIS обучен лобовой парковке с правой стороны ( градус) дороги.
Следующий результат показывает лобовую симуляцию парковки для ft, ft, и градус.
parkFromRight = true; xf = 24; yf = 4.5; theta = 180; figure simulateParking(parkFromRight,fisTout,trainingData,xf,yf,theta)
Parked
Симулируйте парковку для различного начального условия где ft, ft, и градус.
parkFromRight = true; xf = 22; yf = 5; theta = 170; figure simulateParking(parkFromRight,fisTout,trainingData,xf,yf,theta)
Parked
В обоих случаях автомобиль может автономно припарковать использование назад и вперед шаблон движения. Однако автомобиль не обеспечивает равные значения расстояния на левых и правых сторонах парковочного места. Это поведение характерно для человеческих драйверов, кто обычно не паркуется в точной середине парковочного места. Вместо этого они используют безопасное расстояние от каждой стороны.
Парковка с левой стороны
Можно использовать ту же нечеткую систему для лобовой парковки с левой стороны ( градус). Для этого установите parkFromRight
ко лжи, которая вызывает simulateParking
изменить входные значения можно следующим образом:
Переключите знак углового входа отклонения .
Переключите входные параметры расстояния для левого () и право () стороны.
Симулируйте автономную парковку с левой стороны для ft, .5 футы, и градус.
parkFromRight = false; xf = 22; yf = 5; theta = 0; figure simulateParking(parkFromRight,fisTout,trainingData,xf,yf,theta)
Parked
Симулируйте парковку для другого начального условия где ft, .5 футы, и градус.
parkFromRight = false; xf = 23.8; yf = 5.2; theta = 7; figure simulateParking(parkFromRight,fisTout,trainingData,xf,yf,theta)
Parked
В этом случае, похожий на результаты парковки правой стороны, автомобиль следует назад и вперед движение безопасно припарковать автомобиль.
Текущая нечеткая разработка системы имеет следующие недостатки:
Сгенерированные данные рассматривают только два шаблона движения для автономной парковки. Поэтому автономная система парковки ограничила робастность и не представляет все общие навыки человеческого драйвера. Например, следующий рисунок показывает другой общий сценарий, где драйвер пятится и поворачивает направо, чтобы сделать пробел справа из занятого места.
Сгенерированные данные используют a предел градуса для регулирования углов. Получившийся высокий радиус искривления увеличивает трудность парковки без колебания.
Модель датчика, используемая в этом примере, является тривиальной моделью обнаружения заполнения, где значения области значений радиально обнаруживаются от центра автомобиля. Кроме того, когда данные об области значений подобны от каждого угла автомобиля, нечеткая система может привести к неожиданным результатам и локальным оптимумам в рамках симуляции. Лучшая альтернатива должна смоделировать данные об области значений, нормальные каждой стороне автомобиля как показано в следующем рисунке. В этом случае измерения расстояния с каждой стороны автомобиля независимы друг от друга.
ANFIS поддерживает только Sugeno ФИСС, который не может всегда создавать сглаженную поверхность управления.
Чтобы обновить древовидный проект FIS, можно рассмотреть следующие потенциальные изменения.
Используйте ФИСС Mamdani, которые поддерживают дополнительные настраивающие методы вне ANFIS.
Спроектируйте начальную основу правила нечетких систем вывода с помощью человеческого мышления и затем настройтесь с обучающими данными.
Используйте пользовательскую функцию стоимости, чтобы автоматически сгенерировать данные и оптимизировать траекторию парковки с помощью основанной на вознаграждении симуляции парковки. Для примера смотрите Мелодию Нечеткая Система Предотвращения Препятствия Робота Используя Пользовательскую Функцию стоимости.
tunefis
| getTunableSettings
| fistree