# No. 167 (Brown 1868): "A drum or cylinder having an endless spiral groove extending all around it; one half of the groove having its pitch in one, and the other half its pitch in the opposite direction. A stud on a reciprocating rectilinearly moving rod works in the groove, and so converts reciprocating into rotary motion. This has been used as a substitute for the crank in a steam engine."
#
# Model (cm, no gravity; a plan): a vertical drum of radius 2.9 (groove floor 2.2) with one endless groove that climbs 2.6 cm for half a turn and falls 2.6 cm for the other half (a smoothed triangle wave,
# so the stud can round the turns). The two ridges either side of it are real contact (24 convex segments per half turn each side). The stud, on a rod that slides up and down (the one driven joint, a swing of 2.99 cm at 0.4 Hz),
# stands in the groove with 0.15 cm clear each side, so the drum is turned only by the groove walls and goes round one way, once for each up-and-down stroke; the drum's own inertia carries it round the turns. Generator: opencode-runs/batch11/gen167.py.
number: 167
slug: reversing-spiral-drum
name: A drum with a reversing spiral groove
brown: "A drum or cylinder having an endless spiral groove extending all around it; one half of the groove having its pitch in one, and the other half its pitch in the opposite direction. A stud on a reciprocating rectilinearly moving rod works in the groove, and so converts reciprocating into rotary motion. This has been used as a substitute for the crank in a steam engine."
units: cm
sim:
  timestep: 0.0002
  integrator: implicitfast
  iterations: 100
  solver: PGS
  multiccd: true
  duration_s: 5
  floor: false
  gravity: 0
