Плавное серво движение для ползущего робота

11

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

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

Решите для , a_1 , a_2 и a_3 :a 1 a 2 a 3a0a1a2a3

r a t e ( t ) = p o s i t i o n ( t ) = a 1 + 2 a 2 т + 3 a 3 т

поsяTяоN(T)знак равноa0+a1T+a2T2+a3T3
рaTе(T)знак равнопоsяTяоN'(T)знак равноa1+2a2T+3a3T2

Дано: поsяTяоN(0) , поsяTяоN(Tе) , рaTе(0) , рaTе(Tе)

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

Это работало довольно хорошо, но это решение ограничено несколькими способами. С одной стороны, трудно решить, какими именно должны быть скорости между движениями в одном направлении. Я использовал среднее значение уклонов впереди и сзади определенной позиции между движениями, но мне не ясно, что является оптимальным. Во-вторых, кубические кривые могут привести сервопривод в положение вне диапазона положений в начале и в конце движения, что может быть нежелательным. Например, в некоторой точке в течение временного интервала кривая может заставить сервопривод выйти за пределы второй позиции или ниже первой позиции. В-третьих, генерация кривой здесь не учитывает максимальную скорость, которую может разворачивать сервопривод, поэтому кривая может иметь сервопривод, движущийся со скоростью, которая нереальна. С этим,

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

Есть ли лучший способ сделать серво движение более плавным и более реалистичным?

Robz
источник
Код должен был быть относительно простым. Можете ли вы рассказать больше о том, почему это было связано?
DaemonMaker
1
Вы правы, код был довольно простым, хотя полученный метод управления сервоприводами был более сложным, чем раньше. Я отредактировал свой вопрос, чтобы вместо него включить описание ограничений этого метода.
Робз
NURBS , неоднородные рациональные B-сплайны, могут выполнять эту работу
Джеймс Уолдби - jwpat7
@ jwpat7 спасибо за ваш вклад, но я не думаю, что NURBS сработает, потому что эти кривые не гарантируют попадание в поставленные точки
Robz
Это так же просто, как понизить коэффициент ? Кп
Ян

Ответы:

6

Генерация профиля движения

В прошлом я использовал генератор профилей движения для решения этой проблемы. Чтобы использовать его, вам понадобятся желаемое целевое положение (заданное значение), максимальная скорость и значения ускорения, связанные с вашими двигателями. Он работает путем интегрирования трапециевидной кривой скорости, чтобы получить плавный профиль положения. S-образная кривая может использоваться, если движение должно быть еще более плавным. Ссылка на статью, объясняющую профилирование движения .

Предварительная фильтрация заданного значения

Помимо маршрута профилирования движения, вы можете попробовать просто пропустить низкочастотную фильтрацию команды к сервоприводам. Этот тип фильтрации заданных значений замедлит ваш ответ, но также сгладит его, и его легко реализовать. Частоту среза нужно будет выбирать так, чтобы она поддерживала полосу пропускания вашей системы (чтобы она не отфильтровывала желаемое движение). Реализация простого фильтра нижних частот в C

ddevaz
источник
+1: определенно генерация профиля движения.
Гай Сиртон
2

Я думаю, что вопрос касается такого рода устройства: RC сервопривод

Обычно это не очень высокая производительность, поэтому они не смогут хорошо отслеживать сгенерированный профиль движения. Большинство коммерческих систем управления двигателем используют S-кривую для движения точка-точка (см. Ответ @ ddevaz), которые создают кусочный профиль, где каждый сегмент использует свое уравнение. Ваша проблема заключается в том, что для того, чтобы ваш двигатель отслеживал сгенерированный профиль, у вас, вероятно, будет очень «медленный» профиль. В противном случае в профиле, который вы пробуете и подаете команду на устройство, будет большая ошибка положения по сравнению с фактическим положением устройства.

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

Гай Сиртон
источник