Способное к реверсу Движение, Планирующее Модель Тягача Используя plannerControlRRT

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

  1. Введение в Kino-динамическое планирование.

  2. Адаптация plannerControlRRT к системе Тягача.

  3. Нахождение траекторий без коллизий Используя кинематическую систему.

Введение в Kino-динамическое планирование

Описание планировщика

Обычные геометрические специалисты по планированию, такие как RRT, RRT*, и hybridA*, являются быстрыми и расширяемыми алгоритмами, способными к нахождению полных и оптимальных решений большого разнообразия планирования проблем. Один компромисс, однако, то, что они делают предположения о пробеле планирования, который не может сохраняться для реальной системы. Обычные геометрические специалисты по планированию принимают, что любые два состояния на пробеле могут быть соединены траекторией без остаточной ошибки, и что пути, возвращенные геометрическим специалистом по планированию, могут быть прослежены физической системой.

Для систем с комплексной кинематикой, или те, которые не имеют легко определенных решений закрытой формы для соединения состояний, используют kino-динамических планировщиков, таких как plannerControlRRT. Kino-динамические планировщики обменивают полноту на планирование гибкости и усиливают собственную кинематическую модель системы и контроллер, чтобы сгенерировать выполнимые и отслеживаемые траектории.

Запланировать данную систему, the plannerControlRRT функция запрашивает эту информацию:

  • Утилита для демонстрационных состояний на пробеле планирования.

  • Метрика, чтобы оценить стоимость соединения двух состояний.

  • Механизм, чтобы детерминировано распространить систему от одного состояния к другому.

  • Утилита, чтобы определить, достигло ли состояние цели.

Этот пример демонстрирует, как сформулировать эти различные утилиты для системы тягача и адаптировать их в инфраструктуру планирования. Этот предварительный просмотр показывает результат:

% Attempt to generate MEX to accelerate collision checking
genFastCC
Code generation successful.
% load preplannedScenarios
parkingScenario = load("parkingScenario.mat");
planner = parkingScenario.planner;
start   = parkingScenario.start;
goal    = parkingScenario.goal;

% Display the scenario and play back the trajectory
show(planner.StatePropagator.StateValidator);
axis equal 
hold on
trajectory = plan(planner,start,goal);
demoParams = trajectory.StatePropagator.StateSpace.TruckParams;
exampleHelperPlotTruck(demoParams,start); % Display start config
exampleHelperPlotTruck(demoParams,goal);  % Display goal config

% Plan path using previously-built utilities
rng(1)
trajectory = plan(planner,start,goal);

% Animate the trajectory
exampleHelperPlotTruck(trajectory);
hold off

Figure contains an axes object. The axes object contains 30 objects of type patch, line, rectangle.

Kino-динамический алгоритм планирования

Если вы уже знакомы с геометрическими специалистами по планированию, итерацией plannerControlRRT алгоритм поиска должен выглядеть знакомым, но с несколькими дополнительными шагами:

  1. Произведите целевое состояние.

  2. Найдите аппроксимированного самого близкого соседа целевого состояния в дереве поиска.

  3. Сгенерируйте вход управления (или ссылочное значение) и управляйте длительностью, которая управляет системой к цели.

  4. Распространите (расширяют) систему к выборке при проверке промежуточных состояний вдоль распространенной траектории. Возвратите допустимую последовательность состояний, средств управления и длительности.

  5. Проверяйте, достигли ли какие-либо возвращенные состояния цели.

  6. Если цель была найдена, выход. В противном случае добавьте конечное состояние, начальное управление, совокупную длительность и цель к дереву.

  7. (Необязательно) Произведите целевую настройку и управление и повторные шаги 4,5, и 6 желаемое число раз.

Компоненты, необходимые plannerControlRRT Среда

