Lắp UMI gripper đầu tiên: in 3D, assembly, và smoke test GoPro
Đây là bài 2 trong series UMI + VLA. Nếu bạn chưa đọc bài 1, hãy đọc trước để hiểu tại sao chúng ta cần cái gripper này.
Mục tiêu của bài này: bạn sẽ có một UMI handheld unit hoàn chỉnh, GoPro stream chạy được, và gripper mở/đóng mượt. Đây là bước vật lý duy nhất trước khi thu demo.
Quan trọng: UMI dùng GoPro — không phải RealSense hay webcam. Lý do: pipeline SLAM chính thức cần IMU của GoPro và FOV fisheye rộng. Bài 6 sẽ đề cập khi nào nên upgrade sang D405.
Bill of materials (1 unit)
| Vật tư | Số lượng | Ghi chú |
|---|---|---|
| UMI 3D printed parts | 1 set | Tải STL từ UMI Hardware Guide / Onshape chính thức |
| Soft fingers (TPU) | 2 | In bằng TPU 95A; geometry nên giống fingertip của robot bạn dùng |
| Springs (return mechanism) | 1 set | Spec cụ thể trong hardware guide; đo lực đóng với caliper sau khi lắp |
| Screws / heat-set inserts | 1 set | M2/M3 assorted; đọc BOM chính thức để chính xác |
| GoPro Hero 7 Black (trở lên) | 1 | Hero 10/11 tốt hơn cho video quality; cần bản Black để có IMU |
| GoPro mount bracket (in 3D) | 1 | STL trong UMI repo |
| Side mirrors (optional) | 1 set | Cho extra side view; có thể bỏ qua cho lần đầu |
| ArUco marker (gripper width) | 1-2 | Dán lên jaw để đo gripper width qua vision |
| Caliper | 1 | Đo max/min gripper width — quan trọng cho calibration |
Tổng chi phí phần cứng (1 unit): ~$200–500 USD tùy GoPro model và chất lượng filament.
Clone repo và đọc hardware guide
Trước khi in, hãy clone repo và xem hardware documentation chính thức:
git clone https://github.com/real-stanford/universal_manipulation_interface.git
cd universal_manipulation_interface
# Xem danh sách scripts và configs có sẵn
ls scripts/ scripts_slam_pipeline/ scripts_real/
ls diffusion_policy/config/task/
Hardware guide và file STL chính thức nằm trên Onshape (link trong README của repo). Đừng dùng STL từ nguồn không chính thức — hình học của gripper ảnh hưởng trực tiếp đến observation gap sau này.
Print settings khuyến nghị
| Part | Material | Layer height | Infill | Support |
|---|---|---|---|---|
| Body / handle | PETG | 0.2 mm | 40% | Theo overhang |
| Linkage / jaw | PETG hoặc Nylon | 0.16–0.2 mm | 50% | Tránh support trên sliding surface |
| Finger shell | PETG | 0.16–0.2 mm | 35% | Theo STL |
| Soft pads | TPU 95A | 0.16–0.2 mm | 15–25% | Thường không cần |
| GoPro bracket | PETG | 0.16–0.2 mm | 50% | Có thể cần |
Mẹo in:
- In thử body ở 20% infill trước để kiểm tra fit trước khi in bản final.
- Deburr tất cả lỗ vít và sliding surface trước khi lắp.
- Để part nguội hoàn toàn trước khi lắp heat-set inserts.
- Với TPU, in chậm hơn (~30 mm/s) để tránh underextrusion.
Quy trình assembly từng bước
Bước 1: Chuẩn bị parts
Sau khi in xong, trước khi lắp:
- Dùng deburring tool hoặc dao nhỏ để làm sạch tất cả lỗ vít.
- Thử fit jaw/linkage vào body mà chưa lắp screw — phải trượt mượt.
- Dùng soldering iron để gắn heat-set inserts vào tất cả lỗ M3 trên body.
- Đo lỗ GoPro mount: camera phải ngồi chắc, không xoay được.
Bước 2: Lắp linkage và spring
- Lắp spring vào vị trí return mechanism (xem hardware guide để biết đúng orientation).
- Gắn jaw vào body qua linkage pivot.
- Test mở/đóng bằng tay: phải mượt, không vướng, spring tự đưa về đóng.
- Dùng caliper đo gripper width ở trạng thái đóng hoàn toàn và mở tối đa. Ghi lại 2 số này — bạn sẽ cần khi chạy
scripts/calibrate_gripper_range.pysau.
Bước 3: Gắn soft fingers
- Press TPU fingers vào finger mount. Không dùng keo nếu không cần — TPU friction thường đủ.
- Kiểm tra fingers không chạm nhau khi đóng hoàn toàn.
- Kiểm tra fingers có symmetry — nếu lệch, force distribution khi grasping sẽ không đều.
Bước 4: Gắn GoPro
- Lắp GoPro vào bracket.
- Gắn bracket vào body UMI. Bracket phải cứng — không được lắc khi cầm.
- Kiểm tra góc camera: mở gripper ra, nhìn vào màn hình GoPro hoặc preview trên điện thoại. Camera phải thấy được:
- Vùng contact của fingertip
- Object phía trước gripper
- Đủ background để SLAM track features
- Nếu GoPro quay quá thẳng vào fingers thì reprint bracket với góc nghiêng hơn về phía trước.
Bước 5: Dán ArUco marker (gripper width)
UMI đo gripper width qua ArUco tag vision. Tạo tag:
cd universal_manipulation_interface
python scripts/gen_aruco_tag_pdf.py
In tag ra giấy, cắt và dán vào jaw (vị trí theo hardware guide). Tag phải visible từ góc nhìn camera khi gripper ở trạng thái bình thường.
Bước 6: Cable management
- Dùng cable tie hoặc clip để cố định dây USB GoPro vào handle. Quan trọng: nếu cable tự do, nó sẽ kéo lệch gripper khi bạn vận động — gây sai số tracking.
- Để service loop đủ dài ở wrist để cổ tay xoay không bị căng dây.
Smoke test: kiểm tra GoPro trước khi thu demo
Trước khi bước vào pipeline SLAM, phải verify GoPro hoạt động đúng:
Test 1: Video stream
# Kết nối GoPro qua USB-C
# Mở GoPro app trên điện thoại hoặc dùng GoPro Webcam mode
# Kiểm tra: 60fps, 1080p hoặc 4K, fisheye mode bật
Test 2: IMU data có sẵn
IMU của GoPro được trích xuất qua script chính thức trong bước SLAM pipeline. Để kiểm tra sơ bộ rằng metadata tồn tại:
cd universal_manipulation_interface
# Ghi 1 clip ngắn (~30 giây), sau đó kiểm tra metadata
python scripts_slam_pipeline/01_extract_gopro_imu.py --help
Test 3: ArUco detection
python scripts/detect_aruco.py --help
# Nếu repo có script test detection live:
python scripts/draw_aurco_detection.py --help
Nếu script chạy được và detect được tag trong frame — assembly thành công.
Test 4: Verify orientation
python scripts/check_gopro_orientation.py --help
Script này kiểm tra GoPro có bị mount ngược hay không. Chạy với 1 clip thử trước khi collect data thật.
Lỗi thường gặp và cách xử lý
| Lỗi | Nguyên nhân | Fix |
|---|---|---|
| Jaw bị kẹt | Print warp hoặc surface rough | Reprint, sand nhẹ sliding surface |
| Camera thấy toàn fingers | Bracket angle quá steep | Reprint bracket, nghiêng về phía trước |
| Spring quá mạnh / yếu | Sai spec spring | Thay spring theo hardware guide |
| GoPro cable kéo lệch gripper | Không có strain relief | Clamp cable vào handle |
| ArUco không detect | Tag quá nhỏ hoặc mờ | Print lại to hơn, cải thiện lighting |
| Heat-set insert lỏng | Không đủ nhiệt | Nung lại, press chắc hơn |
Definition of done — trước khi sang bài 3
Kiểm tra checklist này trước khi tiếp tục:
[ ] Jaw mở/đóng mượt, không vướng
[ ] GoPro stream 60fps, fisheye mode bật
[ ] ArUco tag detect được trong camera frame
[ ] Cable không tạo tension khi cổ tay xoay
[ ] Đã ghi lại min/max gripper width (mm)
[ ] Camera thấy fingertip area + workspace phía trước
[ ] scripts/check_gopro_orientation.py chạy OK
Nếu tất cả checklist đã tick — bạn đã sẵn sàng cho bài 3: thu demo và chạy SLAM pipeline.
Một unit hay hai?
Nếu mục tiêu cuối của bạn là bimanual (hai tay), bạn cần in 2 units. Nhưng hãy hoàn thiện unit đầu tiên trước — đảm bảo mọi thứ hoạt động đúng, rồi mới in unit thứ hai để tiết kiệm thời gian nếu phải reprint.
Hai units phải có hình học giống hệt nhau — dùng cùng STL revision, cùng print settings, đo caliper so sánh sau khi lắp.
Nguồn tham khảo
- UMI project page + hardware guide
- real-stanford/universal_manipulation_interface
- UMI paper (Chi et al., 2024)