Этот пример показывает, как настроить систему нечеткого вывода (FIS) для автономного приложения парковки с неголономическими ограничениями.
Автономная парковка является важной способностью интеллектуальных транспортных средств (автономных автомобилей). Неголономическая кинематика накладывает дополнительные ограничения на автономную парковку, где автомобиль не может двигаться боком и вместо этого использует изогнутое движение.
Следующий рисунок показывает кинематику неголономического автомобиля со стандартным механизмом рулевого управления Ackermann.
Кинематическая модель имеет следующие параметры.
- текущая ориентация автомобиля относительно глобальной системы координат.
- угол поворота руля относительно ориентации автомобиля.
- центр переднего колеса, .
- центр заднего колеса, .
- длина колесной базы.
является центром кривизны автомобиля.
- радиус кривизны автомобиля.
В этой модели ориентация заднего колеса фиксирована и параллельна кузову автомобиля. То есть задние колеса имеют ту же ориентацию, что и автомобиль, . Передние колеса параллельны друг другу и вращаются с углом поворота . Угол поворота ограничен, чтобы находиться между и . В данном примере, составляет 30 степени.
Центр переднего и заднего колес имеет следующие отношения.
Кинематические уравнения для скорости центра переднего колеса и скорости ориентации автомобиля следующие, где - скорость автомобиля.
Минимальный радиус кривизны () для автомобиля зависит от длины колесной базы (). Этот минимальный радиус ограничивает движение автомобиля во время маневров стоянки.
Когда человек драйвера паркуется, им часто не удается поддерживать необходимую скорость и ориентацию автомобиля при приближении к пустому парковочному пространству. Чтобы успешно припарковаться без столкновения, они должны компенсировать переключением между движением вперед и назад с регулированием скорости и угла поворота автомобиля.
Человеческие драйверы сознательно не выполняют геометрические расчеты, основанные на кинематической модели своего автомобиля. Вместо этого, основываясь на собственном опыте проб и ошибок, они используют естественные правила и рассуждения, чтобы понять ограничения своего автомобиля в ситуации парковки. Можно использовать нечеткие системы, чтобы смоделировать такие основанные на правилах рассуждения.
Этот пример использует следующее окружение, чтобы симулировать лобовую парковку неголономического автомобиля.
Здесь:
Среда симуляции - стоянка 45 на 15 футов.
На выведенном участке показаны занятые парковочные места.
Пустое парковочное место - 6 на 7 футов.
Машина 5 на 3 фута и длина колесной базы () составляет 3 фута, обеспечивая смещение на 1 фут от колесной базы как к передней, так и к задней части автомобиля.
Этот пример принимает следующее.
Автомобиль оборудован интеллектуальной системой, которая может обнаружить пустое парковочное место и затем остановить автомобиль около стартового ребра парковочного места.
Автономная система парковки берёт под контроль автомобиль после его остановки. В идеале при стартовом положении машина практически вертикально центрируется в дороге и параллельна дороге ( град или град).
Из-за постоянно изменяющегося характера стоянки, кинематических ограничений движения и атрибутов физического автомобиля машина действительно останавливается при точном желаемом положении и ориентации. Поэтому система парковки принимает, что машина останавливается где-то перед пустым парковочным местом с или град и с неравным пространством на любом sid el автомобиля.
Чтобы избежать столкновений, автомобиль оборудован датчиками области значений для предоставления данных о области значений для передней, задней, левой и правой сторон автомобиля. Следующий рисунок показывает пример данных области значений, полученных с датчиков в среде симуляции.
Максимальная область значений датчиков принята как , который охватывает всю среду симуляции.
Человеческое мышление для парковки автомобилей
В целом, как показано на следующем рисунке, человеческий драйвер поддерживает соответствующую скорость и угол поворота руля при приближении к пустому стояночному месту. В этом случае они могут парковаться без каких-либо движений вперед и назад.
Однако иногда драйвер не удается поддерживать желаемую скорость и угол поворота для стоянки без колебаний. Как показано в следующем примере, драйвер должен затем компенсировать с помощью возвратно-поступательных движений.
При этом драйвер:
Поворачивает направо и движется вперед.
Не заходит на парковочное место, так как передняя часть машины приближается к машине на занимаемом пространстве.
Поворачивает налево и резервируется, чтобы получить достаточно места, чтобы войти в парковочное место
Перемещается вперед, чтобы войти в парковочное место, регулируя ориентацию автомобиля, чтобы соответствовать направлению парковки.
Остановка, когда передняя часть автомобиля является безопасным минимальным расстоянием от конца парковочного места, и транспортное средство выровнена с парковочным местом (ориентация 90 o в среде симуляции).
Следующий раздел использует эти шаблоны движения, чтобы создать нечеткие системы для автономной парковки.
Для настройки нечетких систем этот пример искусственно генерирует обучающие данные с использованием кинематической модели автомобиля и шаблонов движения, описанных в предыдущем разделе. Процесс генерации данных использует следующую дискретную форму кинематической модели, где составляет 0,1 секунды.
Угол поворота руля () и скорость () значения генерируются на основе типичных шаблонов вождения человека, обсуждавшихся ранее. Угол и скорость рулевого управления ограничиваются следующими пределами.
В порядок сделать пространство для безопасного поворота, движение назад использует более высокую скорость, когда машина приближается к занятому пространству. Кроме того, автомобиль может использовать ту же скорость в течение более длительных периодов времени при движении назад, чтобы сделать достаточное пространство для безопасного поворота.
Загрузите структуру обучающих данных.
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;
Синтаксис 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;
Для повторяемости установите seed генератора случайных чисел по умолчанию.
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
false, что вызывает 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
В этом случае, подобно результатам стоянки с правой стороны, машина следует возвратно-поступательным движением, чтобы безопасно припарковать машину.
Текущая нечеткая разработка системы имеет следующие недостатки:
Сгенерированные данные рассматривают только два шаблона движения для автономной парковки. Поэтому система автономной парковки имеет ограниченную робастность и не представляет всех общих навыков человеческого драйвера. Например, на следующем рисунке показан другой распространенный сценарий, в котором драйвер перемещается назад и поворачивает вправо, чтобы освободить пространство справа от занимаемого пространства.
Сгенерированные данные используют град. Предел для углов поворота руля. Полученный высокий радиус кривизны увеличивает сложность парковки без колебаний.
Модель датчика, используемая в этом примере, является тривиальной моделью обнаружения заполнения, где значения области значений радиально обнаруживаются из центра автомобиля. Кроме того, когда данные о области значений аналогичны из каждого угла автомобиля, нечеткая система может привести к неожиданным результатам и локальной оптимизации в симуляции. Лучшая альтернатива - моделировать данные о области значений, нормальном к каждой стороне автомобиля, как показано на следующем рисунке. В этом случае измерения расстояния с каждой стороны автомобиля являются независимыми друг от друга.
ANFIS поддерживает только FIS Sugeno, которые могут не всегда создавать гладкую поверхность управления.
Чтобы обновить проект дерева FIS, можно рассмотреть следующие потенциальные изменения.
Используйте Mamdani FIS, которые поддерживают дополнительные методы настройки за пределами ANFIS.
Разработайте начальную основу правил систем нечеткого вывода с помощью человеческого мышления и затем настройте с помощью обучающих данных.
Используйте пользовательскую функцию стоимости, чтобы автоматически сгенерировать данные и оптимизировать траекторию парковки с помощью основанной на вознаграждении симуляции парковки. Для получения примера смотрите Настроить Нечеткую Систему Предотвращения Препятствий Робота Используя Пользовательскую Функцию Стоимости.
fistree
| getTunableSettings
| tunefis