# No. 165 (Brown 1868): "Circular into rectilinear motion. The waved-wheel or cam on the upright shaft communicates a rectilinear motion to the upright bar through the oscillating rod."
#
# Model (cm, gravity on): the waved wheel (r = 5.6 + 0.9 cos 4(phi - 20 deg)) is turned on its shaft (15 turns a minute: the one driven joint). The oscillating rod (16 cm from its pivot to the 0.6 cm roller) rests on it, pressed down by a spring at the pivot;
# it rises and falls 6.5 degrees 4 times a turn. A link (9 cm) from the rod's other arm (12 cm) works the upright bar in its guides 1.35 cm, by real contact and pins. Generator: opencode-runs/batch11/gen165.py.
number: 165
slug: waved-wheel-oscillating-rod
name: A waved wheel working an oscillating rod and bar
brown: "Circular into rectilinear motion. The waved-wheel or cam on the upright shaft communicates a rectilinear motion to the upright bar through the oscillating rod."
units: cm
sim:
  timestep: 0.0002
  integrator: implicitfast
  iterations: 100
  solver: PGS
  multiccd: true
  duration_s: 20.0
  floor: false
bodies:
  - id: cam
    shape: part
    pos: [0, 0, 0]
    mass: 1.0
    friction: 0.03
    color: "#d9cfb6"
    pieces:
      - {kind: rod, from: [0, -1.4, 0], to: [0, 3.6, 0], radius: 0.9, color: "#8f8a80", collide: 0}
      - {kind: disc, center: [0, 0], radius: 1.8, inner: 0.9, y: [-1.0, -0.8], collide: 0, color: "#b8ad97"}
      - {kind: poly, points: [[0, 0], [5.7563, 0.0], [5.9676, 0.3911]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [5.9676, 0.3911], [6.1257, 0.8065]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [6.1257, 0.8065], [6.2155, 1.2363]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [6.2155, 1.2363], [6.2261, 1.6683]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [6.2261, 1.6683], [6.1518, 2.0883]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [6.1518, 2.0883], [5.9926, 2.4822]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [5.9926, 2.4822], [5.754, 2.8376]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [5.754, 2.8376], [5.4468, 3.1447]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [5.4468, 3.1447], [5.0855, 3.398]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [5.0855, 3.398], [4.687, 3.5965]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [4.687, 3.5965], [4.2693, 3.7441]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [4.2693, 3.7441], [3.8493, 3.8493]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [3.8493, 3.8493], [3.4416, 3.9243]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [3.4416, 3.9243], [3.0569, 3.9838]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [3.0569, 3.9838], [2.7016, 4.0432]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [2.7016, 4.0432], [2.3771, 4.1173]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [2.3771, 4.1173], [2.0803, 4.2184]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [2.0803, 4.2184], [1.8038, 4.3549]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [1.8038, 4.3549], [1.5379, 4.5304]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [1.5379, 4.5304], [1.2709, 4.7432]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [1.2709, 4.7432], [0.9918, 4.9861]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [0.9918, 4.9861], [0.6908, 5.2469]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [0.6908, 5.2469], [0.3611, 5.5097]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [0.3611, 5.5097], [0.0, 5.7563]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [0.0, 5.7563], [-0.3911, 5.9676]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-0.3911, 5.9676], [-0.8065, 6.1257]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-0.8065, 6.1257], [-1.2363, 6.2155]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-1.2363, 6.2155], [-1.6683, 6.2261]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-1.6683, 6.2261], [-2.0883, 6.1518]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-2.0883, 6.1518], [-2.4822, 5.9926]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-2.4822, 5.9926], [-2.8376, 5.754]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-2.8376, 5.754], [-3.1447, 5.4468]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-3.1447, 5.4468], [-3.398, 5.0855]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-3.398, 5.0855], [-3.5965, 4.687]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-3.5965, 4.687], [-3.7441, 4.2693]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-3.7441, 4.2693], [-3.8493, 3.8493]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-3.8493, 3.8493], [-3.9243, 3.4416]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-3.9243, 3.4416], [-3.9838, 3.0569]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-3.9838, 3.0569], [-4.0432, 2.7016]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-4.0432, 2.7016], [-4.1173, 2.3771]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-4.1173, 2.3771], [-4.2184, 2.0803]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-4.2184, 2.0803], [-4.3549, 1.8038]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-4.3549, 1.8038], [-4.5304, 1.5379]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-4.5304, 1.5379], [-4.7432, 1.2709]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-4.7432, 1.2709], [-4.9861, 0.9918]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-4.9861, 0.9918], [-5.2469, 0.6908]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-5.2469, 0.6908], [-5.5097, 0.3611]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-5.5097, 0.3611], [-5.7563, 0.0]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-5.7563, 0.0], [-5.9676, -0.3911]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-5.9676, -0.3911], [-6.1257, -0.8065]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-6.1257, -0.8065], [-6.2155, -1.2363]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-6.2155, -1.2363], [-6.2261, -1.6683]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-6.2261, -1.6683], [-6.1518, -2.0883]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-6.1518, -2.0883], [-5.9926, -2.4822]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-5.9926, -2.4822], [-5.754, -2.8376]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-5.754, -2.8376], [-5.4468, -3.1447]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-5.4468, -3.1447], [-5.0855, -3.398]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-5.0855, -3.398], [-4.687, -3.5965]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-4.687, -3.5965], [-4.2693, -3.7441]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-4.2693, -3.7441], [-3.8493, -3.8493]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-3.8493, -3.8493], [-3.4416, -3.9243]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-3.4416, -3.9243], [-3.0569, -3.9838]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-3.0569, -3.9838], [-2.7016, -4.0432]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-2.7016, -4.0432], [-2.3771, -4.1173]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-2.3771, -4.1173], [-2.0803, -4.2184]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-2.0803, -4.2184], [-1.8038, -4.3549]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-1.8038, -4.3549], [-1.5379, -4.5304]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-1.5379, -4.5304], [-1.2709, -4.7432]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-1.2709, -4.7432], [-0.9918, -4.9861]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-0.9918, -4.9861], [-0.6908, -5.2469]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-0.6908, -5.2469], [-0.3611, -5.5097]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-0.3611, -5.5097], [-0.0, -5.7563]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [-0.0, -5.7563], [0.3911, -5.9676]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [0.3911, -5.9676], [0.8065, -6.1257]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [0.8065, -6.1257], [1.2363, -6.2155]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [1.2363, -6.2155], [1.6683, -6.2261]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [1.6683, -6.2261], [2.0883, -6.1518]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [2.0883, -6.1518], [2.4822, -5.9926]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [2.4822, -5.9926], [2.8376, -5.754]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [2.8376, -5.754], [3.1447, -5.4468]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [3.1447, -5.4468], [3.398, -5.0855]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [3.398, -5.0855], [3.5965, -4.687]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [3.5965, -4.687], [3.7441, -4.2693]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [3.7441, -4.2693], [3.8493, -3.8493]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [3.8493, -3.8493], [3.9243, -3.4416]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [3.9243, -3.4416], [3.9838, -3.0569]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [3.9838, -3.0569], [4.0432, -2.7016]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [4.0432, -2.7016], [4.1173, -2.3771]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [4.1173, -2.3771], [4.2184, -2.0803]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [4.2184, -2.0803], [4.3549, -1.8038]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [4.3549, -1.8038], [4.5304, -1.5379]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [4.5304, -1.5379], [4.7432, -1.2709]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [4.7432, -1.2709], [4.9861, -0.9918]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [4.9861, -0.9918], [5.2469, -0.6908]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [5.2469, -0.6908], [5.5097, -0.3611]], y: [-0.8, 0.8], collide: 1}
      - {kind: poly, points: [[0, 0], [5.5097, -0.3611], [5.7563, 0.0]], y: [-0.8, 0.8], collide: 1}
  - id: rod
    shape: part
    pos: [-16.0, 0, 6.47]
    mass: 0.15
    friction: 0.03
    color: "#b8ad97"
    pieces:
      - {kind: rod, from: [-0.0, -0.6, 6.4443], to: [-0.0, 0.6, 6.4443], radius: 0.6, collide: 2, capsule: true}
      - {kind: poly, points: [[-27.9992, 6.9893], [0.0008, 6.9443], [-0.0008, 5.9443], [-28.0008, 5.9893]], y: [-1.7, -1.0], collide: 0}
      - {kind: disc, center: [-16.0, 6.47], radius: 1.6, inner: 0.5, y: [-1.8, -0.9], collide: 0}
      - {kind: disc, center: [-28.0, 6.4893], radius: 0.9, inner: 0.35, y: [-1.8, -0.9], collide: 0}
  - id: link
    shape: part
    pos: [-28.0, 0, 6.4893]
    mount: rod
    mass: 0.03
    color: "#c9bfa6"
    pieces:
      - {kind: poly, points: [[-27.55, 6.4893], [-27.55, -2.5107], [-28.45, -2.5107], [-28.45, 6.4893]], y: [-0.9, -0.2], collide: 0}
      - {kind: disc, center: [-28.0, 6.4893], radius: 0.8, inner: 0.35, y: [-0.9, -0.2], collide: 0}
      - {kind: disc, center: [-28.0, -2.5107], radius: 0.8, inner: 0.35, y: [-0.9, -0.2], collide: 0}
  - id: upbar
    shape: part
    pos: [-28.0, 0, -2.5107]
    mass: 0.1
    friction: 0.03
    color: "#a89a7e"
    pieces:
      - {kind: poly, points: [[-28.5, -18.5107], [-27.5, -18.5107], [-27.5, -2.5107], [-28.5, -2.5107]], y: [-0.9, -0.2], collide: 0, color: "#a89a7e"}
      - {kind: disc, center: [-28.0, -2.5107], radius: 0.8, inner: 0.35, y: [-0.9, -0.2], collide: 0}
      - {kind: poly, points: [[-28.8, -18.5107], [-27.2, -18.5107], [-27.2, -16.5107], [-28.8, -16.5107]], y: [-1.0, -0.1], collide: 0, color: "#8f8a80"}
  - id: frame
    shape: part
    pos: [0, 0, 0]
    fixed: true
    color: "#cfc6b4"
    pieces:
      - {kind: poly, points: [[-2.4, -14.0], [2.4, -14.0], [2.4, -13.0], [-2.4, -13.0]], y: [-3, 3], collide: 0, color: "#b9b09c"}
      - {kind: poly, points: [[-28.0, -15.0], [8.0, -15.0], [8.0, -14.0], [-28.0, -14.0]], y: [-3, 3], collide: 0, color: "#b9b09c"}
      - {kind: poly, points: [[-1.2, -13.0], [1.2, -13.0], [1.2, -0.0], [-1.2, -0.0]], y: [3.2, 4.2], collide: 0}
      - {kind: poly, points: [[-17.0, -13.0], [-15.0, -13.0], [-15.0, 6.47], [-17.0, 6.47]], y: [2.2, 3.2], collide: 0}
      - {kind: rod, from: [-16.0, -1.8, 6.469999999999999], to: [-16.0, 3.0, 6.469999999999999], radius: 0.5, collide: 0, color: "#8f8a80"}
      - {kind: poly, points: [[-30.2, -17.5107], [-28.9, -17.5107], [-28.9, -13.5107], [-30.2, -13.5107]], y: [-1.4, 1.4], collide: 0}
      - {kind: poly, points: [[-27.1, -17.5107], [-25.8, -17.5107], [-25.8, -13.5107], [-27.1, -13.5107]], y: [-1.4, 1.4], collide: 0}
      - {kind: poly, points: [[-30.2, -7.5107], [-28.9, -7.5107], [-28.9, -3.5107], [-30.2, -3.5107]], y: [-1.4, 1.4], collide: 0}
      - {kind: poly, points: [[-27.1, -7.5107], [-25.8, -7.5107], [-25.8, -3.5107], [-27.1, -3.5107]], y: [-1.4, 1.4], collide: 0}
      - {kind: poly, points: [[-25.8, -17.5107], [-24.6, -17.5107], [-24.6, -13.0], [-25.8, -13.0]], y: [1.4, 2.4], collide: 0}
