Skip to content

The Loader

This model represents a simplified front end of a front loader and contains the following parts:

  • Loader Front Frame
  • Lifting Arm
  • Bucket
  • Bell crank
  • Bucket link

The cylinders are represented with axial springs dampers, while the joints are represented by revolute joints.


Basic lifting operation

The model is activated with a time dependent function for the spring elongation.

The model is loaded by increasing the mass in the bucket.


Improved cylinder models

Beam elements are used to model the cylinders, improving the mass distribution and the stiffness of the cylinders.

Case 3: Improved load model, using mass elements

Case 4: Improved cylinder control, using PID controller

Solver control with Python API

from pathlib import Path

from fedempy.fmm_solver import FmmSolver
from fedempy.modeler import FedemModeler
from fedempy.enums import FmDof, FmDofStat, FmLoadType, FmType, FmVar


Load driven Digital Twin


from pathlib import Path

from fedempy.fmm_solver import FmmSolver
from fedempy.modeler import FedemModeler
from fedempy.enums import FmDof, FmDofStat, FmLoadType, FmType, FmVar

from _clean_path import clean_path

# Global constants
RELATIVE_PATH = '00-loader-Base_case/'
MODEL_FILE    = '00-loader-Base_case.fmm'
PARTS_PATH    = 'parts/'

# Prepare run directory (=RELATIVE_PATH)
model_file = Path(RELATIVE_PATH) / MODEL_FILE
# parts_path = '../'*RELATIVE_PATH.count('/') + PARTS_PATH

my_model = FedemModeler(str(model_file), force_new=True)

p1 = my_model.make_fe_part(PARTS_PATH + 'Front.flm')
p2 = my_model.make_fe_part(PARTS_PATH + 'Boom.flm')
p3 = my_model.make_fe_part(PARTS_PATH + 'Bucket.flm')
p4 = my_model.make_fe_part(PARTS_PATH + 'BellCrank.flm')
p5 = my_model.make_fe_part(PARTS_PATH + 'BucketLink.flm')
my_model.edit_part([p1, p2, p3, p4, p5],
    alpha2=0.00286, component_modes=0, consistent_mass=True)

my_model.edit_part(p2, Tx=0.01080263, Tz=-0.77487206)
my_model.edit_part(p3, Tx=-0.64636636, Tz=-2.0328088, Ry=-30, Rz=-180)
my_model.edit_part(p4, Tx=-3.2499752, Ty=-2.8376081, Tz=0.04694241, Ry=21.814096)
my_model.edit_part(p5, Tx=-2.041544, Ty=-0.92750001, Tz=0.12191465, Ry=-4.9156169)

# Create revolute joints coupling the FE parts together and to ground
joints = []
joints.append(my_model.make_joint('Rev1', FmType.REVOLUTE_JOINT, 8))
joints.append(my_model.make_joint('Rev2', FmType.REVOLUTE_JOINT, 11))
joints.append(my_model.make_joint('Rev3', FmType.REVOLUTE_JOINT, 19, 7))
joints.append(my_model.make_joint('Rev4', FmType.REVOLUTE_JOINT, 24, 6))
joints.append(my_model.make_joint('Rev5', FmType.REVOLUTE_JOINT, 38, 22))
joints.append(my_model.make_joint('Rev6', FmType.REVOLUTE_JOINT, 33, 17))
joints.append(my_model.make_joint('Rev7', FmType.REVOLUTE_JOINT, 49, 21))
joints.append(my_model.make_joint('Rev8', FmType.REVOLUTE_JOINT, 48, 20))
joints.append(my_model.make_joint('Rev9', FmType.REVOLUTE_JOINT, 56, 47))
joints.append(my_model.make_joint('Rv10', FmType.REVOLUTE_JOINT, 55, 35))

my_model.edit_joint(joints[2], Ry=90, Rz=-90)
[my_model.edit_joint(id, Rx=90) for id in joints[3:]]

f1 = my_model.make_function('Lift Cylinders',
    frequency=0.625, amplitude=0.15, delay=0.25, mean_value=0.15, end=0.8)

f2 = my_model.make_function('Boom Cylinder',
    slope=-0.5, start_ramp=0.5, end_ramp=1.2)

f3 = my_model.make_function('Rotation Front',
    frequency=0.5, amplitude=0.262, delay=0.25, mean_value=0.262, end=1.0)

f4 = my_model.make_function('Bucket Load',
    slope=50000, start_ramp=0.7, end_ramp=1.2)

my_model.edit_joint(joints[0], constraints={'Rz' : FmDofStat.SPRING},
    spring={'Rz' : 1.0e9}, length={'Rz' : f3})

cyl = my_model.make_spring('Lift cylinder', [(9, 23), (10, 18)],
    init_Stiff_Coeff=1.0e9, length=f1)

cyl.append(my_model.make_spring('Boom cylinder', (5, 50),
    init_Stiff_Coeff=1.0e9, length=f2))

my_model.make_load('Load', FmLoadType.FORCE, 39, (0, 0, -1), fn=f4)

my_model.fm_solver_setup(t_inc=0.01, t_end=1.6)

# Solver setup and execution
my_solver = FmmSolver()
my_solver.solve_all(str(model_file), True, True)


