# No. 94 (Brown 1868): "Variable crank, two circular plates revolving on the same center. In one a spiral
# groove is cut; in the other a series of slots radiating from the center. On turning one of these plates around
# its center, the bolt shown near the bottom of the figure, and which passes through the spiral groove and radial
# slots, is caused to move toward or from the center of the plates."
#
# Model (cm): the plate with the spiral groove (the one driven joint, 4 turns a minute, clockwise in the view)
# turns behind the plate with the six radial slots, which is fixed. The bolt passes through both, held in the slot
# (it slides along the slot: its joint) and in the groove by real contact of its shank with the groove's two walls
# (1.0 cm wide, 1.0 mm clearance). The groove is an Archimedean spiral, r = 3 + 1 a, so the bolt
# is moved out 1 cm a radian of turn, from 3 cm toward 8 cm. Generator: opencode-runs/batch8/gen094.py.
number: 94
slug: variable-crank-spiral-groove
name: A variable crank by a bolt in a spiral groove and a radial slot
brown: "Variable crank, two circular plates revolving on the same center. In one a spiral groove is cut; in the other a series of slots radiating from the center. On turning one of these plates around its center, the bolt shown near the bottom of the figure, and which passes through the spiral groove and radial slots, is caused to move toward or from the center of the plates."
units: cm
sim:
  timestep: 0.0002
  integrator: implicitfast
  iterations: 100
  solver: PGS
  multiccd: true
  duration_s: 10
  floor: false
