# No. 97 (Brown 1868): "This is a heart-cam, similar to 96, except that it is grooved."
#
# Model (cm): as No. 96, but the heart is a groove: two walls (1.06 cm apart, the pin 1.0 cm) are struck out about the same
# curve (its centre line: radius 4 cm growing 1.273 cm to the radian to 8 cm, and falling as fast; the cusps rounded over
# 0.06 rad). The bar's pin is held in the groove by real contact, so the groove drives it both ways and no spring is wanted.
# Generator: opencode-runs/batch9/gen097.py.
number: 97
slug: grooved-heart-cam
name: A grooved heart-cam driving the bar both ways
brown: "This is a heart-cam, similar to 96, except that it is grooved."
units: cm
sim:
  timestep: 0.0005
  integrator: implicitfast
  iterations: 50
  solver: PGS
  duration_s: 12
  floor: false
bodies:
  - id: cam
    shape: part
    pos: [0, 0, 0]
    mass: 1.0
    friction: 0.05
    color: "#d9cfb6"
    pieces:
      - {kind: rod, from: [0, 0.8, 0], to: [0, 3.0, 0], radius: 0.7, color: "#8f8a80"}   # the cam's shaft
      - {kind: disc, center: [0, 0], radius: 9.63, y: [0.4, 0.8]}   # the plate the groove is cut in
      - {kind: poly, points: [[4.5724, 0.0], [4.6135, 0.2462], [5.1022, 0.1405], [5.0724, 0.0]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[4.6135, 0.2462], [4.6844, 0.6706], [5.1809, 0.6116], [5.1022, 0.1405]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[4.6844, 0.6706], [4.7155, 1.1088], [5.2154, 1.0968], [5.1809, 0.6116]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[4.7155, 1.1088], [4.7051, 1.5572], [5.2039, 1.5922], [5.2154, 1.0968]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[4.7051, 1.5572], [4.6516, 2.0117], [5.1449, 2.0932], [5.2039, 1.5922]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[4.6516, 2.0117], [4.554, 2.4682], [5.0376, 2.5954], [5.1449, 2.0932]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[4.554, 2.4682], [4.4115, 2.9224], [4.8811, 3.094], [5.0376, 2.5954]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[4.4115, 2.9224], [4.2239, 3.3699], [4.6755, 3.5844], [4.8811, 3.094]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[4.2239, 3.3699], [3.9912, 3.8062], [4.4211, 4.0616], [4.6755, 3.5844]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.9912, 3.8062], [3.7141, 4.227], [4.1185, 4.5209], [4.4211, 4.0616]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.7141, 4.227], [3.3935, 4.6276], [3.7692, 4.9576], [4.1185, 4.5209]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.3935, 4.6276], [3.031, 5.0037], [3.3747, 5.3668], [3.7692, 4.9576]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.031, 5.0037], [2.6284, 5.3511], [2.9374, 5.7442], [3.3747, 5.3668]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[2.6284, 5.3511], [2.1881, 5.6655], [2.4597, 6.0852], [2.9374, 5.7442]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[2.1881, 5.6655], [1.7127, 5.943], [1.9448, 6.3858], [2.4597, 6.0852]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[1.7127, 5.943], [1.2055, 6.1799], [1.3963, 6.6421], [1.9448, 6.3858]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[1.2055, 6.1799], [0.67, 6.3728], [0.8178, 6.8504], [1.3963, 6.6421]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[0.67, 6.3728], [0.11, 6.5185], [0.2138, 7.0076], [0.8178, 6.8504]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[0.11, 6.5185], [-0.4701, 6.6142], [-0.4112, 7.1107], [0.2138, 7.0076]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-0.4701, 6.6142], [-1.066, 6.6575], [-1.0524, 7.1573], [-0.4112, 7.1107]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-1.066, 6.6575], [-1.6728, 6.6465], [-1.7045, 7.1455], [-1.0524, 7.1573]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-1.6728, 6.6465], [-2.2854, 6.5795], [-2.3621, 7.0736], [-1.7045, 7.1455]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-2.2854, 6.5795], [-2.8988, 6.4556], [-3.0198, 6.9407], [-2.3621, 7.0736]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-2.8988, 6.4556], [-3.5075, 6.2741], [-3.6719, 6.7463], [-3.0198, 6.9407]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-3.5075, 6.2741], [-4.1062, 6.0348], [-4.3124, 6.4903], [-3.6719, 6.7463]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-4.1062, 6.0348], [-4.6893, 5.7384], [-4.9357, 6.1734], [-4.3124, 6.4903]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-4.6893, 5.7384], [-5.2514, 5.3855], [-5.536, 5.7966], [-4.9357, 6.1734]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-5.2514, 5.3855], [-5.787, 4.9778], [-6.1074, 5.3617], [-5.536, 5.7966]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-5.787, 4.9778], [-6.2909, 4.5173], [-6.6444, 4.8708], [-6.1074, 5.3617]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-6.2909, 4.5173], [-6.7577, 4.0063], [-7.1416, 4.3267], [-6.6444, 4.8708]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-6.7577, 4.0063], [-7.1827, 3.4479], [-7.5937, 3.7326], [-7.1416, 4.3267]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-7.1827, 3.4479], [-7.5609, 2.8457], [-7.9958, 3.0924], [-7.5937, 3.7326]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-7.5609, 2.8457], [-7.888, 2.2035], [-8.3432, 2.4103], [-7.9958, 3.0924]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-7.888, 2.2035], [-8.1598, 1.5257], [-8.6317, 1.691], [-8.3432, 2.4103]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-8.1598, 1.5257], [-8.3727, 0.8173], [-8.8575, 0.9397], [-8.6317, 1.691]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-8.3727, 0.8173], [-8.4876, 0.0], [-8.9876, 0.0], [-8.8575, 0.9397]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-8.4876, 0.0], [-8.3727, -0.8173], [-8.8575, -0.9397], [-8.9876, 0.0]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-8.3727, -0.8173], [-8.1598, -1.5257], [-8.6317, -1.691], [-8.8575, -0.9397]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-8.1598, -1.5257], [-7.888, -2.2035], [-8.3432, -2.4103], [-8.6317, -1.691]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-7.888, -2.2035], [-7.5609, -2.8457], [-7.9958, -3.0924], [-8.3432, -2.4103]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-7.5609, -2.8457], [-7.1827, -3.4479], [-7.5937, -3.7326], [-7.9958, -3.0924]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-7.1827, -3.4479], [-6.7577, -4.0063], [-7.1416, -4.3267], [-7.5937, -3.7326]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-6.7577, -4.0063], [-6.2909, -4.5173], [-6.6444, -4.8708], [-7.1416, -4.3267]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-6.2909, -4.5173], [-5.787, -4.9778], [-6.1074, -5.3617], [-6.6444, -4.8708]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-5.787, -4.9778], [-5.2514, -5.3855], [-5.536, -5.7966], [-6.1074, -5.3617]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-5.2514, -5.3855], [-4.6893, -5.7384], [-4.9357, -6.1734], [-5.536, -5.7966]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-4.6893, -5.7384], [-4.1062, -6.0348], [-4.3124, -6.4903], [-4.9357, -6.1734]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-4.1062, -6.0348], [-3.5075, -6.2741], [-3.6719, -6.7463], [-4.3124, -6.4903]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-3.5075, -6.2741], [-2.8988, -6.4556], [-3.0198, -6.9407], [-3.6719, -6.7463]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-2.8988, -6.4556], [-2.2854, -6.5795], [-2.3621, -7.0736], [-3.0198, -6.9407]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-2.2854, -6.5795], [-1.6728, -6.6465], [-1.7045, -7.1455], [-2.3621, -7.0736]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-1.6728, -6.6465], [-1.066, -6.6575], [-1.0524, -7.1573], [-1.7045, -7.1455]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-1.066, -6.6575], [-0.4701, -6.6142], [-0.4112, -7.1107], [-1.0524, -7.1573]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-0.4701, -6.6142], [0.11, -6.5185], [0.2138, -7.0076], [-0.4112, -7.1107]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[0.11, -6.5185], [0.67, -6.3728], [0.8178, -6.8504], [0.2138, -7.0076]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[0.67, -6.3728], [1.2055, -6.1799], [1.3963, -6.6421], [0.8178, -6.8504]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[1.2055, -6.1799], [1.7127, -5.943], [1.9448, -6.3858], [1.3963, -6.6421]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[1.7127, -5.943], [2.1881, -5.6655], [2.4597, -6.0852], [1.9448, -6.3858]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[2.1881, -5.6655], [2.6284, -5.3511], [2.9374, -5.7442], [2.4597, -6.0852]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[2.6284, -5.3511], [3.031, -5.0037], [3.3747, -5.3668], [2.9374, -5.7442]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.031, -5.0037], [3.3935, -4.6276], [3.7692, -4.9576], [3.3747, -5.3668]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.3935, -4.6276], [3.7141, -4.227], [4.1185, -4.5209], [3.7692, -4.9576]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.7141, -4.227], [3.9912, -3.8062], [4.4211, -4.0616], [4.1185, -4.5209]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.9912, -3.8062], [4.2239, -3.3699], [4.6755, -3.5844], [4.4211, -4.0616]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[4.2239, -3.3699], [4.4115, -2.9224], [4.8811, -3.094], [4.6755, -3.5844]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[4.4115, -2.9224], [4.554, -2.4682], [5.0376, -2.5954], [4.8811, -3.094]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[4.554, -2.4682], [4.6516, -2.0117], [5.1449, -2.0932], [5.0376, -2.5954]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[4.6516, -2.0117], [4.7051, -1.5572], [5.2039, -1.5922], [5.1449, -2.0932]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[4.7051, -1.5572], [4.7155, -1.1088], [5.2154, -1.0968], [5.2039, -1.5922]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[4.7155, -1.1088], [4.6844, -0.6706], [5.1809, -0.6116], [5.2154, -1.0968]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[4.6844, -0.6706], [4.6135, -0.2462], [5.1022, -0.1405], [5.1809, -0.6116]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[4.6135, -0.2462], [4.5724, -0.0], [5.0724, -0.0], [5.1022, -0.1405]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.5124, 0.0], [3.5775, 0.4704], [3.0888, 0.5761], [3.0124, 0.0]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.5775, 0.4704], [3.6318, 0.7958], [3.1353, 0.8548], [3.0888, 0.5761]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.6318, 0.7958], [3.6558, 1.1343], [3.156, 1.1462], [3.1353, 0.8548]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.6558, 1.1343], [3.6477, 1.483], [3.1489, 1.448], [3.156, 1.1462]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.6477, 1.483], [3.6058, 1.8388], [3.1125, 1.7573], [3.1489, 1.448]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.6058, 1.8388], [3.5289, 2.1985], [3.0453, 2.0713], [3.1125, 1.7573]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.5289, 2.1985], [3.4159, 2.5585], [2.9463, 2.3868], [3.0453, 2.0713]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.4159, 2.5585], [3.2663, 2.9152], [2.8147, 2.7007], [2.9463, 2.3868]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.2663, 2.9152], [3.0799, 3.2648], [2.65, 3.0095], [2.8147, 2.7007]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.0799, 3.2648], [2.8566, 3.6037], [2.4522, 3.3098], [2.65, 3.0095]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[2.8566, 3.6037], [2.5972, 3.928], [2.2215, 3.598], [2.4522, 3.3098]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[2.5972, 3.928], [2.3023, 4.2339], [1.9586, 3.8708], [2.2215, 3.598]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[2.3023, 4.2339], [1.9734, 4.5176], [1.6645, 4.1245], [1.9586, 3.8708]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[1.9734, 4.5176], [1.6122, 4.7756], [1.3405, 4.3558], [1.6645, 4.1245]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[1.6122, 4.7756], [1.2206, 5.0042], [0.9884, 4.5613], [1.3405, 4.3558]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[1.2206, 5.0042], [0.8011, 5.2001], [0.6103, 4.7379], [0.9884, 4.5613]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[0.8011, 5.2001], [0.3565, 5.3602], [0.2087, 4.8825], [0.6103, 4.7379]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[0.3565, 5.3602], [-0.11, 5.4815], [-0.2138, 4.9924], [0.2087, 4.8825]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-0.11, 5.4815], [-0.5951, 5.5616], [-0.654, 5.065], [-0.2138, 4.9924]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-0.5951, 5.5616], [-1.0949, 5.5979], [-1.1086, 5.0981], [-0.654, 5.065]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-1.0949, 5.5979], [-1.6056, 5.5886], [-1.5739, 5.0896], [-1.1086, 5.0981]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-1.6056, 5.5886], [-2.1228, 5.5321], [-2.0461, 5.038], [-1.5739, 5.0896]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-2.1228, 5.5321], [-2.6422, 5.4271], [-2.5212, 4.942], [-2.0461, 5.038]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-2.6422, 5.4271], [-3.1591, 5.2729], [-2.9948, 4.8007], [-2.5212, 4.942]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-3.1591, 5.2729], [-3.669, 5.0692], [-3.4627, 4.6137], [-2.9948, 4.8007]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-3.669, 5.0692], [-4.1669, 4.816], [-3.9205, 4.381], [-3.4627, 4.6137]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-4.1669, 4.816], [-4.6481, 4.514], [-4.3635, 4.1028], [-3.9205, 4.381]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-4.6481, 4.514], [-5.1078, 4.164], [-4.7874, 3.7802], [-4.3635, 4.1028]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-5.1078, 4.164], [-5.5413, 3.7677], [-5.1878, 3.4142], [-4.7874, 3.7802]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-5.5413, 3.7677], [-5.944, 3.3271], [-5.5601, 3.0067], [-5.1878, 3.4142]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-5.944, 3.3271], [-6.3113, 2.8444], [-5.9002, 2.5597], [-5.5601, 3.0067]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-6.3113, 2.8444], [-6.6389, 2.3226], [-6.204, 2.0759], [-5.9002, 2.5597]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-6.6389, 2.3226], [-6.9229, 1.7651], [-6.4676, 1.5583], [-6.204, 2.0759]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-6.9229, 1.7651], [-7.1594, 1.1755], [-6.6875, 1.0102], [-6.4676, 1.5583]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-7.1594, 1.1755], [-7.345, 0.5578], [-6.8602, 0.4354], [-6.6875, 1.0102]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-7.345, 0.5578], [-7.4276, 0.0], [-6.9276, 0.0], [-6.8602, 0.4354]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-7.4276, 0.0], [-7.345, -0.5578], [-6.8602, -0.4354], [-6.9276, 0.0]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-7.345, -0.5578], [-7.1594, -1.1755], [-6.6875, -1.0102], [-6.8602, -0.4354]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-7.1594, -1.1755], [-6.9229, -1.7651], [-6.4676, -1.5583], [-6.6875, -1.0102]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-6.9229, -1.7651], [-6.6389, -2.3226], [-6.204, -2.0759], [-6.4676, -1.5583]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-6.6389, -2.3226], [-6.3113, -2.8444], [-5.9002, -2.5597], [-6.204, -2.0759]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-6.3113, -2.8444], [-5.944, -3.3271], [-5.5601, -3.0067], [-5.9002, -2.5597]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-5.944, -3.3271], [-5.5413, -3.7677], [-5.1878, -3.4142], [-5.5601, -3.0067]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-5.5413, -3.7677], [-5.1078, -4.164], [-4.7874, -3.7802], [-5.1878, -3.4142]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-5.1078, -4.164], [-4.6481, -4.514], [-4.3635, -4.1028], [-4.7874, -3.7802]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-4.6481, -4.514], [-4.1669, -4.816], [-3.9205, -4.381], [-4.3635, -4.1028]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-4.1669, -4.816], [-3.669, -5.0692], [-3.4627, -4.6137], [-3.9205, -4.381]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-3.669, -5.0692], [-3.1591, -5.2729], [-2.9948, -4.8007], [-3.4627, -4.6137]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-3.1591, -5.2729], [-2.6422, -5.4271], [-2.5212, -4.942], [-2.9948, -4.8007]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-2.6422, -5.4271], [-2.1228, -5.5321], [-2.0461, -5.038], [-2.5212, -4.942]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-2.1228, -5.5321], [-1.6056, -5.5886], [-1.5739, -5.0896], [-2.0461, -5.038]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-1.6056, -5.5886], [-1.0949, -5.5979], [-1.1086, -5.0981], [-1.5739, -5.0896]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-1.0949, -5.5979], [-0.5951, -5.5616], [-0.654, -5.065], [-1.1086, -5.0981]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-0.5951, -5.5616], [-0.11, -5.4815], [-0.2138, -4.9924], [-0.654, -5.065]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[-0.11, -5.4815], [0.3565, -5.3602], [0.2087, -4.8825], [-0.2138, -4.9924]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[0.3565, -5.3602], [0.8011, -5.2001], [0.6103, -4.7379], [0.2087, -4.8825]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[0.8011, -5.2001], [1.2206, -5.0042], [0.9884, -4.5613], [0.6103, -4.7379]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[1.2206, -5.0042], [1.6122, -4.7756], [1.3405, -4.3558], [0.9884, -4.5613]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[1.6122, -4.7756], [1.9734, -4.5176], [1.6645, -4.1245], [1.3405, -4.3558]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[1.9734, -4.5176], [2.3023, -4.2339], [1.9586, -3.8708], [1.6645, -4.1245]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[2.3023, -4.2339], [2.5972, -3.928], [2.2215, -3.598], [1.9586, -3.8708]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[2.5972, -3.928], [2.8566, -3.6037], [2.4522, -3.3098], [2.2215, -3.598]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[2.8566, -3.6037], [3.0799, -3.2648], [2.65, -3.0095], [2.4522, -3.3098]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.0799, -3.2648], [3.2663, -2.9152], [2.8147, -2.7007], [2.65, -3.0095]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.2663, -2.9152], [3.4159, -2.5585], [2.9463, -2.3868], [2.8147, -2.7007]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.4159, -2.5585], [3.5289, -2.1985], [3.0453, -2.0713], [2.9463, -2.3868]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.5289, -2.1985], [3.6058, -1.8388], [3.1125, -1.7573], [3.0453, -2.0713]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.6058, -1.8388], [3.6477, -1.483], [3.1489, -1.448], [3.1125, -1.7573]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.6477, -1.483], [3.6558, -1.1343], [3.156, -1.1462], [3.1489, -1.448]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.6558, -1.1343], [3.6318, -0.7958], [3.1353, -0.8548], [3.156, -1.1462]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.6318, -0.7958], [3.5775, -0.4704], [3.0888, -0.5761], [3.1353, -0.8548]], y: [-0.4, 0.4], collide: 1}
      - {kind: poly, points: [[3.5775, -0.4704], [3.5124, -0.0], [3.0124, -0.0], [3.0888, -0.5761]], y: [-0.4, 0.4], collide: 1}
  - id: bar
    shape: part
    pos: [4.0, 0, 0]
    mass: 0.2
    friction: 0.05
    color: "#b8ad97"
    pieces:
      - {kind: rod, from: [4.0, -0.3, 0], to: [4.0, 0.3, 0], radius: 0.5, collide: 2, capsule: true, color: "#8f8a80"}   # the pin
      - {kind: poly, points: [[4.5, -0.5], [24.0, -0.5], [24.0, 0.5], [4.5, 0.5]], y: [-0.4, 0.4]}   # the horizontal bar
  - id: frame
    shape: part
    pos: [0, 0, 0]
    fixed: true
    color: "#cfc6b4"
    pieces:
      - {kind: poly, points: [[-1.4, -13], [1.4, -13], [1.0, 0], [-1.0, 0]], y: [1.8, 2.8]}   # the cam's standard, behind
      - {kind: poly, points: [[9.0, -1.6], [26.0, -1.6], [26.0, -0.7], [9.0, -0.7]], y: [-0.8, 1.2]}   # the bar's lower guide
      - {kind: poly, points: [[9.0, 0.7], [26.0, 0.7], [26.0, 1.6], [9.0, 1.6]], y: [-0.8, 1.2]}   # the upper guide
      - {kind: poly, points: [[9.0, -1.6], [26.0, -1.6], [26.0, 1.6], [9.0, 1.6]], y: [1.2, 2.2]}   # their back plate
      - {kind: poly, points: [[21.0, -13], [23.0, -13], [23.0, -1.6], [21.0, -1.6]], y: [1.2, 2.2]}   # their post
      - {kind: poly, points: [[-12, -14], [30.0, -14], [30.0, -13], [-12, -13]], y: [-3, 3], color: "#b9b09c"}
