← Ethan Ieong

042026

Synthetic Data Pipeline for Grasp Detection

Labelling grasp data by hand does not scale, and no public dataset shows wheelchair push handles from a humanoid's point of view. So the data gets generated instead — randomized scenes in Isaac Sim, rendered and annotated straight into a format a detector can train on.

One generated frame: object pose, surface materials, lighting and camera placement all randomized, with the annotation written out alongside it.
Where
Intelligent Systems & Robotics / Micro Manufacturing (ISRMM) Laboratory, TMU
Stack
Isaac Sim, Omniverse Replicator, YOLOv8, Python

Randomising the scene

Omniverse Replicator inside Isaac Sim does the generating. It randomizes object pose, surface materials, lighting through dome-light HDRI environments and camera placement, shooting from top-down and perspective angles both.

A custom writer dumps annotations straight into YOLOv8 format across two classes, handle and wheelchair, so a generated set is ready to train against with no intermediate conversion and no manual pass. Two thousand plus images so far.

Camera placement out of the target's geometry

Arm's length is the range the robot actually grasps from, and at that distance the handles fill a good chunk of the wrist camera's view. So the close-range half of the pipeline is built around that one viewpoint, pulling camera placement out of the target's geometry instead of eyeballing it.

The wheelchair USD is read directly for the real numbers: two handle prims, 0.185 units apiece, roughly 0.887 units apart. Those figures anchor every close-range camera, not the object's overall bounding box. Cameras aim at the midpoint between the handles — the spot the robot goes for — so handles land centred and full-size in every frame that comes out.

Standoff distance scales off the target too. Camera distances are multiples of that 0.887-unit separation, which turns handle size in the training images into something set deliberately rather than something that just happens. Viewpoints get sampled from a horizontal wedge on the handle side of the chair, matching the way the robot actually walks up to it.

Checking the data before spending an epoch on it

The pipeline is instrumented to report bounding-box scale statistics across the whole generated set. That makes it possible to check training data against the box sizes the deployment camera actually produces before spending a single epoch on it.

Material randomization got wider along the way: a plain white and grey pass alongside the wood and coloured-handle pass already there, closer to the finishes real chairs come in.

What it feeds

The trained detector is exported to ONNX and runs under ONNX Runtime inside a C++ ROS 2 node, with Python kept out of the runtime path entirely.

On the wrist-camera frame the robot deploys from, it picks up both grips at roughly 0.81 confidence apiece and the wheelchair body at 0.85, each with a metric depth attached — two real grasp targets in the robot's own frame, handed straight to the planner.

What the generated data buys: both handles and the wheelchair body detected on the wrist-camera view, each with the depth resolved for it in metres.