Направление робота через путь

У меня есть поле, заполненное препятствиями, я знаю, где они расположены, и я знаю положение робота. Используя алгоритм поиска пути, я вычисляю путь для робота.

Теперь моя проблема: я направляю робота из сетки в сетку, но это создает не очень гладкое движение. Я начинаю с A, поворачиваю нос до точки B, двигаюсь прямо, пока не дойду до точки B, не промойте и не повторите, пока не будет достигнута конечная точка.

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

У робота есть два колеса и два двигателя. Я меняю направление движения двигателя, поворачивая двигатели в обратном направлении.

EDIT: я могу варьировать скорость двигателей, в основном робот - это arduino plus ardumoto, я могу подавать значения между 0-255 двигателям в любом направлении.

Ответ 1

Вам нужна линеаризация обратной связи для робота с дифференциальным управлением. Этот документ объясняет это в Разделе 2.2. Я включил соответствующие части ниже:

Моделируемый робот, необходимый для проект является независимым роботом с ограниченной скоростью. поскольку различные роботы-накопители нехолономные, ученикам предлагается использовать линеаризацию обратной связи для преобразование выходного сигнала кинематического управления из их алгоритмов для управления различных роботов. следует следующее преобразование:

Transformation

где v, ω, x, y - линейные, angular и кинематические скорости. L представляет собой заданную длину, пропорциональную размер базового колеса робота.

Ответ 2

Один алгоритм управления, с которым я имел неплохие результаты, - это чистое преследование. В принципе, робот пытается переместиться в точку вдоль пути на фиксированное расстояние перед роботом. Так как робот движется по пути, точка обзора вперед также продвигается вперед. Алгоритм компенсирует неголономные ограничения путем моделирования возможных путей как дуг.

Увеличенное расстояние вперед будет создавать более плавное движение. Однако большие расстояния впереди будут заставлять робота срезать углы, которые могут столкнуться с препятствиями. Вы можете исправить эту проблему, реализовав идеи из реактивного алгоритма управления, называемого Vector Field Histogram (VFH). VFH в основном отталкивает робота от закрытых стен. В то время как это обычно использует какой-то датчик дальности, вы можете экстраполировать относительные местоположения препятствий, так как вы знаете положение робота и места препятствий.

Ответ 3

Мои первоначальные мысли об этом (я на работе, поэтому не могу тратить слишком много времени):

Это зависит от того, насколько вы хотите или хотите, чтобы ваши углы были (что будет зависеть от того, сколько расстояние ваш искатель пути дает вам от препятствий)

Учитывая ширину робота, вы можете рассчитать радиус поворота, учитывая скорости для каждого колеса. Предполагая, что вы хотите идти как можно быстрее, и что занос не является проблемой, вы всегда будете держать внешнее колесо на уровне 255 и уменьшите внутреннее колесо до скорости, которая дает необходимый радиус поворота.

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

Ответ 4

Оптимизационный подход - это очень общий способ справиться с этим.

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

Заметки курса Robotics от Marc Toussaint являются хорошим источником для такого подхода. См., В частности, лекцию 7: http://userpage.fu-berlin.de/mtoussai/teaching/10-robotics/