Files
issacdataengine/migrate/gen_tube_grasp.py
Tangger 3d6b73753a feat: add test tube pick task with custom assets and grasp annotations
- Add pick_test_tube task: USDC asset repackaging, grasp generation, task config
- Add tools: usdc_to_obj.py, repackage_test_tube.py, fix_test_tube_materials.py
- Add custom_task_guide.md: full Chinese documentation for creating custom tasks
- Add crawled InternDataEngine online docs (23 pages)
- Add grasp generation script (gen_tube_grasp.py) and pipeline config
2026-04-05 11:01:59 +08:00

52 lines
1.8 KiB
Python

"""
Generate test tube grasp annotations by adapting working bottle grasps.
Strategy: Load verified working bottle grasps, scale positions to match
test tube dimensions. The rotation conventions are already correct.
Bottle: ~5cm radius, ~10cm height
Test tube: ~1.5cm radius, ~10.6cm height (similar height, 3x smaller radius)
Usage:
python migrate/gen_tube_grasp.py
"""
import numpy as np
import os
BOTTLE_GRASP = "workflows/simbox/example_assets/task/sort_the_rubbish/recyclable_garbage/bottle_0/Aligned_grasp_sparse.npy"
OUTPUT = "workflows/simbox/example_assets/task/pick_test_tube/test_tube/Aligned_grasp_sparse.npy"
def main():
# Load working bottle grasps
bottle = np.load(BOTTLE_GRASP)
print(f"Loaded {len(bottle)} bottle grasps")
print(f"Bottle pos range: X[{bottle[:,13].min():.4f},{bottle[:,13].max():.4f}] "
f"Y[{bottle[:,14].min():.4f},{bottle[:,14].max():.4f}] "
f"Z[{bottle[:,15].min():.4f},{bottle[:,15].max():.4f}]")
tube = bottle.copy()
# Scale XY positions (radius: bottle ~3cm -> tube ~1.5cm, factor ~0.5)
# Keep Z positions similar (both ~10cm height)
xy_scale = 0.5
tube[:, 13] *= xy_scale # X position
tube[:, 14] *= xy_scale # Y position
# Z positions stay the same (similar height)
# Reduce gripper width for smaller object
# Bottle width: 0.044-0.10, Tube needs: 0.02-0.06
tube[:, 1] = np.clip(tube[:, 1] * 0.6, 0.02, 0.06)
print(f"\nTube pos range: X[{tube[:,13].min():.4f},{tube[:,13].max():.4f}] "
f"Y[{tube[:,14].min():.4f},{tube[:,14].max():.4f}] "
f"Z[{tube[:,15].min():.4f},{tube[:,15].max():.4f}]")
print(f"Tube width range: [{tube[:,1].min():.3f},{tube[:,1].max():.3f}]")
np.save(OUTPUT, tube)
print(f"\nSaved {len(tube)} grasps to: {OUTPUT}")
if __name__ == "__main__":
main()