bodies:
  - id: drum
    shape: part
    pos: [0, 0, 0]
    mass: 2.5
    friction: 0.02
    color: "#cdbf9f"
    pieces:
      - {kind: rod, from: [0, 0, -6.2], to: [0, 0, 6.2], radius: 2.1, collide: 0, color: "#6e6452"}
      - {kind: rod, from: [0, 0, 6.2], to: [0, 0, 7.6], radius: 0.7, collide: 0, color: "#b9b09c"}
      - {kind: rod, from: [0, 0, -7.6], to: [0, 0, -6.2], radius: 0.7, collide: 0, color: "#b9b09c"}
      - {kind: loft, a: [[-0.0, 2.1, 0.4683], [-0.0, 2.1, 6.2], [-0.0, 2.9, 6.2], [-0.0, 2.9, 0.4683]], b: [[-0.2741, 2.082, 0.1949], [-0.2741, 2.082, 6.2], [-0.3785, 2.8752, 6.2], [-0.3785, 2.8752, 0.1949]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-0.0, 2.1, -6.2], [-0.0, 2.1, -0.4683], [-0.0, 2.9, -0.4683], [-0.0, 2.9, -6.2]], b: [[-0.2741, 2.082, -6.2], [-0.2741, 2.082, -0.7417], [-0.3785, 2.8752, -0.7417], [-0.3785, 2.8752, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-0.2741, 2.082, 0.1949], [-0.2741, 2.082, 6.2], [-0.3785, 2.8752, 6.2], [-0.3785, 2.8752, 0.1949]], b: [[-0.5435, 2.0284, -0.0776], [-0.5435, 2.0284, 6.2], [-0.7506, 2.8012, 6.2], [-0.7506, 2.8012, -0.0776]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-0.2741, 2.082, -6.2], [-0.2741, 2.082, -0.7417], [-0.3785, 2.8752, -0.7417], [-0.3785, 2.8752, -6.2]], b: [[-0.5435, 2.0284, -6.2], [-0.5435, 2.0284, -1.0142], [-0.7506, 2.8012, -1.0142], [-0.7506, 2.8012, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-0.5435, 2.0284, -0.0776], [-0.5435, 2.0284, 6.2], [-0.7506, 2.8012, 6.2], [-0.7506, 2.8012, -0.0776]], b: [[-0.8036, 1.9401, -0.3481], [-0.8036, 1.9401, 6.2], [-1.1098, 2.6793, 6.2], [-1.1098, 2.6793, -0.3481]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-0.5435, 2.0284, -6.2], [-0.5435, 2.0284, -1.0142], [-0.7506, 2.8012, -1.0142], [-0.7506, 2.8012, -6.2]], b: [[-0.8036, 1.9401, -6.2], [-0.8036, 1.9401, -1.2847], [-1.1098, 2.6793, -1.2847], [-1.1098, 2.6793, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-0.8036, 1.9401, -0.3481], [-0.8036, 1.9401, 6.2], [-1.1098, 2.6793, 6.2], [-1.1098, 2.6793, -0.3481]], b: [[-1.05, 1.8187, -0.6155], [-1.05, 1.8187, 6.2], [-1.45, 2.5115, 6.2], [-1.45, 2.5115, -0.6155]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-0.8036, 1.9401, -6.2], [-0.8036, 1.9401, -1.2847], [-1.1098, 2.6793, -1.2847], [-1.1098, 2.6793, -6.2]], b: [[-1.05, 1.8187, -6.2], [-1.05, 1.8187, -1.5521], [-1.45, 2.5115, -1.5521], [-1.45, 2.5115, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.05, 1.8187, -0.6155], [-1.05, 1.8187, 6.2], [-1.45, 2.5115, 6.2], [-1.45, 2.5115, -0.6155]], b: [[-1.2784, 1.666, -0.878], [-1.2784, 1.666, 6.2], [-1.7654, 2.3007, 6.2], [-1.7654, 2.3007, -0.878]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.05, 1.8187, -6.2], [-1.05, 1.8187, -1.5521], [-1.45, 2.5115, -1.5521], [-1.45, 2.5115, -6.2]], b: [[-1.2784, 1.666, -6.2], [-1.2784, 1.666, -1.8146], [-1.7654, 2.3007, -1.8146], [-1.7654, 2.3007, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.2784, 1.666, -0.878], [-1.2784, 1.666, 6.2], [-1.7654, 2.3007, 6.2], [-1.7654, 2.3007, -0.878]], b: [[-1.4849, 1.4849, -1.1334], [-1.4849, 1.4849, 6.2], [-2.0506, 2.0506, 6.2], [-2.0506, 2.0506, -1.1334]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.2784, 1.666, -6.2], [-1.2784, 1.666, -1.8146], [-1.7654, 2.3007, -1.8146], [-1.7654, 2.3007, -6.2]], b: [[-1.4849, 1.4849, -6.2], [-1.4849, 1.4849, -2.07], [-2.0506, 2.0506, -2.07], [-2.0506, 2.0506, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.4849, 1.4849, -1.1334], [-1.4849, 1.4849, 6.2], [-2.0506, 2.0506, 6.2], [-2.0506, 2.0506, -1.1334]], b: [[-1.666, 1.2784, -1.3781], [-1.666, 1.2784, 6.2], [-2.3007, 1.7654, 6.2], [-2.3007, 1.7654, -1.3781]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.4849, 1.4849, -6.2], [-1.4849, 1.4849, -2.07], [-2.0506, 2.0506, -2.07], [-2.0506, 2.0506, -6.2]], b: [[-1.666, 1.2784, -6.2], [-1.666, 1.2784, -2.3147], [-2.3007, 1.7654, -2.3147], [-2.3007, 1.7654, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.666, 1.2784, -1.3781], [-1.666, 1.2784, 6.2], [-2.3007, 1.7654, 6.2], [-2.3007, 1.7654, -1.3781]], b: [[-1.8187, 1.05, -1.6069], [-1.8187, 1.05, 6.2], [-2.5115, 1.45, 6.2], [-2.5115, 1.45, -1.6069]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.666, 1.2784, -6.2], [-1.666, 1.2784, -2.3147], [-2.3007, 1.7654, -2.3147], [-2.3007, 1.7654, -6.2]], b: [[-1.8187, 1.05, -6.2], [-1.8187, 1.05, -2.5435], [-2.5115, 1.45, -2.5435], [-2.5115, 1.45, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.8187, 1.05, -1.6069], [-1.8187, 1.05, 6.2], [-2.5115, 1.45, 6.2], [-2.5115, 1.45, -1.6069]], b: [[-1.9401, 0.8036, -1.8113], [-1.9401, 0.8036, 6.2], [-2.6793, 1.1098, 6.2], [-2.6793, 1.1098, -1.8113]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.8187, 1.05, -6.2], [-1.8187, 1.05, -2.5435], [-2.5115, 1.45, -2.5435], [-2.5115, 1.45, -6.2]], b: [[-1.9401, 0.8036, -6.2], [-1.9401, 0.8036, -2.7479], [-2.6793, 1.1098, -2.7479], [-2.6793, 1.1098, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.9401, 0.8036, -1.8113], [-1.9401, 0.8036, 6.2], [-2.6793, 1.1098, 6.2], [-2.6793, 1.1098, -1.8113]], b: [[-2.0284, 0.5435, -1.9786], [-2.0284, 0.5435, 6.2], [-2.8012, 0.7506, 6.2], [-2.8012, 0.7506, -1.9786]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.9401, 0.8036, -6.2], [-1.9401, 0.8036, -2.7479], [-2.6793, 1.1098, -2.7479], [-2.6793, 1.1098, -6.2]], b: [[-2.0284, 0.5435, -6.2], [-2.0284, 0.5435, -2.9152], [-2.8012, 0.7506, -2.9152], [-2.8012, 0.7506, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-2.0284, 0.5435, -1.9786], [-2.0284, 0.5435, 6.2], [-2.8012, 0.7506, 6.2], [-2.8012, 0.7506, -1.9786]], b: [[-2.082, 0.2741, -2.0914], [-2.082, 0.2741, 6.2], [-2.8752, 0.3785, 6.2], [-2.8752, 0.3785, -2.0914]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-2.0284, 0.5435, -6.2], [-2.0284, 0.5435, -2.9152], [-2.8012, 0.7506, -2.9152], [-2.8012, 0.7506, -6.2]], b: [[-2.082, 0.2741, -6.2], [-2.082, 0.2741, -3.028], [-2.8752, 0.3785, -3.028], [-2.8752, 0.3785, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-2.082, 0.2741, -2.0914], [-2.082, 0.2741, 6.2], [-2.8752, 0.3785, 6.2], [-2.8752, 0.3785, -2.0914]], b: [[-2.1, -0.0, -2.1317], [-2.1, -0.0, 6.2], [-2.9, -0.0, 6.2], [-2.9, -0.0, -2.1317]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-2.082, 0.2741, -6.2], [-2.082, 0.2741, -3.028], [-2.8752, 0.3785, -3.028], [-2.8752, 0.3785, -6.2]], b: [[-2.1, -0.0, -6.2], [-2.1, -0.0, -3.0683], [-2.9, -0.0, -3.0683], [-2.9, -0.0, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-2.1, -0.0, -2.1317], [-2.1, -0.0, 6.2], [-2.9, -0.0, 6.2], [-2.9, -0.0, -2.1317]], b: [[-2.082, -0.2741, -2.0914], [-2.082, -0.2741, 6.2], [-2.8752, -0.3785, 6.2], [-2.8752, -0.3785, -2.0914]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-2.1, -0.0, -6.2], [-2.1, -0.0, -3.0683], [-2.9, -0.0, -3.0683], [-2.9, -0.0, -6.2]], b: [[-2.082, -0.2741, -6.2], [-2.082, -0.2741, -3.028], [-2.8752, -0.3785, -3.028], [-2.8752, -0.3785, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-2.082, -0.2741, -2.0914], [-2.082, -0.2741, 6.2], [-2.8752, -0.3785, 6.2], [-2.8752, -0.3785, -2.0914]], b: [[-2.0284, -0.5435, -1.9786], [-2.0284, -0.5435, 6.2], [-2.8012, -0.7506, 6.2], [-2.8012, -0.7506, -1.9786]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-2.082, -0.2741, -6.2], [-2.082, -0.2741, -3.028], [-2.8752, -0.3785, -3.028], [-2.8752, -0.3785, -6.2]], b: [[-2.0284, -0.5435, -6.2], [-2.0284, -0.5435, -2.9152], [-2.8012, -0.7506, -2.9152], [-2.8012, -0.7506, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-2.0284, -0.5435, -1.9786], [-2.0284, -0.5435, 6.2], [-2.8012, -0.7506, 6.2], [-2.8012, -0.7506, -1.9786]], b: [[-1.9401, -0.8036, -1.8113], [-1.9401, -0.8036, 6.2], [-2.6793, -1.1098, 6.2], [-2.6793, -1.1098, -1.8113]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-2.0284, -0.5435, -6.2], [-2.0284, -0.5435, -2.9152], [-2.8012, -0.7506, -2.9152], [-2.8012, -0.7506, -6.2]], b: [[-1.9401, -0.8036, -6.2], [-1.9401, -0.8036, -2.7479], [-2.6793, -1.1098, -2.7479], [-2.6793, -1.1098, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.9401, -0.8036, -1.8113], [-1.9401, -0.8036, 6.2], [-2.6793, -1.1098, 6.2], [-2.6793, -1.1098, -1.8113]], b: [[-1.8187, -1.05, -1.6069], [-1.8187, -1.05, 6.2], [-2.5115, -1.45, 6.2], [-2.5115, -1.45, -1.6069]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.9401, -0.8036, -6.2], [-1.9401, -0.8036, -2.7479], [-2.6793, -1.1098, -2.7479], [-2.6793, -1.1098, -6.2]], b: [[-1.8187, -1.05, -6.2], [-1.8187, -1.05, -2.5435], [-2.5115, -1.45, -2.5435], [-2.5115, -1.45, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.8187, -1.05, -1.6069], [-1.8187, -1.05, 6.2], [-2.5115, -1.45, 6.2], [-2.5115, -1.45, -1.6069]], b: [[-1.666, -1.2784, -1.3781], [-1.666, -1.2784, 6.2], [-2.3007, -1.7654, 6.2], [-2.3007, -1.7654, -1.3781]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.8187, -1.05, -6.2], [-1.8187, -1.05, -2.5435], [-2.5115, -1.45, -2.5435], [-2.5115, -1.45, -6.2]], b: [[-1.666, -1.2784, -6.2], [-1.666, -1.2784, -2.3147], [-2.3007, -1.7654, -2.3147], [-2.3007, -1.7654, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.666, -1.2784, -1.3781], [-1.666, -1.2784, 6.2], [-2.3007, -1.7654, 6.2], [-2.3007, -1.7654, -1.3781]], b: [[-1.4849, -1.4849, -1.1334], [-1.4849, -1.4849, 6.2], [-2.0506, -2.0506, 6.2], [-2.0506, -2.0506, -1.1334]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.666, -1.2784, -6.2], [-1.666, -1.2784, -2.3147], [-2.3007, -1.7654, -2.3147], [-2.3007, -1.7654, -6.2]], b: [[-1.4849, -1.4849, -6.2], [-1.4849, -1.4849, -2.07], [-2.0506, -2.0506, -2.07], [-2.0506, -2.0506, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.4849, -1.4849, -1.1334], [-1.4849, -1.4849, 6.2], [-2.0506, -2.0506, 6.2], [-2.0506, -2.0506, -1.1334]], b: [[-1.2784, -1.666, -0.878], [-1.2784, -1.666, 6.2], [-1.7654, -2.3007, 6.2], [-1.7654, -2.3007, -0.878]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.4849, -1.4849, -6.2], [-1.4849, -1.4849, -2.07], [-2.0506, -2.0506, -2.07], [-2.0506, -2.0506, -6.2]], b: [[-1.2784, -1.666, -6.2], [-1.2784, -1.666, -1.8146], [-1.7654, -2.3007, -1.8146], [-1.7654, -2.3007, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.2784, -1.666, -0.878], [-1.2784, -1.666, 6.2], [-1.7654, -2.3007, 6.2], [-1.7654, -2.3007, -0.878]], b: [[-1.05, -1.8187, -0.6155], [-1.05, -1.8187, 6.2], [-1.45, -2.5115, 6.2], [-1.45, -2.5115, -0.6155]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.2784, -1.666, -6.2], [-1.2784, -1.666, -1.8146], [-1.7654, -2.3007, -1.8146], [-1.7654, -2.3007, -6.2]], b: [[-1.05, -1.8187, -6.2], [-1.05, -1.8187, -1.5521], [-1.45, -2.5115, -1.5521], [-1.45, -2.5115, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.05, -1.8187, -0.6155], [-1.05, -1.8187, 6.2], [-1.45, -2.5115, 6.2], [-1.45, -2.5115, -0.6155]], b: [[-0.8036, -1.9401, -0.3481], [-0.8036, -1.9401, 6.2], [-1.1098, -2.6793, 6.2], [-1.1098, -2.6793, -0.3481]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-1.05, -1.8187, -6.2], [-1.05, -1.8187, -1.5521], [-1.45, -2.5115, -1.5521], [-1.45, -2.5115, -6.2]], b: [[-0.8036, -1.9401, -6.2], [-0.8036, -1.9401, -1.2847], [-1.1098, -2.6793, -1.2847], [-1.1098, -2.6793, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-0.8036, -1.9401, -0.3481], [-0.8036, -1.9401, 6.2], [-1.1098, -2.6793, 6.2], [-1.1098, -2.6793, -0.3481]], b: [[-0.5435, -2.0284, -0.0776], [-0.5435, -2.0284, 6.2], [-0.7506, -2.8012, 6.2], [-0.7506, -2.8012, -0.0776]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-0.8036, -1.9401, -6.2], [-0.8036, -1.9401, -1.2847], [-1.1098, -2.6793, -1.2847], [-1.1098, -2.6793, -6.2]], b: [[-0.5435, -2.0284, -6.2], [-0.5435, -2.0284, -1.0142], [-0.7506, -2.8012, -1.0142], [-0.7506, -2.8012, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-0.5435, -2.0284, -0.0776], [-0.5435, -2.0284, 6.2], [-0.7506, -2.8012, 6.2], [-0.7506, -2.8012, -0.0776]], b: [[-0.2741, -2.082, 0.1949], [-0.2741, -2.082, 6.2], [-0.3785, -2.8752, 6.2], [-0.3785, -2.8752, 0.1949]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-0.5435, -2.0284, -6.2], [-0.5435, -2.0284, -1.0142], [-0.7506, -2.8012, -1.0142], [-0.7506, -2.8012, -6.2]], b: [[-0.2741, -2.082, -6.2], [-0.2741, -2.082, -0.7417], [-0.3785, -2.8752, -0.7417], [-0.3785, -2.8752, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-0.2741, -2.082, 0.1949], [-0.2741, -2.082, 6.2], [-0.3785, -2.8752, 6.2], [-0.3785, -2.8752, 0.1949]], b: [[-0.0, -2.1, 0.4683], [-0.0, -2.1, 6.2], [-0.0, -2.9, 6.2], [-0.0, -2.9, 0.4683]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[-0.2741, -2.082, -6.2], [-0.2741, -2.082, -0.7417], [-0.3785, -2.8752, -0.7417], [-0.3785, -2.8752, -6.2]], b: [[-0.0, -2.1, -6.2], [-0.0, -2.1, -0.4683], [-0.0, -2.9, -0.4683], [-0.0, -2.9, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[0.0, -2.1, 0.4683], [0.0, -2.1, 6.2], [0.0, -2.9, 6.2], [0.0, -2.9, 0.4683]], b: [[0.2741, -2.082, 0.7417], [0.2741, -2.082, 6.2], [0.3785, -2.8752, 6.2], [0.3785, -2.8752, 0.7417]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[0.0, -2.1, -6.2], [0.0, -2.1, -0.4683], [0.0, -2.9, -0.4683], [0.0, -2.9, -6.2]], b: [[0.2741, -2.082, -6.2], [0.2741, -2.082, -0.1949], [0.3785, -2.8752, -0.1949], [0.3785, -2.8752, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[0.2741, -2.082, 0.7417], [0.2741, -2.082, 6.2], [0.3785, -2.8752, 6.2], [0.3785, -2.8752, 0.7417]], b: [[0.5435, -2.0284, 1.0142], [0.5435, -2.0284, 6.2], [0.7506, -2.8012, 6.2], [0.7506, -2.8012, 1.0142]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[0.2741, -2.082, -6.2], [0.2741, -2.082, -0.1949], [0.3785, -2.8752, -0.1949], [0.3785, -2.8752, -6.2]], b: [[0.5435, -2.0284, -6.2], [0.5435, -2.0284, 0.0776], [0.7506, -2.8012, 0.0776], [0.7506, -2.8012, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[0.5435, -2.0284, 1.0142], [0.5435, -2.0284, 6.2], [0.7506, -2.8012, 6.2], [0.7506, -2.8012, 1.0142]], b: [[0.8036, -1.9401, 1.2847], [0.8036, -1.9401, 6.2], [1.1098, -2.6793, 6.2], [1.1098, -2.6793, 1.2847]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[0.5435, -2.0284, -6.2], [0.5435, -2.0284, 0.0776], [0.7506, -2.8012, 0.0776], [0.7506, -2.8012, -6.2]], b: [[0.8036, -1.9401, -6.2], [0.8036, -1.9401, 0.3481], [1.1098, -2.6793, 0.3481], [1.1098, -2.6793, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[0.8036, -1.9401, 1.2847], [0.8036, -1.9401, 6.2], [1.1098, -2.6793, 6.2], [1.1098, -2.6793, 1.2847]], b: [[1.05, -1.8187, 1.5521], [1.05, -1.8187, 6.2], [1.45, -2.5115, 6.2], [1.45, -2.5115, 1.5521]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[0.8036, -1.9401, -6.2], [0.8036, -1.9401, 0.3481], [1.1098, -2.6793, 0.3481], [1.1098, -2.6793, -6.2]], b: [[1.05, -1.8187, -6.2], [1.05, -1.8187, 0.6155], [1.45, -2.5115, 0.6155], [1.45, -2.5115, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.05, -1.8187, 1.5521], [1.05, -1.8187, 6.2], [1.45, -2.5115, 6.2], [1.45, -2.5115, 1.5521]], b: [[1.2784, -1.666, 1.8146], [1.2784, -1.666, 6.2], [1.7654, -2.3007, 6.2], [1.7654, -2.3007, 1.8146]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.05, -1.8187, -6.2], [1.05, -1.8187, 0.6155], [1.45, -2.5115, 0.6155], [1.45, -2.5115, -6.2]], b: [[1.2784, -1.666, -6.2], [1.2784, -1.666, 0.878], [1.7654, -2.3007, 0.878], [1.7654, -2.3007, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.2784, -1.666, 1.8146], [1.2784, -1.666, 6.2], [1.7654, -2.3007, 6.2], [1.7654, -2.3007, 1.8146]], b: [[1.4849, -1.4849, 2.07], [1.4849, -1.4849, 6.2], [2.0506, -2.0506, 6.2], [2.0506, -2.0506, 2.07]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.2784, -1.666, -6.2], [1.2784, -1.666, 0.878], [1.7654, -2.3007, 0.878], [1.7654, -2.3007, -6.2]], b: [[1.4849, -1.4849, -6.2], [1.4849, -1.4849, 1.1334], [2.0506, -2.0506, 1.1334], [2.0506, -2.0506, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.4849, -1.4849, 2.07], [1.4849, -1.4849, 6.2], [2.0506, -2.0506, 6.2], [2.0506, -2.0506, 2.07]], b: [[1.666, -1.2784, 2.3147], [1.666, -1.2784, 6.2], [2.3007, -1.7654, 6.2], [2.3007, -1.7654, 2.3147]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.4849, -1.4849, -6.2], [1.4849, -1.4849, 1.1334], [2.0506, -2.0506, 1.1334], [2.0506, -2.0506, -6.2]], b: [[1.666, -1.2784, -6.2], [1.666, -1.2784, 1.3781], [2.3007, -1.7654, 1.3781], [2.3007, -1.7654, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.666, -1.2784, 2.3147], [1.666, -1.2784, 6.2], [2.3007, -1.7654, 6.2], [2.3007, -1.7654, 2.3147]], b: [[1.8187, -1.05, 2.5435], [1.8187, -1.05, 6.2], [2.5115, -1.45, 6.2], [2.5115, -1.45, 2.5435]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.666, -1.2784, -6.2], [1.666, -1.2784, 1.3781], [2.3007, -1.7654, 1.3781], [2.3007, -1.7654, -6.2]], b: [[1.8187, -1.05, -6.2], [1.8187, -1.05, 1.6069], [2.5115, -1.45, 1.6069], [2.5115, -1.45, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.8187, -1.05, 2.5435], [1.8187, -1.05, 6.2], [2.5115, -1.45, 6.2], [2.5115, -1.45, 2.5435]], b: [[1.9401, -0.8036, 2.7479], [1.9401, -0.8036, 6.2], [2.6793, -1.1098, 6.2], [2.6793, -1.1098, 2.7479]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.8187, -1.05, -6.2], [1.8187, -1.05, 1.6069], [2.5115, -1.45, 1.6069], [2.5115, -1.45, -6.2]], b: [[1.9401, -0.8036, -6.2], [1.9401, -0.8036, 1.8113], [2.6793, -1.1098, 1.8113], [2.6793, -1.1098, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.9401, -0.8036, 2.7479], [1.9401, -0.8036, 6.2], [2.6793, -1.1098, 6.2], [2.6793, -1.1098, 2.7479]], b: [[2.0284, -0.5435, 2.9152], [2.0284, -0.5435, 6.2], [2.8012, -0.7506, 6.2], [2.8012, -0.7506, 2.9152]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.9401, -0.8036, -6.2], [1.9401, -0.8036, 1.8113], [2.6793, -1.1098, 1.8113], [2.6793, -1.1098, -6.2]], b: [[2.0284, -0.5435, -6.2], [2.0284, -0.5435, 1.9786], [2.8012, -0.7506, 1.9786], [2.8012, -0.7506, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[2.0284, -0.5435, 2.9152], [2.0284, -0.5435, 6.2], [2.8012, -0.7506, 6.2], [2.8012, -0.7506, 2.9152]], b: [[2.082, -0.2741, 3.028], [2.082, -0.2741, 6.2], [2.8752, -0.3785, 6.2], [2.8752, -0.3785, 3.028]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[2.0284, -0.5435, -6.2], [2.0284, -0.5435, 1.9786], [2.8012, -0.7506, 1.9786], [2.8012, -0.7506, -6.2]], b: [[2.082, -0.2741, -6.2], [2.082, -0.2741, 2.0914], [2.8752, -0.3785, 2.0914], [2.8752, -0.3785, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[2.082, -0.2741, 3.028], [2.082, -0.2741, 6.2], [2.8752, -0.3785, 6.2], [2.8752, -0.3785, 3.028]], b: [[2.1, 0.0, 3.0683], [2.1, 0.0, 6.2], [2.9, 0.0, 6.2], [2.9, 0.0, 3.0683]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[2.082, -0.2741, -6.2], [2.082, -0.2741, 2.0914], [2.8752, -0.3785, 2.0914], [2.8752, -0.3785, -6.2]], b: [[2.1, 0.0, -6.2], [2.1, 0.0, 2.1317], [2.9, 0.0, 2.1317], [2.9, 0.0, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[2.1, -0.0, 3.0683], [2.1, -0.0, 6.2], [2.9, -0.0, 6.2], [2.9, -0.0, 3.0683]], b: [[2.082, 0.2741, 3.028], [2.082, 0.2741, 6.2], [2.8752, 0.3785, 6.2], [2.8752, 0.3785, 3.028]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[2.1, -0.0, -6.2], [2.1, -0.0, 2.1317], [2.9, -0.0, 2.1317], [2.9, -0.0, -6.2]], b: [[2.082, 0.2741, -6.2], [2.082, 0.2741, 2.0914], [2.8752, 0.3785, 2.0914], [2.8752, 0.3785, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[2.082, 0.2741, 3.028], [2.082, 0.2741, 6.2], [2.8752, 0.3785, 6.2], [2.8752, 0.3785, 3.028]], b: [[2.0284, 0.5435, 2.9152], [2.0284, 0.5435, 6.2], [2.8012, 0.7506, 6.2], [2.8012, 0.7506, 2.9152]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[2.082, 0.2741, -6.2], [2.082, 0.2741, 2.0914], [2.8752, 0.3785, 2.0914], [2.8752, 0.3785, -6.2]], b: [[2.0284, 0.5435, -6.2], [2.0284, 0.5435, 1.9786], [2.8012, 0.7506, 1.9786], [2.8012, 0.7506, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[2.0284, 0.5435, 2.9152], [2.0284, 0.5435, 6.2], [2.8012, 0.7506, 6.2], [2.8012, 0.7506, 2.9152]], b: [[1.9401, 0.8036, 2.7479], [1.9401, 0.8036, 6.2], [2.6793, 1.1098, 6.2], [2.6793, 1.1098, 2.7479]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[2.0284, 0.5435, -6.2], [2.0284, 0.5435, 1.9786], [2.8012, 0.7506, 1.9786], [2.8012, 0.7506, -6.2]], b: [[1.9401, 0.8036, -6.2], [1.9401, 0.8036, 1.8113], [2.6793, 1.1098, 1.8113], [2.6793, 1.1098, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.9401, 0.8036, 2.7479], [1.9401, 0.8036, 6.2], [2.6793, 1.1098, 6.2], [2.6793, 1.1098, 2.7479]], b: [[1.8187, 1.05, 2.5435], [1.8187, 1.05, 6.2], [2.5115, 1.45, 6.2], [2.5115, 1.45, 2.5435]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.9401, 0.8036, -6.2], [1.9401, 0.8036, 1.8113], [2.6793, 1.1098, 1.8113], [2.6793, 1.1098, -6.2]], b: [[1.8187, 1.05, -6.2], [1.8187, 1.05, 1.6069], [2.5115, 1.45, 1.6069], [2.5115, 1.45, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.8187, 1.05, 2.5435], [1.8187, 1.05, 6.2], [2.5115, 1.45, 6.2], [2.5115, 1.45, 2.5435]], b: [[1.666, 1.2784, 2.3147], [1.666, 1.2784, 6.2], [2.3007, 1.7654, 6.2], [2.3007, 1.7654, 2.3147]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.8187, 1.05, -6.2], [1.8187, 1.05, 1.6069], [2.5115, 1.45, 1.6069], [2.5115, 1.45, -6.2]], b: [[1.666, 1.2784, -6.2], [1.666, 1.2784, 1.3781], [2.3007, 1.7654, 1.3781], [2.3007, 1.7654, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.666, 1.2784, 2.3147], [1.666, 1.2784, 6.2], [2.3007, 1.7654, 6.2], [2.3007, 1.7654, 2.3147]], b: [[1.4849, 1.4849, 2.07], [1.4849, 1.4849, 6.2], [2.0506, 2.0506, 6.2], [2.0506, 2.0506, 2.07]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.666, 1.2784, -6.2], [1.666, 1.2784, 1.3781], [2.3007, 1.7654, 1.3781], [2.3007, 1.7654, -6.2]], b: [[1.4849, 1.4849, -6.2], [1.4849, 1.4849, 1.1334], [2.0506, 2.0506, 1.1334], [2.0506, 2.0506, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.4849, 1.4849, 2.07], [1.4849, 1.4849, 6.2], [2.0506, 2.0506, 6.2], [2.0506, 2.0506, 2.07]], b: [[1.2784, 1.666, 1.8146], [1.2784, 1.666, 6.2], [1.7654, 2.3007, 6.2], [1.7654, 2.3007, 1.8146]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.4849, 1.4849, -6.2], [1.4849, 1.4849, 1.1334], [2.0506, 2.0506, 1.1334], [2.0506, 2.0506, -6.2]], b: [[1.2784, 1.666, -6.2], [1.2784, 1.666, 0.878], [1.7654, 2.3007, 0.878], [1.7654, 2.3007, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.2784, 1.666, 1.8146], [1.2784, 1.666, 6.2], [1.7654, 2.3007, 6.2], [1.7654, 2.3007, 1.8146]], b: [[1.05, 1.8187, 1.5521], [1.05, 1.8187, 6.2], [1.45, 2.5115, 6.2], [1.45, 2.5115, 1.5521]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.2784, 1.666, -6.2], [1.2784, 1.666, 0.878], [1.7654, 2.3007, 0.878], [1.7654, 2.3007, -6.2]], b: [[1.05, 1.8187, -6.2], [1.05, 1.8187, 0.6155], [1.45, 2.5115, 0.6155], [1.45, 2.5115, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.05, 1.8187, 1.5521], [1.05, 1.8187, 6.2], [1.45, 2.5115, 6.2], [1.45, 2.5115, 1.5521]], b: [[0.8036, 1.9401, 1.2847], [0.8036, 1.9401, 6.2], [1.1098, 2.6793, 6.2], [1.1098, 2.6793, 1.2847]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[1.05, 1.8187, -6.2], [1.05, 1.8187, 0.6155], [1.45, 2.5115, 0.6155], [1.45, 2.5115, -6.2]], b: [[0.8036, 1.9401, -6.2], [0.8036, 1.9401, 0.3481], [1.1098, 2.6793, 0.3481], [1.1098, 2.6793, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[0.8036, 1.9401, 1.2847], [0.8036, 1.9401, 6.2], [1.1098, 2.6793, 6.2], [1.1098, 2.6793, 1.2847]], b: [[0.5435, 2.0284, 1.0142], [0.5435, 2.0284, 6.2], [0.7506, 2.8012, 6.2], [0.7506, 2.8012, 1.0142]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[0.8036, 1.9401, -6.2], [0.8036, 1.9401, 0.3481], [1.1098, 2.6793, 0.3481], [1.1098, 2.6793, -6.2]], b: [[0.5435, 2.0284, -6.2], [0.5435, 2.0284, 0.0776], [0.7506, 2.8012, 0.0776], [0.7506, 2.8012, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[0.5435, 2.0284, 1.0142], [0.5435, 2.0284, 6.2], [0.7506, 2.8012, 6.2], [0.7506, 2.8012, 1.0142]], b: [[0.2741, 2.082, 0.7417], [0.2741, 2.082, 6.2], [0.3785, 2.8752, 6.2], [0.3785, 2.8752, 0.7417]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[0.5435, 2.0284, -6.2], [0.5435, 2.0284, 0.0776], [0.7506, 2.8012, 0.0776], [0.7506, 2.8012, -6.2]], b: [[0.2741, 2.082, -6.2], [0.2741, 2.082, -0.1949], [0.3785, 2.8752, -0.1949], [0.3785, 2.8752, -6.2]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[0.2741, 2.082, 0.7417], [0.2741, 2.082, 6.2], [0.3785, 2.8752, 6.2], [0.3785, 2.8752, 0.7417]], b: [[0.0, 2.1, 0.4683], [0.0, 2.1, 6.2], [0.0, 2.9, 6.2], [0.0, 2.9, 0.4683]], collide: 1, color: "#cdbf9f"}
      - {kind: loft, a: [[0.2741, 2.082, -6.2], [0.2741, 2.082, -0.1949], [0.3785, 2.8752, -0.1949], [0.3785, 2.8752, -6.2]], b: [[0.0, 2.1, -6.2], [0.0, 2.1, -0.4683], [0.0, 2.9, -0.4683], [0.0, 2.9, -6.2]], collide: 1, color: "#cdbf9f"}
  - id: rod
    shape: part
    pos: [0, 0, 0]
    mass: 0.15
    friction: 0.02
    color: "#a89a7e"
    pieces:
      - {kind: poly, points: [[-5.1, -8.2], [-4.1, -8.2], [-4.1, 8.2], [-5.1, 8.2]], y: [-4.3, -3.7], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-4.6, -0.6], [0.35, -0.6], [0.35, 0.6], [-4.6, 0.6]], y: [-4.3, -3.7], collide: 0, color: "#8f8a80"}
      - {kind: rod, from: [0, -3.7, 0], to: [0, -2.5500000000000003, 0], radius: 0.2, collide: 2, capsule: true, color: "#6b4f3a"}
  - id: frame
    shape: part
    pos: [0, 0, 0]
    fixed: true
    color: "#cfc6b4"
    pieces:
      - {kind: poly, points: [[-7.1, -10.4], [3.8, -10.4], [3.8, -9.4], [-7.1, -9.4]], y: [-4, 4], collide: 0, color: "#b9b09c"}
      - {kind: poly, points: [[-1.2, -9.4], [1.2, -9.4], [1.2, -7.6], [-1.2, -7.6]], y: [-1.2, 1.2], collide: 0}
      - {kind: poly, points: [[-1.2, 7.6], [1.2, 7.6], [1.2, 9.4], [-1.2, 9.4]], y: [-1.2, 1.2], collide: 0}