bodies:
  - id: plate
    shape: part
    pos: [0, 0, 0]
    mass: 1.0
    friction: 0.05
    color: "#d9cfb6"
    pieces:
      - {kind: rod, from: [0, -1.4, 0], to: [0, 3.0, 0], radius: 0.8, color: "#8f8a80"}   # the spindle
      - {kind: disc, center: [0, 0], radius: 9.5, y: [0.0, 0.6]}   # the plate with the spiral groove (its walls are raised on it)
      - {kind: poly, points: [[-2.8682, 1.2349], [-2.9957, 1.0765], [-3.3555, 1.3467], [-3.2093, 1.5285]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.1104, 0.5824], [-2.1961, 0.476], [-1.8362, 0.2057], [-1.7694, 0.2888]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.9957, 1.0765], [-3.1141, 0.9073], [-3.4911, 1.153], [-3.3555, 1.3467]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.1961, 0.476], [-2.2764, 0.3612], [-1.8994, 0.1155], [-1.8362, 0.2057]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-3.1141, 0.9073], [-3.2228, 0.7279], [-3.6152, 0.9482], [-3.4911, 1.153]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.2764, 0.3612], [-2.3508, 0.2384], [-1.9584, 0.0181], [-1.8994, 0.1155]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-3.2228, 0.7279], [-3.3208, 0.5389], [-3.7269, 0.7328], [-3.6152, 0.9482]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.3508, 0.2384], [-2.4184, 0.1079], [-2.0124, -0.086], [-1.9584, 0.0181]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-3.3208, 0.5389], [-3.4075, 0.3409], [-3.8254, 0.5078], [-3.7269, 0.7328]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.4184, 0.1079], [-2.4788, -0.0299], [-2.0608, -0.1968], [-2.0124, -0.086]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-3.4075, 0.3409], [-3.4821, 0.1346], [-3.91, 0.2738], [-3.8254, 0.5078]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.4788, -0.0299], [-2.5311, -0.1747], [-2.1032, -0.3138], [-2.0608, -0.1968]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-3.4821, 0.1346], [-3.544, -0.0793], [-3.9801, 0.0317], [-3.91, 0.2738]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.5311, -0.1747], [-2.5749, -0.3258], [-2.1387, -0.4368], [-2.1032, -0.3138]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-3.544, -0.0793], [-3.5925, -0.2999], [-4.0349, -0.2175], [-3.9801, 0.0317]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.5749, -0.3258], [-2.6094, -0.4829], [-2.167, -0.5653], [-2.1387, -0.4368]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-3.5925, -0.2999], [-3.6271, -0.5264], [-4.0739, -0.4729], [-4.0349, -0.2175]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.6094, -0.4829], [-2.6342, -0.6453], [-2.1874, -0.6989], [-2.167, -0.5653]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-3.6271, -0.5264], [-3.6473, -0.758], [-4.0966, -0.7334], [-4.0739, -0.4729]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.6342, -0.6453], [-2.6487, -0.8125], [-2.1994, -0.837], [-2.1874, -0.6989]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-3.6473, -0.758], [-3.6525, -0.9936], [-4.1025, -0.9981], [-4.0966, -0.7334]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.6487, -0.8125], [-2.6525, -0.9836], [-2.2026, -0.9792], [-2.1994, -0.837]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-3.6525, -0.9936], [-3.6424, -1.2324], [-4.0911, -1.2659], [-4.1025, -0.9981]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.6525, -0.9836], [-2.6451, -1.1582], [-2.1964, -1.1247], [-2.2026, -0.9792]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-3.6424, -1.2324], [-3.6166, -1.4734], [-4.0623, -1.5355], [-4.0911, -1.2659]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.6451, -1.1582], [-2.6262, -1.3353], [-2.1805, -1.2732], [-2.1964, -1.1247]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-3.6166, -1.4734], [-3.5749, -1.7155], [-4.0157, -1.806], [-4.0623, -1.5355]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.6262, -1.3353], [-2.5954, -1.5143], [-2.1546, -1.4237], [-2.1805, -1.2732]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-3.5749, -1.7155], [-3.517, -1.9576], [-3.9511, -2.0761], [-4.0157, -1.806]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.5954, -1.5143], [-2.5523, -1.6943], [-2.1182, -1.5758], [-2.1546, -1.4237]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-3.517, -1.9576], [-3.4428, -2.1988], [-3.8685, -2.3447], [-3.9511, -2.0761]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.5523, -1.6943], [-2.4969, -1.8745], [-2.0712, -1.7286], [-2.1182, -1.5758]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-3.4428, -2.1988], [-3.3523, -2.4378], [-3.7678, -2.6105], [-3.8685, -2.3447]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.4969, -1.8745], [-2.4288, -2.0541], [-2.0133, -1.8814], [-2.0712, -1.7286]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-3.3523, -2.4378], [-3.2453, -2.6737], [-3.6491, -2.8724], [-3.7678, -2.6105]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.4288, -2.0541], [-2.3481, -2.2321], [-1.9444, -2.0334], [-2.0133, -1.8814]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-3.2453, -2.6737], [-3.122, -2.9053], [-3.5124, -3.1292], [-3.6491, -2.8724]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.3481, -2.2321], [-2.2546, -2.4077], [-1.8643, -2.1838], [-1.9444, -2.0334]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-3.122, -2.9053], [-2.9826, -3.1315], [-3.358, -3.3796], [-3.5124, -3.1292]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.2546, -2.4077], [-2.1484, -2.58], [-1.773, -2.3319], [-1.8643, -2.1838]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.9826, -3.1315], [-2.8272, -3.3511], [-3.1862, -3.6225], [-3.358, -3.3796]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.1484, -2.58], [-2.0294, -2.7481], [-1.6705, -2.4768], [-1.773, -2.3319]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.8272, -3.3511], [-2.6562, -3.5632], [-2.9973, -3.8566], [-3.1862, -3.6225]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.0294, -2.7481], [-1.898, -2.9111], [-1.5568, -2.6177], [-1.6705, -2.4768]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.6562, -3.5632], [-2.4698, -3.7665], [-2.7918, -4.0808], [-2.9973, -3.8566]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-1.898, -2.9111], [-1.7542, -3.068], [-1.4321, -2.7537], [-1.5568, -2.6177]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.4698, -3.7665], [-2.2686, -3.96], [-2.5703, -4.294], [-2.7918, -4.0808]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-1.7542, -3.068], [-1.5982, -3.218], [-1.2966, -2.8841], [-1.4321, -2.7537]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.2686, -3.96], [-2.0531, -4.1428], [-2.3332, -4.495], [-2.5703, -4.294]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-1.5982, -3.218], [-1.4306, -3.3601], [-1.1505, -3.008], [-1.2966, -2.8841]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-2.0531, -4.1428], [-1.8238, -4.3137], [-2.0813, -4.6827], [-2.3332, -4.495]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-1.4306, -3.3601], [-1.2515, -3.4936], [-0.994, -3.1245], [-1.1505, -3.008]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-1.8238, -4.3137], [-1.5814, -4.4717], [-1.8153, -4.8562], [-2.0813, -4.6827]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-1.2515, -3.4936], [-1.0616, -3.6174], [-0.8277, -3.233], [-0.994, -3.1245]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-1.5814, -4.4717], [-1.3267, -4.616], [-1.5361, -5.0143], [-1.8153, -4.8562]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-1.0616, -3.6174], [-0.8612, -3.7309], [-0.6518, -3.3326], [-0.8277, -3.233]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-1.3267, -4.616], [-1.0603, -4.7456], [-1.2445, -5.1562], [-1.5361, -5.0143]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-0.8612, -3.7309], [-0.6511, -3.8332], [-0.4669, -3.4226], [-0.6518, -3.3326]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-1.0603, -4.7456], [-0.7833, -4.8596], [-0.9416, -5.2808], [-1.2445, -5.1562]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-0.6511, -3.8332], [-0.4317, -3.9234], [-0.2735, -3.5022], [-0.4669, -3.4226]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-0.7833, -4.8596], [-0.4965, -4.9572], [-0.6282, -5.3875], [-0.9416, -5.2808]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-0.4317, -3.9234], [-0.2038, -4.001], [-0.0721, -3.5707], [-0.2735, -3.5022]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-0.4965, -4.9572], [-0.2009, -5.0377], [-0.3056, -5.4754], [-0.6282, -5.3875]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-0.2038, -4.001], [0.0318, -4.0652], [0.1365, -3.6275], [-0.0721, -3.5707]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-0.2009, -5.0377], [0.1025, -5.1004], [0.0252, -5.5437], [-0.3056, -5.4754]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[0.0318, -4.0652], [0.2743, -4.1153], [0.3516, -3.6719], [0.1365, -3.6275]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[0.1025, -5.1004], [0.4126, -5.1446], [0.363, -5.5918], [0.0252, -5.5437]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[0.2743, -4.1153], [0.523, -4.1507], [0.5726, -3.7034], [0.3516, -3.6719]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[0.4126, -5.1446], [0.7283, -5.1697], [0.7064, -5.6192], [0.363, -5.5918]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[0.523, -4.1507], [0.7768, -4.1709], [0.7987, -3.7214], [0.5726, -3.7034]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[0.7283, -5.1697], [1.0483, -5.1753], [1.0543, -5.6253], [0.7064, -5.6192]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[0.7768, -4.1709], [1.0349, -4.1754], [1.0289, -3.7255], [0.7987, -3.7214]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[1.0483, -5.1753], [1.3715, -5.161], [1.4053, -5.6097], [1.0543, -5.6253]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[1.0349, -4.1754], [1.2963, -4.1638], [1.2624, -3.7151], [1.0289, -3.7255]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[1.3715, -5.161], [1.6966, -5.1263], [1.7581, -5.5721], [1.4053, -5.6097]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[1.2963, -4.1638], [1.5599, -4.1357], [1.4984, -3.6899], [1.2624, -3.7151]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[1.6966, -5.1263], [2.0223, -5.071], [2.1112, -5.5122], [1.7581, -5.5721]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[1.5599, -4.1357], [1.8247, -4.0907], [1.7358, -3.6496], [1.4984, -3.6899]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[2.0223, -5.071], [2.3473, -4.995], [2.4633, -5.4298], [2.1112, -5.5122]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[1.8247, -4.0907], [2.0896, -4.0288], [1.9736, -3.594], [1.7358, -3.6496]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[2.3473, -4.995], [2.6703, -4.898], [2.8129, -5.3249], [2.4633, -5.4298]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[2.0896, -4.0288], [2.3536, -3.9495], [2.211, -3.5227], [1.9736, -3.594]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[2.6703, -4.898], [2.99, -4.7802], [3.1586, -5.1974], [2.8129, -5.3249]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[2.3536, -3.9495], [2.6154, -3.853], [2.4468, -3.4358], [2.211, -3.5227]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[2.99, -4.7802], [3.3049, -4.6415], [3.4989, -5.0476], [3.1586, -5.1974]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[2.6154, -3.853], [2.874, -3.7391], [2.6801, -3.3331], [2.4468, -3.4358]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[3.3049, -4.6415], [3.6138, -4.4821], [3.8324, -4.8755], [3.4989, -5.0476]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[2.874, -3.7391], [3.1282, -3.608], [2.9097, -3.2146], [2.6801, -3.3331]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[3.6138, -4.4821], [3.9153, -4.3023], [4.1576, -4.6815], [3.8324, -4.8755]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[3.1282, -3.608], [3.3769, -3.4596], [3.1346, -3.0804], [2.9097, -3.2146]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[3.9153, -4.3023], [4.208, -4.1023], [4.4731, -4.4659], [4.1576, -4.6815]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[3.3769, -3.4596], [3.6188, -3.2943], [3.3537, -2.9307], [3.1346, -3.0804]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[4.208, -4.1023], [4.4906, -3.8826], [4.7775, -4.2293], [4.4731, -4.4659]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[3.6188, -3.2943], [3.8529, -3.1123], [3.566, -2.7657], [3.3537, -2.9307]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[4.4906, -3.8826], [4.7618, -3.6438], [5.0694, -3.9722], [4.7775, -4.2293]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[3.8529, -3.1123], [4.0781, -2.914], [3.7704, -2.5856], [3.566, -2.7657]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[4.7618, -3.6438], [5.0202, -3.3863], [5.3474, -3.6952], [5.0694, -3.9722]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[4.0781, -2.914], [4.2931, -2.6998], [3.9659, -2.3908], [3.7704, -2.5856]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.0202, -3.3863], [5.2647, -3.1108], [5.6102, -3.3992], [5.3474, -3.6952]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[4.2931, -2.6998], [4.4969, -2.4702], [4.1514, -2.1818], [3.9659, -2.3908]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.2647, -3.1108], [5.494, -2.8182], [5.8566, -3.0849], [5.6102, -3.3992]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[4.4969, -2.4702], [4.6885, -2.2257], [4.326, -1.9591], [4.1514, -2.1818]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.494, -2.8182], [5.707, -2.5093], [6.0851, -2.7532], [5.8566, -3.0849]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[4.6885, -2.2257], [4.8667, -1.9672], [4.4885, -1.7232], [4.326, -1.9591]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.707, -2.5093], [5.9024, -2.1849], [6.2948, -2.4053], [6.0851, -2.7532]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[4.8667, -1.9672], [5.0305, -1.6952], [4.6382, -1.4749], [4.4885, -1.7232]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.9024, -2.1849], [6.0793, -1.8462], [6.4844, -2.0422], [6.2948, -2.4053]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.0305, -1.6952], [5.1791, -1.4107], [4.774, -1.2147], [4.6382, -1.4749]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[6.0793, -1.8462], [6.2365, -1.4941], [6.6528, -1.6649], [6.4844, -2.0422]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.1791, -1.4107], [5.3114, -1.1143], [4.8951, -0.9435], [4.774, -1.2147]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[6.2365, -1.4941], [6.3732, -1.1298], [6.7991, -1.2749], [6.6528, -1.6649]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.3114, -1.1143], [5.4266, -0.8072], [5.0007, -0.6621], [4.8951, -0.9435]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[6.3732, -1.1298], [6.4884, -0.7545], [6.9224, -0.8734], [6.7991, -1.2749]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.4266, -0.8072], [5.5239, -0.4903], [5.0899, -0.3714], [5.0007, -0.6621]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[6.4884, -0.7545], [6.5813, -0.3695], [7.0218, -0.4617], [6.9224, -0.8734]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.5239, -0.4903], [5.6025, -0.1646], [5.1621, -0.0724], [5.0899, -0.3714]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[6.5813, -0.3695], [6.6512, 0.0238], [7.0964, -0.0414], [7.0218, -0.4617]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.6025, -0.1646], [5.6617, 0.1687], [5.2165, 0.2339], [5.1621, -0.0724]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[6.6512, 0.0238], [6.6974, 0.4241], [7.1458, 0.3862], [7.0964, -0.0414]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.6617, 0.1687], [5.7009, 0.5084], [5.2525, 0.5464], [5.2165, 0.2339]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[6.6974, 0.4241], [6.7193, 0.83], [7.1692, 0.8194], [7.1458, 0.3862]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.7009, 0.5084], [5.7196, 0.8535], [5.2697, 0.864], [5.2525, 0.5464]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[6.7193, 0.83], [6.7164, 1.2399], [7.1661, 1.2567], [7.1692, 0.8194]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.7196, 0.8535], [5.7171, 1.2025], [5.2674, 1.1856], [5.2697, 0.864]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[6.7164, 1.2399], [6.6884, 1.6523], [7.1362, 1.6965], [7.1661, 1.2567]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.7171, 1.2025], [5.6932, 1.5542], [5.2454, 1.51], [5.2674, 1.1856]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[6.6884, 1.6523], [6.6348, 2.0657], [7.0791, 2.1371], [7.1362, 1.6965]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.6932, 1.5542], [5.6475, 1.9073], [5.2031, 1.836], [5.2454, 1.51]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[6.6348, 2.0657], [6.5556, 2.4786], [6.9948, 2.5767], [7.0791, 2.1371]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.6475, 1.9073], [5.5797, 2.2604], [5.1405, 2.1622], [5.2031, 1.836]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[6.5556, 2.4786], [6.4506, 2.8892], [6.883, 3.0139], [6.9948, 2.5767]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.5797, 2.2604], [5.4897, 2.6121], [5.0574, 2.4874], [5.1405, 2.1622]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[6.4506, 2.8892], [6.3197, 3.296], [6.7437, 3.4467], [6.883, 3.0139]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.4897, 2.6121], [5.3775, 2.961], [4.9535, 2.8103], [5.0574, 2.4874]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[6.3197, 3.296], [6.1632, 3.6973], [6.5772, 3.8735], [6.7437, 3.4467]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.3775, 2.961], [5.243, 3.3058], [4.8289, 3.1296], [4.9535, 2.8103]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[6.1632, 3.6973], [5.9811, 4.0916], [6.3837, 4.2925], [6.5772, 3.8735]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.243, 3.3058], [5.0864, 3.6449], [4.6837, 3.4439], [4.8289, 3.1296]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.9811, 4.0916], [5.7737, 4.4771], [6.1634, 4.7022], [6.3837, 4.2925]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.0864, 3.6449], [4.9078, 3.977], [4.5181, 3.7519], [4.6837, 3.4439]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.7737, 4.4771], [5.5415, 4.8523], [5.9168, 5.1006], [6.1634, 4.7022]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[4.9078, 3.977], [4.7075, 4.3006], [4.3322, 4.0523], [4.5181, 3.7519]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.5415, 4.8523], [5.285, 5.2156], [5.6446, 5.4862], [5.9168, 5.1006]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[4.7075, 4.3006], [4.486, 4.6143], [4.1264, 4.3438], [4.3322, 4.0523]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.285, 5.2156], [5.0048, 5.5654], [5.3473, 5.8573], [5.6446, 5.4862]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[4.486, 4.6143], [4.2436, 4.9168], [3.9011, 4.6249], [4.1264, 4.3438]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[5.0048, 5.5654], [4.7015, 5.9002], [5.0257, 6.2123], [5.3473, 5.8573]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[4.2436, 4.9168], [3.981, 5.2066], [3.6568, 4.8946], [3.9011, 4.6249]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[4.7015, 5.9002], [4.376, 6.2184], [4.6807, 6.5495], [5.0257, 6.2123]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[3.981, 5.2066], [3.6989, 5.4825], [3.3942, 5.1513], [3.6568, 4.8946]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[4.376, 6.2184], [4.0292, 6.5186], [4.3133, 6.8676], [4.6807, 6.5495]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[3.6989, 5.4825], [3.3979, 5.743], [3.1138, 5.394], [3.3942, 5.1513]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[4.0292, 6.5186], [3.6621, 6.7993], [3.9245, 7.1649], [4.3133, 6.8676]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[3.3979, 5.743], [3.0789, 5.987], [2.8164, 5.6215], [3.1138, 5.394]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[3.6621, 6.7993], [3.2757, 7.0593], [3.5156, 7.4401], [3.9245, 7.1649]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[3.0789, 5.987], [2.7428, 6.2132], [2.5029, 5.8324], [2.8164, 5.6215]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[3.2757, 7.0593], [2.8714, 7.2972], [3.0877, 7.6918], [3.5156, 7.4401]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[2.7428, 6.2132], [2.3906, 6.4204], [2.1742, 6.0258], [2.5029, 5.8324]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[2.8714, 7.2972], [2.4502, 7.5118], [2.6423, 7.9188], [3.0877, 7.6918]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[2.3906, 6.4204], [2.0233, 6.6075], [1.8312, 6.2006], [2.1742, 6.0258]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[2.4502, 7.5118], [2.0137, 7.702], [2.1808, 8.1198], [2.6423, 7.9188]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[2.0233, 6.6075], [1.6423, 6.7735], [1.4751, 6.3557], [1.8312, 6.2006]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[2.0137, 7.702], [1.5632, 7.8665], [1.7048, 8.2937], [2.1808, 8.1198]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[1.6423, 6.7735], [1.2486, 6.9173], [1.107, 6.4902], [1.4751, 6.3557]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[1.5632, 7.8665], [1.1002, 8.0046], [1.2157, 8.4395], [1.7048, 8.2937]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[1.2486, 6.9173], [0.8435, 7.0381], [0.728, 6.6032], [1.107, 6.4902]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[1.1002, 8.0046], [0.6263, 8.1152], [0.7153, 8.5563], [1.2157, 8.4395]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[0.8435, 7.0381], [0.4285, 7.135], [0.3395, 6.6939], [0.728, 6.6032]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[0.6263, 8.1152], [0.1432, 8.1976], [0.2054, 8.6433], [0.7153, 8.5563]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[0.4285, 7.135], [0.0049, 7.2072], [-0.0573, 6.7615], [0.3395, 6.6939]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[0.1432, 8.1976], [-0.3476, 8.2511], [-0.3124, 8.6997], [0.2054, 8.6433]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[0.0049, 7.2072], [-0.4258, 7.2541], [-0.461, 6.8055], [-0.0573, 6.7615]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-0.3476, 8.2511], [-0.8441, 8.2749], [-0.836, 8.7249], [-0.3124, 8.6997]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-0.4258, 7.2541], [-0.862, 7.2751], [-0.87, 6.8252], [-0.461, 6.8055]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-0.8441, 8.2749], [-1.3447, 8.2687], [-1.3638, 8.7183], [-0.836, 8.7249]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-0.862, 7.2751], [-1.3022, 7.2697], [-1.283, 6.8201], [-0.87, 6.8252]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-1.3447, 8.2687], [-1.8474, 8.2321], [-1.8937, 8.6797], [-1.3638, 8.7183]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-1.3022, 7.2697], [-1.7447, 7.2374], [-1.6985, 6.7898], [-1.283, 6.8201]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-1.8474, 8.2321], [-2.3506, 8.1647], [-2.4237, 8.6088], [-1.8937, 8.6797]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
      - {kind: poly, points: [[-1.7447, 7.2374], [-2.188, 7.178], [-2.1149, 6.734], [-1.6985, 6.7898]], y: [-0.5, 0.0], collide: 1, color: "#b8ad97"}
  - id: bolt
    shape: part
    pos: [-3.0, 0, 0.0]
    mass: 0.2
    friction: 0.05
    color: "#8f8a80"
    pieces:
      - {kind: rod, from: [-3.0, -2.3, 0.0], to: [-3.0, 0.3, 0.0], radius: 0.45, collide: 2, capsule: true}   # the bolt
      - {kind: disc, center: [-3.0, 0.0], radius: 0.9, y: [-2.9, -2.3]}   # its head
  - id: frame
    shape: part
    pos: [0, 0, 0]
    fixed: true
    color: "#cfc6b4"
    pieces:
      - {kind: disc, center: [0, 0], radius: 2.4, y: [-1.9, -1.3]}   # the slotted plate's hub
      - {kind: poly, points: [[2.4, 0.55], [9.5, 0.55], [9.2851, 2.009], [8.8628, 3.4207], [8.2272, 4.75], [7.3938, 5.9651], [6.3824, 7.0366], [5.2263, 7.9522], [1.6763, 1.8035]], y: [-1.9, -1.3]}   # between the slots
      - {kind: poly, points: [[0.7237, 2.3535], [4.2737, 8.5022], [2.9027, 9.0457], [1.469, 9.3857], [0.0, 9.5], [-1.469, 9.3857], [-2.9027, 9.0457], [-4.2737, 8.5022], [-0.7237, 2.3535]], y: [-1.9, -1.3]}   # between the slots
      - {kind: poly, points: [[-1.6763, 1.8035], [-5.2263, 7.9522], [-6.3824, 7.0366], [-7.3938, 5.9651], [-8.2272, 4.75], [-8.8628, 3.4207], [-9.2851, 2.009], [-9.5, 0.55], [-2.4, 0.55]], y: [-1.9, -1.3]}   # between the slots
      - {kind: poly, points: [[-2.4, -0.55], [-9.5, -0.55], [-9.2851, -2.009], [-8.8628, -3.4207], [-8.2272, -4.75], [-7.3938, -5.9651], [-6.3824, -7.0366], [-5.2263, -7.9522], [-1.6763, -1.8035]], y: [-1.9, -1.3]}   # between the slots
      - {kind: poly, points: [[-0.7237, -2.3535], [-4.2737, -8.5022], [-2.9027, -9.0457], [-1.469, -9.3857], [-0.0, -9.5], [1.469, -9.3857], [2.9027, -9.0457], [4.2737, -8.5022], [0.7237, -2.3535]], y: [-1.9, -1.3]}   # between the slots
      - {kind: poly, points: [[1.6763, -1.8035], [5.2263, -7.9522], [6.3824, -7.0366], [7.3938, -5.9651], [8.2272, -4.75], [8.8628, -3.4207], [9.2851, -2.009], [9.5, -0.55], [2.4, -0.55]], y: [-1.9, -1.3]}   # between the slots
      - {kind: poly, points: [[-1.6, -14], [1.6, -14], [1.1, 0], [-1.1, 0]], y: [1.0, 2.0]}   # the standard, behind
      - {kind: poly, points: [[-7, -15], [7, -15], [7, -14], [-7, -14]], y: [-3, 3], color: "#b9b09c"}
