Я моделирую простой робот с дифференциальным приводом (например, 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 для робота, поэтому трение не играет роли в моих результатах.
Похоже, мне нужно будет поднять ваше предложение и перейти к динамическому телу, так как я не могу заставить суперпростую кинематическую версию работать. Вопрос: хотя я могу сделать револьверное соединение, соединяющее двумерное тело робота с колесом под углом 90 градусов к нему? Разве мне не понадобится третье измерение? Другими словами, колеса должны вращаться вокруг оси z, чтобы продвинуть робота вперед, но Box2D не имеет оси z, правильно? Извините, если вопрос звучит глупо, но я очень новичок в Box2D – stefano
. Возможно, я, возможно, забыл подчеркнуть, что я использую Box2D в режиме сверху вниз (т. Е. С гравитацией = 0). Отсюда моя путаница в том, как внедрить колесо через револьверный сустав. – stefano
Ничего, наш твой учебник: [link] (http://www.iforce2d.net/b2dtut/top-down-car) :-) – stefano