# No. 172 (Brown 1868): "A mode of obtaining an egg-shaped elliptical movement."
#
# Reading of the figure (cm, no gravity; a plan): a crank (radius 4 cm) turns on its shaft; its pin carries one end of a long bar, which slides through a swivel block pinned to the frame 18.5 cm away. A point 5.5 cm along the bar from the crank-pin (the ring in the figure) traces the egg (dashed, 8.0 x 5.7 cm).
# The bar rides between the two walls of the swivel block (real contact; the block turns on its pin only because the bar pushes it) and swings 21 deg each way. Generator: opencode-runs/batch11/gen172.py.
number: 172
slug: egg-shaped-elliptical-movement
name: A mode of obtaining an egg-shaped elliptical movement
brown: "A mode of obtaining an egg-shaped elliptical movement."
units: cm
sim:
  timestep: 0.0002
  integrator: implicitfast
  iterations: 100
  solver: PGS
  multiccd: true
  duration_s: 9.0
  floor: false
  gravity: 0
bodies:
  - id: crank
    shape: part
    pos: [8.0, 0, -0.15]
    mass: 0.3
    color: "#cfc6b4"
    pieces:
      - {kind: rod, from: [8.0, -1.2, -0.15], to: [8.0, 1.0, -0.15], radius: 0.9, collide: 0, color: "#8f8a80"}
      - {kind: disc, center: [8.0, -0.15], radius: 1.7, y: [-1.6, -0.8], collide: 0, color: "#d9cfb6"}
      - {kind: poly, points: [[8.4505, 0.1655], [10.7448, -3.1111], [9.8438, -3.7421], [7.5495, -0.4655]], y: [-1.6, -0.8], collide: 0, color: "#d9cfb6"}
      - {kind: disc, center: [10.2943, -3.4266], radius: 1.5, y: [-1.6, -0.8], collide: 0, color: "#d9cfb6"}
  - id: bar
    shape: part
    pos: [10.2943, 0, -3.4266]
    mount: crank
    mass: 0.2
    color: "#a89a7e"
    pieces:
      - {kind: poly, points: [[11.8458, -3.8659], [-14.9786, 0.2318], [-14.9182, 0.6273], [11.9062, -3.4705]], y: [-2.3, -2.2], collide: 0, color: "#a89a7e"}
      - {kind: rod, from: [11.876, -2.25, -3.6682], to: [-14.9484, -2.25, 0.4296], radius: 0.35, collide: 1, capsule: true, color: "#a89a7e"}
      - {kind: rod, from: [10.2943, -2.9, -3.4266], to: [10.2943, -0.8, -3.4266], radius: 0.5, collide: 0, color: "#8f8a80"}
      - {kind: disc, center: [4.8574, -2.596], radius: 0.7, inner: 0.25, y: [-3.4, -2.9], collide: 0, color: "#6b4f3a"}
  - id: block
    shape: part
    pos: [-10.5, 0, -0.25]
    mass: 0.3
    friction: 0.02
    color: "#d9cfb6"
    pieces:
      - {kind: poly, points: [[-7.4785, -0.3373], [-13.4097, 0.5688], [-13.3493, 0.9642], [-7.4181, 0.0581]], y: [-2.8, -1.7], collide: 2, color: "#d9cfb6"}
      - {kind: poly, points: [[-7.5903, -1.0688], [-13.5215, -0.1627], [-13.5819, -0.5581], [-7.6507, -1.4642]], y: [-2.8, -1.7], collide: 2, color: "#d9cfb6"}
      - {kind: disc, center: [-10.5, -0.25], radius: 1.4, y: [-1.5, -0.6], collide: 0, color: "#d9cfb6"}
      - {kind: rod, from: [-10.5, -3.0, -0.25], to: [-10.5, 0.4, -0.25], radius: 0.5, collide: 0, color: "#8f8a80"}
  - id: frame
    shape: part
    pos: [0, 0, 0]
    fixed: true
    color: "#cfc6b4"
    pieces:
      - {kind: poly, points: [[6.8, -9.5], [9.2, -9.5], [8.9, -0.15], [7.1, -0.15]], y: [0.8, 1.8], collide: 0}
      - {kind: poly, points: [[-11.5, -9.5], [-9.5, -9.5], [-9.8, -0.25], [-11.2, -0.25]], y: [0.2, 1.2], collide: 0}
      - {kind: poly, points: [[-16, -10.5], [16, -10.5], [16, -9.5], [-16, -9.5]], y: [-3, 2], collide: 0, color: "#b9b09c"}
      - {kind: poly, points: [[4.8245, -2.5342], [4.9872, -2.4478], [5.0529, -2.5714], [4.8902, -2.6579]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[5.1368, -2.358], [5.2857, -2.2575], [5.3641, -2.3735], [5.2152, -2.474]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[5.421, -2.155], [5.5546, -2.0416], [5.6452, -2.1483], [5.5116, -2.2618]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[5.6743, -1.9278], [5.7912, -1.8028], [5.8935, -1.8985], [5.7765, -2.0234]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[5.8941, -1.679], [5.9932, -1.5441], [6.106, -1.6269], [6.0069, -1.7619]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[6.0783, -1.4119], [6.1585, -1.2686], [6.2807, -1.337], [6.2005, -1.4803]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[6.2252, -1.1297], [6.2857, -0.9798], [6.4155, -1.0322], [6.355, -1.1821]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[6.3332, -0.8359], [6.3734, -0.6813], [6.5089, -0.7165], [6.4687, -0.8711]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[6.4015, -0.5341], [6.421, -0.3767], [6.5599, -0.3938], [6.5405, -0.5512]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[6.4294, -0.2279], [6.4279, -0.0696], [6.5679, -0.0683], [6.5694, -0.2265]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[6.4166, 0.079], [6.3941, 0.2361], [6.5327, 0.2559], [6.5552, 0.0988]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[6.3632, 0.3828], [6.32, 0.5367], [6.4548, 0.5745], [6.498, 0.4206]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[6.2697, 0.6798], [6.2063, 0.8287], [6.3351, 0.8835], [6.3985, 0.7347]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[6.137, 0.9664], [6.054, 1.1084], [6.1749, 1.179], [6.2578, 1.0371]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[5.9663, 1.2391], [5.8646, 1.3724], [5.9759, 1.4573], [6.0776, 1.324]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[5.7593, 1.4945], [5.6399, 1.6174], [5.7404, 1.715], [5.8598, 1.592]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[5.5181, 1.7293], [5.3822, 1.8405], [5.4709, 1.9488], [5.6067, 1.8376]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[5.2449, 1.9407], [5.094, 2.0387], [5.1703, 2.1561], [5.3212, 2.0581]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[4.9425, 2.126], [4.7782, 2.2098], [4.8417, 2.3345], [5.0061, 2.2508]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[4.6141, 2.2831], [4.4379, 2.3515], [4.4886, 2.482], [4.6648, 2.4136]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[4.2628, 2.4099], [4.0766, 2.4624], [4.1145, 2.5971], [4.3007, 2.5447]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[3.8923, 2.5052], [3.6979, 2.5411], [3.7234, 2.6788], [3.9177, 2.6428]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[3.5063, 2.5678], [3.3058, 2.587], [3.3191, 2.7263], [3.5196, 2.7072]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[3.1088, 2.5974], [2.9042, 2.5998], [2.9058, 2.7397], [3.1105, 2.7374]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[2.7039, 2.5939], [2.4973, 2.5797], [2.4877, 2.7194], [2.6943, 2.7336]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[2.2957, 2.558], [2.0891, 2.5277], [2.0688, 2.6662], [2.2754, 2.6965]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[1.8885, 2.4906], [1.6841, 2.4449], [1.6536, 2.5816], [1.858, 2.6272]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[1.4865, 2.3932], [1.2865, 2.3332], [1.2462, 2.4673], [1.4463, 2.5273]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[1.0941, 2.2679], [0.9005, 2.1946], [0.8509, 2.3256], [1.0445, 2.3989]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[0.7155, 2.1171], [0.5305, 2.0318], [0.4719, 2.159], [0.6569, 2.2442]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[0.355, 1.9434], [0.1808, 1.8476], [0.1134, 1.9704], [0.2876, 2.0661]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[0.017, 1.7499], [-0.1445, 1.6452], [-0.2206, 1.7627], [-0.0592, 1.8674]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[-0.2944, 1.5398], [-0.4411, 1.4277], [-0.5261, 1.5389], [-0.3794, 1.651]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[-0.5752, 1.3163], [-0.7051, 1.1983], [-0.7992, 1.302], [-0.6692, 1.42]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[-0.8212, 1.0827], [-0.9326, 0.9603], [-1.0362, 1.0545], [-0.9248, 1.1769]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[-1.0291, 0.8421], [-1.1202, 0.7164], [-1.2336, 0.7986], [-1.1425, 0.9243]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[-1.1957, 0.5972], [-1.2651, 0.4694], [-1.3882, 0.5361], [-1.3188, 0.664]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[-1.3188, 0.3504], [-1.3652, 0.2212], [-1.4969, 0.2686], [-1.4505, 0.3978]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[-1.3967, 0.1032], [-1.4194, -0.0266], [-1.5573, -0.0026], [-1.5347, 0.1273]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[-1.429, -0.1438], [-1.4275, -0.2738], [-1.5675, -0.2754], [-1.569, -0.1454]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[-1.4153, -0.3909], [-1.3897, -0.5204], [-1.527, -0.5476], [-1.5526, -0.418]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[-1.3555, -0.6381], [-1.3062, -0.7668], [-1.4369, -0.8169], [-1.4862, -0.6882]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[-1.2498, -0.8851], [-1.1777, -1.0121], [-1.2994, -1.0813], [-1.3715, -0.9543]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[-1.0995, -1.1304], [-1.0057, -1.2549], [-1.1176, -1.3392], [-1.2113, -1.2147]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[-0.9066, -1.3719], [-0.7927, -1.4929], [-0.8947, -1.5889], [-1.0086, -1.4679]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[-0.6742, -1.607], [-0.5418, -1.7232], [-0.6342, -1.8284], [-0.7665, -1.7122]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[-0.4056, -1.8328], [-0.2567, -1.9429], [-0.3399, -2.0555], [-0.4888, -1.9454]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[-0.1047, -2.0463], [0.0588, -2.1486], [-0.0155, -2.2673], [-0.179, -2.1649]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[0.2244, -2.2441], [0.4005, -2.3373], [0.335, -2.461], [0.1589, -2.3678]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[0.5776, -2.4232], [0.764, -2.5057], [0.7074, -2.6337], [0.5209, -2.5512]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[0.9504, -2.5805], [1.1452, -2.6509], [1.0976, -2.7826], [0.9028, -2.7122]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[1.3387, -2.7133], [1.5397, -2.7703], [1.5015, -2.905], [1.3005, -2.848]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[1.7381, -2.8189], [1.9432, -2.8614], [1.9148, -2.9985], [1.7097, -2.956]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[2.1443, -2.8954], [2.3513, -2.9225], [2.3331, -3.0613], [2.1262, -3.0342]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[2.553, -2.941], [2.7597, -2.952], [2.7523, -3.0918], [2.5456, -3.0808]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[2.9599, -2.9546], [3.1643, -2.9489], [3.1681, -3.0889], [2.9638, -3.0945]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[3.3609, -2.9353], [3.5608, -2.913], [3.5764, -3.0521], [3.3764, -3.0745]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[3.7517, -2.8831], [3.9452, -2.8441], [3.9729, -2.9813], [3.7794, -3.0204]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[4.1284, -2.7983], [4.3135, -2.7428], [4.3537, -2.8769], [4.1686, -2.9324]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
      - {kind: poly, points: [[4.4873, -2.6816], [4.662, -2.6102], [4.7149, -2.7398], [4.5402, -2.8112]], y: [0.4, 0.8], collide: 0, color: "#6b4f3a"}
joints:
  - {id: j_c, type: hinge, body: crank, axis: [0, -1, 0], damping: 0.002}   # the one driven joint: the crank
  - {id: j_b, type: hinge, body: bar, axis: [0, -1, 0], damping: 0.002}   # the bar on the crank-pin
  - {id: j_k, type: hinge, body: block, axis: [0, -1, 0], damping: 0.002}   # the swivel block on the frame
contact: {solref: [0.002, 1.0], solimp: [0.95, 0.99, 0.0005], margin: 0}
driver: {joint: j_c, kind: velocity, rpm: 20, kv: 2.0, max_torque: 20}
checks:
  - {type: follow, out: j_k, in: j_c, expect: 0.1769, tol: 0.0142, min_r2: 0.99, settle_s: 0.375, window_s: 0.25}
  - {type: follow, out: j_k, in: j_c, expect: 0.1224, tol: 0.0098, min_r2: 0.99, settle_s: 0.8333, window_s: 0.25}
  - {type: follow, out: j_k, in: j_c, expect: -0.2718, tol: 0.0217, min_r2: 0.99, settle_s: 1.8333, window_s: 0.25}
  - {type: follow, out: j_b, in: j_c, expect: -1.0944, tol: 0.0876, min_r2: 0.99, settle_s: 1.375, window_s: 0.25}
  - {type: follow, out: j_b, in: j_c, expect: -1.2711, tol: 0.1017, min_r2: 0.99, settle_s: 1.8333, window_s: 0.25}
  - {type: follow, out: j_b, in: j_c, expect: -1.0972, tol: 0.0878, min_r2: 0.99, settle_s: 2.2917, window_s: 0.25}
  - {type: position, joint: j_k, min: -0.0909, max: 0.4049, settle_s: 0.0, window_s: 8.5}
  - {type: penetration, max: 0.003, settle_s: 0.5}
camera: {target: [0.0, 0, -3.0], position: [0.0, -46.0, -3.0], fov: 34}
display:
  output: j_k
  labels: {j_c: "Crank (driver)", j_k: "Swivel block", j_b: "Bar"}

