PlanarMechanics.examples.excavator.SoilContact
Soil reaction force acting on a digging tool at a flat soil surface.
The soil surface is horizontal at y = 0. When the attached frame (typically a bucket tip) penetrates below the surface, the component applies a vertical reaction following the Bekker pressure-sinkage relation
and a horizontal cutting resistance following the fundamental equation of earthmoving (Reece), with dimensionless factors after McKyes,
where d is the penetration depth below the surface. The penetration depth is computed with a smooth max so that all forces are smooth functions of the frame position and velocity; above the surface the residual force is negligible. The damping term is scaled by the penetration depth so the vertical force is continuous at contact onset. Default parameter values represent sandy loam.
While the tool cuts through the soil, the swept material accumulates as a payload carried by the tool: the payload mass grows at the rate at which the cutting edge sweeps soil volume,
saturating smoothly at the tool capacity, and its weight acts on the frame after the tool leaves the soil. The payload inertia is neglected; only the gravitational load is applied.
The soil volume is rendered as a box slab whose top face coincides with the soil surface.
This component extends from MultibodyComponents.Renderable
Usage
MultibodyComponents.PlanarMechanics.examples.excavator.SoilContact(render=true, color=[0.47, 0.35, 0.2, 1.0], specular_coefficient=1.5, gamma_s=15700, rho_soil=1600, m_capacity=150, c_soil=4000, N_gamma=3.5, N_c=6.0, w=0.6, b=0.6, A_tip=0.018, n=0.8, k_c=3e4, k_phi=1.2e6, c_v=2e5, v_t=0.05, eps_c=1e-3, slab_center_x=1.5, slab_extent_x=7.0, slab_depth=0.5, slab_extent_z=2.0)
Parameters:
| Name | Description | Units | Default value |
|---|---|---|---|
render | – | true | |
color | – | [0.47, 0.35, 0.2, 1.0] | |
specular_coefficient | – | 1.5 | |
gamma_s | Unit weight of the soil | – | 15700 |
rho_soil | Bulk density of the scooped soil | – | 1600 |
m_capacity | Payload capacity of the tool | – | 150 |
c_soil | Soil cohesion | – | 4000 |
N_gamma | Gravity term factor of the fundamental equation of earthmoving | – | 3.5 |
N_c | Cohesion term factor of the fundamental equation of earthmoving | – | 6.0 |
w | Width of the cutting blade (bucket) | – | 0.6 |
b | Smaller dimension of the contact patch in the pressure-sinkage relation | – | 0.6 |
A_tip | Effective tool tip contact area for the vertical reaction | – | 0.018 |
n | Sinkage exponent of the pressure-sinkage relation | – | 0.8 |
k_c | Cohesive modulus of the pressure-sinkage relation | – | 3e4 |
k_phi | Frictional modulus of the pressure-sinkage relation | – | 1.2e6 |
c_v | Vertical contact damping per unit penetration depth | – | 2e5 |
v_t | Regularization velocity of the horizontal friction law | – | 0.05 |
eps_c | Contact onset smoothing length | – | 1e-3 |
slab_center_x | x-coordinate of the rendered slab center | – | 1.5 |
slab_extent_x | Extent of the rendered slab along the x axis | – | 7.0 |
slab_depth | Depth of the rendered slab below the surface | – | 0.5 |
slab_extent_z | Extent of the rendered slab along the z axis | – | 2.0 |
Connectors
frame_a- Coordinate system (2-dim.) fixed to the component with one cut-force and cut-torque.
All variables are resolved in the planar world frame. (Frame2D)
Variables
| Name | Description | Units |
|---|---|---|
y | Tool tip height above the soil surface | m |
vx | Horizontal tool tip velocity | m/s |
vy | Vertical tool tip velocity | m/s |
d | Smoothed penetration depth below the soil surface | – |
F_cut | Horizontal cutting resistance magnitude | – |
F_x | Horizontal soil force acting on the tool | – |
F_y | Vertical soil force acting on the tool | – |
m_load | Accumulated payload mass scooped by the tool | – |
g_vec | Gravitational acceleration vector of the planar world | – |
Behavior
Dict{MIME{Symbol("text/plain")}, String} with 1 entry: MIME type text/plain => "Error displaying result"
Source
"""
Soil reaction force acting on a digging tool at a flat soil surface.
The soil surface is horizontal at `y = 0`. When the attached frame (typically a
bucket tip) penetrates below the surface, the component applies a vertical
reaction following the Bekker pressure-sinkage relation
```math
F_y = A_{tip} \\left(\\frac{k_c}{b} + k_\\phi\\right) d^n - c_v d v_y
```
and a horizontal cutting resistance following the fundamental equation of
earthmoving (Reece), with dimensionless factors after McKyes,
```math
F_{cut} = w (\\gamma d^2 N_\\gamma + c d N_c), \\qquad F_x = -F_{cut} \\tanh(v_x / v_t)
```
where `d` is the penetration depth below the surface. The penetration depth is
computed with a smooth max so that all forces are smooth functions of the frame
position and velocity; above the surface the residual force is negligible. The
damping term is scaled by the penetration depth so the vertical force is
continuous at contact onset. Default parameter values represent sandy loam.
While the tool cuts through the soil, the swept material accumulates as a
payload carried by the tool: the payload mass grows at the rate at which the
cutting edge sweeps soil volume,
```math
\\dot{m}_{load} = \\rho_{soil} \\, w \\, d \\, |v_x| \\, (1 - m_{load} / m_{capacity})
```
saturating smoothly at the tool capacity, and its weight acts on the frame
after the tool leaves the soil. The payload inertia is neglected; only the
gravitational load is applied.
The soil volume is rendered as a box slab whose top face coincides with the
soil surface.
"""
component SoilContact
extends MultibodyComponents.Renderable(color = [0.47, 0.35, 0.2, 1.0])
"Frame of the digging tool tip"
frame_a = Frame2D() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 450, "y1": -50, "x2": 550, "y2": 50, "rot": 0}
},
"tags": []
}
}
"Soil volume visualization"
slab_shape = MultibodyComponents.BoxShape(render = render, color = color, r = [slab_center_x, 0, 0], length_direction = [0, -1, 0], width_direction = [1, 0, 0], length = slab_depth, width = slab_extent_x, height = slab_extent_z)
"Unit weight of the soil"
parameter gamma_s::Real = 15700
"Bulk density of the scooped soil"
parameter rho_soil::Real = 1600
"Payload capacity of the tool"
parameter m_capacity::Real = 150
"Soil cohesion"
parameter c_soil::Real = 4000
"Gravity term factor of the fundamental equation of earthmoving"
parameter N_gamma::Real = 3.5
"Cohesion term factor of the fundamental equation of earthmoving"
parameter N_c::Real = 6.0
"Width of the cutting blade (bucket)"
parameter w::Real = 0.6
"Smaller dimension of the contact patch in the pressure-sinkage relation"
parameter b::Real = 0.6
"Effective tool tip contact area for the vertical reaction"
parameter A_tip::Real = 0.018
"Sinkage exponent of the pressure-sinkage relation"
parameter n::Real = 0.8
"Cohesive modulus of the pressure-sinkage relation"
parameter k_c::Real = 3e4
"Frictional modulus of the pressure-sinkage relation"
parameter k_phi::Real = 1.2e6
"Vertical contact damping per unit penetration depth"
parameter c_v::Real = 2e5
"Regularization velocity of the horizontal friction law"
parameter v_t::Real = 0.05
"Contact onset smoothing length"
parameter eps_c::Real = 1e-3
"x-coordinate of the rendered slab center"
parameter slab_center_x::Real = 1.5
"Extent of the rendered slab along the x axis"
parameter slab_extent_x::Real = 7.0
"Depth of the rendered slab below the surface"
parameter slab_depth::Real = 0.5
"Extent of the rendered slab along the z axis"
parameter slab_extent_z::Real = 2.0
"Tool tip height above the soil surface"
variable y::Length
"Horizontal tool tip velocity"
variable vx::Velocity
"Vertical tool tip velocity"
variable vy::Velocity
"Smoothed penetration depth below the soil surface"
variable d::Real
"Horizontal cutting resistance magnitude"
variable F_cut::Real
"Horizontal soil force acting on the tool"
variable F_x::Real
"Vertical soil force acting on the tool"
variable F_y::Real
"Accumulated payload mass scooped by the tool"
variable m_load::Real
"Gravitational acceleration vector of the planar world"
variable g_vec::Real[2]
relations
initial m_load = 0
y = frame_a.y
vx = der(frame_a.x)
vy = der(frame_a.y)
d = (sqrt(y ^ 2 + eps_c ^ 2) - y) / 2
F_y = A_tip * (k_c / b + k_phi) * d ^ n - c_v * d * vy
F_cut = w * (gamma_s * d ^ 2 * N_gamma + c_soil * d * N_c)
F_x = -F_cut * tanh(vx / v_t)
# Swept-volume capture with smooth saturation at the tool capacity; the
# regularized absolute value keeps the fill rate smooth through vx = 0
der(m_load) = rho_soil * w * d * vx * tanh(vx / v_t) * (1 - m_load / m_capacity)
g_vec = MultibodyComponents.PlanarMechanics.gravity_acceleration_2d()
# Soil reaction plus the weight of the carried payload
frame_a.fx = -F_x - m_load * g_vec[1]
frame_a.fy = -F_y - m_load * g_vec[2]
frame_a.tau = 0
metadata {"Dyad": {"icons": {"default": "dyad://MultibodyComponents/SoilContact.svg"}}}
endFlattened Source
"""
Soil reaction force acting on a digging tool at a flat soil surface.
The soil surface is horizontal at `y = 0`. When the attached frame (typically a
bucket tip) penetrates below the surface, the component applies a vertical
reaction following the Bekker pressure-sinkage relation
```math
F_y = A_{tip} \\left(\\frac{k_c}{b} + k_\\phi\\right) d^n - c_v d v_y
```
and a horizontal cutting resistance following the fundamental equation of
earthmoving (Reece), with dimensionless factors after McKyes,
```math
F_{cut} = w (\\gamma d^2 N_\\gamma + c d N_c), \\qquad F_x = -F_{cut} \\tanh(v_x / v_t)
```
where `d` is the penetration depth below the surface. The penetration depth is
computed with a smooth max so that all forces are smooth functions of the frame
position and velocity; above the surface the residual force is negligible. The
damping term is scaled by the penetration depth so the vertical force is
continuous at contact onset. Default parameter values represent sandy loam.
While the tool cuts through the soil, the swept material accumulates as a
payload carried by the tool: the payload mass grows at the rate at which the
cutting edge sweeps soil volume,
```math
\\dot{m}_{load} = \\rho_{soil} \\, w \\, d \\, |v_x| \\, (1 - m_{load} / m_{capacity})
```
saturating smoothly at the tool capacity, and its weight acts on the frame
after the tool leaves the soil. The payload inertia is neglected; only the
gravitational load is applied.
The soil volume is rendered as a box slab whose top face coincides with the
soil surface.
"""
component SoilContact
parameter render::Boolean = true
parameter color::Real[4] = [0.5, 0.5, 0.5, 1.0]
parameter specular_coefficient::Real = 1.5
"Frame of the digging tool tip"
frame_a = Frame2D() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 450, "y1": -50, "x2": 550, "y2": 50, "rot": 0}
},
"tags": []
}
}
"Soil volume visualization"
slab_shape = MultibodyComponents.BoxShape(render = render, color = color, r = [slab_center_x, 0, 0], length_direction = [0, -1, 0], width_direction = [1, 0, 0], length = slab_depth, width = slab_extent_x, height = slab_extent_z)
"Unit weight of the soil"
parameter gamma_s::Real = 15700
"Bulk density of the scooped soil"
parameter rho_soil::Real = 1600
"Payload capacity of the tool"
parameter m_capacity::Real = 150
"Soil cohesion"
parameter c_soil::Real = 4000
"Gravity term factor of the fundamental equation of earthmoving"
parameter N_gamma::Real = 3.5
"Cohesion term factor of the fundamental equation of earthmoving"
parameter N_c::Real = 6.0
"Width of the cutting blade (bucket)"
parameter w::Real = 0.6
"Smaller dimension of the contact patch in the pressure-sinkage relation"
parameter b::Real = 0.6
"Effective tool tip contact area for the vertical reaction"
parameter A_tip::Real = 0.018
"Sinkage exponent of the pressure-sinkage relation"
parameter n::Real = 0.8
"Cohesive modulus of the pressure-sinkage relation"
parameter k_c::Real = 3e4
"Frictional modulus of the pressure-sinkage relation"
parameter k_phi::Real = 1.2e6
"Vertical contact damping per unit penetration depth"
parameter c_v::Real = 2e5
"Regularization velocity of the horizontal friction law"
parameter v_t::Real = 0.05
"Contact onset smoothing length"
parameter eps_c::Real = 1e-3
"x-coordinate of the rendered slab center"
parameter slab_center_x::Real = 1.5
"Extent of the rendered slab along the x axis"
parameter slab_extent_x::Real = 7.0
"Depth of the rendered slab below the surface"
parameter slab_depth::Real = 0.5
"Extent of the rendered slab along the z axis"
parameter slab_extent_z::Real = 2.0
"Tool tip height above the soil surface"
variable y::Length
"Horizontal tool tip velocity"
variable vx::Velocity
"Vertical tool tip velocity"
variable vy::Velocity
"Smoothed penetration depth below the soil surface"
variable d::Real
"Horizontal cutting resistance magnitude"
variable F_cut::Real
"Horizontal soil force acting on the tool"
variable F_x::Real
"Vertical soil force acting on the tool"
variable F_y::Real
"Accumulated payload mass scooped by the tool"
variable m_load::Real
"Gravitational acceleration vector of the planar world"
variable g_vec::Real[2]
relations
initial m_load = 0
y = frame_a.y
vx = der(frame_a.x)
vy = der(frame_a.y)
d = (sqrt(y ^ 2 + eps_c ^ 2) - y) / 2
F_y = A_tip * (k_c / b + k_phi) * d ^ n - c_v * d * vy
F_cut = w * (gamma_s * d ^ 2 * N_gamma + c_soil * d * N_c)
F_x = -F_cut * tanh(vx / v_t)
# Swept-volume capture with smooth saturation at the tool capacity; the
# regularized absolute value keeps the fill rate smooth through vx = 0
der(m_load) = rho_soil * w * d * vx * tanh(vx / v_t) * (1 - m_load / m_capacity)
g_vec = MultibodyComponents.PlanarMechanics.gravity_acceleration_2d()
# Soil reaction plus the weight of the carried payload
frame_a.fx = -F_x - m_load * g_vec[1]
frame_a.fy = -F_y - m_load * g_vec[2]
frame_a.tau = 0
metadata {"Dyad": {"icons": {"default": "dyad://MultibodyComponents/SoilContact.svg"}}}
endTest Cases
No test cases defined.
Related
Examples
Experiments
Analyses