# No. 171 (Brown 1868): "Valve motion and reversing gear used in oscillating marine engines. The two eccentric rods give an oscillating motion to the slotted link which works the curved slide over the trunnion. Within the slot in the curved slide is a pin attached to the arm of a rock-shaft which gives motion to the valve. The curve of the slot in the slide is an arc of a circle described from the center of the trunnion, and as it moves with the cylinder it does not interfere with the stroke of the valve. The two eccentrics and link are like those of the link motion used in locomotives."
#
# Model (cm, no gravity; a plan): the shaft (the one driven joint, 20 turns a minute) carries two eccentrics (throw 1.4 cm, 110 deg ahead of and behind the crank), whose 12 cm rods are pinned to the ends of the slotted link.
# The link (6.8 cm between the rod pins, its slot an arc of radius 12 cm) is held by a radius rod and swings 24 deg each way. The valve rod's pin runs in the link's slot (real contact), 2.8 cm from its middle, and the valve rod, on a vertical guide, carries the curved slide
# over the trunnion; the pin of the rock-shaft arm runs in that slide's slot, so the valve rod goes 2.6 cm and the rock-shaft rocks 22 deg. Generator: opencode-runs/batch11/gen171.py. Cylinder oscillation is left out.
number: 171
slug: oscillating-engine-link-motion
name: Valve motion used in oscillating marine engines
brown: "Valve motion and reversing gear used in oscillating marine engines. The two eccentric rods give an oscillating motion to the slotted link which works the curved slide over the trunnion. Within the slot in the curved slide is a pin attached to the arm of a rock-shaft which gives motion to the valve. The curve of the slot in the slide is an arc of a circle described from the center of the trunnion, and as it moves with the cylinder it does not interfere with the stroke of the valve. The two eccentrics and link are like those of the link motion used in locomotives."
units: cm
sim:
  timestep: 0.0002
  integrator: implicitfast
  iterations: 100
  solver: PGS
  multiccd: true
  duration_s: 9.0
  floor: false
  gravity: 0
