Vì sao Grasping là bài toán khó nhất của Manipulation?
Với con người, việc cầm một chiếc cốc cà phê là hành động vô thức -- mắt nhìn, tay vươn, ngón tay khép lại. Nhưng với robot, đây là bài toán kết hợp perception, planning, và control cực kỳ phức tạp.
Một robot arm cần trả lời 3 câu hỏi trước khi grasping: (1) ở đâu trên vật thể nên tiếp xúc? (2) hướng nào của gripper là ổn định? (3) lực bao nhiêu là đủ để giữ mà không làm vỡ? Mỗi câu hỏi là một bài toán riêng, và các phương pháp giải đã tiến hóa từ analytical (tính toán hình học + vật lý) sang learning-based (học từ data) trong 2 thập kỷ qua.
Bài này là Part 1 của series Robot Manipulation Masterclass -- mình sẽ đi từ lý thuyết cổ điển đến các model deep learning mới nhất, với comparison table để bạn chọn đúng approach cho project của mình.
Analytical Grasping: Nền tảng vật lý
Force Closure -- Điều kiện cần và đủ
Khái niệm quan trọng nhất của analytical grasping là force closure: một grasp được gọi là force closure khi các contact forces có thể chống lại bất kỳ external wrench nào (lực + moment) tác động lên vật thể.
Hình dung đơn giản: khi bạn cầm một quả bóng bằng 2 ngón tay (thumb và index finger), friction tại 2 điểm tiếp xúc tạo ra một wrench space đủ lớn để giữ quả bóng không trượt, không xoay, dù bạn nghiêng tay hay ai đẩy nhẹ.
Điều kiện toán học cho force closure:
Một grasp G với n contact points là force closure khi và chỉ khi:
convex hull của các primitive wrenches bao quanh gốc tọa độ (origin)
trong không gian wrench 6D (3 force + 3 torque).
Các bước tính:
- Xác định contact model: point contact with friction (PCWF), soft finger, hay rigid body
- Tính friction cone: tại mỗi contact point, tạo cone các lực cho phép dựa trên hệ số ma sát (coefficient of friction mu)
- Map sang wrench space: mỗi contact force -> wrench = [force; torque] qua cross product với contact position
- Kiểm tra force closure: convex hull của tất cả wrenches có chứa origin không?
GraspIt! -- Simulator cổ điển
GraspIt! là grasp planning simulator được phát triển tại Columbia University từ năm 2004, và vẫn được dùng rộng rãi cho analytical grasping research.
GraspIt! cho phép:
- Load robot hand models (Barrett, Shadow, Allegro) và object meshes
- Tự động search grasp poses bằng eigengrasp planner hoặc simulated annealing
- Tính grasp quality metrics: epsilon metric (lớn nhất của smallest wrench có thể resist), volume metric (tổng thể tích wrench space)
# Cài GraspIt! (Ubuntu)
sudo apt-get install libqt5-dev libsoqt520-dev libcoin-dev
git clone https://github.com/graspit-simulator/graspit.git
cd graspit && mkdir build && cd build
cmake .. && make -j$(nproc)
Hạn chế của analytical approach: cần 3D model chính xác của vật thể, friction coefficient chính xác, và không scale tốt với unknown objects. Đây là lý do learning-based methods ra đời.
Learning-Based Grasping: Học từ Data
PointNetGPD -- Point cloud trực tiếp
PointNetGPD (Liang et al., 2018) là một trong những paper đầu tiên dùng PointNet để evaluate grasp quality trực tiếp từ point cloud.
Ý tưởng cốt lõi: thay vì phân tích hình học phức tạp, hãy cho neural network học từ 350K grasp samples trên YCB object set. Input là point cloud bên trong gripper, output là grasp score.
# PointNetGPD inference pipeline (simplified)
import torch
from pointnet_gpd import PointNetGPD
model = PointNetGPD(num_classes=2)
model.load_state_dict(torch.load("pointnetgpd_weights.pth"))
# 1. Sample grasp candidates từ point cloud
grasp_candidates = sample_antipodal_grasps(point_cloud, num_samples=200)
# 2. Với mỗi candidate, crop point cloud trong gripper volume
for grasp in grasp_candidates:
local_points = crop_points_in_gripper(point_cloud, grasp)
# 3. PointNet predict quality score
score = model(local_points)
grasp.quality = score
# 4. Chọn grasp có score cao nhất
best_grasp = max(grasp_candidates, key=lambda g: g.quality)
Ưu điểm: nhanh (real-time), không cần object model, generalize tốt đến unseen objects.
Nhược điểm: chỉ hỗ trợ parallel-jaw gripper, không xét scene context (occlusion, clutter).
Contact-GraspNet -- 6-DoF trong clutter
Contact-GraspNet (Sundermeyer et al., 2021) giải quyết hạn chế của PointNetGPD bằng cách generate 6-DoF grasps trực tiếp từ scene point cloud, có xét đến clutter.
Điểm đột phá:
- Contact-based representation: mỗi điểm trong point cloud là một potential grasp contact, chỉ cần predict 4-DoF (approach direction + grasp width) thay vì 6-DoF đầy đủ -- giảm độ phức tạp học
- Train trên 17 triệu simulated grasps, generalize tốt đến real sensor data
- Đạt >90% success rate trên unseen objects trong structured clutter, gấp đôi so với state-of-the-art trước đó
# Contact-GraspNet inference (simplified)
from contact_graspnet import ContactGraspNet
model = ContactGraspNet.load_pretrained()
# Input: single-view depth image -> point cloud
point_cloud = depth_to_pointcloud(depth_image, camera_intrinsics)
# Output: set of 6-DoF grasps with confidence scores
grasps, scores, contact_points = model.predict(
point_cloud,
forward_passes=5 # multiple passes for uncertainty
)
# Filter và rank
valid_grasps = grasps[scores > 0.5]
best_grasp = valid_grasps[scores.argmax()]
So sánh các phương pháp
| Tiêu chí | Analytical (GraspIt!) | PointNetGPD | Contact-GraspNet |
|---|---|---|---|
| Input | 3D mesh + friction | Point cloud (local) | Point cloud (scene) |
| Output | Grasp + quality metric | Grasp score | 6-DoF grasps + scores |
| Unknown objects | Không (cần mesh) | Có | Có |
| Clutter handling | Không | Hạn chế | Tốt |
| Speed | Chậm (optimization) | Real-time | ~0.5s/scene |
| Gripper | Multi-finger | Parallel-jaw | Parallel-jaw |
| Training data | Không cần | 350K grasps | 17M grasps |
| Success rate (real) | ~70-80% (known objects) | ~85% | >90% |
| Best use case | Research, multi-finger | Quick prototype | Production clutter |
Grasp Quality Metrics
Dù dùng phương pháp nào, bạn cần đo lường chất lượng của grasp. Đây là các metrics phổ biến:
Epsilon Metric (Force Closure Quality)
Epsilon metric là bán kính của largest inscribed ball trong wrench space convex hull. Epsilon > 0 nghĩa là force closure. Epsilon càng lớn, grasp càng robust với external disturbances.
# Tính epsilon metric
from scipy.spatial import ConvexHull
import numpy as np
def epsilon_metric(wrenches):
"""
wrenches: (N, 6) array of primitive wrenches
Returns: epsilon value (>0 = force closure)
"""
hull = ConvexHull(wrenches)
# Khoảng cách ngắn nhất từ origin đến mỗi facet
distances = []
for eq in hull.equations:
normal = eq[:-1]
offset = eq[-1]
dist = abs(offset) / np.linalg.norm(normal)
distances.append(dist)
return min(distances)
Grasp Success Rate (Thực nghiệm)
Metric thực tế nhất: chạy N lần grasp, đếm số lần thành công. Một grasp "thành công" khi robot nhặt được vật thể, nâng lên 10cm, giữ 3 giây mà không rơi.
Diversity và Coverage
Ngoài quality, diversity cũng quan trọng: một grasp planner tốt cần tạo ra nhiều grasp candidates từ nhiều hướng khác nhau, để robot có fallback options khi grasp ưu tiên bị block bởi obstacles.
Từ Analytical đến Learning: Khi nào dùng gì?
Chọn Analytical khi:
- Bạn làm việc với known objects có 3D model chính xác (vd: assembly line với các part cố định)
- Cần interpretability -- giải thích tại sao grasp này tốt/xấu (quan trọng cho safety-critical applications)
- Dùng multi-finger hands (Shadow, Allegro) -- learning methods cho multi-finger vẫn còn immature
- Cần grasp quality guarantees (force closure chứng minh được)
Chọn Learning-based khi:
- Cần generalize đến unknown objects (warehouse, home environment)
- Môi trường có clutter (nhiều vật thể chồng lên nhau)
- Chỉ có partial observation (single-view depth camera)
- Cần real-time performance (<1s per grasp)
- Dùng parallel-jaw gripper (phổ biến nhất trong industry)
Hybrid approach
Xu hướng 2025-2026 là kết hợp: dùng learning model để generate grasp candidates nhanh, sau đó dùng analytical metrics để verify và rank. Đây là cách Google DeepMind và UC Berkeley đang làm trong các hệ thống mới nhất.
Hands-on: Chạy Contact-GraspNet
Nếu bạn muốn thử ngay, đây là cách setup nhanh nhất:
# Clone repo
git clone https://github.com/NVlabs/contact_graspnet.git
cd contact_graspnet
# Cài dependencies (Python 3.8+, CUDA 11.x)
pip install -r requirements.txt
# Download pre-trained weights
bash download_weights.sh
# Chạy inference trên sample depth image
python contact_graspnet/inference.py \
--np_path=test_data/scene_0.npy \
--forward_passes=5 \
--z_range=[0.2,1.2]
Output là một set 6-DoF grasps visualize trên point cloud. Từ đây, bạn có thể integrate với robot arm qua ROS 2 hoặc trực tiếp qua inverse kinematics.
Resources
- GraspIt! docs: https://graspit-simulator.github.io/
- Contact-GraspNet paper: arXiv:2103.14127
- PointNetGPD paper: arXiv:1809.06267
- Grasp quality survey: Ferrari & Canny, "Planning Optimal Grasps" (1992) -- paper gốc của force closure metrics
Tiếp theo trong series
Đây là Part 1 của series Robot Manipulation Masterclass. Trong các bài tiếp theo:
- Part 2: Imitation Learning cho Manipulation: BC, DAgger, ACT -- Học manipulation từ demonstrations
- Part 3: Diffusion Policy thực hành: Từ lý thuyết đến code -- State-of-the-art policy learning
Bài viết liên quan
- Imitation Learning cho Manipulation: BC, DAgger, ACT -- Part 2 series này
- Tactile Sensing cho Manipulation -- Cảm biến xúc giác giúp grasping chính xác hơn
- Foundation Models cho Robot: RT-2, Octo, OpenVLA -- VLA models có thể grasping zero-shot
- Inverse Kinematics cho Robot 6-DoF -- Cần IK để thực hiện grasp pose