Роботы с дифференциальным приводом: преобразование скорости вращения колес в линейную / угловую скорости

Я моделирую простого робота с дифференциальным приводом (например, e-Puck, Khepera и т. Д.) С помощью pyBox2D. Этот класс роботов обычно контролируется путем указания скорости правого и левого колеса в рад / сек.
Однако Box2D может управлять (кинематическим) телом только через два параметра: линейную скорость (в метрах / сек, как 2D вектор) и угловой скорости (в рад / сек). Мне нужно преобразовать скорость моего колеса в линейную + угловую скорости.

Линейная скорость на самом деле проста. Учитывая радиус колеса r в метрах и текущую ориентацию робота theta в радианах, скорость движения представляет собой просто среднее из двух скоростей колес в метрах / с и сокращается до вектора в соответствии с текущей ориентацией:

(1) forwardSpeed ​​= ((rightSpeed ​​* r) + (leftSpeed ​​* r)) / 2

(2) linearVelocity = (forwardSpeed ​​* cos (theta), forwardSpeed ​​* sin (theta)).

Однако я не могу понять правильную формулу для угловой скорости. Интуитивно это должна быть разница между двумя скоростями по модулю расстояния между колесами:

(3) angularVelocity = (rightSpeed ​​- leftSpeed) / wheelSeparation

в предельных случаях: когда right = left, робот вращается на месте, а когда rightSpeed ​​= 0 или leftSpeed ​​= 0, робот вращается (поворачивается) вокруг неподвижного колеса, то есть по кругу с радиусом = до расстояния между колеса.

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

Обратите внимание, что я использую кинематическое тело Box2D для робота, поэтому трение не играет роли в моих результатах.


person stefano    schedule 24.03.2015    source источник


Ответы (1)


Имейте в виду, что угловые скорости в Box2D работают вокруг начала координат (0,0) в местных координатах тела, что затрудняет точное воспроизведение этого типа движения. Предположительно источник робота находится в центре тела, и в этом случае вы никогда не сможете заставить его вращаться вокруг одного колеса (для этого потребуются как поворот, так и перемещение). На самом деле может быть проще смоделировать робота как динамическое тело и приложить силы там, где находятся колеса. Если вы не хотите иметь дело с потерями на трение и т. Д., Вы можете использовать кинематическое тело для каждого колеса и соединить их с основным (динамическим) телом с помощью поворотных шарниров.

person iforce2d    schedule 25.03.2015
comment
Похоже, мне придется уловить ваше предложение и перейти к динамическому телу, поскольку я не могу заставить работать сверхпростую кинематическую версию. Вопрос, однако: как мне сделать поворотный шарнир, соединяющий двухмерное тело робота с колесом под углом 90 градусов к нему? Разве мне не нужно для этого третье измерение? Другими словами, колеса должны вращаться вокруг оси z, чтобы продвинуть робота вперед, но у Box2D нет оси z, верно? Извините, если вопрос звучит глупо, но я новичок в Box2D - person stefano; 28.03.2015
comment
Наверное, я забыл подчеркнуть, что использую Box2D в нисходящем режиме (т.е. с гравитацией = 0). Отсюда мое замешательство относительно того, как реализовать колесо через поворотный шарнир. - person stefano; 28.03.2015
comment
Неважно, нашел ваше руководство: ссылка :-) - person stefano; 28.03.2015