joints:
  - {id: j_p, type: hinge, body: plate, axis: [0, 1, 0], damping: 0.002}   # the one driven joint; + : clockwise
  - {id: j_b, type: slide, body: bolt, axis: [-1.0, 0, 0.0], damping: 1.0}   # the bolt in the radial slot; + : outward
contact: {solref: [0.002, 1.0], solimp: [0.95, 0.99, 0.0005], margin: 0}
driver: {joint: j_p, kind: velocity, rpm: 4.0, kv: 20.0, max_torque: 20}
checks:
  - {type: follow, out: j_b, in: j_p, expect: 0.01, tol: 0.0002, min_r2: 0.995, settle_s: 1.0, window_s: 3.0}   # the bolt moves out C a radian
  - {type: follow, out: j_b, in: j_p, expect: 0.01, tol: 0.0002, min_r2: 0.995, settle_s: 4.5, window_s: 4.0}   # ... all the way
  - {type: position, joint: j_b, min: -0.2, max: 4.7, settle_s: 0.5, window_s: 9}
  - {type: penetration, max: 0.001, settle_s: 0.5}
camera: {target: [0, 0, -3], position: [0, -90, -2], fov: 34}
display:
  output: j_b
  labels: {j_p: "Spiral plate (driver)", j_b: "Bolt"}
  proof: {label: "Groove walls out of contact", sub: "the plate turns but the bolt stands in its slot"}

