ตกลงฉันกลับมาพร้อมผลลัพธ์!
ฉันลองสองวิธี:
การใช้กลไกของแข็งเพื่อให้ได้สมการเชิงอนุพันธ์ที่ควบคุมการเคลื่อนที่ของศูนย์กลางของล้อ: อินพุตของระบบ "จักรยาน" คือแรงบิดที่ล้อหลังและมุมของล้อหน้าและเอาต์พุตเป็นจลศาสตร์ของศูนย์ ของล้อ แต่ฉันยอมแพ้มันยาก!
พยายามคาดเดาสิ่งที่เกิดขึ้นจากมุมมองทางเรขาคณิตเมื่อล้อหลัง "ดัน" ล้อหน้าไปข้างหน้าโดยล้อหน้าไม่ตรง วิธีนี้ให้ผลโดยตรงกับการเพิ่มขึ้นเล็กน้อย (ดูด้านล่าง) ซึ่งคุณจะได้สมการเชิงอนุพันธ์ที่แท้จริง ฉันไม่ได้พยายามจัดการสมการแรกนี้เพื่อให้ได้ ODE แต่ฉันเดาว่าฉันจะได้ ODE ที่เหมือนกันมาก ๆ โดยใช้กลศาสตร์ของแข็ง มันรู้สึกถูกต้อง
สัญลักษณ์และสมมติฐาน:
เราอยู่ในเครื่องบินที่มีพื้นฐานเวกเตอร์อดีตและEY
Aคือศูนย์กลางของล้อหลัง Bคือศูนย์กลางของล้อหน้า ความยาวของจักรยานLคือระยะห่างระหว่างและB มุมระหว่างEYและเวกเตอร์ABคือφ มุมระหว่างABและล้อหน้าเป็นθ
เหตุผลที่ใช้งานง่าย:
เราคิดว่าในทันทีบางT , A (t)มีความเร็วV (t) colinear กับAB ดังนั้นสำหรับ timestep dtเล็ก ๆ น้อย ๆ
A (T + dt) = A (t) + V
นอกจากนี้เรายังคิดว่าในเวลาT , ล้อหน้าไม่ลอยคือความเร็วของBเป็น colinear กับทิศทางของล้อหน้าคือรูปแบบมุมθกับAB เราเรียกUθว่าเวกเตอร์หน่วยสร้างมุมθกับABนั่นคือเวกเตอร์หน่วยที่มีทิศทางเดียวกับล้อหน้า
ดังนั้นที่T + dt ,
B (t + dt) = B (t) + λ.Uθ
สำหรับจริงบางอย่างในเชิงบวกλดังกล่าวว่าความยาวของจักรยานLเป็นป่าสงวน:
ระยะทาง (A (t + dt), B (t + dt)) = L
การคำนวณ:
สมการสุดท้ายนี้แปลเป็น
norm² (B (t) + λ.Uθ - A (t) - V (t) .dt) = L²
แต่B (t)ตามคำนิยามคือA (t) + L.Uφดังนั้นλต้องเป็นไปตามสมการ
norm² (L.Uφ + λ.Uθ - V (t) .dt) = L²
วิธีการแก้ปัญหาของหลักสูตรมีความเป็นอิสระจากφตั้งแต่ที่เป็นปัญหาเดียวกันเมื่อจุดจักรยานไปทางบวกY ดังนั้นถ้าเราเรียกRหมุนเมทริกซ์ด้วยมุม-φ , λจะต้องเป็นวิธีการแก้ปัญหาในเชิงบวกของ
norm² (L.ey; + λ.Uθ - RV (t) .dt) = L²
หลังจากการคำนวณเล็กน้อยถ้าเราเรียกvปกติของVคุณจะได้
λ = ลิตร (sqrt (1 - (บาป (θ) (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);
}
ถ้าคุณทำซ้ำมากและ / หรือเพิ่มมุมบังคับเลี้ยววิถีคือวงกลมซึ่งสอดคล้องกันฉันเชื่อ