joints:
  - {id: j_c, type: hinge, body: cam, axis: [0, 1, 0], damping: 0.002}   # the one driven joint; + : clockwise
  - {id: j_x, type: slide, body: bar, axis: [1, 0, 0], range: [-1.0, 5.0], damping: 1.0}   # the bar in its guides, held by the groove; + : out
driver: {joint: j_c, kind: velocity, rpm: 10.0, kv: 20.0, max_torque: 20}
checks:
  - {type: follow, out: j_x, in: j_c, expect: 0.01273, tol: 0.00038, min_r2: 0.995, settle_s: 0.8333, window_s: 1.6667}   # out: K a radian
  - {type: follow, out: j_x, in: j_c, expect: -0.01273, tol: 0.00038, min_r2: 0.995, settle_s: 3.8333, window_s: 1.3333}   # and back
  - {type: follow, out: j_x, in: j_c, expect: 0.01273, tol: 0.00038, min_r2: 0.995, settle_s: 6.8333, window_s: 1.6667}   # and again
  - {type: position, joint: j_x, min: -0.05, max: 4.05, settle_s: 0.5, window_s: 11}
camera: {target: [11.0, 0, -2.5], position: [11.0, -85, 0], fov: 34}
display:
  output: j_x
  labels: {j_c: "Grooved heart-cam (driver)", j_x: "Bar"}
  proof: {label: "Groove walls out of contact", sub: "the cam turns but the bar stands"}

