Хорошо, я вернулся с результатами!
Я попробовал два подхода:
Использование механики твердого тела для получения дифференциального уравнения, управляющего движением центров колес: входы системы «велосипед» - это крутящий момент на заднем колесе и угол наклона переднего колеса, а на выходе - кинематика центров колес. Но я сдался, это было сложно!
Попытка угадать, что происходит с геометрической точки зрения, когда заднее колесо «толкает» переднее колесо вперед, а переднее колесо не является прямым. Этот метод напрямую выдает уравнение бесконечно малых приращений (см. Ниже), из которого вы можете получить фактическое дифференциальное уравнение. Я не пытался манипулировать этим первым уравнением, чтобы получить ODE, но я предполагаю, что я получил бы тот же самый ODE, используя механику твердого тела. Это просто чувствует себя хорошо.
Обозначения и гипотезы:
Мы находимся в плоскости с базисными векторами ex и ey .
А является центром заднего колеса. B - центр переднего колеса. Длина велосипеда L представляет расстояние между A и B . Угол между ey и вектором AB равен φ . Угол между AB и передним колесом θ .
Интуитивное обоснование:
Мы полагаем , что в некоторый момент времени Т , А (Т) имеет скорость V (T) коллинеарно с AB . Следовательно, для бесконечно малого временного шага dt ,
A (t + dt) = A (t) + V (t) .dt .
Мы также предполагаем, что в момент времени t переднее колесо не дрейфует, то есть скорость B является коллинеарной с направлением переднего колеса, то есть образует угол θ с AB . Мы называем Uθ единичным вектором, образующим угол θ с AB , то есть единичный вектор с тем же направлением, что и переднее колесо.
Следовательно, при t + dt ,
B (t + dt) = B (t) + λ.Uθ
для некоторого действительного положительного λ, такого, что длина велосипеда L сохраняется:
расстояние (A (t + dt), B (t + dt)) = L
Расчеты:
Это последнее уравнение переводится как
норма² (B (t) + λ.Uθ - A (t) - V (t) .dt) = L²
но B (t) , по определению, есть A (t) + L.Uφ , так что λ должно удовлетворять уравнению
норма² (L.Uφ + λ.Uθ - V (t) .dt) = L² .
Решение, конечно, не зависит от φ, так как проблема одинакова, когда велосипед указывает на положительное значение y . Следовательно, если мы назовем R матрицей вращения с углом -φ , то λ должно быть положительным решением
norm² (L.ey; + λ.Uθ - RV (t) .dt) = L² .
После нескольких вычислений, если мы назовем v нормой V , вы получите
λ = L. (sqrt (1 - (sin (θ). (1-v.dt / L)) ²) - cos (θ)) + v.dt.cos (θ) .
Вот псевдокод, который я использовал для анимации выше (вместо Uθ я использую u = U (θ + φ), потому что это было проще):
// I start at i=1 because i=0 contains the initial values
for (int i=1; i<=N; i++)
{
// the array in which I stored the successive A points
Aarray[i] = Aarray[i-1] + dt*V;
float lambda = L*( sqrt(1 - (sin(theta)*(1-v*dt/L))**2) - cos(theta) )
+ cos(theta)*v*dt;
// the array in which I stored the successive B points
Barray[i] = Barray[i-1] + lambda*u;
// the AB vector normalized
AiBiUnit = (Barray[i] - Aarray[i])/L;
// Refreshing the velocity of A
V = v*AiBiUnit;
// Refreshing u.
// u is indeed a unit vector separated from AiBiUnit by an angle theta,
// so you get it by rotating the newly computed AiBiUnit by an angle
// of +theta:
u = AiBiUnit.rotate(theta);
}
Если вы многократно повторяете и / или увеличиваете угол поворота рулевого колеса, траектория представляет собой круг, который, я считаю, является связным.