Чтобы адаптировать планировщика к определенной проблеме, необходимо реализовать пользовательский nav.StatePropagator и nav.StateSpace классы. Раздел ниже сопоставляет шаги, описанные в разделе Kino-Dynamic Planning Algorithm к классу и ответственному методу:

  1. qtgt=sampleUniform(space)

  2. [dist,err]=distance(propagator,Qtree,qtgt)

  3. [u,Nstep]=sampleControl(propagator,q0,u0,qtgt)

  4. [Q1:n,U1:n,nstep1:n]valid=propagateWhileValid(propagator,q0,u0,qtgt,Nstep)

  5. plannerControlRRT проверки, достигли ли какие-либо возвращенные состояния цели.

  6. По умолчанию выход из планирования или добавления к дереву поиска выполняется distance функция распространителя. Можно заменить его путем предоставления планировщика указатель на функцию во время конструкции.

  7. По умолчанию, каждый раз, когда планировщик успешно добавляет узел в дерево, это попытается распространить недавно добавленное состояние к целевой настройке. Это целевое распространение может произойти многократно подряд или быть отключено полностью путем изменения NumGoalExtension свойство планировщика.

Для более подробного синтаксиса функций требования аргумента и примеры, видят plannerControlRRT, nav.StateSpace, и nav.StatePropagator.

Адаптация plannerControlRRT к системе трейлера грузовика

Этот раздел демонстрирует, как сформулировать, смоделировать, и управлять системой трейлера грузовика 2D тела. Эта система по сути нестабильна во время противоположного движения, таким образом, пути, возвращенные обычными геометрическими специалистами по планированию, вряд ли приведут к хорошим результатам во время следования траектории. Чтобы точно смоделировать эту систему, вы должны:

  • Задайте функцию изменения состояния.

  • Задайте геометрические параметры модели.

  • Создайте закон о надзоре, настроенный к параметрированной модели.

  • Создайте эвристику расстояния, настроенную к параметрированной модели.

  • Группируйте кинематическую модель, метрику расстояния и закон о надзоре в пользовательском пространстве состояний и утвердите распространителя.

  • Запланируйте путь несколько проблемных сценариев.

Задайте функцию изменения состояния

Эта система тягача состоит из двух твердых тел, соединенных в помехе центральной фигуры, которая моделируется как шарнирное соединение. Корпус трейлера вступает в контакт с землей в задней оси, и передняя сторона трейлера поддерживается помехой, расположенной где-нибудь вдоль осевой средней линии грузовика.

Запаздывающая Настройка (оставленный, M <0), Настройка OverCenter (право, M> 0)

Используйте геометрическую настройку для системы трейлера грузовика 2D тела от Грузовика и Трейлера Автоматическая Парковка Используя Многоступенчатый Нелинейный пример MPC, описанный как:

qsys=[x2y2θ2β],

где:

  • x2 глобальная переменная x- позиция центра задней оси трейлера.

  • y2 глобальная переменная y- позиция центра задней оси трейлера.

  • θ2 — Глобальный угол ориентации трейлера, где 0 восток.

  • β — Ориентация грузовика относительно трейлера, где 0 выравнивается.

Для планирования целей добавьте флаг направления, vsign, и общее расстояние переместилось из настройки запуска, stot к вектору состояния, для обозначения конечного состояния:

q=[x2y2θ2βvsignstot]

  • vsign — Указывает на желаемый режим управления (вперед или реверс) или необходимая скорость, гарантируя, что система распространяет к цели, происходят в желаемом направлении.

  • stot — Изменяет поведение distance распространителя функция распространителя. Можно изменить TravelBias распространителя свойство изменить частоту, с которой сравнение ближайшего соседа включает или исключает стоимость корня к узлу. Значения ближе к 0 результатам в более быстром поиске пробела планирования, за счет более локально оптимальных установленных связей. Значения ближе к 1 могут улучшить решения планировщика, но время планирования увеличения.

Эта функция изменения состояния является расширением TruckTrailerStateFcn. Для полной деривации функции изменения состояния смотрите exampleHelperStateDerivative, который является упрощением этой модели [1] N-трейлера:

q˙(L1,L2,M,q,u)=[x2˙y2˙θ2˙β˙0v]

Для простоты, эта модель обработки uapp=[v,αsteer] когда мгновенная скорость и держащаяся угловая команда применились к системе, сгенерированной высокоуровневым контроллером. Для получения дополнительной информации смотрите, Создают Законы о надзоре для Устойчивого Прямого и Противоположного Движения.

