전륜 방향 및 속도에서 자전거 방향 계산


10

스티어링을 추가하려는 간단한 하향식 자전거 게임이 있습니다. 자전거의 방향과 속도를 결정하기 위해 앞 바퀴의 방향을 사용하는 방법을 알고 싶습니다.

void Update () 
{
    //Get input from user Vertical: 0 to 1, Horizontal -1 to 1
    float forwardInput = Input.GetAxis("Vertical");
    float sidewaysInput = Input.GetAxis("Horizontal") * m_steeringAmount;

    // Turn front wheel
    m_frontWheelTransform.localEulerAngles = new Vector3(0, sidewaysInput, 90);

    // get speed and drag
    float   speed           = m_velocity.magnitude;
    Vector3 forwardDrag     = -m_forwardDragConstant * m_velocity * speed;

    // calculate acceleration 
    float engineForce       = forwardInput * m_enginePower;
    Vector3 forwardTraction = transform.forward * engineForce;
    Vector3 forwrdForce     = forwardTraction + forwardDrag;
    Vector3 acceleration    = forwrdForce / m_mass;

    // update velocity and position
    m_velocity += acceleration * Time.deltaTime;
    transform.localPosition += m_velocity * Time.deltaTime;
}

자전거 속도를 전륜과 후륜에 적용하고 자전거의 방향을 결정하기 위해 위치의 차이를 사용하려고했지만 앞으로 드래그하면 혼란 스럽습니다.

madshogo 의견을 기반으로 편집

여기에 이미지 설명을 입력하십시오


나는 지금 전화를 걸기 때문에 간단한 대답을 드리겠습니다 : 바퀴는 자전거가가는 가상의 원에 접하여 자전거를 돌립니다. 원의 중심은 각 바퀴에 직교하는 선의 교차점에 있습니다. 바퀴가 모두 직선 인 경우 (자전거가 돌아 가지 않는 경우)이 선은 무한히 멀리 경로를 가로 지르며 (병렬 임) 무한 반경의 원, 즉 A 선이됩니다. 결국, 이것은 자전거가 따라야 할 궤도 (원) 또는 곡률 (필요에 따라)을 제공합니다.
jrsala

답변 madshogo에 감사드립니다. 내가 추가 한 다이어그램을보고 그것이 맞는지 말해 주시겠습니까? 레드 라인은 자전거 제목입니다. 건배
346443

잠깐만 요, 앞바퀴가 그림의 원에 접하지 않습니다. 내 머리에는 두 바퀴가 접했다. 몇 가지 사항이 바뀝니다.
jrsala

자전거 물리학에 대한 Wikipedia 페이지를 보셨습니까 ? 회전 반경에 대한 유용한 공식이 있습니다.
sam hocevar

답변:


3

좋아, 나는 결과로 돌아왔다!

애니메이션 자전거

나는 두 가지 접근법을 시도했다.

  • 솔리드 역학을 사용하여 휠 중심의 움직임을 제어하는 ​​미분 방정식을 도출합니다. "자전거"시스템의 입력은 뒷바퀴의 토크와 앞바퀴 각도이며, 출력은 중심의 운동학입니다 바퀴의. 그러나 나는 포기했다, 그것은 어려웠다!

  • 뒷바퀴가 앞바퀴를 똑바로 펴지 않고 앞바퀴로 "밀어 낼"때 기하학적 관점에서 어떤 일이 발생하는지 추측하려고합니다. 이 방법을 사용하면 실제 미분 방정식을 얻을 수있는 무한 증분 방정식 (아래 참조)을 직접 얻을 수 있습니다. ODE를 얻기 위해이 첫 번째 방정식을 조작하려고 시도하지는 않았지만 고체 역학을 사용하여 동일한 ODE를 얻었을 것입니다. 기분이 좋아.

표기법과 가설 :

우리는 기본 벡터 exey를 가진 평면에 있습니다.

A 는 뒷바퀴의 중심입니다. B 는 전륜의 중심입니다. 자전거 L 의 길이는 AB 사이의 거리 입니다. ey 와 벡터 AB 사이의 각도 는 φ 입니다. AB 와 앞 바퀴 사이의 각도 는 θ 입니다.

직관적 인 이론적 근거 :

특정 순간 t 에서 A (t)AB 와 동선 인 속도 V (t)를 가지고 있다고 가정합니다 . 따라서 무한 시간 단계 dt의 경우

A (t + dt) = A (t) + V (t) .dt 입니다.

또한 시각 t 에서 전륜이 드리프트되지 않고, 즉 B 의 속도가 전륜의 방향과 동일 선상에 있다고 가정하고, 즉 AB 와 각도 θ 를 형성 한다고 가정하자 . 우리는 전화 각도 형성하는 단위 벡터 θ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² 입니다.

몇 가지 계산을 한 후, vV 의 표준 이라고 하면

λ = L. (sqrt (1-(sin (θ). (1-v.dt / L)) ²)-cos (θ)) + v.dt.cos (θ) .

여기에 위의 애니메이션을 얻기 위해 사용하는 의사입니다 (대신 사용하는 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);
}

많이 반복하거나 스티어링 각도를 늘리면 궤도는 일관된 원입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.