# No. 15 (Brown 1868): White's pulleys. Generator: opencode-runs/batch18/gen015.py (one rope, capstan friction model, six loose sheaves).
number: 15
slug: whites-pulleys
name: White's pulleys
brown: "15. Represents what are known as White's pulleys, which can either be made with separate loose pulleys, or a series of grooves can be cut in a solid block, the diameters being made in proportion to the speed of the rope; that is, 1, 3, and 5 for one block, and 2, 4, and 6 for the other. Power as 1 to 7."
units: cm
sim: {timestep: 0.0005, integrator: implicitfast, iterations: 50, duration_s: 10.0}
bodies:
  - id: upblock
    shape: part
    fixed: true
    pos: [0, 0, 90.0]
    mass: 1
    color: "#8f8a80"
    pieces:
      - {kind: rod, from: [0, -0.4, 90.0], to: [0, 3.0, 90.0], radius: 0.6, collide: 0}
      - {kind: rod, from: [0, 0, 98.9], to: [0, 0, 102.4], radius: 0.4, collide: 0}
  - {id: u2, shape: pulley, mount: upblock, radius: 2.5000, width: 0.8, pos: [0, 0.200, 90.0], mass: 0.100, spokes: 0, hub: 0.700, flange: 0.25, color: "#5a5046"}
  - {id: u4, shape: pulley, mount: upblock, radius: 5.3000, width: 0.8, pos: [0, 0.800, 90.0], mass: 0.200, spokes: 0, hub: 0.700, flange: 0.25, color: "#4a4239"}
  - {id: u6, shape: pulley, mount: upblock, radius: 8.1000, width: 0.8, pos: [0, 1.400, 90.0], mass: 0.300, spokes: 0, hub: 0.700, flange: 0.25, color: "#3b342c"}
  - id: lowblock
    shape: part
    pos: [0, 0, 26.0]
    mass: 12.0
    color: "#8f8a80"
    pieces:
      - {kind: rod, from: [0, -0.4, 26.0], to: [0, 3.0, 26.0], radius: 0.6, collide: 0}
      - {kind: rod, from: [0, 0, 18.5], to: [0, 0, 15.0], radius: 0.4, collide: 0}
  - {id: l1, shape: pulley, mount: lowblock, radius: 1.1000, width: 0.8, pos: [0, 0.200, 26.0], mass: 0.050, spokes: 0, hub: 0.700, flange: 0.25, color: "#5a5046"}
  - {id: l3, shape: pulley, mount: lowblock, radius: 3.9000, width: 0.8, pos: [0, 0.800, 26.0], mass: 0.150, spokes: 0, hub: 0.700, flange: 0.25, color: "#4a4239"}
  - {id: l5, shape: pulley, mount: lowblock, radius: 6.7000, width: 0.8, pos: [0, 1.400, 26.0], mass: 0.250, spokes: 0, hub: 0.700, flange: 0.25, color: "#3b342c"}
  - id: hand
    shape: grip
    pos: [-8.7000, 0, 60.0]
    mass: 0.4
    color: "#c9bda2"
    rods:
      - {from: [-8.7000, 0, 61.0], to: [-8.7000, 0, 59.0], radius: 1.4}
joints:
  - {id: j_block, type: slide, body: lowblock, axis: [0, 0, 1], range: [-6, 16], damping: 2}
  - {id: j_u2, type: hinge, body: u2, axis: [0, 1, 0], damping: 0.0005}
  - {id: j_u4, type: hinge, body: u4, axis: [0, 1, 0], damping: 0.0005}
  - {id: j_u6, type: hinge, body: u6, axis: [0, 1, 0], damping: 0.0005}
  - {id: j_l1, type: hinge, body: l1, axis: [0, 1, 0], damping: 0.0005}
  - {id: j_l3, type: hinge, body: l3, axis: [0, 1, 0], damping: 0.0005}
  - {id: j_l5, type: hinge, body: l5, axis: [0, 1, 0], damping: 0.0005}
  - {id: j_hand, type: slide, body: hand, axis: [0, 0, -1], range: [-6, 70]}
cords:
  - id: rope
    from: {body: upblock, at: [-1.7000, 0, 80.6000]}
    to: {body: hand, at: [-8.7000, 0, 60.0]}
    over: [l1, u2, l3, u4, l5, u6]
    under: [l1, u2, l3, u4, l5, u6]
    links: 120
    thickness: 0.6
    density: 1400
    stiffness: 200000.0
    pretension: 20.93
    damping: 12
    friction: 0.3
    model: capstan
driver: {joint: j_hand, kind: velocity, speed: 4.0, kv: 20000.0, max_torque: 400}
checks:
  # six falls carry the load: the block rises a sixth of the hand's pull
  - {type: ratio, out: j_block, in: j_hand, expect: 0.1667, tol: 0.004, settle_s: 2.0, window_s: 6}
  # grooves in proportion to the rope's speed (pitch radii 1..6 A): every sheave turns at the same rate, 1/(6A) rad per unit
  # of pull, all the same way (the rope wraps every groove in one sense), so none slips on its pin
  - {type: ratio, out: j_u2, in: j_hand, expect: -11.905, tol: 0.3, settle_s: 2.0, window_s: 6}
  - {type: ratio, out: j_u4, in: j_hand, expect: -11.905, tol: 0.3, settle_s: 2.0, window_s: 6}
  - {type: ratio, out: j_u6, in: j_hand, expect: -11.905, tol: 0.3, settle_s: 2.0, window_s: 6}
  - {type: ratio, out: j_l1, in: j_hand, expect: -11.905, tol: 0.3, settle_s: 2.0, window_s: 6}
  - {type: ratio, out: j_l3, in: j_hand, expect: -11.905, tol: 0.3, settle_s: 2.0, window_s: 6}
  - {type: ratio, out: j_l5, in: j_hand, expect: -11.905, tol: 0.3, settle_s: 2.0, window_s: 6}
  # the hand holds a sixth of the block's weight (12.45 kg with its sheaves), less its own 0.4 kg
  - {type: force, expect: 16.43, tol: 0.8, settle_s: 2.0, window_s: 6}
camera: {target: [0, 0, 50.0], position: [0, -192.0, 52.0], fov: 36}
display:
  output: j_block
  labels: {j_hand: "Hand pulling the rope (driver)", j_block: "Lower block and its load"}