Задайте геометрические параметры модели и продемонстрируйте нестабильность

Кинематические характеристики этого транспортного средства в большой степени под влиянием выбора параметров модели. Создайте структуру, которая описывает систему тягача,

truckParams = struct;
truckParams.L1 = 6;     % Truck body length
truckParams.L2 = 10;    % Trailer length
truckParams.M  = 1;     % Distance between hitch and truck rear axle along truck body +X-axis

Задайте свойства, связанные с визуализацией и проверкой столкновения.

truckParams.W1 = 2.5;               % Truck width
truckParams.W2 = 2.5;               % Trailer width
truckParams.Lwheel = 1;             % Wheel length
truckParams.Wwheel = 0.4;           % Wheel width

Используя exampleHelperShowOpenLoopDynamics функционируйте и заданные параметры модели, распространите системное состояние использование его динамики разомкнутого контура, чтобы продемонстрировать, что внутренний угол автостабилизируется во время движения вперед, и нестабильный во время противоположного движения для любого ненулевого β0.

exampleHelperShowOpenLoopDynamics(truckParams);

Figure contains 2 axes objects. Axes object 1 with title Interior Angle vs Time, v > 0 contains 11 objects of type line. Axes object 2 with title Interior Angle vs Time, v < 0 contains 11 objects of type line.

Figure contains 2 axes objects. Axes object 1 with title Open loop propagation is empty. Axes object 2 contains 20 objects of type patch, line.

Создайте законы о надзоре для устойчивого прямого и противоположного движения

Этот пример нанимает многоуровневый контроллер переключения режимов, чтобы управлять моделью трейлера грузовика. В верхнем уровне чистый контроллер преследования вычисляет контрольную точку, P=[Xp,Yp], между текущим положением, qi, и целевое состояние, qtgt. У контроллера есть два режима для форварда и реверса. Для получения информации о базисе для этого закона о надзоре см. [1]. Для движения вперед контроллер вычисляет держащийся угол, который, когда сохранено постоянный, управляет задней осью грузовика вдоль дуги, которая пересекает контрольную точку:

q1i=[x1,y1θ1]i

θerr=atan2(Xp-x1,Yp-y1)-θ1

αfwd=f(θerr)

Для противоположного движения задняя ось трейлера становится управляемым состоянием, q2=[x2,y2,θ2]. Кроме того, потому что система по сути нестабильна во время противоположного движения, закон о надзоре обрабатывает держащийся угол, возвращенный контроллером верхнего уровня как ссылочное значение запланированному на усиление контроллеру LQ, который стремится стабилизировать внутренний угол транспортного средства:

θerr=atan2(Xp-x2,Yp-y2)-θ2

βd=-atan(2L2sin(θerr)R)

βref=βd+Kp(βd-β)

Стабилизация обратной связи LQ

Во время противоположного движения можно добавить усиление в держащийся угол, который управляет внутренним углом к точке равновесия. Используйте контроллер LQ, чтобы вычислить желаемый руководящий угол и усиления обратной связи. Усиления являются оптимальным решением Алгебраического уравнения Рикатти, сохраненного как интерполяционная таблица, зависящая от желаемого руководящего угла. Для получения дополнительной информации о деривации этого контроллера обратной связи, смотрите exampleHelperCalculateLQGains:

% Define Q/R weight matrices for LQR controller
Q = 10; % Weight driving betaDot -> 0
R = 1; % Weight minimizing steering angle command

% Derive geometric steering limits and solve for LQR feedback gains
[alphaLimit, ...        % Max steady-state steering angle before jack-knife
 betaLimit, ...         % Max interior angle before jack-knife
 alphaDesiredEq, ...    % Sampled angles from stable alpha domain
 alphaGain ...          % LQ gain corresponding to desired alpha
] = exampleHelperCalculateLQGains(truckParams,Q,R);

Figure contains an axes object. The axes object with title Trailer Axial Velocity VS Steering Angle contains 2 objects of type line.

Figure contains an axes object. The axes object with title LQ Gain vs Desired Steering Angle contains an object of type line.

