Skip to content

Customize vehicle slip due to road surfaces #269

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Feb 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,266 changes: 1,266 additions & 0 deletions Assets/AWSIM/Scenes/Samples/VehicleSlipSample.unity

Large diffs are not rendered by default.

7 changes: 7 additions & 0 deletions Assets/AWSIM/Scenes/Samples/VehicleSlipSample.unity.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 25 additions & 0 deletions Assets/AWSIM/Scripts/Vehicles/GroudSlipMultiplier.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace AWSIM
{
/// <summary>
/// By attaching this script to a collider whose IsTrigger is On, the slip rate of the Vehicle can be changed. 1 no slip, 0 is full slip.
/// </summary>
public class GroudSlipMultiplier : MonoBehaviour
{
[Range(0, 1)] [SerializeField] float forwardSlip;
[Range(0, 1)] [SerializeField] float sidewaySlip;

/// <summary>
/// Slip multiplier in foward direction.
/// </summary>
public float FowardSlip => forwardSlip;

/// <summary>
/// Slip multiplier in sideway direction.
/// </summary>
public float SidewaySlip => sidewaySlip;
}
}
11 changes: 11 additions & 0 deletions Assets/AWSIM/Scripts/Vehicles/GroudSlipMultiplier.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

60 changes: 60 additions & 0 deletions Assets/AWSIM/Scripts/Vehicles/Vehicle.cs
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,40 @@ public class Axle
// reference sample (in 1998): https://www.researchgate.net/publication/228945609_Measured_Vehicle_Inertial_Parameters-NHTSA
[SerializeField] Vector3 inertia;

/// <summary>
/// Change the slip rate of the wheel in the foward direction of this car. 1 no slip, 0 is full slip.
/// </summary>
public float ForwardSlipMultipler
{
get
{
return wheels[0].ForwardSlipMultiplier;
}

set
{
foreach (var e in wheels)
e.ForwardSlipMultiplier = value;
}
}

/// <summary>
/// Change the slip rate of the wheel in the sideway direction of this car. 1 no slip, 0 is full slip.
/// </summary>
public float SidewaySlipMultipler
{
get
{
return wheels[0].SidewaySlipMultiplier;
}

set
{
foreach (var e in wheels)
e.SidewaySlipMultiplier = value;
}
}

[Header("Physics Settings (experimental)")]

// Threshold for Rigidbody Sleep (m/s).
Expand Down Expand Up @@ -254,6 +288,32 @@ void Awake()
// Set inertia values.
if (useInertia)
m_rigidbody.inertiaTensor = inertia;

// Initialize with non-slip value
ForwardSlipMultipler = 1f;
SidewaySlipMultipler = 1f;
}

// GroundSlipMultiplier changes the slip rate.
private void OnTriggerEnter(Collider other)
{
var groundSlipMultiplier = other.GetComponent<GroudSlipMultiplier>();
if (groundSlipMultiplier != null)
{
ForwardSlipMultipler = groundSlipMultiplier.FowardSlip;
SidewaySlipMultipler = groundSlipMultiplier.SidewaySlip;
}
}

// GroundSlipMultiplier changes the slip rate.
private void OnTriggerExit(Collider other)
{
var groundSlipMultiplier = other.GetComponent<GroudSlipMultiplier>();
if (groundSlipMultiplier != null)
{
ForwardSlipMultipler = 1; // Default value is 1 if there is no slip.
SidewaySlipMultipler = 1;
}
}

void FixedUpdate()
Expand Down
17 changes: 14 additions & 3 deletions Assets/AWSIM/Scripts/Vehicles/Wheel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,16 @@ public class Wheel : MonoBehaviour
/// </summary>
public bool IsSleep { get; private set; }

/// <summary>
/// Slip multiplier in foward direction.
/// </summary>
public float ForwardSlipMultiplier { get; set; } = 1;

/// <summary>
/// Slip multiplier in sideway direction.
/// </summary>
public float SidewaySlipMultiplier { get; set; } = 1;

/// <summary>
/// Steering angle of the wheel.
/// </summary>
Expand Down Expand Up @@ -71,11 +81,12 @@ void Update()
// TODO: Determine rotation from the speed of the wheels.
void UpdateVisual(float speed, float steerAngle)
{
// wheel position
wheelCollider.GetWorldPose(out var pos, out _);
wheelVisualTransform.position = pos;

// wheel forward rotation(pitch).
var additionalPitchAngle = (speed * Time.deltaTime / wheelCollider.radius) * Mathf.Rad2Deg;
var additionalPitchAngle = (speed / ForwardSlipMultiplier * Time.deltaTime / wheelCollider.radius) * Mathf.Rad2Deg;
wheelPitchAngle += additionalPitchAngle;
wheelPitchAngle %= 360;

Expand Down Expand Up @@ -141,12 +152,12 @@ public void UpdateWheelForce(float acceleration)
return;

// Apply cancel force.
var lateralCancelForce = GetSkiddingCancelForce();
var lateralCancelForce = GetSkiddingCancelForce() * SidewaySlipMultiplier;
vehicleRigidbody.AddForceAtPosition(lateralCancelForce, wheelHit.point, ForceMode.Force);

// Apply drive force.
// Apply a force that will result in the commanded acceleration.
var driveForce = acceleration * wheelHit.forwardDir;
var driveForce = acceleration * wheelHit.forwardDir * ForwardSlipMultiplier;
vehicleRigidbody.AddForceAtPosition(driveForce, wheelHit.point, ForceMode.Acceleration);

// Counteracts the sideway force of the tire.
Expand Down
Binary file added docs/Components/Vehicle/CustomizeSlip/image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 15 additions & 0 deletions docs/Components/Vehicle/CustomizeSlip/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Customize slip

By attaching a `GroundSlipMutiplier.cs` script to a collider (trigger), you can change the slip of the vehicle within the range of that collider.

## Sample scene

`Assets\AWSIM\Scenes\Samples\VehicleSlipSample.unity`

## How to setup

1. Create collider
2. Check IsTrigger
3. Change properties of FowardSlip and SidewaySlip.

![](image.png)
1 change: 1 addition & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ nav:
- Add Colliders: Components/Vehicle/AddNewVehicle/AddColliders/index.md
- Add Sensors: Components/Vehicle/AddNewVehicle/AddSensors/index.md
- Add Visual Elements: Components/Vehicle/AddNewVehicle/AddVisualElements/index.md
- Customize Slip: Components/Vehicle/CustomizeSlip/index.md
- FollowCamera: Components/Vehicle/FollowCamera/index.md
- Sensors:
- LiDAR Sensor:
Expand Down