Я моделирую простого робота с дифференциальным приводом (например, 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 для робота, поэтому трение не играет роли в моих результатах.