% Add limits to the truck geometry
truckParams.AlphaLimit = alphaLimit;
truckParams.BetaLimit = betaLimit;

Задайте предварительные расстояния для чистого контроллера преследования, exampleHelperPurePursuitGetSteering, и уровень и информация о промежутке для нашего средства моделирования модели, exampleHelperPropagateTruck. Из-за нестабильности во время противоположного движения, и поскольку вы только имеете косвенный контроль над внутренним углом, задают большее предварительное расстояние наоборот. Это дает системе больше времени, чтобы минимизировать виртуальную руководящую ошибку при поддержании устойчивого внутреннего угла.

% Select forward and reverse lookahead distances. For this example,
% use a reverse lookahead distance twice as long as the forward
% lookahead distance, which itself is slightly longer than the 
% wheelbase. You can tune these parameters can be tuned for
% improved performance for a given geometry.
rFWD = truckParams.L1*1.2;
rREV = rFWD*2;

% Define parameters for the fixed-rate propagator and add them to the
% control structure
controlParams.MaxVelocity = 3; % m/s
controlParams.StepSize = .1; % s
controlParams.MaxNumSteps = 50; %#ok<STRNU> % Max number of steps per propagation

Создайте структуру связанной с управлением информации.

% Store gains and control parameters in a struct
controlParams = struct(...
    'MaxSteer',alphaLimit, ...          % (rad)
    'Gains',alphaGain, ...              % ()
    'AlphaPoints',alphaDesiredEq, ...   % (rad)
    'ForwardLookahead',rFWD, ...        % (m)
    'ReverseLookahead',rREV, ...        % (m)
    'MaxVelocity', 3, ...               % (m/s)
    'StepSize', 0.1, ...                % (s)
    'MaxNumSteps', 200 ...               % ()
    );

Задайте эвристику расстояния

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

distanceHeuristic = exampleHelperCalculateDistanceMetric(truckParams,controlParams);

Figure contains 2 axes objects. Axes object 1 with title Forward Simulations contains 2 objects of type line. These objects represent Trajectories, XY Error. Axes object 2 with title Forward Cost contains an object of type image.

Figure contains 2 axes objects. Axes object 1 with title Reverse Simulations contains 2 objects of type line. These objects represent Trajectories, XY Error. Axes object 2 with title Reverse Cost contains an object of type image.

Адаптируйте систему к использованию с кинематическим планировщиком

Адаптируйте систему в среду, применимую кинематическим планировщиком пути, plannerControlRRT. Создайте 3 пользовательских класса: exampleHelperTruckStateSpace, exampleHelperTruckPropagator, и exampleHelperTruckValidator, которые наследовались nav.StateSpace, nav.StatePropagator, и nav.StateValidator подклассы, соответственно.

Инициализируйте пространство состояний

Объект пространства состояний, в основном, ответственен за:

  • Выборка случайных состояний для планировщика.

  • Определение и осуществление состояния ограничивают в траектории.

Задайте пределы xy-для доступной для поиска области. Инициализируйте пространство состояний с помощью этих пределов и геометрических свойств транспортного средства прицепа для грузовика, содержащего β- пределы, определенные геометрическими свойствами грузовика и трейлера.

Поскольку кинематический планировщик использует distance функция распространителя состояния для ее поиска ближайшего соседа, оставьте пространство состояний distance неопределенный метод. Оставьте interpolate и sampleGaussian методы столь же неопределенного пространства состояний.

% Define limits of searchable region
xyLimits = [-60 60; -40 40];

% Construct our state-space
stateSpace = exampleHelperTruckStateSpace(xyLimits, truckParams);

Инициализируйте блок проверки допустимости состояния

В этом примере блок проверки допустимости состояния использует ориентированные ограничительные рамки (OBBs), чтобы проверить, является ли транспортное средство в столкновении со средой. Грузовик представлен двумя прямоугольниками с положениями, заданными состоянием и геометрией транспортного средства грузовика, содержавшегося в объекте пространства состояний. Среда представлена списком прямоугольников с их местоположениями, ориентациями и размерностями, заданными в структуре 1 на n. Загрузите файл MAT, содержащий среду в рабочую область, и используйте препятствия и объект пространства состояний создать блок проверки допустимости состояния.

