# No. 120 (Brown 1868): "Each jaw is attached to one of the two segments, one of which has teeth outside and the other teeth inside. On turning the shaft carrying the two pinions, one of which gears with one and the other with the other segment, the jaws are brought together with great force."
#
# Model (cm): a pair of tongs, both jaws on the one pivot (0, 24.0). One jaw carries a segment about the pivot with teeth outside (pitch radius 19.2), the other a segment with teeth inside (pitch radius 32.0). The shaft below carries a pinion of
# 12 teeth (pitch radius 4.8) that gears with the first and one of 20 teeth (8.0) that gears with the second, one in front of the other. The pivot is placed at 2 r1 r2/(r2-r1) so that the two jaws
# turn at the same rate, 0.25 of the shaft's angle, in opposite senses: they close and open together. The shaft (the one driven joint) is rocked to and fro by hand. No gravity (a flat plan on the bench). Generator: opencode-runs/batch9/gen120.py.
number: 120
slug: calipers-two-pinions
name: Two toothed segments closing a pair of jaws by two pinions
brown: "Each jaw is attached to one of the two segments, one of which has teeth outside and the other teeth inside. On turning the shaft carrying the two pinions, one of which gears with one and the other with the other segment, the jaws are brought together with great force."
units: cm
sim:
  timestep: 0.0002
  integrator: implicitfast
  iterations: 100
  solver: PGS
  multiccd: true
  duration_s: 10
  gravity: 0
  floor: false