bodies:
  - id: shaft
    shape: part
    pos: [0, 0, 0]
    mass: 0.3
    color: "#cfc6b4"
    pieces:
      - {kind: rod, from: [0, -4.2, 0], to: [0, 1.6, 0], radius: 1.0, collide: 0, color: "#8f8a80"}
      - {kind: disc, center: [1.3156, -0.4788], radius: 2.2, y: [-4.2, -3.3], collide: 0, color: "#d9cfb6"}
      - {kind: disc, center: [-1.3156, -0.4788], radius: 2.2, y: [-2.7, -1.9], collide: 0, color: "#d9cfb6"}
  - id: rod_a
    shape: part
    pos: [1.3156, 0, -0.4788]
    mount: shaft
    mass: 0.3
    color: "#a89a7e"
    pieces:
      - {kind: poly, points: [[1.8213, -0.695], [-2.8942, -11.7296], [-3.9058, -11.2973], [0.8098, -0.2627]], y: [-4.1, -3.3], collide: 0, color: "#a89a7e"}
      - {kind: rod, from: [-3.4, -4.1, -11.5135], to: [-3.4, -0.2, -11.5135], radius: 0.55, collide: 0, color: "#8f8a80"}
  - id: link
    shape: part
    pos: [-3.4, 0, -11.5135]
    mount: rod_a
    mass: 0.4
    friction: 0.02
    color: "#d9cfb6"
    pieces:
      - {kind: poly, points: [[-4.0852, -10.6487], [-3.8677, -10.7297], [-3.698, -10.2593], [-3.906, -10.1819]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-3.8677, -10.7297], [-3.6485, -10.8062], [-3.4885, -10.3325], [-3.698, -10.2593]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-3.6485, -10.8062], [-3.4279, -10.8783], [-3.2775, -10.4014], [-3.4885, -10.3325]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-3.4279, -10.8783], [-3.2058, -10.9458], [-3.0652, -10.4659], [-3.2775, -10.4014]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-3.2058, -10.9458], [-2.9824, -11.0088], [-2.8516, -10.5262], [-3.0652, -10.4659]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-2.9824, -11.0088], [-2.7578, -11.0672], [-2.6368, -10.5821], [-2.8516, -10.5262]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-2.7578, -11.0672], [-2.532, -11.1211], [-2.4209, -10.6335], [-2.6368, -10.5821]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-2.532, -11.1211], [-2.3052, -11.1703], [-2.2041, -10.6806], [-2.4209, -10.6335]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-2.3052, -11.1703], [-2.0774, -11.2149], [-1.9863, -10.7233], [-2.2041, -10.6806]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-2.0774, -11.2149], [-1.8487, -11.2549], [-1.7677, -10.7615], [-1.9863, -10.7233]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-1.8487, -11.2549], [-1.6193, -11.2902], [-1.5483, -10.7953], [-1.7677, -10.7615]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-1.6193, -11.2902], [-1.3892, -11.3208], [-1.3283, -10.8245], [-1.5483, -10.7953]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-1.3892, -11.3208], [-1.1586, -11.3468], [-1.1078, -10.8493], [-1.3283, -10.8245]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-1.1586, -11.3468], [-0.9274, -11.368], [-0.8868, -10.8697], [-1.1078, -10.8493]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-0.9274, -11.368], [-0.6959, -11.3845], [-0.6654, -10.8855], [-0.8868, -10.8697]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-0.6959, -11.3845], [-0.4641, -11.3964], [-0.4438, -10.8967], [-0.6654, -10.8855]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-0.4641, -11.3964], [-0.2321, -11.4034], [-0.2219, -10.9035], [-0.4438, -10.8967]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-0.2321, -11.4034], [-0.0, -11.4058], [-0.0, -10.9058], [-0.2219, -10.9035]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-0.0, -11.4058], [0.2321, -11.4034], [0.2219, -10.9035], [-0.0, -10.9058]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[0.2321, -11.4034], [0.4641, -11.3964], [0.4437, -10.8967], [0.2219, -10.9035]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[0.4641, -11.3964], [0.6959, -11.3845], [0.6654, -10.8855], [0.4437, -10.8967]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[0.6959, -11.3845], [0.9274, -11.368], [0.8868, -10.8697], [0.6654, -10.8855]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[0.9274, -11.368], [1.1586, -11.3468], [1.1078, -10.8493], [0.8868, -10.8697]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[1.1586, -11.3468], [1.3892, -11.3208], [1.3283, -10.8245], [1.1078, -10.8493]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[1.3892, -11.3208], [1.6193, -11.2902], [1.5483, -10.7953], [1.3283, -10.8245]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[1.6193, -11.2902], [1.8487, -11.2549], [1.7677, -10.7615], [1.5483, -10.7953]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[1.8487, -11.2549], [2.0774, -11.2149], [1.9863, -10.7233], [1.7677, -10.7615]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[2.0774, -11.2149], [2.3052, -11.1703], [2.2041, -10.6806], [1.9863, -10.7233]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[2.3052, -11.1703], [2.532, -11.1211], [2.4209, -10.6335], [2.2041, -10.6806]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[2.532, -11.1211], [2.7578, -11.0672], [2.6368, -10.5821], [2.4209, -10.6335]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[2.7578, -11.0672], [2.9824, -11.0088], [2.8516, -10.5262], [2.6368, -10.5821]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[2.9824, -11.0088], [3.2058, -10.9458], [3.0652, -10.4659], [2.8516, -10.5262]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[3.2058, -10.9458], [3.4279, -10.8783], [3.2775, -10.4014], [3.0652, -10.4659]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[3.4279, -10.8783], [3.6485, -10.8062], [3.4885, -10.3325], [3.2775, -10.4014]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[3.6485, -10.8062], [3.8677, -10.7297], [3.698, -10.2593], [3.4885, -10.3325]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[3.8677, -10.7297], [4.0852, -10.6487], [3.906, -10.1819], [3.698, -10.2593]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-4.5152, -11.7691], [-4.2748, -11.8586], [-4.4444, -12.329], [-4.6944, -12.2359]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-4.2748, -11.8586], [-4.0326, -11.9432], [-4.1926, -12.4169], [-4.4444, -12.329]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-4.0326, -11.9432], [-3.7887, -12.0228], [-3.9391, -12.4997], [-4.1926, -12.4169]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-3.7887, -12.0228], [-3.5433, -12.0974], [-3.6839, -12.5773], [-3.9391, -12.4997]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-3.5433, -12.0974], [-3.2964, -12.1671], [-3.4272, -12.6497], [-3.6839, -12.5773]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-3.2964, -12.1671], [-3.0481, -12.2317], [-3.169, -12.7168], [-3.4272, -12.6497]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-3.0481, -12.2317], [-2.7985, -12.2912], [-2.9096, -12.7787], [-3.169, -12.7168]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-2.7985, -12.2912], [-2.5478, -12.3456], [-2.6489, -12.8353], [-2.9096, -12.7787]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-2.5478, -12.3456], [-2.2961, -12.3949], [-2.3872, -12.8866], [-2.6489, -12.8353]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-2.2961, -12.3949], [-2.0433, -12.4391], [-2.1244, -12.9325], [-2.3872, -12.8866]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-2.0433, -12.4391], [-1.7898, -12.4781], [-1.8608, -12.9731], [-2.1244, -12.9325]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-1.7898, -12.4781], [-1.5355, -12.512], [-1.5964, -13.0083], [-1.8608, -12.9731]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-1.5355, -12.512], [-1.2805, -12.5406], [-1.3314, -13.0381], [-1.5964, -13.0083]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-1.2805, -12.5406], [-1.0251, -12.5641], [-1.0657, -13.0625], [-1.3314, -13.0381]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-1.0251, -12.5641], [-0.7692, -12.5824], [-0.7997, -13.0815], [-1.0657, -13.0625]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-0.7692, -12.5824], [-0.513, -12.5954], [-0.5333, -13.095], [-0.7997, -13.0815]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-0.513, -12.5954], [-0.2565, -12.6033], [-0.2667, -13.1032], [-0.5333, -13.095]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-0.2565, -12.6033], [-0.0, -12.6059], [-0.0, -13.1059], [-0.2667, -13.1032]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-0.0, -12.6059], [0.2565, -12.6033], [0.2667, -13.1032], [-0.0, -13.1059]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[0.2565, -12.6033], [0.513, -12.5954], [0.5333, -13.095], [0.2667, -13.1032]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[0.513, -12.5954], [0.7692, -12.5824], [0.7997, -13.0815], [0.5333, -13.095]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[0.7692, -12.5824], [1.0251, -12.5641], [1.0657, -13.0625], [0.7997, -13.0815]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[1.0251, -12.5641], [1.2805, -12.5406], [1.3314, -13.0381], [1.0657, -13.0625]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[1.2805, -12.5406], [1.5355, -12.512], [1.5964, -13.0083], [1.3314, -13.0381]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[1.5355, -12.512], [1.7898, -12.4781], [1.8608, -12.9731], [1.5964, -13.0083]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[1.7898, -12.4781], [2.0433, -12.4391], [2.1244, -12.9325], [1.8608, -12.9731]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[2.0433, -12.4391], [2.2961, -12.3949], [2.3872, -12.8866], [2.1244, -12.9325]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[2.2961, -12.3949], [2.5478, -12.3456], [2.6489, -12.8353], [2.3872, -12.8866]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[2.5478, -12.3456], [2.7985, -12.2912], [2.9096, -12.7787], [2.6489, -12.8353]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[2.7985, -12.2912], [3.0481, -12.2317], [3.169, -12.7168], [2.9096, -12.7787]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[3.0481, -12.2317], [3.2964, -12.1671], [3.4272, -12.6497], [3.169, -12.7168]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[3.2964, -12.1671], [3.5433, -12.0974], [3.6839, -12.5773], [3.4272, -12.6497]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[3.5433, -12.0974], [3.7887, -12.0228], [3.9391, -12.4997], [3.6839, -12.5773]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[3.7887, -12.0228], [4.0326, -11.9432], [4.1926, -12.4169], [3.9391, -12.4997]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[4.0326, -11.9432], [4.2748, -11.8586], [4.4444, -12.329], [4.1926, -12.4169]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[4.2748, -11.8586], [4.5152, -11.7691], [4.6944, -12.2359], [4.4444, -12.329]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-5.0, -12.2052], [5.0, -12.2052], [5.0, -11.0052], [-5.0, -11.0052]], y: [0.0, 0.5], collide: 0, color: "#d9cfb6"}
  - id: rod_b
    shape: part
    pos: [-1.3156, 0, -0.4788]
    mount: shaft
    mass: 0.3
    color: "#a89a7e"
    pieces:
      - {kind: poly, points: [[-0.8098, -0.2627], [3.9058, -11.2973], [2.8942, -11.7296], [-1.8213, -0.695]], y: [-2.7, -1.9], collide: 0, color: "#a89a7e"}
      - {kind: rod, from: [3.4, -2.7, -11.5135], to: [3.4, -0.2, -11.5135], radius: 0.55, collide: 0, color: "#8f8a80"}
  - id: hanger
    shape: part
    pos: [-9.0, 0, -12.0]
    mass: 0.2
    color: "#a89a7e"
    pieces:
      - {kind: poly, points: [[-8.9998, -11.6], [0.0002, -11.6052], [-0.0002, -12.4052], [-9.0002, -12.4]], y: [1.8, 2.4], collide: 0, color: "#a89a7e"}
      - {kind: rod, from: [-0.0, -0.2, -12.0052], to: [-0.0, 2.6, -12.0052], radius: 0.45, collide: 0, color: "#8f8a80"}
      - {kind: rod, from: [-9.0, 1.4, -12.0], to: [-9.0, 2.8, -12.0], radius: 0.5, collide: 0, color: "#8f8a80"}
  - id: valve
    shape: part
    pos: [-2.8, 0, -11.674]
    mass: 0.3
    friction: 0.02
    color: "#cfc6b4"
    pieces:
      - {kind: rod, from: [-2.8, -0.9, -11.674], to: [-2.8, 1.4, -11.674], radius: 0.5, collide: 1, capsule: true, color: "#8f8a80"}
      - {kind: poly, points: [[-2.4, 3.0], [-2.4, -14.674], [-3.2, -14.674], [-3.2, 3.0]], y: [0.8, 1.4], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-8.3, -14.674], [2.7, -14.674], [2.7, -14.074], [-8.3, -14.074]], y: [-1.0, -0.2], collide: 0, color: "#cfc6b4"}
      - {kind: poly, points: [[-5.7465, -16.9728], [-5.6112, -16.7573], [-5.1978, -17.0392], [-5.3132, -17.223]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-5.6112, -16.7573], [-5.4601, -16.5526], [-5.0689, -16.8646], [-5.1978, -17.0392]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-5.4601, -16.5526], [-5.2941, -16.3598], [-4.9273, -16.7001], [-5.0689, -16.8646]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-5.2941, -16.3598], [-5.1142, -16.1799], [-4.7739, -16.5466], [-4.9273, -16.7001]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-5.1142, -16.1799], [-4.9213, -16.0139], [-4.6094, -16.4051], [-4.7739, -16.5466]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-4.9213, -16.0139], [-4.7166, -15.8628], [-4.4348, -16.2762], [-4.6094, -16.4051]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-4.7166, -15.8628], [-4.5012, -15.7274], [-4.251, -16.1607], [-4.4348, -16.2762]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-4.5012, -15.7274], [-4.2762, -15.6085], [-4.0591, -16.0593], [-4.251, -16.1607]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-4.2762, -15.6085], [-4.043, -15.5068], [-3.8602, -15.9726], [-4.0591, -16.0593]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-4.043, -15.5068], [-3.8029, -15.4228], [-3.6554, -15.9009], [-3.8602, -15.9726]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-3.8029, -15.4228], [-3.5571, -15.3569], [-3.4458, -15.8447], [-3.6554, -15.9009]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-3.5571, -15.3569], [-3.3071, -15.3096], [-3.2325, -15.8044], [-3.4458, -15.8447]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-3.3071, -15.3096], [-3.0543, -15.2811], [-3.0169, -15.7801], [-3.2325, -15.8044]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-3.0543, -15.2811], [-2.8, -15.2716], [-2.8, -15.7719], [-3.0169, -15.7801]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-2.8, -15.2716], [-2.5457, -15.2811], [-2.5831, -15.7801], [-2.8, -15.7719]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-2.5457, -15.2811], [-2.2929, -15.3096], [-2.3675, -15.8044], [-2.5831, -15.7801]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-2.2929, -15.3096], [-2.0429, -15.3569], [-2.1542, -15.8447], [-2.3675, -15.8044]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-2.0429, -15.3569], [-1.7971, -15.4228], [-1.9446, -15.9009], [-2.1542, -15.8447]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-1.7971, -15.4228], [-1.557, -15.5068], [-1.7398, -15.9726], [-1.9446, -15.9009]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-1.557, -15.5068], [-1.3238, -15.6085], [-1.5409, -16.0593], [-1.7398, -15.9726]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-1.3238, -15.6085], [-1.0988, -15.7274], [-1.349, -16.1607], [-1.5409, -16.0593]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-1.0988, -15.7274], [-0.8834, -15.8628], [-1.1652, -16.2762], [-1.349, -16.1607]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-0.8834, -15.8628], [-0.6787, -16.0139], [-0.9906, -16.4051], [-1.1652, -16.2762]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-0.6787, -16.0139], [-0.4858, -16.1799], [-0.8261, -16.5466], [-0.9906, -16.4051]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-0.4858, -16.1799], [-0.3059, -16.3598], [-0.6727, -16.7001], [-0.8261, -16.5466]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-0.3059, -16.3598], [-0.1399, -16.5526], [-0.5311, -16.8646], [-0.6727, -16.7001]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-0.1399, -16.5526], [0.0112, -16.7573], [-0.4022, -17.0392], [-0.5311, -16.8646]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[0.0112, -16.7573], [0.1465, -16.9728], [-0.2868, -17.223], [-0.4022, -17.0392]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-6.7865, -16.3724], [-6.6034, -16.0809], [-7.0168, -15.799], [-7.2198, -16.1222]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-6.6034, -16.0809], [-6.3989, -15.8039], [-6.7901, -15.492], [-7.0168, -15.799]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-6.3989, -15.8039], [-6.1744, -15.543], [-6.5412, -15.2027], [-6.7901, -15.492]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-6.1744, -15.543], [-5.931, -15.2996], [-6.2713, -14.9328], [-6.5412, -15.2027]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-5.931, -15.2996], [-5.6701, -15.075], [-5.982, -14.6838], [-6.2713, -14.9328]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-5.6701, -15.075], [-5.3931, -14.8706], [-5.6749, -14.4572], [-5.982, -14.6838]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-5.3931, -14.8706], [-5.1016, -14.6875], [-5.3518, -14.2542], [-5.6749, -14.4572]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-5.1016, -14.6875], [-4.7973, -14.5266], [-5.0144, -14.0758], [-5.3518, -14.2542]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-4.7973, -14.5266], [-4.4817, -14.389], [-4.6645, -13.9232], [-5.0144, -14.0758]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-4.4817, -14.389], [-4.1568, -14.2753], [-4.3043, -13.7971], [-4.6645, -13.9232]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-4.1568, -14.2753], [-3.8243, -14.1862], [-3.9357, -13.6984], [-4.3043, -13.7971]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-3.8243, -14.1862], [-3.4861, -14.1222], [-3.5606, -13.6274], [-3.9357, -13.6984]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-3.4861, -14.1222], [-3.144, -14.0836], [-3.1814, -13.5847], [-3.5606, -13.6274]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-3.144, -14.0836], [-2.8, -14.0708], [-2.8, -13.5704], [-3.1814, -13.5847]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-2.8, -14.0708], [-2.456, -14.0836], [-2.4186, -13.5847], [-2.8, -13.5704]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-2.456, -14.0836], [-2.1139, -14.1222], [-2.0394, -13.6274], [-2.4186, -13.5847]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-2.1139, -14.1222], [-1.7757, -14.1862], [-1.6643, -13.6984], [-2.0394, -13.6274]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-1.7757, -14.1862], [-1.4432, -14.2753], [-1.2957, -13.7971], [-1.6643, -13.6984]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-1.4432, -14.2753], [-1.1183, -14.389], [-0.9355, -13.9232], [-1.2957, -13.7971]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-1.1183, -14.389], [-0.8027, -14.5266], [-0.5856, -14.0758], [-0.9355, -13.9232]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-0.8027, -14.5266], [-0.4984, -14.6875], [-0.2482, -14.2542], [-0.5856, -14.0758]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-0.4984, -14.6875], [-0.2069, -14.8706], [0.0749, -14.4572], [-0.2482, -14.2542]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-0.2069, -14.8706], [0.0701, -15.075], [0.382, -14.6838], [0.0749, -14.4572]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[0.0701, -15.075], [0.331, -15.2996], [0.6713, -14.9328], [0.382, -14.6838]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[0.331, -15.2996], [0.5744, -15.543], [0.9412, -15.2027], [0.6713, -14.9328]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[0.5744, -15.543], [0.7989, -15.8039], [1.1901, -15.492], [0.9412, -15.2027]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[0.7989, -15.8039], [1.0034, -16.0809], [1.4168, -15.799], [1.1901, -15.492]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[1.0034, -16.0809], [1.1865, -16.3724], [1.6198, -16.1222], [1.4168, -15.799]], y: [-1.0, -0.2], collide: 2, color: "#d9cfb6"}
  - id: rock
    shape: part
    pos: [5.8905, 0, -15.0487]
    mass: 0.2
    friction: 0.02
    color: "#a89a7e"
    pieces:
      - {kind: poly, points: [[5.8905, -15.4987], [-1.1095, -15.4987], [-1.1095, -14.5987], [5.8905, -14.5987]], y: [-1.8, -1.2], collide: 0, color: "#a89a7e"}
      - {kind: rod, from: [-1.1095, -1.8, -15.0487], to: [-1.1095, 0.0, -15.0487], radius: 0.5, collide: 1, capsule: true, color: "#8f8a80"}
      - {kind: rod, from: [5.8905, -2.4, -15.0487], to: [5.8905, 0.6, -15.0487], radius: 0.9, collide: 0, color: "#8f8a80"}
  - id: frame
    shape: part
    pos: [0, 0, 0]
    fixed: true
    color: "#cfc6b4"
    pieces:
      - {kind: poly, points: [[-0.8, -23.6], [0.8, -23.6], [0.6, -1.0], [-0.6, -1.0]], y: [1.8, 2.8], collide: 0}
      - {kind: poly, points: [[-3.7, -6.474], [-1.9, -6.474], [-1.9, -5.674], [-3.7, -5.674]], y: [0.2, 2.0], collide: 0, color: "#b9b09c"}   # the valve rod's guide
      - {kind: poly, points: [[5.0905, -23.6], [6.6905, -23.6], [6.3905, -15.0487], [5.3905, -15.0487]], y: [0.8, 1.8], collide: 0}   # the rock-shaft's standard
      - {kind: poly, points: [[-9.6, -23.6], [-8.4, -23.6], [-8.6, -12.0], [-9.4, -12.0]], y: [2.8, 3.4], collide: 0}
      - {kind: disc, center: [-2.8, -18.674], radius: 2.0, y: [-0.9, -0.3], collide: 0, color: "#8f8a80"}   # the trunnion
      - {kind: poly, points: [[-14, -24.6], [14, -24.6], [14, -23.6], [-14, -23.6]], y: [-3, 3], collide: 0, color: "#b9b09c"}
