manipulationumi3d-printinghardwaregoproassemblymanipulation

Build your first UMI gripper: 3D printing, assembly, and GoPro smoke test

Step-by-step guide to 3D printing and assembling a UMI handheld unit with GoPro — the verified path from the Stanford repo. Full BOM, print settings, and how to test before collecting your first demo.

Nguyễn Anh TuấnMay 28, 20267 min readUpdated: Jun 6, 2026
Build your first UMI gripper: 3D printing, assembly, and GoPro smoke test

Build your first UMI gripper: 3D printing, assembly, and GoPro smoke test

This is Part 2 in the UMI + VLA series. If you haven't read Part 1 yet, start there to understand why we're building this gripper.

Goal of this post: you'll have one complete UMI handheld unit, GoPro streaming, and the gripper opening and closing smoothly. This is the only physical step before recording demos.

Important: UMI uses GoPro — not RealSense or a regular webcam. The reason: the official SLAM pipeline needs the GoPro's built-in IMU and wide fisheye FOV. Part 6 covers when and how to upgrade to D405.

Bill of materials (1 unit)

Item Qty Notes
UMI 3D printed parts 1 set Download STL from the official UMI Hardware Guide / Onshape
Soft fingers (TPU) 2 Print with TPU 95A; geometry should match your robot's fingertip
Springs (return mechanism) 1 set Exact spec in hardware guide; measure closing force with caliper after assembly
Screws / heat-set inserts 1 set M2/M3 assorted; check the official BOM
GoPro Hero 7 Black or newer 1 Hero 10/11 better for video quality; Black edition has IMU
GoPro mount bracket (3D printed) 1 STL in UMI repo
Side mirrors (optional) 1 set Extra side view; can skip for first build
ArUco marker (gripper width) 1–2 Stick on jaw to measure gripper width via vision
Caliper 1 Measure min/max gripper width — critical for calibration

Estimated hardware cost (1 unit): ~$200–500 USD depending on GoPro model and filament quality.

Clone the repo and read the hardware guide

Before printing, clone the repo and review the official hardware documentation:

git clone https://github.com/real-stanford/universal_manipulation_interface.git
cd universal_manipulation_interface

# See what scripts and configs are available
ls scripts/ scripts_slam_pipeline/ scripts_real/
ls diffusion_policy/config/task/

The hardware guide and official STL files are on Onshape (linked in the repo README). Don't use STL files from unofficial sources — the gripper geometry directly affects the observation gap during training.

Part Material Layer height Infill Support
Body / handle PETG 0.2 mm 40% Per overhang
Linkage / jaw PETG or Nylon 0.16–0.2 mm 50% Avoid on sliding surfaces
Finger shell PETG 0.16–0.2 mm 35% Per STL
Soft pads TPU 95A 0.16–0.2 mm 15–25% Usually none needed
GoPro bracket PETG 0.16–0.2 mm 50% May be needed

Print tips:

  • Print the body at 20% infill first to check fit before printing the final version.
  • Deburr all screw holes and sliding surfaces before assembly.
  • Let parts cool completely before inserting heat-set inserts.
  • For TPU, print slower (~30 mm/s) to avoid underextrusion.

Step-by-step assembly

Step 1: Prepare parts

Before assembly:

  1. Use a deburring tool to clean all screw holes.
  2. Test-fit the jaw/linkage into the body without screws — it should slide smoothly.
  3. Use a soldering iron to install heat-set inserts in all M3 holes on the body.
  4. Check the GoPro mount hole: the camera must sit tight, no rotation.

Step 2: Install linkage and spring

  1. Install the spring in the return mechanism position (see hardware guide for correct orientation).
  2. Attach the jaw to the body via the linkage pivot.
  3. Test open/close by hand: should be smooth, no binding, spring returns to closed.
  4. Use a caliper to measure gripper width when fully closed and fully open. Record both numbers — you'll need them when running scripts/calibrate_gripper_range.py later.

