Skip to content
LIBRARY
PlanarMechanics.examples.excavator.SoilContact.md

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

Missing open brace for subscript

and a horizontal cutting resistance following the fundamental equation of earthmoving (Reece), with dimensionless factors after McKyes,

Missing open brace for subscript

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:

NameDescriptionUnitsDefault value
rendertrue
color[0.47, 0.35, 0.2, 1.0]
specular_coefficient1.5
gamma_sUnit weight of the soil15700
rho_soilBulk density of the scooped soil1600
m_capacityPayload capacity of the tool150
c_soilSoil cohesion4000
N_gammaGravity term factor of the fundamental equation of earthmoving3.5
N_cCohesion term factor of the fundamental equation of earthmoving6.0
wWidth of the cutting blade (bucket)0.6
bSmaller dimension of the contact patch in the pressure-sinkage relation0.6
A_tipEffective tool tip contact area for the vertical reaction0.018
nSinkage exponent of the pressure-sinkage relation0.8
k_cCohesive modulus of the pressure-sinkage relation3e4
k_phiFrictional modulus of the pressure-sinkage relation1.2e6
c_vVertical contact damping per unit penetration depth2e5
v_tRegularization velocity of the horizontal friction law0.05
eps_cContact onset smoothing length1e-3
slab_center_xx-coordinate of the rendered slab center1.5
slab_extent_xExtent of the rendered slab along the x axis7.0
slab_depthDepth of the rendered slab below the surface0.5
slab_extent_zExtent of the rendered slab along the z axis2.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

NameDescriptionUnits
yTool tip height above the soil surfacem
vxHorizontal tool tip velocitym/s
vyVertical tool tip velocitym/s
dSmoothed penetration depth below the soil surface
F_cutHorizontal cutting resistance magnitude
F_xHorizontal soil force acting on the tool
F_yVertical soil force acting on the tool
m_loadAccumulated payload mass scooped by the tool
g_vecGravitational acceleration vector of the planar world

Behavior

Dict{MIME{Symbol("text/plain")}, String} with 1 entry: MIME type text/plain => "Error displaying result"

Source

dyad
"""
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"}}}
end
Flattened Source
dyad
"""
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"}}}
end


Test Cases

No test cases defined.

  • Examples

  • Experiments

  • Analyses