joints:
  - {id: j_s, type: hinge, body: cam, axis: [0, 1, 0], damping: 0.002}   # the one driven joint; + : clockwise
  - {id: j_r, type: hinge, body: rod, axis: [0, 1, 0], damping: 0.003, stiffness: 0.6, springref: 0.5}   # the oscillating rod; + : the roller goes down; the spring presses it on the wheel
  - {id: j_k, type: hinge, body: link, axis: [0, 1, 0], damping: 0.002}
  - {id: j_x, type: slide, body: upbar, axis: [0, 0, 1], damping: 0.5}   # the upright bar in its guides; + : up
pins:
  - {id: pin_s, a: link, b: upbar, at: [-28.0, 0, -2.5107]}
contact: {solref: [0.002, 1.0], solimp: [0.95, 0.99, 0.0005], margin: 0}
driver: {joint: j_s, kind: velocity, rpm: 15.0, kv: 20.0, max_torque: 20.0}
checks:
  - {type: follow, out: j_x, in: j_s, expect: 0.0263, tol: 0.0018, min_r2: 0.98, settle_s: 8.5, window_s: 0.0889}   # steepest rise of the bar, shaft 42.0..50.0 deg of turn 2
  - {type: follow, out: j_x, in: j_s, expect: -0.0257, tol: 0.0018, min_r2: 0.98, settle_s: 8.9333, window_s: 0.0889}   # steepest fall of the bar, shaft 81.0..89.0 deg of turn 2
  - {type: follow, out: j_x, in: j_s, expect: 0.0263, tol: 0.0018, min_r2: 0.98, settle_s: 14.5, window_s: 0.0889}   # steepest rise of the bar, shaft 222.0..230.0 deg of turn 3
  - {type: follow, out: j_x, in: j_s, expect: -0.0257, tol: 0.0018, min_r2: 0.98, settle_s: 15.9333, window_s: 0.0889}   # steepest fall of the bar, shaft 351.0..359.0 deg of turn 3
  - {type: position, joint: j_x, min: -0.5917, max: 0.9584, settle_s: 1.0, window_s: 18.5}   # the stroke: 1.35 cm
  - {type: penetration, max: 0.001, settle_s: 0.5}
camera: {target: [-9.0, 0, -3.0], position: [-9.0, -105.0, -3.0], fov: 34}
display:
  output: j_x
  labels: {j_s: "Waved wheel (driver)", j_r: "Oscillating rod", j_x: "Upright bar", j_k: "Link"}
  proof: {label: "Wheel out of contact", sub: "the wheel turns but the rod does not touch it: the rod and bar come to rest"}