bodies:
  - id: shaft
    shape: part
    pos: [0, 0, 0]
    density: 7800
    friction: 0.1
    color: "#d9cfb6"
    pieces:
      - {kind: rod, from: [0, -1.6, 0], to: [0, 3.4, 0], radius: 0.7, collide: 0, color: "#8f8a80"}
      - {kind: disc, center: [0, 0], radius: 3.95, y: [-0.8, 0.8]}
      - {kind: disc, center: [0, 0], radius: 7.15, y: [1.2, 2.8]}
      - {kind: poly, points: [[0.8441, 4.0], [-0.8441, 4.0], [-0.3491, 5.36], [0.3491, 5.36]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[-1.269, 3.8861], [-2.731, 3.0421], [-2.9823, 4.4673], [-2.3777, 4.8164]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[-3.0421, 2.731], [-3.8861, 1.269], [-4.8164, 2.3777], [-4.4673, 2.9823]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[-4.0, 0.8441], [-4.0, -0.8441], [-5.36, -0.3491], [-5.36, 0.3491]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[-3.8861, -1.269], [-3.0421, -2.731], [-4.4673, -2.9823], [-4.8164, -2.3777]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[-2.731, -3.0421], [-1.269, -3.8861], [-2.3777, -4.8164], [-2.9823, -4.4673]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[-0.8441, -4.0], [0.8441, -4.0], [0.3491, -5.36], [-0.3491, -5.36]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[1.269, -3.8861], [2.731, -3.0421], [2.9823, -4.4673], [2.3777, -4.8164]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[3.0421, -2.731], [3.8861, -1.269], [4.8164, -2.3777], [4.4673, -2.9823]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[4.0, -0.8441], [4.0, 0.8441], [5.36, 0.3491], [5.36, -0.3491]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[3.8861, 1.269], [3.0421, 2.731], [4.4673, 2.9823], [4.8164, 2.3777]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[2.731, 3.0421], [1.269, 3.8861], [2.3777, 4.8164], [2.9823, 4.4673]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0.8441, 7.2], [-0.8441, 7.2], [-0.3491, 8.56], [0.3491, 8.56]], y: [1.2, 2.8], collide: 1}
      - {kind: poly, points: [[-1.4221, 7.1084], [-3.0277, 6.5868], [-2.9772, 8.0332], [-2.3132, 8.2489]], y: [1.2, 2.8], collide: 1}
      - {kind: poly, points: [[-3.5492, 6.3211], [-4.9149, 5.3288], [-5.3139, 6.72], [-4.749, 7.1304]], y: [1.2, 2.8], collide: 1}
      - {kind: poly, points: [[-5.3288, 4.9149], [-6.3211, 3.5492], [-7.1304, 4.749], [-6.72, 5.3139]], y: [1.2, 2.8], collide: 1}
      - {kind: poly, points: [[-6.5868, 3.0277], [-7.1084, 1.4221], [-8.2489, 2.3132], [-8.0332, 2.9772]], y: [1.2, 2.8], collide: 1}
      - {kind: poly, points: [[-7.2, 0.8441], [-7.2, -0.8441], [-8.56, -0.3491], [-8.56, 0.3491]], y: [1.2, 2.8], collide: 1}
      - {kind: poly, points: [[-7.1084, -1.4221], [-6.5868, -3.0277], [-8.0332, -2.9772], [-8.2489, -2.3132]], y: [1.2, 2.8], collide: 1}
      - {kind: poly, points: [[-6.3211, -3.5492], [-5.3288, -4.9149], [-6.72, -5.3139], [-7.1304, -4.749]], y: [1.2, 2.8], collide: 1}
      - {kind: poly, points: [[-4.9149, -5.3288], [-3.5492, -6.3211], [-4.749, -7.1304], [-5.3139, -6.72]], y: [1.2, 2.8], collide: 1}
      - {kind: poly, points: [[-3.0277, -6.5868], [-1.4221, -7.1084], [-2.3132, -8.2489], [-2.9772, -8.0332]], y: [1.2, 2.8], collide: 1}
      - {kind: poly, points: [[-0.8441, -7.2], [0.8441, -7.2], [0.3491, -8.56], [-0.3491, -8.56]], y: [1.2, 2.8], collide: 1}
      - {kind: poly, points: [[1.4221, -7.1084], [3.0277, -6.5868], [2.9772, -8.0332], [2.3132, -8.2489]], y: [1.2, 2.8], collide: 1}
      - {kind: poly, points: [[3.5492, -6.3211], [4.9149, -5.3288], [5.3139, -6.72], [4.749, -7.1304]], y: [1.2, 2.8], collide: 1}
      - {kind: poly, points: [[5.3288, -4.9149], [6.3211, -3.5492], [7.1304, -4.749], [6.72, -5.3139]], y: [1.2, 2.8], collide: 1}
      - {kind: poly, points: [[6.5868, -3.0277], [7.1084, -1.4221], [8.2489, -2.3132], [8.0332, -2.9772]], y: [1.2, 2.8], collide: 1}
      - {kind: poly, points: [[7.2, -0.8441], [7.2, 0.8441], [8.56, 0.3491], [8.56, -0.3491]], y: [1.2, 2.8], collide: 1}
      - {kind: poly, points: [[7.1084, 1.4221], [6.5868, 3.0277], [8.0332, 2.9772], [8.2489, 2.3132]], y: [1.2, 2.8], collide: 1}
      - {kind: poly, points: [[6.3211, 3.5492], [5.3288, 4.9149], [6.72, 5.3139], [7.1304, 4.749]], y: [1.2, 2.8], collide: 1}
      - {kind: poly, points: [[4.9149, 5.3288], [3.5492, 6.3211], [4.749, 7.1304], [5.3139, 6.72]], y: [1.2, 2.8], collide: 1}
      - {kind: poly, points: [[3.0277, 6.5868], [1.4221, 7.1084], [2.3132, 8.2489], [2.9772, 8.0332]], y: [1.2, 2.8], collide: 1}
  - id: jaw_a
    shape: part
    pos: [0, 0, 24.0]
    mass: 0.3
    friction: 0.1
    color: "#b8ad97"
    pieces:
      - {kind: poly, points: [[-8.8726, 7.8598], [-7.4036, 7.1353], [-8.3261, 6.2523], [-9.0116, 6.5903]], y: [-0.8, 0.8], collide: 2}
      - {kind: poly, points: [[-6.69, 6.8397], [-5.139, 6.3132], [-5.9383, 5.3173], [-6.6621, 5.563]], y: [-0.8, 0.8], collide: 2}
      - {kind: poly, points: [[-4.3929, 6.1133], [-2.7864, 5.7938], [-3.4489, 4.702], [-4.1986, 4.8512]], y: [-0.8, 0.8], collide: 2}
      - {kind: poly, points: [[-2.0206, 5.693], [-0.3862, 5.5858], [-0.9005, 4.417], [-1.6633, 4.467]], y: [-0.8, 0.8], collide: 2}
      - {kind: poly, points: [[0.3862, 5.5858], [2.0206, 5.693], [1.6633, 4.467], [0.9005, 4.417]], y: [-0.8, 0.8], collide: 2}
      - {kind: poly, points: [[2.7864, 5.7938], [4.3929, 6.1133], [4.1986, 4.8512], [3.4489, 4.702]], y: [-0.8, 0.8], collide: 2}
      - {kind: poly, points: [[5.139, 6.3132], [6.69, 6.8397], [6.6621, 5.563], [5.9383, 5.3173]], y: [-0.8, 0.8], collide: 2}
      - {kind: poly, points: [[7.4036, 7.1353], [8.8726, 7.8598], [9.0116, 6.5903], [8.3261, 6.2523]], y: [-0.8, 0.8], collide: 2}
      - {kind: poly, points: [[-8.9902, 9.3366], [-9.5129, 8.4841], [-8.0527, 7.6784], [-7.6102, 8.5752]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[-7.6102, 8.5752], [-8.0527, 7.6784], [-6.5248, 7.0098], [-6.1663, 7.9433]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[-6.1663, 7.9433], [-6.5248, 7.0098], [-4.9422, 6.4839], [-4.6706, 7.4463]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[-4.6706, 7.4463], [-4.9422, 6.4839], [-3.318, 6.105], [-3.1357, 7.0882]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[-3.1357, 7.0882], [-3.318, 6.105], [-1.666, 5.8764], [-1.5745, 6.8722]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[-1.5745, 6.8722], [-1.666, 5.8764], [0.0, 5.8], [0.0, 6.8]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[0.0, 6.8], [0.0, 5.8], [1.666, 5.8764], [1.5745, 6.8722]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[1.5745, 6.8722], [1.666, 5.8764], [3.318, 6.105], [3.1357, 7.0882]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[3.1357, 7.0882], [3.318, 6.105], [4.9422, 6.4839], [4.6706, 7.4463]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[4.6706, 7.4463], [4.9422, 6.4839], [6.5248, 7.0098], [6.1663, 7.9433]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[6.1663, 7.9433], [6.5248, 7.0098], [8.0527, 7.6784], [7.6102, 8.5752]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[7.6102, 8.5752], [8.0527, 7.6784], [9.5129, 8.4841], [8.9902, 9.3366]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[-0.8637, 23.3566], [-0.1817, 22.9384], [-9.1719, 8.275], [-9.8539, 8.6931]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[0.1817, 22.9384], [0.8637, 23.3566], [9.8539, 8.6931], [9.1719, 8.275]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[-1.0, 23.3], [-1.0, 24.7], [0.8928, 24.8597], [1.1273, 23.4794]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[1.1273, 23.4794], [0.8928, 24.8597], [2.7322, 25.3341], [3.1945, 24.0127]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[3.1945, 24.0127], [2.7322, 25.3341], [4.466, 26.11], [5.1432, 24.8847]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[5.1432, 24.8847], [4.466, 26.11], [6.0454, 27.1653], [6.9183, 26.0707]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[6.9183, 26.0707], [6.0454, 27.1653], [7.4258, 28.4703], [8.4697, 27.5374]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[8.4697, 27.5374], [7.4258, 28.4703], [8.568, 29.988], [9.7534, 29.2432]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[9.7534, 29.2432], [8.568, 29.988], [9.4398, 31.6757], [10.7333, 31.1399]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[10.7333, 31.1399], [9.4398, 31.6757], [10.0167, 33.4855], [11.3816, 33.174]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[11.3816, 33.174], [10.0167, 33.4855], [10.2822, 35.3664], [11.68, 35.2879]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[11.68, 35.2879], [10.2822, 35.3664], [10.2289, 37.2652], [11.6201, 37.4219]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[11.6201, 37.4219], [10.2289, 37.2652], [9.8584, 39.1282], [11.2036, 39.5158]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[11.2036, 39.5158], [9.8584, 39.1282], [9.1809, 40.9029], [10.4423, 41.5103]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[10.4423, 41.5103], [9.1809, 40.9029], [8.2158, 42.539], [9.3576, 43.3491]], y: [-0.8, 0.8], collide: 0}
      - {kind: poly, points: [[9.3576, 43.3491], [8.2158, 42.539], [6.9903, 43.9903], [7.9803, 44.9803]], y: [-0.8, 0.8], collide: 0}
  - id: jaw_b
    shape: part
    pos: [0, 0, 24.0]
    mass: 0.3
    friction: 0.1
    color: "#a89d89"
    pieces:
      - {kind: poly, points: [[-14.4758, -5.4442], [-12.9883, -6.13], [-12.8826, -4.8573], [-13.5767, -4.5373]], y: [1.2, 2.8], collide: 2}
      - {kind: poly, points: [[-12.121, -6.4892], [-10.5843, -7.0561], [-10.5787, -5.7791], [-11.2959, -5.5146]], y: [1.2, 2.8], collide: 2}
      - {kind: poly, points: [[-9.6915, -7.3462], [-8.115, -7.7908], [-8.2097, -6.5173], [-8.9454, -6.3098]], y: [1.2, 2.8], collide: 2}
      - {kind: poly, points: [[-7.2022, -8.01], [-5.5957, -8.3295], [-5.79, -7.0674], [-6.5397, -6.9183]], y: [1.2, 2.8], collide: 2}
      - {kind: poly, points: [[-4.6685, -8.4764], [-3.0419, -8.6689], [-3.3346, -7.4259], [-4.0937, -7.336]], y: [1.2, 2.8], collide: 2}
      - {kind: poly, points: [[-2.1061, -8.7426], [-0.4694, -8.8069], [-0.8587, -7.5906], [-1.6225, -7.5606]], y: [1.2, 2.8], collide: 2}
      - {kind: poly, points: [[0.4694, -8.8069], [2.1061, -8.7426], [1.6225, -7.5606], [0.8587, -7.5906]], y: [1.2, 2.8], collide: 2}
      - {kind: poly, points: [[3.0419, -8.6689], [4.6685, -8.4764], [4.0937, -7.336], [3.3346, -7.4259]], y: [1.2, 2.8], collide: 2}
      - {kind: poly, points: [[5.5957, -8.3295], [7.2022, -8.01], [6.5397, -6.9183], [5.79, -7.0674]], y: [1.2, 2.8], collide: 2}
      - {kind: poly, points: [[8.115, -7.7908], [9.6915, -7.3462], [8.9454, -6.3098], [8.2097, -6.5173]], y: [1.2, 2.8], collide: 2}
      - {kind: poly, points: [[10.5843, -7.0561], [12.121, -6.4892], [11.2959, -5.5146], [10.5787, -5.7791]], y: [1.2, 2.8], collide: 2}
      - {kind: poly, points: [[12.9883, -6.13], [14.4758, -5.4442], [13.5767, -4.5373], [12.8826, -4.8573]], y: [1.2, 2.8], collide: 2}
      - {kind: poly, points: [[-17.2487, -4.1333], [-17.7714, -4.9858], [-15.0434, -6.4909], [-14.601, -5.5941]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[-14.601, -5.5941], [-15.0434, -6.4909], [-12.1892, -7.7399], [-11.8307, -6.8064]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[-11.8307, -6.8064], [-12.1892, -7.7399], [-9.2326, -8.7225], [-8.961, -7.76]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[-8.961, -7.76], [-9.2326, -8.7225], [-6.1985, -9.4302], [-6.0162, -8.447]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[-6.0162, -8.447], [-6.1985, -9.4302], [-3.1123, -9.8573], [-3.0208, -8.8615]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[-3.0208, -8.8615], [-3.1123, -9.8573], [0.0, -10.0], [0.0, -9.0]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[0.0, -9.0], [0.0, -10.0], [3.1123, -9.8573], [3.0208, -8.8615]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[3.0208, -8.8615], [3.1123, -9.8573], [6.1985, -9.4302], [6.0162, -8.447]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[6.0162, -8.447], [6.1985, -9.4302], [9.2326, -8.7225], [8.961, -7.76]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[8.961, -7.76], [9.2326, -8.7225], [12.1892, -7.7399], [11.8307, -6.8064]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[11.8307, -6.8064], [12.1892, -7.7399], [15.0434, -6.4909], [14.601, -5.5941]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[14.601, -5.5941], [15.0434, -6.4909], [17.7714, -4.9858], [17.2487, -4.1333]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[-0.8637, 23.3566], [-0.1817, 22.9384], [-17.4304, -5.1949], [-18.1124, -4.7768]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[0.1817, 22.9384], [0.8637, 23.3566], [18.1124, -4.7768], [17.4304, -5.1949]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[1.0, 23.3], [1.0, 24.7], [-0.8928, 24.8597], [-1.1273, 23.4794]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[-1.1273, 23.4794], [-0.8928, 24.8597], [-2.7322, 25.3341], [-3.1945, 24.0127]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[-3.1945, 24.0127], [-2.7322, 25.3341], [-4.466, 26.11], [-5.1432, 24.8847]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[-5.1432, 24.8847], [-4.466, 26.11], [-6.0454, 27.1653], [-6.9183, 26.0707]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[-6.9183, 26.0707], [-6.0454, 27.1653], [-7.4258, 28.4703], [-8.4697, 27.5374]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[-8.4697, 27.5374], [-7.4258, 28.4703], [-8.568, 29.988], [-9.7534, 29.2432]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[-9.7534, 29.2432], [-8.568, 29.988], [-9.4398, 31.6757], [-10.7333, 31.1399]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[-10.7333, 31.1399], [-9.4398, 31.6757], [-10.0167, 33.4855], [-11.3816, 33.174]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[-11.3816, 33.174], [-10.0167, 33.4855], [-10.2822, 35.3664], [-11.68, 35.2879]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[-11.68, 35.2879], [-10.2822, 35.3664], [-10.2289, 37.2652], [-11.6201, 37.4219]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[-11.6201, 37.4219], [-10.2289, 37.2652], [-9.8584, 39.1282], [-11.2036, 39.5158]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[-11.2036, 39.5158], [-9.8584, 39.1282], [-9.1809, 40.9029], [-10.4423, 41.5103]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[-10.4423, 41.5103], [-9.1809, 40.9029], [-8.2158, 42.539], [-9.3576, 43.3491]], y: [1.2, 2.8], collide: 0}
      - {kind: poly, points: [[-9.3576, 43.3491], [-8.2158, 42.539], [-6.9903, 43.9903], [-7.9803, 44.9803]], y: [1.2, 2.8], collide: 0}
  - id: frame
    shape: part
    pos: [0, 0, 0]
    fixed: true
    color: "#cfc6b4"
    pieces:
      - {kind: rod, from: [0, -1.6, 24.0], to: [0, 3.4, 24.0], radius: 1.2, collide: 0, color: "#8f8a80"}