Step 3: Attach soft fingers

  1. Press TPU fingers into the finger mount. Glue is usually not needed — TPU friction is sufficient.
  2. Check that the fingers don't touch each other when fully closed.
  3. Check finger symmetry — if misaligned, grasping force distribution will be uneven.

Step 4: Mount the GoPro

  1. Mount GoPro to bracket.
  2. Attach bracket to UMI body. Bracket must be rigid — no wobble when held.
  3. Check camera angle: open the gripper and look at the GoPro preview. The camera must see:
    • Fingertip contact zone
    • Object in front of the gripper
    • Enough background for SLAM feature tracking
  4. If GoPro is pointing too directly at the fingers, reprint the bracket with more forward tilt.

Step 5: Apply ArUco marker (gripper width)

Generate and print the ArUco tag:

cd universal_manipulation_interface
python scripts/gen_aruco_tag_pdf.py

Print the tag, cut it out, and stick it on the jaw per the hardware guide. The tag must be visible from the camera view in normal operating position.

Step 6: Cable management

  1. Use a cable tie or clip to secure the GoPro USB cable to the handle. Critical: if the cable is free, it will pull the gripper off-axis during motion — adding tracking error.
  2. Leave a service loop at the wrist so wrist rotation doesn't strain the cable.

Smoke tests: verify GoPro before collecting demos

Before entering the SLAM pipeline, verify GoPro is working correctly:

Test 1: Video stream

# Connect GoPro via USB-C
# Check: 60fps, 1080p or 4K, fisheye mode enabled

Test 2: IMU data exists

The GoPro IMU is extracted via the official SLAM pipeline script. To verify the tool runs:

python scripts_slam_pipeline/01_extract_gopro_imu.py --help

Test 3: ArUco detection

python scripts/detect_aruco.py --help
python scripts/draw_aurco_detection.py --help

If the script runs and detects the tag in frame — assembly is successful.

Test 4: Verify orientation

python scripts/check_gopro_orientation.py --help

This checks that the GoPro isn't mounted upside down. Run with a test clip before collecting real data.

Common errors and fixes

Error Cause Fix
Jaw binds Print warp or rough surface Reprint, lightly sand sliding surface
Camera only sees fingers Bracket angle too steep Reprint bracket with more forward tilt
Spring too strong/weak Wrong spring spec Replace per hardware guide spec
GoPro cable pulls gripper No strain relief Clamp cable to handle
ArUco not detected Tag too small or blurry Print larger, improve lighting
Heat-set insert loose Insufficient heat Re-insert with more pressure

Definition of done — before moving to Part 3

Check this list before continuing:

[ ] Jaw opens/closes smoothly, no binding
[ ] GoPro streams at 60fps with fisheye mode enabled
[ ] ArUco tag is detected in camera frame
[ ] Cable doesn't create tension during wrist rotation
[ ] Min/max gripper width recorded (mm)
[ ] Camera sees fingertip area + workspace ahead
[ ] scripts/check_gopro_orientation.py runs OK

If all items are checked — you're ready for Part 3: record demos and run the SLAM pipeline.

One unit or two?

If your end goal is bimanual (two arms), you'll need 2 units. But perfect the first unit before building the second — confirm everything works, then build the duplicate. Both units must have identical geometry — same STL revision, same print settings, compare caliper measurements after assembly.

References


NT

Nguyễn Anh Tuấn

Robotics & AI Engineer. Building VnRobo — sharing knowledge about robot learning, VLA models, and automation.

Khám phá VnRobo

Related Posts

Thu demo đơn tay với UMI và chạy SLAM pipeline chính thức
manipulation

Thu demo đơn tay với UMI và chạy SLAM pipeline chính thức

5/31/20268 min read
NT
Upgrade lên D405: khi nào nên thay GoPro trong UMI và cách làm
manipulation

Upgrade lên D405: khi nào nên thay GoPro trong UMI và cách làm

6/6/20267 min read
NT
Lên hai tay: UMI bimanual pipeline với scripts chính thức
manipulation

Lên hai tay: UMI bimanual pipeline với scripts chính thức

6/5/20267 min read
NT