2015-03-24 2 views
0

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

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

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

(2) linearVelocity = (forwardSpeed ​​* соз (тета), forwardSpeed ​​* Sin (тета))

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

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

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

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

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

ответ

0

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

+0

Похоже, мне нужно будет поднять ваше предложение и перейти к динамическому телу, так как я не могу заставить суперпростую кинематическую версию работать. Вопрос: хотя я могу сделать револьверное соединение, соединяющее двумерное тело робота с колесом под углом 90 градусов к нему? Разве мне не понадобится третье измерение? Другими словами, колеса должны вращаться вокруг оси z, чтобы продвинуть робота вперед, но Box2D не имеет оси z, правильно? Извините, если вопрос звучит глупо, но я очень новичок в Box2D – stefano

+0

. Возможно, я, возможно, забыл подчеркнуть, что я использую Box2D в режиме сверху вниз (т. Е. С гравитацией = 0). Отсюда моя путаница в том, как внедрить колесо через револьверный сустав. – stefano

+0

Ничего, наш твой учебник: [link] (http://www.iforce2d.net/b2dtut/top-down-car) :-) – stefano

Смежные вопросы