I. Stakes

Microvascular suturing is precise work: vessels 1 to 3 mm across, stitch spacing measured in fractions of a millimeter, forces that tear tissue if they drift outside a narrow band. VASARA tests how much of that a $500 machine can do on its own: a trained policy that plans and places stitches with no operator in the loop.

II. Constraints

  • BudgetUnder $500 total bill of materials
  • Tissue1 to 3 mm synthetic venous vessels
  • ComputeJetson Orin Nano for inference, Arduino Mega for real-time IO
  • Control loop15.7 ms physical loop time (σ 1.75, measured)
  • Frame1010 aluminum extrusion, ~30 custom 3D-printed mounts

III. Decisions

Two coupled kinematic chains

A Cartesian gantry on MGN12 linear rails does the coarse positioning; a 3D-printed 6-DOF arm rides the Z carriage and does the fine work, ending in a rack-and-pinion gripper built around hemostatic forceps. Splitting coarse and fine motion means neither chain has to be good at the other's job, which is what makes sub-millimeter repeatability possible on hobby-grade parts.

The 6-DOF arm with rack-and-pinion gripper, mid-build
Synthetic vessel test specimens, sutured and cut
Fig. 02–03 — The arm mid-build (Mar 2026), and synthetic test specimens from bench validation.
SubsystemComponentRole
ComputeNVIDIA Jetson Orin NanoPolicy inference, vision pre-processing, serial bridge
Real-time IOArduino Mega 2560Stepper pulses, servo PWM, endstops, 115200 baud uplink
Stepper driveCNC Shield V3 + 4× TMC2209Silent microstepped X/Y/Z/A with stallGuard
Axes3× NEMA 17 + MGN12 railsCoarse positioning, sub-millimeter repeatability
Arm2× HS-488HB · 2× MG946R · 3× s52 microShoulder (paired), elbow, wrist roll/pitch, gripper
End-effectorRack-and-pinion gripper + hemostatic forceps14T spur, 2× 10T racks driving the jaw
VisionArducam IMX179 (16 MP + 8 MP)Stereo vessel + needle pose estimation
Power24 V PSU + DC-DC buckSeparate motor and logic rails, common ground

One pipeline from CAD to step pulses

The Fusion 360 occurrence tree is the single source of truth. A custom mapper emits a URDF and an Isaac Lab config from it; a PPO policy trains in Isaac Sim against 256 domain-randomized environments; the trained policy runs on the Jetson and streams joint targets over UART to the Arduino, which generates the step pulses.

  • 01 · CADFusion 360 · Vasara_9dan v18
  • 02 · Translatetreemapper → URDF + Isaac config
  • 03 · TrainIsaac Lab · PPO · domain randomization, 256 envs
  • 04 · DeployJetson Orin Nano · TensorRT · 115200 baud uplink
  • 05 · DriveArduino Mega · step pulses, servo PWM, endstops
Fig. 04 — 256 parallel training environments in Isaac Sim, path-traced.

Shaping the reward

A naive distance reward collapses into cheese-wiring: the agent rips the vessel because it gets to the target fastest.

The shaped reward keeps speed in tension with vessel safety, and the weights are tuned per campaign. Every term below exists because the policy found a way to cheat without it.

reward.pyShaped PPO reward
R(s, a) =
    w_pos · R_pos(s)        # puncture-site radial error
  + w_sp  · R_spacing(s)    # 1.0 mm ± 0.2 mm stitch interval
  + w_t   · R_tension(s,a)  # 0.20 to 0.50 N peak band
  + w_lat · R_latency(s)    # penalize control-loop overruns
  + w_rel · R_release(s,a)  # clean needle release
  − P_tear(s)              # hard penalty: cheese-wire / lumen tear
Listing 02 — The shaped PPO reward, annotated. Each term addresses a specific failure mode.

IV. What shipped

The full loop runs: camera to policy to UART to step pulses, closed-loop on physical hardware. The MCU firmware drives twelve servo channels on pins D2 through D13 with coarse and fine step sizes; production firmware speaks SLIP-framed commands from the Jetson over USB serial, replacing the IR-remote prototype path shown below.

servo_controller.inoPrototype excerpt · Arduino Mega
// Arduino Mega · 12-channel servo controller
#include <Servo.h>
#include <IRremote.hpp>

// Digital pins 2-13 each drive one servo channel.
const uint8_t servoPins[12] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
Servo servos[12];
int   servoAngles[12];

const int DEFAULT_ANGLE = 90;
const int STEP_COARSE   = 5;
const int STEP_FINE     = 1;
Listing 03 — The prototype servo controller. The production path swaps IR for SLIP-framed serial from the Jetson.
Fig. 05 — Closed-loop targeting demo, 10 seconds, RTX path-traced.

V. Results

The money result

0.18 mm in sim, 0.24 mm on hardware. The gap is the finding.

Sim-only claims are free; the physical number is what counts. Mean radial error at the puncture site, measured across independent runs on the assembled machine.

0.18 mmSimulation · n=60
0.24 mmPhysical · n=40
15.7 msControl loop · σ 1.75

The 0.06 mm sim-to-real gap held up because the things that break transfer, latency, backlash, servo slop, were either measured and modeled or randomized away during training. The judges at SCVSEF gave the project the Dr. Michael V. McCusker Award and an Honorable Mention in Biological Science & Engineering.

VI. What I learned

  • Reward shaping is failure-mode engineering. Every term in the reward exists because the policy found a way to cheat without it. The cheese-wiring penalty taught me more about RL than any tutorial.
  • The sim-to-real gap is a measurement, not a vibe. Publishing both numbers with sample sizes, 0.18 sim against 0.24 physical, is more credible than either number alone.

Colophon