joints:
  - {id: j_dr, type: hinge, body: drum, axis: [0, 0, -1], damping: 0.001}   # the drum, turned by the groove
  - {id: j_rod, type: slide, body: rod, axis: [0, 0, 1], damping: 0.05}   # the reciprocating rod, the one driven joint
contact: {solref: [0.002, 1.0], solimp: [0.95, 0.99, 0.0005], margin: 0}
driver: {joint: j_rod, kind: velocity, rpm: 0, swing: {amplitude: 0.0299, hz: 0.4}, kv: 300, max_torque: 3000}
checks:
  - {type: follow, out: j_dr, in: j_rod, expect: -47.8534, tol: 2.8712, min_r2: 0.99, settle_s: 1.1, window_s: 0.3}
  - {type: follow, out: j_dr, in: j_rod, expect: 47.8534, tol: 2.8712, min_r2: 0.99, settle_s: 2.35, window_s: 0.3}
  - {type: follow, out: j_dr, in: j_rod, expect: -47.8534, tol: 2.8712, min_r2: 0.99, settle_s: 3.6, window_s: 0.3}
  - {type: turning, joint: j_dr, direction: 1, min_mean: 2.0106, slow: 0.2, min_fraction: 0.8, settle_s: 0.5, window_s: 4.3}   # the drum goes round and round one way
  - {type: position, joint: j_rod, min: -3.19, max: 3.19, settle_s: 0.0, window_s: 4.8}
  - {type: penetration, max: 0.003, settle_s: 0.5}
camera: {target: [-1.5, 0, -2.6], position: [-1.5, -60.0, -2.6], fov: 34}
display:
  output: j_dr
  labels: {j_rod: "Rod (driver)", j_dr: "Drum"}

