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:
| Name | Description | Units | Default value |
|---|---|---|---|
iscut | – | false | |
surface | – | false | |
elastic_contact | Use a compliant (elastic) normal contact (see SlipWheelJoint) | – | false |
angular_state | Include the wheel's angular state (see SlipWheelJoint). Set false on an already-rooted axis to drop the angular state and orientation loop. | – | true |
render | Render the wheel | – | true |
color | Color of the wheel in animations | – | [1, 0, 0, 1] |
radius | Radius of the wheel | m | 0.3 |
m | Mass of the wheel | kg | 1 |
I_axis | Moment of inertia of the wheel about its spin axis | kg.m2 | 0.06 |
I_long | Moment of inertia of the wheel perpendicular to its spin axis | kg.m2 | 0.12 |
width | Width of the wheel | – | 0.035 |
c_z | Vertical contact stiffness (elastic_contact) [N/m] | – | 250000 |
d_z | Vertical contact damping (elastic_contact) [N*s/m] | – | 500 |
vAdhesion_min | Minimum velocity for the peak of the adhesion curve (regularization) | m/s | 0.05 |
vSlide_min | Minimum velocity for the start of the flat region of the slip curve (regularization) | m/s | 0.15 |
sAdhesion | Adhesion slippage | – | 0.04 |
sSlide | Sliding slippage | – | 0.12 |
mu_A | Friction coefficient at the adhesion peak | – | 0.8 |
mu_S | Friction coefficient at full sliding | – | 0.6 |
Connectors
frame_a- Frame3D is the fundamental 3D connector used for 6DOF motion. Most components have one or severalFrame
connectors that can be connected together (Frame3D)
surface_frame- Frame3D is the fundamental 3D connector used for 6DOF motion. Most components have one or severalFrame
connectors that can be connected together (Frame3D)
Variables
| Name | Description | Units |
|---|---|---|
x | x-position of the wheel axis | m |
z | z-position of the wheel axis | m |
angles | Angles that rotate the world frame into frame_a around the y-, z-, x-axis | rad |
der_angles | Time derivatives of angles | rad/s |
Behavior
Source
"""
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"}
}
]
}
}
endFlattened Source
"""
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"}
}
]
}
}
endTest Cases
No test cases defined.
Related
Examples
Experiments
Analyses