Last active
September 29, 2024 13:27
-
-
Save comoc/7a3adb6b878084d1530210128c4c027b to your computer and use it in GitHub Desktop.
Ackermann Steering Geometory for Unity in C#
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using UnityEngine; | |
public class AckermannSteering : MonoBehaviour | |
{ | |
[SerializeField] private float steeringAngle; // ステアリングの切れ角 | |
[SerializeField] private float tread; // 左右の車輪間の距離 (トレッド) | |
[SerializeField] private float wheelBase; // 前後の車輪間の距離 (ホイールベース) | |
public float leftWheelAngle { get; private set; } // 左車輪の角度 | |
public float rightWheelAngle { get; private set; } // 右車輪の角度 | |
public float turningRadius { get; private set; } // 回転半径 | |
public Vector3 turningCenter { get; private set; } // 回転中心 | |
void Update() | |
{ | |
CalculateAckermannSteering(steeringAngle, tread, wheelBase); | |
} | |
private void CalculateAckermannSteering(float steeringAngle, float tread, float wheelBase) | |
{ | |
float radianSteeringAngle = Mathf.Deg2Rad * steeringAngle; | |
float tanSteeringAngle = Mathf.Tan(radianSteeringAngle); | |
turningRadius = wheelBase / tanSteeringAngle; // 回転半径の計算 | |
// 回転中心の計算 | |
float turningCenterX = transform.position.x + (tread / 2) * Mathf.Cos(radianSteeringAngle); | |
float turningCenterZ = transform.position.z - turningRadius * Mathf.Sin(radianSteeringAngle); | |
turningCenter = new Vector3(turningCenterX, transform.position.y, turningCenterZ); | |
// Ackermann steering geometryの計算 | |
float innerWheelAngle = Mathf.Rad2Deg * Mathf.Atan(wheelBase / (turningRadius + (tread / 2))); | |
float outerWheelAngle = Mathf.Rad2Deg * Mathf.Atan(wheelBase / (turningRadius - (tread / 2))); | |
// 左右の車輪の角度を設定 | |
if (steeringAngle > 0) | |
{ | |
leftWheelAngle = outerWheelAngle; | |
rightWheelAngle = innerWheelAngle; | |
} | |
else if (steeringAngle < 0) | |
{ | |
leftWheelAngle = innerWheelAngle; | |
rightWheelAngle = outerWheelAngle; | |
} | |
else | |
{ | |
leftWheelAngle = 0; | |
rightWheelAngle = 0; | |
turningRadius = Mathf.Infinity; | |
turningCenter = Vector3.zero; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment