Skip to content
LIBRARY
SlippingWheel.md

SlippingWheel

Wheel with mass, inertia, and slip-dependent friction on the flat plane y = 0.

Composes SlipWheelJoint and a Body carrying the wheel's mass and diagonal inertia tensor (I_axis about the spin axis, I_long perpendicular). Useful for modelling traction, braking, and stability behaviours that depend on tire slip.

See the Multibody.jl docs for parameter tuning of mu_A, mu_S, sAdhesion, sSlide, vAdhesion_min, vSlide_min.

Usage

MultibodyComponents.SlippingWheel(render=true, color=[1, 0, 0, 1], radius=0.3, m=1, I_axis=0.06, I_long=0.12, width=0.035, c_z=250000, d_z=500, vAdhesion_min=0.05, vSlide_min=0.15, sAdhesion=0.04, sSlide=0.12, mu_A=0.8, mu_S=0.6)

Parameters:

NameDescriptionUnitsDefault value
iscutfalse
surfacefalse
elastic_contactUse a compliant (elastic) normal contact (see SlipWheelJoint)false
angular_stateInclude the wheel's angular state (see SlipWheelJoint). Set false on an already-rooted axis to drop the angular state and orientation loop.true
renderRender the wheeltrue
colorColor of the wheel in animations[1, 0, 0, 1]
radiusRadius of the wheelm0.3
mMass of the wheelkg1
I_axisMoment of inertia of the wheel about its spin axiskg.m20.06
I_longMoment of inertia of the wheel perpendicular to its spin axiskg.m20.12
widthWidth of the wheel0.035
c_zVertical contact stiffness (elastic_contact) [N/m]250000
d_zVertical contact damping (elastic_contact) [N*s/m]500
vAdhesion_minMinimum velocity for the peak of the adhesion curve (regularization)m/s0.05
vSlide_minMinimum velocity for the start of the flat region of the slip curve (regularization)m/s0.15
sAdhesionAdhesion slippage0.04
sSlideSliding slippage0.12
mu_AFriction coefficient at the adhesion peak0.8
mu_SFriction coefficient at full sliding0.6

Connectors

  • frame_a - Frame3D is the fundamental 3D connector used for 6DOF motion. Most components have one or several Frame

connectors that can be connected together (Frame3D)

  • surface_frame - Frame3D is the fundamental 3D connector used for 6DOF motion. Most components have one or several Frame

connectors that can be connected together (Frame3D)

Variables

NameDescriptionUnits
xx-position of the wheel axism
zz-position of the wheel axism
anglesAngles that rotate the world frame into frame_a around the y-, z-, x-axisrad
der_anglesTime derivatives of anglesrad/s

Behavior

Source