% Load a set of obstacles
load("Slalom.mat");

% Construct the state validator using the state space and list of obstacles
validator = exampleHelperTruckValidator(stateSpace,obstacles);

Инициализируйте распространителя состояния

В кинематическом планировании объект распространителя состояния ответственен за:

  • Оценка расстояния между состояниями.

  • Выборка начальной буквы управляют, чтобы распространить по контрольному интервалу или получение входных параметров управления как ссылочные значения для контроллеров низшего уровня во время распространения.

  • Распространение системы к цели и возврат допустимого фрагмента траектории планировщику.

Для лучших результатов, distance функция должна оценить стоимость траектории, сгенерированной при распространении между состояниями.

% Construct the state propagator using the state validator, control parameters,
% and distance lookup table
propagator = exampleHelperTruckPropagator(validator,controlParams,distanceHeuristic);

Создайте путь планировщика и плана

Создайте кинематического планировщика пути, который использует распространителя состояния, чтобы искать путь между этими двумя настройками.

% Define start configuration
start = [35 5 pi/2 0 0 0];

% Define the goal configuration such that the truck must reverse into
% position.
goal  = [-35 20 -pi/2 0 -1 nan];

% Display the problem
figure
show(validator)
hold on
configs = [start; goal];
quiver(configs(:,1),configs(:,2),cos(configs(:,3)),sin(configs(:,3)),.1)

Figure contains an axes object. The axes object contains 5 objects of type rectangle, patch, quiver.

% Define a function to check if planner has reached the true goal state
goalFcn = @(planner,q,qTgt)exampleHelperGoalReachedFunction(goal,planner,q,qTgt);

% Construct planner
planner = plannerControlRRT(propagator,GoalReachedFcn=goalFcn,MaxNumIteration=30000);
planner.NumGoalExtension = 3;
planner.MaxNumTreeNode = 30000;
planner.GoalBias = .25;
% Search for the path
rng(0)
[trajectory,treeInfo] = plan(planner,start,goal)
trajectory = 
  navPathControl with properties:

    StatePropagator: [1x1 exampleHelperTruckPropagator]
             States: [23x6 double]
           Controls: [22x4 double]
          Durations: [22x1 double]
       TargetStates: [22x6 double]
          NumStates: 23
        NumSegments: 22

treeInfo = struct with fields:
     IsPathFound: 1
        ExitFlag: 1
     NumTreeNode: 2201
    NumIteration: 1196
    PlanningTime: 17.1705
        TreeInfo: [6x6602 double]

% Visualize path and waypoints
exampleHelperPlotTruck(trajectory);
hold off

Figure contains an axes object. The axes object contains 14 objects of type patch, line, rectangle, quiver.

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

% Load scenario obstacles
nonConvexProblem = load("NonConvex.mat");

% Update validator and state space
validator.Obstacles = nonConvexProblem.obstacles;
validator.StateSpace.StateBounds(1:2,:) = [-100 100; -40 40];
figure
show(validator)

% Define start and goal
start = [10 0 0 0 NaN 0];
goal  = [-10 0 pi 0 -1 0];

% Update goal reached function
goalFcn = @(planner,q,qTgt)exampleHelperGoalReachedFunction(goal,planner,q,qTgt);
planner.GoalReachedFcn = goalFcn;

% Turn off optional every-step goal propagation
planner.NumGoalExtension = 0;

% Increase goal sampling frequency
planner.GoalBias = .25;

% Balanced search vs path optimality
propagator.TravelBias = .5;

% Plan path
rng(0)
trajectory = plan(planner,start,goal);

% Visualize result
exampleHelperPlotTruck(trajectory);

Figure contains an axes object. The axes object contains 13 objects of type patch, line, rectangle.

Ссылки

[1] Holmer, Олов. “Движение, Планирующее Инвертирующую Полномасштабную Систему Грузовика и Трейлера”. Тезис M.S., Университет Linköping, 2016.