Симулятор движения по траектории: Pure Pursuit и Stanley
Проходите трассу на Pure Pursuit или Stanley с учётом запаздывания руления. Перетащите упреждение: весь прогон перестроится, включая цену GPS-обновления 1 Hz.
- Категория
- Автономные роботы
- Время
- 20–40 min
- Платформа
- Браузер · Arduino · Raspberry Pi
01 / Начните здесь
Введение
Планировщик передаёт путь, но не подсказывает колёсам, что делать. Эта лаборатория — недостающее звено. Pure Pursuit и Stanley проходят маршрут по контрольным точкам с переходной характеристикой рулевого привода первого порядка и задержкой измерений, потому что без задержки неверная настройка кажется оптимальной. Перетащите контрольную точку или упреждение, и весь прогон пересчитается.
Live lab / Path following
Path following simulator
Pure pursuit and Stanley steering the same course, with the lag a real robot has. Drag the lookahead and the whole run replots — too short oscillates, too long cuts corners, and the best value moves with speed.
The dashed line with dots is the course you asked for; the solid line is where the robot went. The faint line is the whole run at the current settings, computed the moment you change one. Below, cross-track error along the path — dotted verticals are corners. Drag a waypoint to rebuild the course.
- Commanded path
- Driven
- Full run preview
- GPS fix
- RMS error
- —
- Worst error
- —
- Corner cut
- —
- Steering effort
- —
- Progress
- 0%
- Lap time
- —
Keyboard: focus the course, then Space to run/pause, N to step, R to reset, C for a new course, F for full screen. Press 1–8 to pick a waypoint and the arrow keys to move it.
Управление
Регулятор выбирает один из двух вариантов: Pure Pursuit или Stanley. Упреждение — единственный регулируемый параметр Pure Pursuit, и для Stanley оно отключено, потому что Stanley его не использует — именно в этом и состоит суть.
Скорость и упреждение взаимодействуют, и с этим стоит поиграть: установите 1 m/s и найдите лучшее упреждение, затем установите 3 m/s и найдите его снова.
Источник положения заменяет идеальную одометрию обновлением 1 Hz с шумом масштаба метра, которое удерживается между обновлениями. Ошибка всегда оценивается относительно истины, поэтому штраф реальный, а не скрытый.
Перетащите любую контрольную точку или нажмите 1–8, чтобы выбрать её и перемещать стрелками. Весь прогон пересчитывается при перетаскивании.
Теория
Оба регулятора отвечают на один вопрос — какой угол руления выбрать, если известны моё положение и положение пути? — но отвечают на него совершенно по-разному.
Pure Pursuit основан на геометрии. Найдите точку пути на расстоянии упреждения L впереди и двигайтесь по дуге через неё:
κ = 2y / L_d² δ = atan(2 b sin α / L_d)
Здесь y — боковое смещение целевой точки в системе координат робота, а b — колёсная база. Параметр один, причём это расстояние, а не коэффициент, поэтому его можно переносить между роботами.
Stanley — это управление. Привяжите систему координат к передней оси и добавьте два слагаемых:
δ = θ_e + atan(k · e / v)
Ошибка курса плюс арктангенс поперечной ошибки. Деление на скорость позволяет одному коэффициенту работать в диапазоне скоростей. k — настоящий коэффициент регулятора, и он не переносится.
Лаборатория добавляет то, что опускают учебные выводы: 0.4 s полной задержки как переходную характеристику рулевого привода первого порядка 0.25 s плюс 0.15 s задержки измерений и вычислений. Без неё Pure Pursuit монотонно улучшается по мере уменьшения упреждения, и весь вопрос настройки исчезает.
Алгоритм
На каждом шаге для обоих регуляторов:
- Проецируйте на путь, выполняя поиск в окне вокруг последней достигнутой длины дуги, а не по всему пути. Глобальный поиск выбирает ближайший сегмент, поэтому трасса, которая возвращается назад, телепортирует прогресс робота в угол, пройденный минуту назад.
- Разрешайте ничью в вершине в пользу исходящего сегмента. После поворота оба соседних сегмента проецируются в одну точку на одинаковом расстоянии; сохранение входящего сегмента передаёт регулятору ошибку курса и боковое смещение, почти равные нулю, пока он едет прямо с трассы, без предупреждения.
- Вычислите угол руления по собственному правилу регулятора и ограничьте его механическим пределом.
- Примените задержку, затем интегрируйте модель велосипеда.
- Оценивайте по истине, а не по оценке положения.
Шаг 2 — не оптимизация. Именно он отличает работающий Stanley от Stanley, который уверенно съезжает с трассы на 78% каждого запуска.
Исходный код
Pure Pursuit в полном виде, в форме, которую он принимает на настоящем роботе:
float lastS = 0; // arc length last reached — state, and it only moves forward
float pursue(float x, float y, float heading, float speed) {
// The lookahead is scheduled on speed, with a hard floor: at a standstill a
// proportional schedule asks for zero, which is a division by zero in disguise.
float lookahead = constrain(0.7f * speed + 0.4f, 0.4f, 3.0f);
float s = projectOntoPath(x, y, lastS); // windowed around lastS
lastS = max(lastS, s);
Point goal = pointAtArcLength(lastS + lookahead);
float dx = goal.x - x, dy = goal.y - y;
float lateral = -sinf(heading) * dx + cosf(heading) * dy;
float ld = max(0.3f, hypotf(dx, dy)); // clamp, or curvature blows up
float curvature = 2.0f * lateral / (ld * ld);
return curvature; // omega = v * curvature
}
Три важные строки — нижний предел расписания, монотонность lastS и ограничение ld. Всё остальное — формула.
Допущения и отличия от реального оборудования
Лаборатория даёт роботу идеальную карту пути, идеально известную колёсную базу, отсутствие проскальзывания и чистую модель задержки первого порядка. У настоящего робота нет ни одного из этих условий.
Проскальзывание колёс делает оценку положения ошибочной так, что ни один регулятор не может это обнаружить. Люфт редуктора добавляет мёртвый ход при каждом изменении направления руления, что действует как дополнительная задержка и увеличивает оптимальное упреждение. А привод на дифференциальном принципе вообще не имеет угла руления — у него есть заданная скорость вращения, поэтому ω = v κ заменяет atan, а колёсная база важна только для того, насколько плотно он может поворачивать.
После всего этого сохраняется только форма: внутренний оптимум, смещающийся вправо вместе со скоростью, и рост ошибки при этом оптимуме со скоростью.
Схема соединений
Регулятор — самая дешёвая часть. Дороже то, что он требует от остальных частей робота.
Положение. Квадратурные энкодеры на обоих колёсах и одометрия привода на дифференциальном принципе, которая их интегрирует с частотой контура. В помещении этого достаточно на несколько десятков метров.
Курс. Гироскоп для краткосрочного отсчёта, магнитометр для абсолютного ориентира или оба. Ошибку курса оба регулятора учитывают с наибольшим весом, и одометрия теряет её первой.
Абсолютная коррекция на улице. Модуль GPS, объединённый с оценкой, а не используемый напрямую, — разница составляет 0.09 m среднеквадратичной ошибки (RMS) против 1.25.
Полную теорию смотрите в материалах Pure Pursuit и поперечной ошибке; для сборки начните с робота-вездехода по контрольным точкам GPS, который сначала работает в помещении на энкодерах и выходит наружу только после работоспособности регулятора следования.
Список оборудования
Компоненты
- Шасси, для которого можно непосредственно задавать руление или скорости колёс
- Оценка положения — как минимум энкодеры, а на улице объединённая с GPS
- Опорный источник курса, не дрейфующий на протяжении задания
- Контур, достаточно быстрый, чтобы его собственная задержка была меньше упреждения
Исследуйте граф
Где используется этот симулятор
Проекты, учебные пути и руководства, которые опираются на эту лабораторию.
Продолжайте сборку
Материалы для загрузки
Пользуйтесь этими справочными материалами на странице, пока работаете над проектом. Загружаемые пакеты проекта появятся только после публикации их исходников и версии.
Частые вопросы
Часто задаваемые вопросы
Почему более короткое упреждение не всегда улучшает отслеживание?
В модели без задержки это действительно так, и именно поэтому так часто вводят в заблуждение учебные выводы. Настоящие роботы требуют времени, чтобы достичь заданного угла руления, и действуют на позе, которая уже на десятки миллисекунд устарела. Здесь моделируется постоянная времени руления 0.25 секунды и задержка измерений 0.15 секунды. При такой задержке кривая ошибки становится U-образной: короткое упреждение задаёт коррекцию, которая приходит после того, как робот уже прошёл точку ошибки, поэтому следующая команда перекомпенсирует. Регулятор, который быстрее собственного исполнительного механизма, колеблется.
Как выбрать упреждение для моего робота?
Измерьте полную задержку управления, умножьте её на скорость и начните с расстояния от одного до двух таких значений. В этой лаборатории задержка равна 0.4 секунды, а измеренные оптимумы составляют 0.9 метра при 1 m/s и возрастают до 1.4 метра при 3 m/s — от 1.2 до 2.3 расстояния, пройденного за время задержки. Заметьте, что оптимум растёт со скоростью, но не пропорционально, поэтому фиксированное число секунд движения близко, но неверно. Реализуйте небольшое линейное расписание по скорости с жёстким минимумом, поскольку на месте расписание требует нуля.
Что лучше — Pure Pursuit или Stanley?
Они отказывают по-разному, и это полезный ответ. На этой трассе при 2 m/s Pure Pursuit срезает углы и заканчивает на 0.8 процента короче заданной длины пути; Stanley не сходит с линии, широко проходит и проезжает на 2.2 процента длиннее. Stanley удерживает более тесную линию там, где это важно, но тратит 18.5 радиан руления против 4.3 у Pure Pursuit — в четыре раза больше движения исполнительного механизма, тока и проскальзывания колёс. Используйте Pure Pursuit, когда путь является рекомендацией, а Stanley — когда это ограничение.
Почему ошибка измеряется относительно истинного положения, а не оценки?
Робот, который считает, что находится на пути, по построению сообщает нулевую ошибку. Переключите источник положения на GPS, и регулятор начнёт рулить по шумному обновлению, полученному секунду назад, пока лаборатория продолжает оценивать результат относительно позы, которую действительно интегрировала модель. Только поэтому штраф GPS отображается числом: 0.09 метра среднеквадратичной ошибки (RMS) превращается в 1.25, а усилие руления более чем учетверяется.
Что показывает бледная линия?
Полный прогон при текущих настройках, вычисляемый в момент изменения любого параметра. Каждое перемещение ползунка повторно прогоняет всю трассу без визуализации примерно за двадцать миллисекунд, поэтому перетаскивание упреждения показывает фактически получаемую траекторию, а не обещание. Жирная линия показывает робота, проходящего тот же прогон после нажатия «Пуск».
Почему робот никогда не перестаёт поворачивать на очень остром углу?
У обоих регуляторов есть минимальный радиус поворота, заданный колёсной базой и максимальным углом руления, и угол острее этого значения невозможно пройти никакой настройкой. Честные исправления находятся выше по контуру: сгладите путь скруглением или дугой либо замедлитесь перед углом, для чего и нужен профиль движения. Никакой регулятор руления не может создать геометрию, которой у транспортного средства нет.
Дополнительные материалы
Источники
Авторитетные источники, чтобы пойти глубже ограниченной учебной модели этого симулятора.