Low-code modeling


target_file: 02-loader-y100.fmm
file_exists: OVERWRITE!

  p1: [parts/Front.ftl]
  p2: [parts/Boom.ftl]
  p3: [parts/Bucket.ftl]
  p4: [parts/BellCrank.ftl]
  p5: [parts/BucketLink.ftl]

  Front_fix_bottom:                [Front bottom bearing housing to ground,    p1, node,  441]
  front_fix_top:                   [Front top bearing housing to ground,       p1, node,  211]
  front_right_housing:             [Front right bearing housing,               p1, node,   38]
  front_left_housing:              [Front left bearing housing,                p1, node,   58]
  front_top_cylinder_attachment:   [Front top cylinder attachment point,       p1, node,   18]
  front_right_cylinder_attachment: [Front right cylinder attachment point,     p1, node,  222]
  front_left_cylinder_attachment:  [Front left cylinder attachment point,      p1, node,  235]

  boom_rear_right_houding:         [Boom right rear bearing housing,           p2, node, 1038]
  boom_rear_left_housing:          [Boom left rear bearing housing,            p2, node,  178]
  boom_front_right_housing:        [Boom right front bearing housing,          p2, node,  715]
  boom_front_left_housing:         [Boom left front bearing housing,           p2, node,    5]
  boom_right_bellcrank_housing:    [Boom right bearing housing to BellCrank,   p2, node,  545]
  boom_left_bellcrank_housing:     [Boom left bearing housing to BellCrank,    p2, node,  424]
  boom_right_cylinder_attachment:  [Boom right cylinder attachment point,      p2, node,  829]
  boom_left_cylinder_attachment:   [Boom left cylinder attachment point,       p2, node,  119]

  bucket_right_housing:            [Bucket right housing,                      p3, node,  509]
  bucket_mid_housing:              [Bucket midt housing,                       p3, node,  451]
  bucket_left_housing:             [Bucket left housing,                       p3, node,  284]

  bellcrank_top_housing:           [BellCrank top housing,                     p4, node,  420]
  bellcrank_bottom_housing:        [BellCrank bottom housing,                  p4, node,   14]
  bellcrank_right_housing:         [BellCrank right housing,                   p4, node,  276]
  bellcrank_left_housing:          [BellCrank left housing,                    p4, node,  244]

  bucketlink_rear_houding:         [BucketLink rear housing,                   p5, node,  575]
  bucketlink_front_housing:        [BucketLink front housing,                  p5, node,  174]

  p1: &link_property
    alpha2: 0.00286
    component_modes: 0
    consistent_mass: True
    <<: *link_property
    Tx:  0.01080263
    Tz: -0.77487206

    <<: *link_property
    Tx:   -0.64636636
    Tz:   -2.0328088
    Ry:  -30
    Rz: -180
    <<: *link_property
    Tx: -3.2499752
    Ty: -2.8376081
    Tz:  0.04694241
    Ry: 21.814096
    <<: *link_property
    Tx: -2.041544
    Ty: -0.92750001
    Tz:  0.12191465
    Ry: -4.9156169

  j01: [Front bottom to ground,        BALL_JOINT, Front_fix_bottom]
  j02: [Front top to ground,           BALL_JOINT, front_fix_top]

  j03: [Front to boom right,           BALL_JOINT, front_right_housing,      boom_rear_right_houding]
  j04: [Front to boom left,            BALL_JOINT, front_left_housing,       boom_rear_left_housing]

  j05: [Boom to bucket right,          BALL_JOINT, boom_front_right_housing, bucket_right_housing]
  j06: [Boom to bucket left,           BALL_JOINT, boom_front_left_housing,  bucket_left_housing]

  j07: [Bucket link rear,              BALL_JOINT, bucketlink_rear_houding,  bellcrank_bottom_housing]
  j08: [Bucket link front,             BALL_JOINT, bucketlink_front_housing, bucket_mid_housing]

  j09: [Boom to bellCrank right,       BALL_JOINT, boom_right_bellcrank_housing, bellcrank_right_housing]
  j10: [Boom to BellCrank left,        BALL_JOINT, boom_left_bellcrank_housing,  bellcrank_left_housing]

hydraulic_cylinders:  # User-defined function
  Top_cylinder:   [Top cylinder,   front_top_cylinder_attachment,
    bellcrank_top_housing, 0.15, 0.12, 0.05, 0.7, 0.7, 1.0e+4]

  Right_cylinder: [Right cylinder, front_right_cylinder_attachment,
    boom_right_cylinder_attachment, 0.15, 0.12, 0.05, 0.7, 0.7, 1.0e+6]

  Left_cylinder:  [Left cylinder,  front_left_cylinder_attachment,
    boom_left_cylinder_attachment, 0.15, 0.12, 0.05, 0.7, 0.7, 1.0e+6]

    kind: PART
    ORIGINAL_FE_FILE: parts/Front.ftl

      - [1.0, 0.0, 0.0, 1.0]
      - [0.0, 1.0, 0.0, 1.0]
      - [0.0, 0.0, 1.0, 1.0]

    DESCR: Front no. 2 | tagging_2