joints:
  - {id: j_s, type: hinge, body: shaft, axis: [0, 1, 0], damping: 0.002}   # the one driven joint: the shaft with its two eccentrics; + : clockwise
  - {id: j_ra, type: hinge, body: rod_a, axis: [0, -1, 0], damping: 0.002}
  - {id: j_l, type: hinge, body: link, axis: [0, -1, 0], damping: 0.002}
  - {id: j_rb, type: hinge, body: rod_b, axis: [0, -1, 0], damping: 0.002}
  - {id: j_h, type: hinge, body: hanger, axis: [0, -1, 0], damping: 0.002}   # the radius rod that holds the link
  - {id: j_v, type: slide, body: valve, axis: [0, 0, 1], damping: 0.05}   # the valve rod on its guide; + : up
  - {id: j_r, type: hinge, body: rock, axis: [0, -1, 0], damping: 0.002}   # the rock-shaft arm
pins:
  - {"id": "pin_b", "a": "rod_b", "b": "link", "at": [3.4, 0, -11.5135]}
  - {"id": "pin_k", "a": "hanger", "b": "link", "at": [-0.0, 0, -12.0052]}
contact: {solref: [0.002, 1.0], solimp: [0.95, 0.99, 0.0005], margin: 0}
driver: {joint: j_s, kind: velocity, rpm: 20, kv: 2.0, max_torque: 20}
checks:
  - {type: follow, out: j_v, in: j_s, expect: -0.0099, tol: 0.0008, min_r2: 0.99, settle_s: 0.2083, window_s: 0.25}
  - {type: follow, out: j_v, in: j_s, expect: 0.0116, tol: 0.0009, min_r2: 0.99, settle_s: 1.2917, window_s: 0.25}
  - {type: follow, out: j_v, in: j_s, expect: -0.0116, tol: 0.0009, min_r2: 0.99, settle_s: 2.7083, window_s: 0.25}
  - {type: follow, out: j_r, in: j_s, expect: 0.1654, tol: 0.0132, min_r2: 0.99, settle_s: 0.125, window_s: 0.25}
  - {type: follow, out: j_r, in: j_s, expect: -0.1665, tol: 0.0133, min_r2: 0.99, settle_s: 1.2083, window_s: 0.25}
  - {type: follow, out: j_r, in: j_s, expect: 0.1532, tol: 0.0123, min_r2: 0.99, settle_s: 2.625, window_s: 0.25}
  - {type: position, joint: j_v, min: -1.5336, max: 1.6914, settle_s: 0.0, window_s: 8.5}
  - {type: penetration, max: 0.003, settle_s: 0.5}
camera: {target: [-3.0, 0, -16.3], position: [-3.0, -72.0, -16.3], fov: 34}
display:
  output: j_v
  labels: {j_s: "Shaft (driver)", j_v: "Valve rod", j_r: "Rock-shaft arm", j_l: "Link"}

