EnglishDeutsch/api/energyGitHub · iceccarelli
Grimaldi EngineeringCluster control · Frankfurt
Product · Palletizer

Stack mixed SKUs on the robot you already have.

Paste the SKU list. The planner returns layers, stability, density and cycle time, then an export for the controller.

Layer map · 1200 × 800 mm
SKU-03SKU-03SKU-03SKU-03SKU-03SKU-031200 mm800 mm
IDLERUNHOLDFAULT
Stability97 %
Density86 %
Layers5
Placed37/37
Height1,230 mm
Weight250 kg
Cycle time3:42 min
  • All SKUs placed. Static stability within limits.
URScript stub (preview)
# Palletizer stack plan — URScript STUB (Grimaldi Engineering, Frankfurt)
# Not commissioned. Verify pallet_frame, approach heights, gripper IO and safety config on the cell before RUN.
# pallet 1200 x 800 mm, 5 layers, 1230 mm, 249.8 kg, stability 0.97, state RUN
def palletizer_stack():
  # --- cell inputs (teach on the pendant) ---
  pallet_frame = p[0.0, 0.0, 0.0, 0.0, 0.0, 0.0]   # pallet deck corner, x along length, y along width, z up
  pick_pose    = p[0.0, 0.0, 0.0, 0.0, 0.0, 0.0]   # infeed pick, tool centre at box top face
  approach_z   = 0.150                            # m above place pose
  acc = 1.2
  vel = 0.8
  def grip():
    set_standard_digital_out(0, True)               # gripper class: vacuum, adapt to cell
    sleep(0.3)
  end
  def release():
    set_standard_digital_out(0, False)
    sleep(0.2)
  end
  def place(box_pose, yaw):
    target = pose_trans(pallet_frame, box_pose)
    target = pose_trans(target, p[0, 0, 0, 0, 0, yaw])
    above = pose_add(target, p[0, 0, approach_z, 0, 0, 0])
    movel(pick_pose, acc, vel)
    grip()
    movel(above, acc, vel)
    movel(target, acc, vel * 0.5)
    release()
    movel(above, acc, vel)
  end
  # --- placements: tool centre over box centre, z = box top face ---
  place(p[0.3000, 0.2000, 0.3000, 0, 0, 0], 0.0)   # 1 SKU-02 L1 15 kg
  place(p[0.9000, 0.2000, 0.3000, 0, 0, 0], 0.0)   # 2 SKU-02 L1 15 kg
  place(p[0.3000, 0.6000, 0.3000, 0, 0, 0], 0.0)   # 3 SKU-02 L1 15 kg
  place(p[0.9000, 0.6000, 0.3000, 0, 0, 0], 0.0)   # 4 SKU-02 L1 15 kg
  place(p[0.2000, 0.2000, 0.5800, 0, 0, 0], 0.0)   # 5 SKU-04 L2 11 kg
  place(p[0.6000, 0.2000, 0.5800, 0, 0, 0], 0.0)   # 6 SKU-04 L2 11 kg
  place(p[1.0000, 0.2000, 0.5800, 0, 0, 0], 0.0)   # 7 SKU-04 L2 11 kg
  place(p[0.2000, 0.6000, 0.5800, 0, 0, 0], 0.0)   # 8 SKU-04 L2 11 kg
  place(p[0.6000, 0.6000, 0.5800, 0, 0, 0], 0.0)   # 9 SKU-04 L2 11 kg
  place(p[1.0000, 0.6000, 0.5800, 0, 0, 0], 0.0)   # 10 SKU-04 L2 11 kg
  place(p[0.2000, 0.1500, 0.8300, 0, 0, 0], 0.0)   # 11 SKU-01 L3 8.5 kg
  place(p[0.6000, 0.1500, 0.8300, 0, 0, 0], 0.0)   # 12 SKU-01 L3 8.5 kg
  place(p[1.0000, 0.1500, 0.8300, 0, 0, 0], 0.0)   # 13 SKU-01 L3 8.5 kg
  place(p[0.2000, 0.4500, 0.8300, 0, 0, 0], 0.0)   # 14 SKU-01 L3 8.5 kg
  place(p[0.6000, 0.4500, 0.8300, 0, 0, 0], 0.0)   # 15 SKU-01 L3 8.5 kg
  place(p[1.0000, 0.4500, 0.8300, 0, 0, 0], 0.0)   # 16 SKU-01 L3 8.5 kg
  place(p[0.2000, 0.7000, 0.8300, 0, 0, 0], 0.0)   # 17 SKU-06 L3 2.4 kg
  place(p[0.6000, 0.7000, 0.8300, 0, 0, 0], 0.0)   # 18 SKU-06 L3 2.4 kg
  place(p[1.0000, 0.7000, 0.8300, 0, 0, 0], 0.0)   # 19 SKU-06 L3 2.4 kg
  place(p[0.1250, 0.1250, 1.0300, 0, 0, 0], 0.0)   # 20 SKU-05 L4 3.2 kg
  place(p[0.3750, 0.1250, 1.0300, 0, 0, 0], 0.0)   # 21 SKU-05 L4 3.2 kg
  place(p[0.6250, 0.1250, 1.0300, 0, 0, 0], 0.0)   # 22 SKU-05 L4 3.2 kg
  place(p[0.8750, 0.1250, 1.0300, 0, 0, 0], 0.0)   # 23 SKU-05 L4 3.2 kg
  place(p[0.1250, 0.3750, 1.0300, 0, 0, 0], 0.0)   # 24 SKU-05 L4 3.2 kg
  place(p[0.3750, 0.3750, 1.0300, 0, 0, 0], 0.0)   # 25 SKU-05 L4 3.2 kg
  place(p[0.6250, 0.3750, 1.0300, 0, 0, 0], 0.0)   # 26 SKU-05 L4 3.2 kg
  place(p[0.8750, 0.3750, 1.0300, 0, 0, 0], 0.0)   # 27 SKU-05 L4 3.2 kg
  place(p[0.1500, 0.6000, 1.0300, 0, 0, 0], 0.0)   # 28 SKU-03 L4 4 kg
  place(p[0.4500, 0.6000, 1.0300, 0, 0, 0], 0.0)   # 29 SKU-03 L4 4 kg
  place(p[0.7500, 0.6000, 1.0300, 0, 0, 0], 0.0)   # 30 SKU-03 L4 4 kg
  place(p[1.0500, 0.6000, 1.0300, 0, 0, 0], 0.0)   # 31 SKU-03 L4 4 kg
  place(p[0.1500, 0.1000, 1.2300, 0, 0, 0], 0.0)   # 32 SKU-03 L5 4 kg
  place(p[0.4500, 0.1000, 1.2300, 0, 0, 0], 0.0)   # 33 SKU-03 L5 4 kg
  place(p[0.7500, 0.1000, 1.2300, 0, 0, 0], 0.0)   # 34 SKU-03 L5 4 kg
  place(p[1.0500, 0.1000, 1.2300, 0, 0, 0], 0.0)   # 35 SKU-03 L5 4 kg
  place(p[0.1500, 0.3000, 1.2300, 0, 0, 0], 0.0)   # 36 SKU-03 L5 4 kg
  place(p[0.4500, 0.3000, 1.2300, 0, 0, 0], 0.0)   # 37 SKU-03 L5 4 kg
end
palletizer_stack()

Static geometry: base support and centre of mass. Not a transport or wrapping certification.Cycle time at 6 s per pick, planning assumption.

What ships

Planner

Height-grouped layers, shelf packing with rotation, per-box base support, centre-of-mass score, crush-limit check. Runs in the browser here and in the Python engine in the repository.

State machine

IDLE · RUN · HOLD · FAULT with named transitions and the fault codes the planner emits. Documented on /docs so a PLC or a person can read it.

Adapters

A URScript stub today. FANUC, KUKA and ABB adapters are planned and listed as such below — not claimed.

Robot adapters

RobotInterfaceStatusNote
Universal RobotsURScript stub (movel, IO)shipsExported from the planner on this page.
FANUCKAREL / TP via socketplannedNo date. Listed when it exists.
KUKAKRL via EthernetKRLplannedNo date. Listed when it exists.
ABBRAPID via PC SDKplannedNo date. Listed when it exists.

Status

software shipped|cell not commissioned

Software shipped: repository public, planner live on this page. Cell not commissioned: no customer cell runs this software yet, so no cell video, no throughput claim and no reference appear here until one does.

Written and maintained by Vincenzo Ceccarelli Grimaldi, Frankfurt am Main.