dyad
"""
Wheel with mass, inertia, and slip-dependent friction on the flat plane y = 0.

Composes `SlipWheelJoint` and a `Body` carrying the wheel's mass and
diagonal inertia tensor (`I_axis` about the spin axis, `I_long` perpendicular).
Useful for modelling traction, braking, and stability behaviours that depend
on tire slip.

See the Multibody.jl docs for parameter tuning of `mu_A`, `mu_S`,
`sAdhesion`, `sSlide`, `vAdhesion_min`, `vSlide_min`.
"""
component SlippingWheel
  frame_a = Frame3D() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 450, "y1": 450, "x2": 550, "y2": 550, "rot": 0}
      },
      "tags": []
    }
  }
  # Road-surface frame, exposed only when surface=true (see SlipWheelJoint)
  surface_frame = Frame3D() if surface {}
  wheeljoint = SlipWheelJoint(final radius = radius, final width = width, final vAdhesion_min = vAdhesion_min, final vSlide_min = vSlide_min, final sAdhesion = sAdhesion, final sSlide = sSlide, final mu_A = mu_A, final mu_S = mu_S, iscut = iscut, surface = surface, angular_state = angular_state, elastic_contact = elastic_contact, c_z = c_z, d_z = d_z, render = render, color = color)
  body = Body(final m = m, final I_11 = I_long, final I_22 = I_long, final I_33 = I_axis, r_cm = [0, 0, 0], render = false)
  structural parameter iscut::Boolean = false
  structural parameter surface::Boolean = false
  "Use a compliant (elastic) normal contact (see SlipWheelJoint)"
  structural parameter elastic_contact::Boolean = false
  """
  Include the wheel's angular state (see SlipWheelJoint). Set false on an
   already-rooted axis to drop the angular state and orientation loop.
  """
  structural parameter angular_state::Boolean = true
  "Render the wheel"
  parameter render::Boolean = true
  "Color of the wheel in animations"
  parameter color::Real[4] = [1, 0, 0, 1]
  "Radius of the wheel"
  parameter radius::Length = 0.3
  "Mass of the wheel"
  parameter m::Mass = 1
  "Moment of inertia of the wheel about its spin axis"
  parameter I_axis::Inertia = 0.06
  "Moment of inertia of the wheel perpendicular to its spin axis"
  parameter I_long::Inertia = 0.12
  "Width of the wheel"
  parameter width::Real = 0.035
  "Vertical contact stiffness (elastic_contact) [N/m]"
  parameter c_z::Real = 250000
  "Vertical contact damping (elastic_contact) [N*s/m]"
  parameter d_z::Real = 500
  "Minimum velocity for the peak of the adhesion curve (regularization)"
  parameter vAdhesion_min::Velocity = 0.05
  "Minimum velocity for the start of the flat region of the slip curve (regularization)"
  parameter vSlide_min::Velocity = 0.15
  "Adhesion slippage"
  parameter sAdhesion::Real = 0.04
  "Sliding slippage"
  parameter sSlide::Real = 0.12
  "Friction coefficient at the adhesion peak"
  parameter mu_A::Real = 0.8
  "Friction coefficient at full sliding"
  parameter mu_S::Real = 0.6
  "x-position of the wheel axis"
  variable x::Length(statePriority = 20)
  "z-position of the wheel axis"
  variable z::Length(statePriority = 20)
  "Angles that rotate the world frame into `frame_a` around the y-, z-, x-axis"
  variable angles::Angle(statePriority = 30)[3] if angular_state
  "Time derivatives of `angles`"
  variable der_angles::AngularVelocity(statePriority = 30)[3] if angular_state
relations
  # Solver guesses for the wheel's generalized coordinates
  guess x = 0
  guess z = 0
  wheeljoint.x = x
  wheeljoint.z = z
  if angular_state
    guess angles = [0, 0, 0]
    guess der_angles = [0, 0, 0]
    wheeljoint.angles = angles
    # See RollingWheel: the derivative relation must live at this level so the
    # high-priority angles/der_angles carry the derivative chain and are
    # selectable as states.
    der_angles = der(angles)
  end
  connect(body.frame_a, frame_a)
  connect(wheeljoint.frame_a, frame_a)
  if surface
    connect(surface_frame, wheeljoint.surface_frame)
  end