joints:
  - {id: j_p, type: hinge, body: shaft, axis: [0, 1, 0], damping: 0.002}   # the shaft (the one driven joint); + : clockwise
  - {id: j_a, type: hinge, body: jaw_a, axis: [0, 1, 0], damping: 0.002}   # the jaw with the outside teeth (the right-hand jaw)
  - {id: j_b, type: hinge, body: jaw_b, axis: [0, 1, 0], damping: 0.002}   # the jaw with the inside teeth (the left-hand jaw)
contact: {solref: [0.002, 1.0], solimp: [0.95, 0.99, 0.0005], margin: 0}
driver: {joint: j_p, kind: velocity, rpm: 0, swing: {amplitude: 1.2, hz: 0.1}, kv: 3.0, max_torque: 20.0}
checks:
  - {type: follow, out: j_a, in: j_p, expect: -0.25, tol: 0.0125, min_r2: 0.99, settle_s: 0.3, window_s: 9.5}   # the outside-toothed jaw turns the one way
  - {type: follow, out: j_b, in: j_p, expect: 0.25, tol: 0.0125, min_r2: 0.99, settle_s: 0.3, window_s: 9.5}   # the inside-toothed jaw the other, as fast
camera: {target: [0, 0, 13.0], position: [0, -125.0, 13.0], fov: 34}
display:
  output: j_a
  labels: {j_p: "Shaft (driver)", j_a: "Right jaw (teeth outside)", j_b: "Left jaw (teeth inside)"}
  proof: {label: "Teeth out of contact", sub: "the shaft turns but the jaws stand"}