metadata {
  "Dyad": {
    "icons": {"default": "dyad://MultibodyComponents/SlippingWheel.svg"},
    "labels": [
      {
        "label": "$(instance)",
        "x": 500,
        "y": 200,
        "rot": 0,
        "attrs": {"font-size": "160"}
      }
    ]
  }
}
end
Flattened Source
dyad
"""
Wheel with mass, inertia, and slip-dependent friction on the flat plane y = 0.

Composes `SlipWheelJoint` and a `Body` carrying the wheel's mass and
diagonal inertia tensor (`I_axis` about the spin axis, `I_long` perpendicular).
Useful for modelling traction, braking, and stability behaviours that depend
on tire slip.

See the Multibody.jl docs for parameter tuning of `mu_A`, `mu_S`,
`sAdhesion`, `sSlide`, `vAdhesion_min`, `vSlide_min`.
"""
component SlippingWheel
  frame_a = Frame3D() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 450, "y1": 450, "x2": 550, "y2": 550, "rot": 0}
      },
      "tags": []
    }
  }
  # Road-surface frame, exposed only when surface=true (see SlipWheelJoint)
  surface_frame = Frame3D() if surface {}
  wheeljoint = SlipWheelJoint(final radius = radius, final width = width, final vAdhesion_min = vAdhesion_min, final vSlide_min = vSlide_min, final sAdhesion = sAdhesion, final sSlide = sSlide, final mu_A = mu_A, final mu_S = mu_S, iscut = iscut, surface = surface, angular_state = angular_state, elastic_contact = elastic_contact, c_z = c_z, d_z = d_z, render = render, color = color)
  body = Body(final m = m, final I_11 = I_long, final I_22 = I_long, final I_33 = I_axis, r_cm = [0, 0, 0], render = false)
  structural parameter iscut::Boolean = false
  structural parameter surface::Boolean = false
  "Use a compliant (elastic) normal contact (see SlipWheelJoint)"
  structural parameter elastic_contact::Boolean = false
  """
  Include the wheel's angular state (see SlipWheelJoint). Set false on an
   already-rooted axis to drop the angular state and orientation loop.
  """
  structural parameter angular_state::Boolean = true
  "Render the wheel"
  parameter render::Boolean = true
  "Color of the wheel in animations"
  parameter color::Real[4] = [1, 0, 0, 1]
  "Radius of the wheel"
  parameter radius::Length = 0.3
  "Mass of the wheel"
  parameter m::Mass = 1
  "Moment of inertia of the wheel about its spin axis"
  parameter I_axis::Inertia = 0.06
  "Moment of inertia of the wheel perpendicular to its spin axis"
  parameter I_long::Inertia = 0.12
  "Width of the wheel"
  parameter width::Real = 0.035
  "Vertical contact stiffness (elastic_contact) [N/m]"
  parameter c_z::Real = 250000
  "Vertical contact damping (elastic_contact) [N*s/m]"
  parameter d_z::Real = 500
  "Minimum velocity for the peak of the adhesion curve (regularization)"
  parameter vAdhesion_min::Velocity = 0.05
  "Minimum velocity for the start of the flat region of the slip curve (regularization)"
  parameter vSlide_min::Velocity = 0.15
  "Adhesion slippage"
  parameter sAdhesion::Real = 0.04
  "Sliding slippage"
  parameter sSlide::Real = 0.12
  "Friction coefficient at the adhesion peak"
  parameter mu_A::Real = 0.8
  "Friction coefficient at full sliding"
  parameter mu_S::Real = 0.6
  "x-position of the wheel axis"
  variable x::Length(statePriority = 20)
  "z-position of the wheel axis"
  variable z::Length(statePriority = 20)
  "Angles that rotate the world frame into `frame_a` around the y-, z-, x-axis"
  variable angles::Angle(statePriority = 30)[3] if angular_state
  "Time derivatives of `angles`"
  variable der_angles::AngularVelocity(statePriority = 30)[3] if angular_state
relations
  # Solver guesses for the wheel's generalized coordinates
  guess x = 0
  guess z = 0
  wheeljoint.x = x
  wheeljoint.z = z
  if angular_state
    guess angles = [0, 0, 0]
    guess der_angles = [0, 0, 0]
    wheeljoint.angles = angles
    # See RollingWheel: the derivative relation must live at this level so the
    # high-priority angles/der_angles carry the derivative chain and are
    # selectable as states.
    der_angles = der(angles)
  end
  connect(body.frame_a, frame_a)
  connect(wheeljoint.frame_a, frame_a)
  if surface
    connect(surface_frame, wheeljoint.surface_frame)
  end
metadata {
  "Dyad": {
    "icons": {"default": "dyad://MultibodyComponents/SlippingWheel.svg"},
    "labels": [
      {
        "label": "$(instance)",
        "x": 500,
        "y": 200,
        "rot": 0,
        "attrs": {"font-size": "160"}
      }
    ]
  }
}
end


Test Cases

No test cases defined.

  • Examples

  • Experiments

  • Analyses